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.Beautifier;
13import de.gultsch.chat.utils.Validator;
14import android.net.Uri;
15import android.os.Bundle;
16import android.provider.ContactsContract;
17import android.text.Editable;
18import android.text.TextWatcher;
19import android.util.Log;
20import android.view.LayoutInflater;
21import android.view.Menu;
22import android.view.MenuItem;
23import android.view.View;
24import android.view.ViewGroup;
25import android.widget.AdapterView;
26import android.widget.AdapterView.OnItemClickListener;
27import android.widget.ArrayAdapter;
28import android.widget.EditText;
29import android.widget.ListView;
30import android.widget.TextView;
31import android.widget.ImageView;
32import android.app.Activity;
33import android.app.AlertDialog;
34import android.content.Context;
35import android.content.CursorLoader;
36import android.content.DialogInterface;
37import android.content.DialogInterface.OnClickListener;
38import android.content.Intent;
39import android.content.Loader;
40import android.content.Loader.OnLoadCompleteListener;
41import android.database.Cursor;
42
43public class NewConversationActivity extends XmppActivity {
44
45 protected List<Contact> phoneContacts = new ArrayList<Contact>();
46 protected List<Contact> rosterContacts = new ArrayList<Contact>();
47 protected List<Contact> aggregatedContacts = new ArrayList<Contact>();
48 protected ListView contactsView;
49 protected ArrayAdapter<Contact> contactsAdapter;
50
51 protected EditText search;
52 protected String searchString = "";
53 private TextView contactsHeader;
54
55 protected void updateAggregatedContacts() {
56
57 aggregatedContacts.clear();
58 for (Contact contact : phoneContacts) {
59 if (contact.match(searchString))
60 aggregatedContacts.add(contact);
61 }
62 for (Contact contact : rosterContacts) {
63 if (contact.match(searchString))
64 aggregatedContacts.add(contact);
65 }
66
67 Collections.sort(aggregatedContacts, new Comparator<Contact>() {
68
69 @Override
70 public int compare(Contact lhs, Contact rhs) {
71 return lhs.getDisplayName().compareTo(rhs.getDisplayName());
72 }
73 });
74
75 if (aggregatedContacts.size() == 0) {
76
77 if (Validator.isValidJid(searchString)) {
78 String name = searchString.split("@")[0];
79 Contact newContact = new Contact(name, searchString,null);
80 aggregatedContacts.add(newContact);
81 contactsHeader.setText("Create new contact");
82 } else {
83 contactsHeader.setText("Contacts");
84 }
85 } else {
86 contactsHeader.setText("Contacts");
87 }
88
89 contactsAdapter.notifyDataSetChanged();
90 }
91
92 static final String[] PROJECTION = new String[] {
93 ContactsContract.Data.CONTACT_ID,
94 ContactsContract.Data.DISPLAY_NAME,
95 ContactsContract.Data.PHOTO_THUMBNAIL_URI,
96 ContactsContract.CommonDataKinds.Im.DATA };
97
98 // This is the select criteria
99 static final String SELECTION = "(" + ContactsContract.Data.MIMETYPE
100 + "=\"" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
101 + "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
102 + "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
103 + "\")";
104
105 @Override
106 protected void onCreate(Bundle savedInstanceState) {
107
108 super.onCreate(savedInstanceState);
109
110 setContentView(R.layout.activity_new_conversation);
111
112 contactsHeader = (TextView) findViewById(R.id.contacts_header);
113
114 search = (EditText) findViewById(R.id.new_conversation_search);
115 search.addTextChangedListener(new TextWatcher() {
116
117 @Override
118 public void onTextChanged(CharSequence s, int start, int before,
119 int count) {
120 searchString = search.getText().toString();
121 updateAggregatedContacts();
122 }
123
124 @Override
125 public void afterTextChanged(Editable s) {
126 // TODO Auto-generated method stub
127
128 }
129
130 @Override
131 public void beforeTextChanged(CharSequence s, int start, int count,
132 int after) {
133 // TODO Auto-generated method stub
134
135 }
136 });
137
138 contactsView = (ListView) findViewById(R.id.contactList);
139 contactsAdapter = new ArrayAdapter<Contact>(getApplicationContext(),
140 R.layout.contact, aggregatedContacts) {
141 @Override
142 public View getView(int position, View view, ViewGroup parent) {
143 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
144 if (view == null) {
145 view = (View) inflater.inflate(R.layout.contact, null);
146 }
147
148 ((TextView) view.findViewById(R.id.contact_display_name))
149 .setText(getItem(position).getDisplayName());
150 ((TextView) view.findViewById(R.id.contact_jid))
151 .setText(getItem(position).getJid());
152 String profilePhoto = getItem(position).getProfilePhoto();
153 ImageView imageView = (ImageView) view.findViewById(R.id.contact_photo);
154 if (profilePhoto!=null) {
155 imageView.setImageURI(Uri.parse(profilePhoto));
156 } else {
157 imageView.setImageBitmap(Beautifier.getUnknownContactPicture(getItem(position).getDisplayName(),90));
158 }
159 return view;
160 }
161 };
162 contactsView.setAdapter(contactsAdapter);
163 final Activity activity = this;
164 contactsView.setOnItemClickListener(new OnItemClickListener() {
165
166 @Override
167 public void onItemClick(AdapterView<?> arg0, final View view, int pos,
168 long arg3) {
169 final Contact clickedContact = aggregatedContacts.get(pos);
170 Log.d("gultsch",
171 "clicked on " + clickedContact.getDisplayName());
172
173 final List<Account> accounts = xmppConnectionService.getAccounts();
174 if (accounts.size() == 1) {
175 startConversation(clickedContact, accounts.get(0));
176 } else {
177 String[] accountList = new String[accounts.size()];
178 for(int i = 0; i < accounts.size(); ++i) {
179 accountList[i] = accounts.get(i).getJid();
180 }
181
182 AlertDialog.Builder builder = new AlertDialog.Builder(activity);
183 builder.setTitle("Choose account");
184 builder.setSingleChoiceItems(accountList,0,new OnClickListener() {
185
186 @Override
187 public void onClick(DialogInterface dialog, int which) {
188 Account account = accounts.get(which);
189 startConversation(clickedContact, account);
190 }
191 });
192 builder.create().show();
193 }
194 }
195 });
196 }
197
198 public void startConversation(Contact contact, Account account) {
199 Conversation conversation = xmppConnectionService
200 .findOrCreateConversation(account, contact);
201
202 Intent viewConversationIntent = new Intent(this,ConversationActivity.class);
203 viewConversationIntent.setAction(Intent.ACTION_VIEW);
204 viewConversationIntent.putExtra(
205 ConversationActivity.CONVERSATION,
206 conversation.getUuid());
207 viewConversationIntent
208 .setType(ConversationActivity.VIEW_CONVERSATION);
209 viewConversationIntent.setFlags(viewConversationIntent
210 .getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
211 startActivity(viewConversationIntent);
212 }
213
214 @Override
215 public void onStart() {
216 super.onStart();
217
218 CursorLoader mCursorLoader = new CursorLoader(this,
219 ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
220 null);
221 mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
222
223 @Override
224 public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
225 phoneContacts.clear();
226 while (cursor.moveToNext()) {
227 String profilePhoto = cursor.getString(cursor
228 .getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI));
229 /*if (profilePhoto == null) {
230 profilePhoto = DEFAULT_PROFILE_PHOTO;
231 }*/
232 Contact contact = new Contact(
233 cursor.getString(cursor
234 .getColumnIndex(ContactsContract.Data.DISPLAY_NAME)),
235 cursor.getString(cursor
236 .getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
237 profilePhoto);
238 phoneContacts.add(contact);
239 }
240 updateAggregatedContacts();
241 }
242 });
243 mCursorLoader.startLoading();
244
245 }
246
247 @Override
248 void onBackendConnected() {
249 if (xmppConnectionService.getConversationCount() == 0) {
250 getActionBar().setDisplayHomeAsUpEnabled(false);
251 getActionBar().setHomeButtonEnabled(false);
252 }
253 }
254
255 @Override
256 public boolean onCreateOptionsMenu(Menu menu) {
257 // Inflate the menu; this adds items to the action bar if it is present.
258 getMenuInflater().inflate(R.menu.newconversation, menu);
259 return true;
260 }
261
262 @Override
263 public boolean onOptionsItemSelected(MenuItem item) {
264 switch (item.getItemId()) {
265 case R.id.action_settings:
266 startActivity(new Intent(this, SettingsActivity.class));
267 break;
268 case R.id.action_accounts:
269 startActivity(new Intent(this, ManageAccountActivity.class));
270 break;
271 default:
272 break;
273 }
274 return super.onOptionsItemSelected(item);
275 }
276
277}