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