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