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}