1package de.gultsch.chat.ui;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.Comparator;
6import java.util.List;
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.utils.Validator;
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.ViewGroup;
23import android.widget.AdapterView;
24import android.widget.AdapterView.OnItemClickListener;
25import android.widget.ArrayAdapter;
26import android.widget.EditText;
27import android.widget.ListView;
28import android.widget.TextView;
29import android.widget.ImageView;
30import android.content.Context;
31import android.content.CursorLoader;
32import android.content.Intent;
33import android.content.Loader;
34import android.content.Loader.OnLoadCompleteListener;
35import android.database.Cursor;
36
37public class NewConversationActivity extends XmppActivity {
38
39 protected List<Contact> phoneContacts = new ArrayList<Contact>();
40 protected List<Contact> rosterContacts = new ArrayList<Contact>();
41 protected List<Contact> aggregatedContacts = new ArrayList<Contact>();
42 protected ListView contactsView;
43 protected ArrayAdapter<Contact> contactsAdapter;
44
45 protected EditText search;
46 protected String searchString = "";
47 private TextView contactsHeader;
48
49 protected void updateAggregatedContacts() {
50
51 aggregatedContacts.clear();
52 for (Contact contact : phoneContacts) {
53 if (contact.match(searchString))
54 aggregatedContacts.add(contact);
55 }
56 for (Contact contact : rosterContacts) {
57 if (contact.match(searchString))
58 aggregatedContacts.add(contact);
59 }
60
61 Collections.sort(aggregatedContacts, new Comparator<Contact>() {
62
63 @Override
64 public int compare(Contact lhs, Contact rhs) {
65 return lhs.getDisplayName().compareTo(rhs.getDisplayName());
66 }
67 });
68
69 if (aggregatedContacts.size() == 0) {
70
71 if (Validator.isValidJid(searchString)) {
72 String name = searchString.split("@")[0];
73 Contact newContact = new Contact(name, searchString,
74 DEFAULT_PROFILE_PHOTO);
75 aggregatedContacts.add(newContact);
76 contactsHeader.setText("Create new contact");
77 } else {
78 contactsHeader.setText("Contacts");
79 }
80 } else {
81 contactsHeader.setText("Contacts");
82 }
83
84 contactsAdapter.notifyDataSetChanged();
85 }
86
87 static final String[] PROJECTION = new String[] {
88 ContactsContract.Data.CONTACT_ID,
89 ContactsContract.Data.DISPLAY_NAME,
90 ContactsContract.Data.PHOTO_THUMBNAIL_URI,
91 ContactsContract.CommonDataKinds.Im.DATA };
92
93 // This is the select criteria
94 static final String SELECTION = "(" + ContactsContract.Data.MIMETYPE
95 + "=\"" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
96 + "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
97 + "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
98 + "\")";
99 protected static final String DEFAULT_PROFILE_PHOTO = "android.resource://de.gultsch.chat/"
100 + R.drawable.ic_profile;
101
102 @Override
103 protected void onCreate(Bundle savedInstanceState) {
104
105 super.onCreate(savedInstanceState);
106
107 setContentView(R.layout.activity_new_conversation);
108
109 contactsHeader = (TextView) findViewById(R.id.contacts_header);
110
111 search = (EditText) findViewById(R.id.new_conversation_search);
112 search.addTextChangedListener(new TextWatcher() {
113
114 @Override
115 public void onTextChanged(CharSequence s, int start, int before,
116 int count) {
117 searchString = search.getText().toString();
118 updateAggregatedContacts();
119 }
120
121 @Override
122 public void afterTextChanged(Editable s) {
123 // TODO Auto-generated method stub
124
125 }
126
127 @Override
128 public void beforeTextChanged(CharSequence s, int start, int count,
129 int after) {
130 // TODO Auto-generated method stub
131
132 }
133 });
134
135 contactsView = (ListView) findViewById(R.id.contactList);
136 contactsAdapter = new ArrayAdapter<Contact>(getApplicationContext(),
137 R.layout.contact, aggregatedContacts) {
138 @Override
139 public View getView(int position, View view, ViewGroup parent) {
140 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
141 if (view == null) {
142 view = (View) inflater.inflate(R.layout.contact, null);
143 }
144
145 ((TextView) view.findViewById(R.id.contact_display_name))
146 .setText(getItem(position).getDisplayName());
147 ((TextView) view.findViewById(R.id.contact_jid))
148 .setText(getItem(position).getJid());
149 ((ImageView) view.findViewById(R.id.contact_photo))
150 .setImageURI(getItem(position).getProfilePhoto());
151 return view;
152 }
153 };
154 contactsView.setAdapter(contactsAdapter);
155 contactsView.setOnItemClickListener(new OnItemClickListener() {
156
157 @Override
158 public void onItemClick(AdapterView<?> arg0, View view, int pos,
159 long arg3) {
160 Contact clickedContact = aggregatedContacts.get(pos);
161 Log.d("gultsch",
162 "clicked on " + clickedContact.getDisplayName());
163
164 Account account = new Account();
165
166 Conversation conversation = xmppConnectionService
167 .findOrCreateConversation(account, clickedContact);
168
169 Intent viewConversationIntent = new Intent(view.getContext(),
170 ConversationActivity.class);
171 viewConversationIntent.setAction(Intent.ACTION_VIEW);
172 viewConversationIntent.putExtra(
173 ConversationActivity.CONVERSATION,
174 conversation.getUuid());
175 viewConversationIntent
176 .setType(ConversationActivity.VIEW_CONVERSATION);
177 viewConversationIntent.setFlags(viewConversationIntent
178 .getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
179 startActivity(viewConversationIntent);
180 }
181 });
182 }
183
184 @Override
185 public void onStart() {
186 super.onStart();
187
188 CursorLoader mCursorLoader = new CursorLoader(this,
189 ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
190 null);
191 mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
192
193 @Override
194 public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
195 phoneContacts.clear();
196 while (cursor.moveToNext()) {
197 String profilePhoto = cursor.getString(cursor
198 .getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI));
199 if (profilePhoto == null) {
200 profilePhoto = DEFAULT_PROFILE_PHOTO;
201 }
202 Contact contact = new Contact(
203 cursor.getString(cursor
204 .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
205 cursor.getString(cursor
206 .getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
207 profilePhoto);
208 phoneContacts.add(contact);
209 }
210 updateAggregatedContacts();
211 }
212 });
213 mCursorLoader.startLoading();
214
215 }
216
217 @Override
218 void onBackendConnected() {
219 if (xmppConnectionService.getConversationCount() == 0) {
220 getActionBar().setDisplayHomeAsUpEnabled(false);
221 getActionBar().setHomeButtonEnabled(false);
222 }
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}