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<>();
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 mListView.setFastScrollEnabled(true);
86 mContactsAdapter = new ListItemAdapter(this, 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 ListItem mListItem = contacts.get(position);
99 data.putExtra("contact", mListItem.getJid().toString());
100 String account = request.getStringExtra("account");
101 if (account == null && mListItem instanceof Contact) {
102 account = ((Contact) mListItem).getAccount().getJid().toBareJid().toString();
103 }
104 data.putExtra("account", account);
105 data.putExtra("conversation",
106 request.getStringExtra("conversation"));
107 setResult(RESULT_OK, data);
108 finish();
109 }
110 });
111 }
112
113 @Override
114 public boolean onCreateOptionsMenu(Menu menu) {
115 getMenuInflater().inflate(R.menu.choose_contact, menu);
116 MenuItem menuSearchView = menu.findItem(R.id.action_search);
117 View mSearchView = menuSearchView.getActionView();
118 mSearchEditText = (EditText) mSearchView
119 .findViewById(R.id.search_field);
120 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
121 menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
122 return true;
123 }
124
125 @Override
126 void onBackendConnected() {
127 filterContacts(null);
128 }
129
130 protected void filterContacts(String needle) {
131 this.contacts.clear();
132 for (Account account : xmppConnectionService.getAccounts()) {
133 if (account.getStatus() != Account.State.DISABLED) {
134 for (Contact contact : account.getRoster().getContacts()) {
135 if (contact.showInRoster() && contact.match(needle)) {
136 this.contacts.add(contact);
137 }
138 }
139 }
140 }
141 Collections.sort(this.contacts);
142 mContactsAdapter.notifyDataSetChanged();
143 }
144
145}