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.Contact;
9import de.gultsch.chat.R;
10import android.os.Bundle;
11import android.provider.ContactsContract;
12import android.text.Editable;
13import android.text.TextWatcher;
14import android.util.Log;
15import android.view.LayoutInflater;
16import android.view.View;
17import android.view.View.OnClickListener;
18import android.widget.LinearLayout;
19import android.widget.TextView;
20import android.widget.ImageView;
21import android.app.Activity;
22import android.content.Context;
23import android.content.CursorLoader;
24import android.content.Intent;
25import android.content.Loader;
26import android.content.Loader.OnLoadCompleteListener;
27import android.database.Cursor;
28
29public class NewConversationActivity extends Activity {
30
31 final protected LinkedHashMap<Contact, View> availablePhoneContacts = new LinkedHashMap<Contact, View>();
32 final protected LinkedHashMap<Contact, View> availableJabberContacts = new LinkedHashMap<Contact, View>();
33 protected View newContactView;
34 protected Contact newContact;
35
36 public static final Pattern VALID_JID =
37 Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
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
52 protected View getViewForContact(Contact contact) {
53 LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
54 View view = (View) inflater.inflate(R.layout.contact,null);
55 ((TextView) view.findViewById(R.id.contact_display_name)).setText(contact.getDisplayName());
56 ((TextView) view.findViewById(R.id.contact_jid)).setText(contact.getJid());
57 if (contact.getProfilePhoto() != null) {
58 ((ImageView) view.findViewById(R.id.contact_photo)).setImageURI(contact.getProfilePhoto());
59 }
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 setContentView(R.layout.activity_new_conversation);
97 CursorLoader mCursorLoader = new CursorLoader(this,
98 ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
99 null);
100 mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
101
102 @Override
103 public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
104 while (cursor.moveToNext()) {
105 Contact contact = new Contact(
106 cursor.getString(cursor
107 .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
108 cursor.getString(cursor
109 .getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
110 cursor.getString(cursor
111 .getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI)));
112 View contactView = getViewForContact(contact);
113 availablePhoneContacts.put(contact, getViewForContact(contact));
114 ((LinearLayout) findViewById(R.id.phone_contacts)).addView(contactView);
115 }
116 updateAvailableContacts();
117 }
118 });
119 mCursorLoader.startLoading();
120
121 ((TextView) findViewById(R.id.new_conversation_search)).addTextChangedListener(new TextWatcher() {
122
123 @Override
124 public void onTextChanged(CharSequence s, int start, int before, int count) {
125 updateAvailableContacts();
126 }
127
128 @Override
129 public void afterTextChanged(Editable s) {
130 // TODO Auto-generated method stub
131
132 }
133
134 @Override
135 public void beforeTextChanged(CharSequence s, int start, int count,
136 int after) {
137 // TODO Auto-generated method stub
138
139 }
140 });
141
142 }
143
144 protected void updateAvailableContacts() {
145 String search = ((TextView) findViewById(R.id.new_conversation_search)).getText().toString();
146
147 LinearLayout phoneContacts = (LinearLayout) findViewById(R.id.phone_contacts);
148 filterAvailableContacts(phoneContacts,this.availablePhoneContacts,search);
149
150 if (phoneContacts.getChildCount() == 0) {
151 findViewById(R.id.phone_contacts_header).setVisibility(View.GONE);
152 } else {
153 findViewById(R.id.phone_contacts_header).setVisibility(View.VISIBLE);
154 }
155
156 LinearLayout jabberContacts = (LinearLayout) findViewById(R.id.jabber_contacts);
157 filterAvailableContacts(jabberContacts,this.availableJabberContacts,search);
158 if (jabberContacts.getChildCount() == 0) {
159 findViewById(R.id.jabber_contacts_header).setVisibility(View.GONE);
160 } else {
161 findViewById(R.id.jabber_contacts_header).setVisibility(View.VISIBLE);
162 }
163
164 LinearLayout createNewContact = (LinearLayout) findViewById(R.id.create_new_contact);
165 Matcher matcher = VALID_JID.matcher(search);
166 if (matcher.find()) {
167 createNewContact.removeAllViews();
168 String name = search.split("@")[0];
169 newContact = new Contact(name,search,null);
170 newContactView = getViewForContact(newContact);
171 newContactView.findViewById(R.id.contact_divider).setVisibility(View.GONE);
172 createNewContact.addView(newContactView);
173 createNewContact.setVisibility(View.VISIBLE);
174 ((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.VISIBLE);
175 } else {
176 createNewContact.setVisibility(View.GONE);
177 ((TextView) findViewById(R.id.new_contact_header)).setVisibility(View.GONE);
178 }
179 }
180
181 private void filterAvailableContacts(
182 LinearLayout layout, LinkedHashMap<Contact, View> contacts, String search) {
183 layout.removeAllViews();
184 for(Entry<Contact, View> entry : contacts.entrySet()) {
185
186 if (entry.getKey().match(search)) {
187 entry.getValue().setVisibility(View.VISIBLE);
188 entry.getValue().findViewById(R.id.contact_divider).setVisibility(View.VISIBLE);
189 layout.addView(entry.getValue());
190 }
191 }
192 int contactsCount = layout.getChildCount();
193 if (contactsCount>=1) {
194 View lastContact = layout.getChildAt(contactsCount - 1);
195 lastContact.findViewById(R.id.contact_divider).setVisibility(View.GONE);
196 }
197 }
198}