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