1package eu.siacs.conversations.ui;
2
3import java.util.ArrayList;
4import java.util.Collections;
5
6import android.content.Context;
7import android.content.Intent;
8import android.os.Bundle;
9import android.text.Editable;
10import android.text.TextWatcher;
11import android.view.Menu;
12import android.view.MenuItem;
13import android.view.View;
14import android.view.inputmethod.InputMethodManager;
15import android.widget.AdapterView;
16import android.widget.ArrayAdapter;
17import android.widget.EditText;
18import android.widget.ListView;
19import eu.siacs.conversations.R;
20import eu.siacs.conversations.entities.Account;
21import eu.siacs.conversations.entities.Contact;
22import eu.siacs.conversations.entities.ListItem;
23import eu.siacs.conversations.ui.adapter.ListItemAdapter;
24
25public class ChooseContactActivity extends XmppActivity {
26
27 private ListView mListView;
28 private ArrayList<ListItem> contacts = new ArrayList<ListItem>();
29 private ArrayAdapter<ListItem> mContactsAdapter;
30
31 private EditText mSearchEditText;
32
33 private TextWatcher mSearchTextWatcher = new TextWatcher() {
34
35 @Override
36 public void afterTextChanged(Editable editable) {
37 filterContacts(editable.toString());
38 }
39
40 @Override
41 public void beforeTextChanged(CharSequence s, int start, int count,
42 int after) {
43 }
44
45 @Override
46 public void onTextChanged(CharSequence s, int start, int before,
47 int count) {
48 }
49 };
50
51 private MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
52
53 @Override
54 public boolean onMenuItemActionExpand(MenuItem item) {
55 mSearchEditText.post(new Runnable() {
56
57 @Override
58 public void run() {
59 mSearchEditText.requestFocus();
60 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
61 imm.showSoftInput(mSearchEditText,
62 InputMethodManager.SHOW_IMPLICIT);
63 }
64 });
65
66 return true;
67 }
68
69 @Override
70 public boolean onMenuItemActionCollapse(MenuItem item) {
71 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
72 imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(),
73 InputMethodManager.HIDE_IMPLICIT_ONLY);
74 mSearchEditText.setText("");
75 filterContacts(null);
76 return true;
77 }
78 };
79
80 @Override
81 public void onCreate(Bundle savedInstanceState) {
82 super.onCreate(savedInstanceState);
83 setContentView(R.layout.activity_choose_contact);
84 mListView = (ListView) findViewById(R.id.choose_contact_list);
85 mContactsAdapter = new ListItemAdapter(this, contacts);
86 mListView.setAdapter(mContactsAdapter);
87 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
88
89 @Override
90 public void onItemClick(AdapterView<?> arg0, View arg1,
91 int position, long arg3) {
92 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
93 imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(),
94 InputMethodManager.HIDE_IMPLICIT_ONLY);
95 Intent request = getIntent();
96 Intent data = new Intent();
97 ListItem mListItem = contacts.get(position);
98 data.putExtra("contact", mListItem.getJid());
99 String account = request.getStringExtra("account");
100 if (account == null && mListItem instanceof Contact) {
101 account = ((Contact) mListItem).getAccount().getJid();
102 }
103 data.putExtra("account", account);
104 data.putExtra("conversation",
105 request.getStringExtra("conversation"));
106 setResult(RESULT_OK, data);
107 finish();
108 }
109 });
110 }
111
112 @Override
113 public boolean onCreateOptionsMenu(Menu menu) {
114 getMenuInflater().inflate(R.menu.choose_contact, menu);
115 MenuItem menuSearchView = (MenuItem) menu.findItem(R.id.action_search);
116 View mSearchView = menuSearchView.getActionView();
117 mSearchEditText = (EditText) mSearchView
118 .findViewById(R.id.search_field);
119 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
120 menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
121 return true;
122 }
123
124 @Override
125 void onBackendConnected() {
126 filterContacts(null);
127 }
128
129 protected void filterContacts(String needle) {
130 this.contacts.clear();
131 for (Account account : xmppConnectionService.getAccounts()) {
132 if (account.getStatus() != Account.STATUS_DISABLED) {
133 for (Contact contact : account.getRoster().getContacts()) {
134 if (contact.showInRoster() && contact.match(needle)) {
135 this.contacts.add(contact);
136 }
137 }
138 }
139 }
140 Collections.sort(this.contacts);
141 mContactsAdapter.notifyDataSetChanged();
142 }
143
144}