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