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(getApplicationContext(),
86 contacts);
87 mListView.setAdapter(mContactsAdapter);
88 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
89
90 @Override
91 public void onItemClick(AdapterView<?> arg0, View arg1,
92 int position, long arg3) {
93 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
94 imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(),
95 InputMethodManager.HIDE_IMPLICIT_ONLY);
96 Intent request = getIntent();
97 Intent data = new Intent();
98 data.putExtra("contact", contacts.get(position).getJid());
99 data.putExtra("account", request.getStringExtra("account"));
100 data.putExtra("conversation",
101 request.getStringExtra("conversation"));
102 setResult(RESULT_OK, data);
103 finish();
104 }
105 });
106 }
107
108 @Override
109 public boolean onCreateOptionsMenu(Menu menu) {
110 getMenuInflater().inflate(R.menu.choose_contact, menu);
111 MenuItem menuSearchView = (MenuItem) menu.findItem(R.id.action_search);
112 View mSearchView = menuSearchView.getActionView();
113 mSearchEditText = (EditText) mSearchView
114 .findViewById(R.id.search_field);
115 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
116 menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
117 return true;
118 }
119
120 @Override
121 void onBackendConnected() {
122 filterContacts(null);
123 }
124
125 protected void filterContacts(String needle) {
126 this.contacts.clear();
127 for (Account account : xmppConnectionService.getAccounts()) {
128 if (account.getStatus() != Account.STATUS_DISABLED) {
129 for (Contact contact : account.getRoster().getContacts()) {
130 if (contact.showInRoster() && contact.match(needle)) {
131 this.contacts.add(contact);
132 }
133 }
134 }
135 }
136 Collections.sort(this.contacts);
137 mContactsAdapter.notifyDataSetChanged();
138 }
139
140}