NewConversationActivity.java

  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}