NewConversationActivity.java

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