NewConversationActivity.java

  1package de.gultsch.chat.ui;
  2
  3import java.util.ArrayList;
  4import java.util.Collections;
  5import java.util.Comparator;
  6import java.util.List;
  7
  8import de.gultsch.chat.R;
  9import de.gultsch.chat.entities.Account;
 10import de.gultsch.chat.entities.Contact;
 11import de.gultsch.chat.entities.Conversation;
 12import de.gultsch.chat.utils.Beautifier;
 13import de.gultsch.chat.utils.Validator;
 14import android.net.Uri;
 15import android.os.Bundle;
 16import android.provider.ContactsContract;
 17import android.text.Editable;
 18import android.text.TextWatcher;
 19import android.util.Log;
 20import android.view.LayoutInflater;
 21import android.view.Menu;
 22import android.view.MenuItem;
 23import android.view.View;
 24import android.view.ViewGroup;
 25import android.widget.AdapterView;
 26import android.widget.AdapterView.OnItemClickListener;
 27import android.widget.ArrayAdapter;
 28import android.widget.EditText;
 29import android.widget.ListView;
 30import android.widget.TextView;
 31import android.widget.ImageView;
 32import android.app.Activity;
 33import android.app.AlertDialog;
 34import android.content.Context;
 35import android.content.CursorLoader;
 36import android.content.DialogInterface;
 37import android.content.DialogInterface.OnClickListener;
 38import android.content.Intent;
 39import android.content.Loader;
 40import android.content.Loader.OnLoadCompleteListener;
 41import android.database.Cursor;
 42
 43public class NewConversationActivity extends XmppActivity {
 44
 45	protected List<Contact> phoneContacts = new ArrayList<Contact>();
 46	protected List<Contact> rosterContacts = new ArrayList<Contact>();
 47	protected List<Contact> aggregatedContacts = new ArrayList<Contact>();
 48	protected ListView contactsView;
 49	protected ArrayAdapter<Contact> contactsAdapter;
 50
 51	protected EditText search;
 52	protected String searchString = "";
 53	private TextView contactsHeader;
 54
 55	protected void updateAggregatedContacts() {
 56
 57		aggregatedContacts.clear();
 58		for (Contact contact : phoneContacts) {
 59			if (contact.match(searchString))
 60				aggregatedContacts.add(contact);
 61		}
 62		for (Contact contact : rosterContacts) {
 63			if (contact.match(searchString))
 64				aggregatedContacts.add(contact);
 65		}
 66
 67		Collections.sort(aggregatedContacts, new Comparator<Contact>() {
 68
 69			@Override
 70			public int compare(Contact lhs, Contact rhs) {
 71				return lhs.getDisplayName().compareTo(rhs.getDisplayName());
 72			}
 73		});
 74
 75		if (aggregatedContacts.size() == 0) {
 76
 77			if (Validator.isValidJid(searchString)) {
 78				String name = searchString.split("@")[0];
 79				Contact newContact = new Contact(name, searchString,null);
 80				aggregatedContacts.add(newContact);
 81				contactsHeader.setText("Create new contact");
 82			} else {
 83				contactsHeader.setText("Contacts");
 84			}
 85		} else {
 86			contactsHeader.setText("Contacts");
 87		}
 88
 89		contactsAdapter.notifyDataSetChanged();
 90	}
 91
 92	static final String[] PROJECTION = new String[] {
 93			ContactsContract.Data.CONTACT_ID,
 94			ContactsContract.Data.DISPLAY_NAME,
 95			ContactsContract.Data.PHOTO_THUMBNAIL_URI,
 96			ContactsContract.CommonDataKinds.Im.DATA };
 97
 98	// This is the select criteria
 99	static final String SELECTION = "(" + ContactsContract.Data.MIMETYPE
100			+ "=\"" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
101			+ "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
102			+ "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
103			+ "\")";
104
105	@Override
106	protected void onCreate(Bundle savedInstanceState) {
107
108		super.onCreate(savedInstanceState);
109
110		setContentView(R.layout.activity_new_conversation);
111
112		contactsHeader = (TextView) findViewById(R.id.contacts_header);
113
114		search = (EditText) findViewById(R.id.new_conversation_search);
115		search.addTextChangedListener(new TextWatcher() {
116
117			@Override
118			public void onTextChanged(CharSequence s, int start, int before,
119					int count) {
120				searchString = search.getText().toString();
121				updateAggregatedContacts();
122			}
123
124			@Override
125			public void afterTextChanged(Editable s) {
126				// TODO Auto-generated method stub
127
128			}
129
130			@Override
131			public void beforeTextChanged(CharSequence s, int start, int count,
132					int after) {
133				// TODO Auto-generated method stub
134
135			}
136		});
137
138		contactsView = (ListView) findViewById(R.id.contactList);
139		contactsAdapter = new ArrayAdapter<Contact>(getApplicationContext(),
140				R.layout.contact, aggregatedContacts) {
141			@Override
142			public View getView(int position, View view, ViewGroup parent) {
143				LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
144				if (view == null) {
145					view = (View) inflater.inflate(R.layout.contact, null);
146				}
147
148				((TextView) view.findViewById(R.id.contact_display_name))
149						.setText(getItem(position).getDisplayName());
150				((TextView) view.findViewById(R.id.contact_jid))
151						.setText(getItem(position).getJid());
152				String profilePhoto = getItem(position).getProfilePhoto();
153				ImageView imageView = (ImageView) view.findViewById(R.id.contact_photo);
154				if (profilePhoto!=null) {
155					imageView.setImageURI(Uri.parse(profilePhoto));
156				} else {
157					imageView.setImageBitmap(Beautifier.getUnknownContactPicture(getItem(position).getDisplayName(),90));
158				}
159				return view;
160			}
161		};
162		contactsView.setAdapter(contactsAdapter);
163		final Activity activity = this;
164		contactsView.setOnItemClickListener(new OnItemClickListener() {
165
166			@Override
167			public void onItemClick(AdapterView<?> arg0, final View view, int pos,
168					long arg3) {
169				final Contact clickedContact = aggregatedContacts.get(pos);
170				Log.d("gultsch",
171						"clicked on " + clickedContact.getDisplayName());
172				
173				final List<Account> accounts = xmppConnectionService.getAccounts();
174				if (accounts.size() == 1) {
175					startConversation(clickedContact, accounts.get(0));
176				} else {
177					String[] accountList = new String[accounts.size()];
178					for(int i = 0; i < accounts.size(); ++i) {
179						accountList[i] = accounts.get(i).getJid();
180					}
181	
182					AlertDialog.Builder builder = new AlertDialog.Builder(activity);
183					builder.setTitle("Choose account");
184					builder.setSingleChoiceItems(accountList,0,new OnClickListener() {
185						
186						@Override
187						public void onClick(DialogInterface dialog, int which) {
188							Account account = accounts.get(which);
189							startConversation(clickedContact, account);
190						}
191					});
192					builder.create().show();
193				}
194			}
195		});
196	}
197	
198	public void startConversation(Contact contact, Account account) {
199		Conversation conversation = xmppConnectionService
200				.findOrCreateConversation(account, contact);
201
202		Intent viewConversationIntent = new Intent(this,ConversationActivity.class);
203		viewConversationIntent.setAction(Intent.ACTION_VIEW);
204		viewConversationIntent.putExtra(
205				ConversationActivity.CONVERSATION,
206				conversation.getUuid());
207		viewConversationIntent
208				.setType(ConversationActivity.VIEW_CONVERSATION);
209		viewConversationIntent.setFlags(viewConversationIntent
210				.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
211		startActivity(viewConversationIntent);
212	}
213
214	@Override
215	public void onStart() {
216		super.onStart();
217
218		CursorLoader mCursorLoader = new CursorLoader(this,
219				ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
220				null);
221		mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
222
223			@Override
224			public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
225				phoneContacts.clear();
226				while (cursor.moveToNext()) {
227					String profilePhoto = cursor.getString(cursor
228							.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI));
229					/*if (profilePhoto == null) {
230						profilePhoto = DEFAULT_PROFILE_PHOTO;
231					}*/
232					Contact contact = new Contact(
233							cursor.getString(cursor
234									.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
235							cursor.getString(cursor
236									.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
237							profilePhoto);
238					phoneContacts.add(contact);
239				}
240				updateAggregatedContacts();
241			}
242		});
243		mCursorLoader.startLoading();
244
245	}
246
247	@Override
248	void onBackendConnected() {
249		if (xmppConnectionService.getConversationCount() == 0) {
250			getActionBar().setDisplayHomeAsUpEnabled(false);
251			getActionBar().setHomeButtonEnabled(false);
252		}
253	}
254
255	@Override
256	public boolean onCreateOptionsMenu(Menu menu) {
257		// Inflate the menu; this adds items to the action bar if it is present.
258		getMenuInflater().inflate(R.menu.newconversation, menu);
259		return true;
260	}
261
262	@Override
263	public boolean onOptionsItemSelected(MenuItem item) {
264		switch (item.getItemId()) {
265		case R.id.action_settings:
266			startActivity(new Intent(this, SettingsActivity.class));
267			break;
268		case R.id.action_accounts:
269			startActivity(new Intent(this, ManageAccountActivity.class));
270			break;
271		default:
272			break;
273		}
274		return super.onOptionsItemSelected(item);
275	}
276
277}