1package eu.siacs.conversations.ui;
2
3import android.content.Context;
4import android.os.Bundle;
5import android.text.Editable;
6import android.text.TextWatcher;
7import android.view.Menu;
8import android.view.MenuItem;
9import android.view.View;
10import android.view.inputmethod.InputMethodManager;
11import android.widget.ArrayAdapter;
12import android.widget.EditText;
13import android.widget.ListView;
14
15import java.util.ArrayList;
16import java.util.List;
17
18import eu.siacs.conversations.R;
19import eu.siacs.conversations.entities.ListItem;
20import eu.siacs.conversations.ui.adapter.ListItemAdapter;
21
22public abstract class AbstractSearchableListItemActivity extends XmppActivity {
23 private ListView mListView;
24 private final List<ListItem> listItems = new ArrayList<>();
25 private ArrayAdapter<ListItem> mListItemsAdapter;
26
27 private EditText mSearchEditText;
28
29 private final MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
30
31 @Override
32 public boolean onMenuItemActionExpand(final MenuItem item) {
33 mSearchEditText.post(new Runnable() {
34
35 @Override
36 public void run() {
37 mSearchEditText.requestFocus();
38 final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
39 imm.showSoftInput(mSearchEditText,
40 InputMethodManager.SHOW_IMPLICIT);
41 }
42 });
43
44 return true;
45 }
46
47 @Override
48 public boolean onMenuItemActionCollapse(final MenuItem item) {
49 final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
50 imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(),
51 InputMethodManager.HIDE_IMPLICIT_ONLY);
52 mSearchEditText.setText("");
53 filterContacts();
54 return true;
55 }
56 };
57
58 private final TextWatcher mSearchTextWatcher = new TextWatcher() {
59
60 @Override
61 public void afterTextChanged(final Editable editable) {
62 filterContacts(editable.toString());
63 }
64
65 @Override
66 public void beforeTextChanged(final CharSequence s, final int start, final int count,
67 final int after) {
68 }
69
70 @Override
71 public void onTextChanged(final CharSequence s, final int start, final int before,
72 final int count) {
73 }
74 };
75
76 public ListView getListView() {
77 return mListView;
78 }
79
80 public List<ListItem> getListItems() {
81 return listItems;
82 }
83
84 public EditText getSearchEditText() {
85 return mSearchEditText;
86 }
87
88 public ArrayAdapter<ListItem> getListItemAdapter() {
89 return mListItemsAdapter;
90 }
91
92 @Override
93 public void onCreate(final Bundle savedInstanceState) {
94 super.onCreate(savedInstanceState);
95 setContentView(R.layout.activity_choose_contact);
96 mListView = (ListView) findViewById(R.id.choose_contact_list);
97 mListView.setFastScrollEnabled(true);
98 mListItemsAdapter = new ListItemAdapter(this, listItems);
99 mListView.setAdapter(mListItemsAdapter);
100 }
101
102 @Override
103 public boolean onCreateOptionsMenu(final Menu menu) {
104 getMenuInflater().inflate(R.menu.choose_contact, menu);
105 final MenuItem menuSearchView = menu.findItem(R.id.action_search);
106 final View mSearchView = menuSearchView.getActionView();
107 mSearchEditText = (EditText) mSearchView
108 .findViewById(R.id.search_field);
109 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
110 menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
111 return true;
112 }
113
114 protected void filterContacts() {
115 final String needle = mSearchEditText != null ? mSearchEditText.getText().toString() : null;
116 if (needle != null && !needle.isEmpty()) {
117 filterContacts(needle);
118 } else {
119 filterContacts(null);
120 }
121 }
122
123 protected abstract void filterContacts(final String needle);
124
125 @Override
126 void onBackendConnected() {
127 filterContacts();
128 }
129}