AbstractSearchableListItemActivity.java

  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}