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.KeyEvent;
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;
15import android.widget.TextView;
16
17import androidx.databinding.DataBindingUtil;
18
19import java.util.ArrayList;
20import java.util.List;
21
22import eu.siacs.conversations.R;
23import eu.siacs.conversations.databinding.ActivityChooseContactBinding;
24import eu.siacs.conversations.entities.ListItem;
25import eu.siacs.conversations.ui.adapter.ListItemAdapter;
26
27public abstract class AbstractSearchableListItemActivity extends XmppActivity implements TextView.OnEditorActionListener {
28 protected ActivityChooseContactBinding binding;
29 private final List<ListItem> listItems = new ArrayList<>();
30 private ArrayAdapter<ListItem> mListItemsAdapter;
31
32 private EditText mSearchEditText;
33
34 private final MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
35
36 @Override
37 public boolean onMenuItemActionExpand(final MenuItem item) {
38 mSearchEditText.post(() -> {
39 mSearchEditText.requestFocus();
40 final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
41 imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
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(), InputMethodManager.HIDE_IMPLICIT_ONLY);
51 mSearchEditText.setText("");
52 filterContacts();
53 return true;
54 }
55 };
56
57 private final TextWatcher mSearchTextWatcher = new TextWatcher() {
58
59 @Override
60 public void afterTextChanged(final Editable editable) {
61 filterContacts(editable.toString());
62 }
63
64 @Override
65 public void beforeTextChanged(final CharSequence s, final int start, final int count,
66 final int after) {
67 }
68
69 @Override
70 public void onTextChanged(final CharSequence s, final int start, final int before,
71 final int count) {
72 }
73 };
74
75 public ListView getListView() {
76 return binding.chooseContactList;
77 }
78
79 public List<ListItem> getListItems() {
80 return listItems;
81 }
82
83 public EditText getSearchEditText() {
84 return mSearchEditText;
85 }
86
87 public ArrayAdapter<ListItem> getListItemAdapter() {
88 return mListItemsAdapter;
89 }
90
91 @Override
92 public void onCreate(final Bundle savedInstanceState) {
93 super.onCreate(savedInstanceState);
94 this.binding = DataBindingUtil.setContentView(this,R.layout.activity_choose_contact);
95 setSupportActionBar(binding.toolbar);
96 configureActionBar(getSupportActionBar());
97 this.binding.chooseContactList.setFastScrollEnabled(true);
98 mListItemsAdapter = new ListItemAdapter(this, listItems);
99 this.binding.chooseContactList.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 = mSearchView.findViewById(R.id.search_field);
108 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
109 mSearchEditText.setHint(R.string.search_contacts);
110 mSearchEditText.setOnEditorActionListener(this);
111 menuSearchView.setOnActionExpandListener(mOnActionExpandListener);
112 return true;
113 }
114
115 protected void filterContacts() {
116 final String needle = mSearchEditText != null ? mSearchEditText.getText().toString() : null;
117 if (needle != null && !needle.isEmpty()) {
118 filterContacts(needle);
119 } else {
120 filterContacts(null);
121 }
122 }
123
124 protected abstract void filterContacts(final String needle);
125
126 @Override
127 void onBackendConnected() {
128 filterContacts();
129 }
130
131 @Override
132 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
133 return false;
134 }
135}