1package de.gultsch.chat.ui;
2
3import java.util.LinkedHashMap;
4import java.util.Map.Entry;
5
6import de.gultsch.chat.R;
7import de.gultsch.chat.entities.Account;
8import de.gultsch.chat.entities.Contact;
9import de.gultsch.chat.entities.Conversation;
10import de.gultsch.chat.persistance.DatabaseBackend;
11import de.gultsch.chat.utils.Validator;
12import android.os.Bundle;
13import android.provider.ContactsContract;
14import android.text.Editable;
15import android.text.TextWatcher;
16import android.util.Log;
17import android.view.LayoutInflater;
18import android.view.Menu;
19import android.view.MenuItem;
20import android.view.View;
21import android.view.View.OnClickListener;
22import android.widget.LinearLayout;
23import android.widget.TextView;
24import android.widget.ImageView;
25import android.content.Context;
26import android.content.CursorLoader;
27import android.content.Intent;
28import android.content.Loader;
29import android.content.Loader.OnLoadCompleteListener;
30import android.database.Cursor;
31
32public class NewConversationActivity extends XmppActivity {
33
34 final protected LinkedHashMap<Contact, View> availablePhoneContacts = new LinkedHashMap<Contact, View>();
35 final protected LinkedHashMap<Contact, View> availableJabberContacts = new LinkedHashMap<Contact, View>();
36 protected View newContactView;
37 protected Contact newContact;
38
39 static final String[] PROJECTION = new String[] {
40 ContactsContract.Data.CONTACT_ID,
41 ContactsContract.Data.DISPLAY_NAME,
42 ContactsContract.Data.PHOTO_THUMBNAIL_URI,
43 ContactsContract.CommonDataKinds.Im.DATA };
44
45 // This is the select criteria
46 static final String SELECTION = "(" + ContactsContract.Data.MIMETYPE
47 + "=\"" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
48 + "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
49 + "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
50 + "\")";
51 protected static final String DEFAULT_PROFILE_PHOTO = "android.resource://de.gultsch.chat/" + R.drawable.ic_profile;
52
53 protected View getViewForContact(Contact contact) {
54 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
55 View view = (View) inflater.inflate(R.layout.contact,null);
56 ((TextView) view.findViewById(R.id.contact_display_name)).setText(contact.getDisplayName());
57 ((TextView) view.findViewById(R.id.contact_jid)).setText(contact.getJid());
58 ((ImageView) view.findViewById(R.id.contact_photo)).setImageURI(contact.getProfilePhoto());
59 view.setOnClickListener(new OnClickListener() {
60
61 @Override
62 public void onClick(View v) {
63 Contact clickedContact = null;
64 for(Entry<Contact, View> entry : availablePhoneContacts.entrySet()) {
65 if (entry.getValue() == v) {
66 clickedContact = entry.getKey();
67 break;
68 }
69 }
70 for(Entry<Contact, View> entry : availableJabberContacts.entrySet()) {
71 if (entry.getValue() == v) {
72 clickedContact = entry.getKey();
73 break;
74 }
75 }
76 if (newContactView==v) {
77 clickedContact = newContact;
78 }
79 Log.d("gultsch","clicked on "+clickedContact.getDisplayName());
80
81
82 Account account = new Account();
83
84 Conversation conversation = xmppConnectionService.findOrCreateConversation(account, clickedContact);
85
86 Intent viewConversationIntent = new Intent(v.getContext(),ConversationActivity.class);
87 viewConversationIntent.setAction(Intent.ACTION_VIEW);
88 viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, conversation.getUuid());
89 viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
90 viewConversationIntent.setFlags(viewConversationIntent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
91 startActivity(viewConversationIntent);
92 }
93 });
94 return view;
95 }
96
97 @Override
98 protected void onCreate(Bundle savedInstanceState) {
99
100 super.onCreate(savedInstanceState);
101
102 if (DatabaseBackend.getInstance(this).getConversationCount() < 1) {
103 getActionBar().setDisplayHomeAsUpEnabled(false);
104 getActionBar().setHomeButtonEnabled(false);
105 }
106
107 setContentView(R.layout.activity_new_conversation);
108 CursorLoader mCursorLoader = new CursorLoader(this,
109 ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
110 null);
111 mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
112
113 @Override
114 public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
115 while (cursor.moveToNext()) {
116 String profilePhoto = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI));
117 if (profilePhoto == null) {
118 profilePhoto = DEFAULT_PROFILE_PHOTO;
119 }
120 Contact contact = new Contact(
121 cursor.getString(cursor
122 .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
123 cursor.getString(cursor
124 .getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
125 profilePhoto
126 );
127 View contactView = getViewForContact(contact);
128 availablePhoneContacts.put(contact, getViewForContact(contact));
129 ((LinearLayout) findViewById(R.id.phone_contacts)).addView(contactView);
130 }
131 updateAvailableContacts();
132 }
133 });
134 mCursorLoader.startLoading();
135
136 ((TextView) findViewById(R.id.new_conversation_search)).addTextChangedListener(new TextWatcher() {
137
138 @Override
139 public void onTextChanged(CharSequence s, int start, int before, int count) {
140 updateAvailableContacts();
141 }
142
143 @Override
144 public void afterTextChanged(Editable s) {
145 // TODO Auto-generated method stub
146
147 }
148
149 @Override
150 public void beforeTextChanged(CharSequence s, int start, int count,
151 int after) {
152 // TODO Auto-generated method stub
153
154 }
155 });
156
157 }
158
159 protected void updateAvailableContacts() {
160 String search = ((TextView) findViewById(R.id.new_conversation_search)).getText().toString();
161
162 LinearLayout phoneContacts = (LinearLayout) findViewById(R.id.phone_contacts);
163 filterAvailableContacts(phoneContacts,this.availablePhoneContacts,search);
164
165 if (phoneContacts.getChildCount() == 0) {
166 findViewById(R.id.phone_contacts_header).setVisibility(View.GONE);
167 } else {
168 findViewById(R.id.phone_contacts_header).setVisibility(View.VISIBLE);
169 }
170
171 LinearLayout jabberContacts = (LinearLayout) findViewById(R.id.jabber_contacts);
172 filterAvailableContacts(jabberContacts,this.availableJabberContacts,search);
173 if (jabberContacts.getChildCount() == 0) {
174 findViewById(R.id.jabber_contacts_header).setVisibility(View.GONE);
175 } else {
176 findViewById(R.id.jabber_contacts_header).setVisibility(View.VISIBLE);
177 }
178
179 LinearLayout createNewContact = (LinearLayout) findViewById(R.id.create_new_contact);
180 if (Validator.isValidJid(search)) {
181 createNewContact.removeAllViews();
182 String name = search.split("@")[0];
183 newContact = new Contact(name,search,DEFAULT_PROFILE_PHOTO);
184 newContactView = getViewForContact(newContact);
185 newContactView.findViewById(R.id.contact_divider).setVisibility(View.GONE);
186 createNewContact.addView(newContactView);
187 createNewContact.setVisibility(View.VISIBLE);
188 ((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.VISIBLE);
189 } else {
190 createNewContact.setVisibility(View.GONE);
191 ((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.GONE);
192 }
193 }
194
195 private void filterAvailableContacts(
196 LinearLayout layout, LinkedHashMap<Contact, View> contacts, String search) {
197 layout.removeAllViews();
198 for(Entry<Contact, View> entry : contacts.entrySet()) {
199
200 if (entry.getKey().match(search)) {
201 entry.getValue().setVisibility(View.VISIBLE);
202 entry.getValue().findViewById(R.id.contact_divider).setVisibility(View.VISIBLE);
203 layout.addView(entry.getValue());
204 }
205 }
206 int contactsCount = layout.getChildCount();
207 if (contactsCount>=1) {
208 View lastContact = layout.getChildAt(contactsCount - 1);
209 lastContact.findViewById(R.id.contact_divider).setVisibility(View.GONE);
210 }
211 }
212
213 @Override
214 void onBackendConnected() {
215 if (xmppConnectionService.getConversationCount()==0) {
216 getActionBar().setDisplayHomeAsUpEnabled(false);
217 getActionBar().setHomeButtonEnabled(false);
218 }
219 }
220
221 @Override
222 public boolean onCreateOptionsMenu(Menu menu) {
223 // Inflate the menu; this adds items to the action bar if it is present.
224 getMenuInflater().inflate(R.menu.newconversation, menu);
225 return true;
226 }
227
228 @Override
229 public boolean onOptionsItemSelected(MenuItem item) {
230 switch (item.getItemId()) {
231 case R.id.action_settings:
232 startActivity(new Intent(this, SettingsActivity.class));
233 break;
234 case R.id.action_accounts:
235 startActivity(new Intent(this, ManageAccountActivity.class));
236 break;
237 default:
238 break;
239 }
240 return super.onOptionsItemSelected(item);
241 }
242
243}