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 ListItemAdapter mListItemsAdapter;
31
32 protected MenuItem mMenuSearchView;
33 protected EditText mSearchEditText;
34
35 private final MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
36
37 @Override
38 public boolean onMenuItemActionExpand(final MenuItem item) {
39 mSearchEditText.post(() -> {
40 mSearchEditText.requestFocus();
41 final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
42 imm.showSoftInput(mSearchEditText, InputMethodManager.SHOW_IMPLICIT);
43 });
44
45 return true;
46 }
47
48 @Override
49 public boolean onMenuItemActionCollapse(final MenuItem item) {
50 final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
51 imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), 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 binding.chooseContactList;
78 }
79
80 public List<ListItem> getListItems() {
81 return listItems;
82 }
83
84 public EditText getSearchEditText() {
85 return mSearchEditText;
86 }
87
88 public ListItemAdapter getListItemAdapter() {
89 return mListItemsAdapter;
90 }
91
92 @Override
93 public void onCreate(final Bundle savedInstanceState) {
94 super.onCreate(savedInstanceState);
95 this.binding = DataBindingUtil.setContentView(this,R.layout.activity_choose_contact);
96 setSupportActionBar(binding.toolbar);
97 configureActionBar(getSupportActionBar());
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 mMenuSearchView = menu.findItem(R.id.action_search);
107 final View mSearchView = mMenuSearchView.getActionView();
108 mSearchEditText = mSearchView.findViewById(R.id.search_field);
109 mSearchEditText.addTextChangedListener(mSearchTextWatcher);
110 mSearchEditText.setHint(R.string.search_contacts);
111 mSearchEditText.setOnEditorActionListener(this);
112 mMenuSearchView.setOnActionExpandListener(mOnActionExpandListener);
113 return true;
114 }
115
116 protected void filterContacts() {
117 final String needle = mSearchEditText != null ? mSearchEditText.getText().toString() : null;
118 if (needle != null && !needle.isEmpty()) {
119 filterContacts(needle);
120 } else {
121 filterContacts(null);
122 }
123 }
124
125 protected abstract void filterContacts(final String needle);
126
127 @Override
128 void onBackendConnected() {
129 filterContacts();
130 }
131
132 @Override
133 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
134 return false;
135 }
136}