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}