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