/* * Created by Angel Leon (@gubatron), Alden Torres (aldenml) * Copyright (c) 2011, 2012, FrostWire(TM). All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.bt.download.android.gui.views; import android.content.Context; import android.content.res.TypedArray; import android.text.Editable; import android.text.TextWatcher; import android.text.method.ReplacementTransformationMethod; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.AdapterView.OnItemClickListener; import android.widget.AutoCompleteTextView; import android.widget.Filterable; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.RelativeLayout; import com.bt.download.android.R; /** * @author gubatron * @author aldenml * */ public class ClearableEditTextView extends RelativeLayout { private FWAutoCompleteTextView input; private ImageView imageSearch; private ImageButton buttonClear; private OnActionListener listener; private String hint; public ClearableEditTextView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.ClearableEditTextView); hint = arr.getString(R.styleable.ClearableEditTextView_clearable_hint); arr.recycle(); } public void setShowKeyboardOnPaste(boolean show) { input.setShowKeyboardOnPaste(show); } public boolean isShowKeyboardOnPaste() { return input.isShowKeyboardOnPaste(); } public OnActionListener getOnActionListener() { return listener; } public void setOnActionListener(OnActionListener listener) { this.listener = listener; } @Override public OnFocusChangeListener getOnFocusChangeListener() { return input.getOnFocusChangeListener(); } @Override public void setOnFocusChangeListener(OnFocusChangeListener l) { input.setOnFocusChangeListener(l); } @Override public void setOnKeyListener(OnKeyListener l) { input.setOnKeyListener(l); } public OnItemClickListener getOnItemClickListener() { return input.getOnItemClickListener(); } public void setOnItemClickListener(OnItemClickListener l) { input.setOnItemClickListener(l); } public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { input.setAdapter(adapter); } public String getText() { return input.getText().toString(); } public void setText(String text) { input.setText(text); } public void setListSelection(int position) { input.setListSelection(position); } public void dismissDropDown() { input.dismissDropDown(); } public void selectAll() { input.selectAll(); } @Override public void setFocusableInTouchMode(boolean focusableInTouchMode) { super.setFocusable(focusableInTouchMode); input.setFocusableInTouchMode(focusableInTouchMode); } @Override public void setFocusable(boolean focusable) { super.setFocusable(focusable); input.setFocusable(focusable); } public AutoCompleteTextView getAutoCompleteTextView() { return input; } public String getHint() { return (String) input.getHint(); } public void setHint(String hint) { input.setHint(hint); } /** * This textview comes by default with a magnifier "search" icon. * Use this after only after the view has been inflated. */ public void replaceSearchIconDrawable(int drawableId) { imageSearch.setImageResource(drawableId); } @Override protected void onFinishInflate() { super.onFinishInflate(); View.inflate(getContext(), R.layout.view_clearable_edittext, this); input = (FWAutoCompleteTextView) findViewById(R.id.view_clearable_edit_text_input); input.setHint(hint); input.setTransformationMethod(new SingleLineTransformationMethod()); input.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() > 0) { imageSearch.setVisibility(View.GONE); buttonClear.setVisibility(View.VISIBLE); } else { imageSearch.setVisibility(View.VISIBLE); buttonClear.setVisibility(View.GONE); } ClearableEditTextView.this.onTextChanged(s.toString()); input.setListSelection(-1); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } }); // workaround for android issue: http://code.google.com/p/android/issues/detail?id=2516 // the comment http://code.google.com/p/android/issues/detail?id=2516#c9 // seems a little overkill for this situation, but it could work for a general situation. input.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { input.requestFocusFromTouch(); return false; } }); imageSearch = (ImageView) findViewById(R.id.view_clearable_edit_text_image_search); imageSearch.setVisibility(RelativeLayout.VISIBLE); buttonClear = (ImageButton) findViewById(R.id.view_clearable_edit_text_button_clear); buttonClear.setVisibility(RelativeLayout.GONE); buttonClear.setOnClickListener(new OnClickListener() { public void onClick(View v) { input.setText(""); onClear(); } }); } private void onTextChanged(String str) { if (listener != null) { listener.onTextChanged(this, str.trim()); } } private void onClear() { if (listener != null) { listener.onClear(this); } } public static interface OnActionListener { public void onTextChanged(View v, String str); public void onClear(View v); } private static class SingleLineTransformationMethod extends ReplacementTransformationMethod { private static char[] ORIGINAL = new char[] { '\n', '\r' }; private static char[] REPLACEMENT = new char[] { '\uFEFF', '\uFEFF' }; protected char[] getOriginal() { return ORIGINAL; } protected char[] getReplacement() { return REPLACEMENT; } } }