package org.wikipedia.views;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.widget.SearchView;
import android.text.InputFilter;
import android.text.Spanned;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import org.wikipedia.R;
import org.wikipedia.richtext.RichTextUtil;
import java.util.Arrays;
/** {@link SearchView} that exposes contextual action bar callbacks. */
public class CabSearchView extends SearchView {
private static final boolean DEFAULT_CAB_ENABLED = true;
private boolean mCabEnabled;
public CabSearchView(Context context) {
this(context, null);
}
public CabSearchView(Context context, AttributeSet attrs) {
this(context, attrs, android.support.v7.appcompat.R.attr.searchViewStyle);
}
public CabSearchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
SearchView.SearchAutoComplete searchSrcTextView = (SearchAutoComplete) findViewById(R.id.search_src_text);
searchSrcTextView.setCustomSelectionActionModeCallback(new Callback());
addFilter(searchSrcTextView, new PlainTextInputFilter());
initLayoutAttributes(attrs, defStyleAttr);
}
public boolean isCabEnabled() {
return mCabEnabled;
}
public void setCabEnabled(boolean enabled) {
mCabEnabled = enabled;
}
private void addFilter(TextView textView, InputFilter filter) {
InputFilter[] filters = textView.getFilters();
InputFilter[] newFilters = Arrays.copyOf(filters, filters.length + 1);
newFilters[filters.length] = filter;
textView.setFilters(newFilters);
}
private void initLayoutAttributes(AttributeSet attrs, int defStyleAttr) {
TypedArray attrsArray = getContext().obtainStyledAttributes(attrs,
R.styleable.CabSearchView, defStyleAttr, 0);
setCabEnabled(attrsArray.getBoolean(R.styleable.CabSearchView_cabEnabled,
DEFAULT_CAB_ENABLED));
attrsArray.recycle();
}
private class Callback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return isCabEnabled();
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override public void onDestroyActionMode(ActionMode mode) { }
}
private static class PlainTextInputFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {
return RichTextUtil.stripRichText(source, start, end).subSequence(start, end);
}
}
}