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 = xmppConnectionService.findOrCreateConversation(account, clickedContact);
 89				
 90				Intent viewConversationIntent = new Intent(v.getContext(),ConversationActivity.class);
 91				viewConversationIntent.setAction(Intent.ACTION_VIEW);
 92				viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, conversation.getUuid());
 93				viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
 94				viewConversationIntent.setFlags(viewConversationIntent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
 95				startActivity(viewConversationIntent);
 96			}
 97		});
 98		return view;
 99	}
100	
101	@Override
102	protected void onCreate(Bundle savedInstanceState) {
103		
104		super.onCreate(savedInstanceState);
105		
106		if (DatabaseBackend.getInstance(this).getConversationCount() < 1) {
107			getActionBar().setDisplayHomeAsUpEnabled(false);
108			getActionBar().setHomeButtonEnabled(false);
109		}
110		
111		setContentView(R.layout.activity_new_conversation);
112		CursorLoader mCursorLoader = new CursorLoader(this,
113				ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
114				null);
115		mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
116
117			@Override
118			public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
119				while (cursor.moveToNext()) {
120					String profilePhoto = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI));
121					if (profilePhoto == null) {
122						profilePhoto = DEFAULT_PROFILE_PHOTO;
123					}
124					Contact contact = new Contact(
125							cursor.getString(cursor
126									.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
127							cursor.getString(cursor
128									.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
129									profilePhoto
130									);
131					View contactView = getViewForContact(contact);
132					availablePhoneContacts.put(contact, getViewForContact(contact));
133					((LinearLayout) findViewById(R.id.phone_contacts)).addView(contactView);
134				}
135				updateAvailableContacts();
136			}
137		});
138		mCursorLoader.startLoading();
139
140		((TextView) findViewById(R.id.new_conversation_search)).addTextChangedListener(new TextWatcher() {
141			
142			@Override
143			public void onTextChanged(CharSequence s, int start, int before, int count) {
144				updateAvailableContacts();
145			}
146			
147			@Override
148			public void afterTextChanged(Editable s) {
149				// TODO Auto-generated method stub
150				
151			}
152
153			@Override
154			public void beforeTextChanged(CharSequence s, int start, int count,
155					int after) {
156				// TODO Auto-generated method stub
157				
158			}
159		});
160		
161	}
162	
163	protected void updateAvailableContacts() {
164		String search = ((TextView) findViewById(R.id.new_conversation_search)).getText().toString();
165		
166		LinearLayout phoneContacts = (LinearLayout) findViewById(R.id.phone_contacts);
167		filterAvailableContacts(phoneContacts,this.availablePhoneContacts,search);
168		
169		if (phoneContacts.getChildCount() == 0) {
170			findViewById(R.id.phone_contacts_header).setVisibility(View.GONE);
171		} else {
172			findViewById(R.id.phone_contacts_header).setVisibility(View.VISIBLE);
173		}
174		
175		LinearLayout jabberContacts = (LinearLayout) findViewById(R.id.jabber_contacts);
176		filterAvailableContacts(jabberContacts,this.availableJabberContacts,search);
177		if (jabberContacts.getChildCount() == 0) {
178			findViewById(R.id.jabber_contacts_header).setVisibility(View.GONE);
179		} else {
180			findViewById(R.id.jabber_contacts_header).setVisibility(View.VISIBLE);
181		}
182		
183		LinearLayout createNewContact = (LinearLayout) findViewById(R.id.create_new_contact);
184		Matcher matcher = VALID_JID.matcher(search);
185		if (matcher.find()) {
186			createNewContact.removeAllViews();
187			String name = search.split("@")[0];
188			newContact = new Contact(name,search,DEFAULT_PROFILE_PHOTO);
189			newContactView = getViewForContact(newContact);
190			newContactView.findViewById(R.id.contact_divider).setVisibility(View.GONE);
191			createNewContact.addView(newContactView);
192			createNewContact.setVisibility(View.VISIBLE);
193			((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.VISIBLE);
194		} else {
195			createNewContact.setVisibility(View.GONE);
196			((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.GONE);
197		}
198	}
199
200	private void filterAvailableContacts(
201			LinearLayout layout, LinkedHashMap<Contact, View> contacts, String search) {
202		layout.removeAllViews();
203		for(Entry<Contact, View> entry  : contacts.entrySet()) {		
204			
205			if (entry.getKey().match(search)) {
206				entry.getValue().setVisibility(View.VISIBLE);
207				entry.getValue().findViewById(R.id.contact_divider).setVisibility(View.VISIBLE);
208				layout.addView(entry.getValue());
209			}
210		}
211		int contactsCount = layout.getChildCount();
212		if (contactsCount>=1) {
213			View lastContact = layout.getChildAt(contactsCount - 1);
214			lastContact.findViewById(R.id.contact_divider).setVisibility(View.GONE);
215		}
216	}
217
218	@Override
219	void onBackendConnected() {
220		
221		getActionBar().setDisplayHomeAsUpEnabled(false);
222		getActionBar().setHomeButtonEnabled(false);
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}