package codetail.widget; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.Gravity; import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import java.util.Set; import codetail.components.R; import codetail.utils.ResourceUtils; import codetail.utils.ViewUtils; public class SearchView extends FrameLayoutCompat{ QueryCallback mCallback; boolean isExpanded; ImageView mSearchButton; AutoCompleteTextView mSearchQuery; ArrayAdapter<String> mSuggestionAdapter; SharedPreferences mSearchQueriesCache; public SearchView(Context context) { this(context, null); } public SearchView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SearchView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mSearchQueriesCache = context.getSharedPreferences("last_search_queries", Context.MODE_PRIVATE); Set<String> collection = mSearchQueriesCache.getAll().keySet(); String[] suggestions = new String[collection.size()]; collection.toArray(suggestions); mSuggestionAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, android.R.id.text1, suggestions); Resources r = getResources(); final int padding = r.getDimensionPixelSize(R.dimen.toolbar_edges_margin); final int size = r.getDimensionPixelSize(R.dimen.toolbar_action_btn_mtrl_size); mSearchButton = new ImageView(context); mSearchButton.setClickable(true); mSearchButton.setPadding(padding, padding, padding, padding); mSearchButton.setImageResource(R.drawable.abc_ic_search_api_mtrl_alpha); mSearchButton.setBackgroundResource(R.drawable.overlay_background); mSearchQuery = new AutoCompleteTextView(context); mSearchQuery.setPadding(0, 0, 0, 0); mSearchQuery.setImeOptions(EditorInfo.IME_ACTION_SEARCH | EditorInfo.IME_FLAG_NO_EXTRACT_UI); mSearchQuery.setInputType(EditorInfo.TYPE_CLASS_TEXT); mSearchQuery.setAdapter(mSuggestionAdapter); mSearchQuery.setFreezesText(true); mSearchQuery.setTextSize(18); mSearchQuery.setTextColor(Color.WHITE); mSearchQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if(actionId == EditorInfo.IME_ACTION_SEARCH){ String query = mSearchQuery.getText().toString().trim(); if(!mSearchQueriesCache.contains(query)) { mSearchQueriesCache.edit() .putString(query, query) .apply(); mSuggestionAdapter.add(query); } if(mCallback != null){ mCallback.onSearchQuery(mSearchQuery.getText()); } ViewUtils.hideKeyboard(mSearchQuery); return true; } return false; } }); ViewUtils.setBackground(mSearchQuery, null); ViewUtils.setVisibilityWithGoneFlag(mSearchQuery, false); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(size, size); params.gravity = Gravity.RIGHT | Gravity.TOP; addView(mSearchButton, params); params = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); params.rightMargin = size; params.leftMargin = ResourceUtils.getPixelSize(R.dimen.toolbar_title_layout_left); params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; addView(mSearchQuery, params); } public void setSearchButtonBackground(Drawable drawable){ if(drawable == null) { return; } ViewUtils.setBackground(mSearchButton, drawable); } public void setOnSearchClickListener(OnClickListener listener){ mSearchButton.setOnClickListener(listener); } public void setCallback(QueryCallback callback) { mCallback = callback; } public void setHintTextColor(int color){ mSearchQuery.setHintTextColor(color); } public void setQueryHintText(CharSequence text){ mSearchQuery.setHint(text); } public void setIconsTint(int color){ mSearchButton.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } public boolean isSearchExpanded(){ return isExpanded; } public void setQuery(String query){ mSearchQuery.setText(query); } public CharSequence getQuery(){ return mSearchQuery.getText(); } public void expand(){ isExpanded = true; ViewUtils.setVisibility(mSearchQuery, true); ViewUtils.showKeyboard(mSearchQuery); mSearchButton.setImageResource(R.drawable.abc_ic_clear_mtrl_alpha); mSearchQuery.setText(""); mSearchQuery.requestFocus(); } public void collapse(){ isExpanded = false; ViewUtils.setVisibilityWithGoneFlag(mSearchQuery, false); mSearchButton.setImageResource(R.drawable.abc_ic_search_api_mtrl_alpha); ViewUtils.hideKeyboard(mSearchQuery); } public static interface QueryCallback{ public void onSearchQuery(CharSequence query); } }