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