/*
* Copyright (C) 2015 Jared Rummler <jared.rummler@gmail.com>
* Ported to support lib by Enno Gottschalk <mrmaffen@googlemail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.tomahawk.tomahawk_android.utils;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.SearchView;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
import java.lang.reflect.Field;
/**
* Helper class to style a {@link SearchView}.</p>
*
* Example usage:</p>
*
* <pre>
* <code>
* SearchViewStyle.on(searchView)
* .setCursorColor(Color.WHITE)
* .setTextColor(Color.WHITE)
* .setHintTextColor(Color.WHITE)
* .setSearchHintDrawable(R.drawable.ic_search_api_material)
* .setSearchButtonImageResource(R.drawable.ic_search_api_material)
* .setCloseBtnImageResource(R.drawable.ic_clear_material)
* .setVoiceBtnImageResource(R.drawable.ic_voice_search_api_material)
* .setGoBtnImageResource(R.drawable.ic_go_search_api_material)
* .setCommitIcon(R.drawable.ic_commit_search_api_material)
* .setSubmitAreaDrawableId(R.drawable.abc_textfield_search_activated_mtrl_alpha)
* .setSearchPlateDrawableId(R.drawable.abc_textfield_search_activated_mtrl_alpha)
* .setSearchPlateTint(Color.WHITE)
* .setSubmitAreaTint(Color.WHITE);
* </pre>
*
* </code>
*
* @author Jared Rummler <jared.rummler@gmail.com>
* @since Oct 24, 2014
*/
public class SearchViewStyle {
// ===========================================================
// STATIC METHODS
// ===========================================================
public static SearchViewStyle on(final SearchView searchView) {
return new SearchViewStyle(searchView);
}
// ===========================================================
// FIELDS
// ===========================================================
private final SearchView mSearchView;
// ===========================================================
// CONSTRUCTORS
// ===========================================================
private SearchViewStyle(final SearchView searchView) {
mSearchView = searchView;
}
// ===========================================================
// METHODS
// ===========================================================
@SuppressWarnings("unchecked")
public <T extends View> T getView(final int id) {
if (id == 0) {
return null;
}
View view = mSearchView.findViewById(id);
return (T) view;
}
public SearchViewStyle setSearchPlateDrawableId(final int id) {
final View view = getView(android.support.v7.appcompat.R.id.search_plate);
if (view != null) {
view.setBackgroundResource(id);
}
return this;
}
public SearchViewStyle setCursorColor(final int color) {
final AutoCompleteTextView editText = getView(
android.support.v7.appcompat.R.id.search_src_text);
if (editText != null) {
try {
final Field fCursorDrawableRes = TextView.class
.getDeclaredField("mCursorDrawableRes");
fCursorDrawableRes.setAccessible(true);
final int mCursorDrawableRes = fCursorDrawableRes.getInt(editText);
final Field fEditor = TextView.class.getDeclaredField("mEditor");
fEditor.setAccessible(true);
final Object editor = fEditor.get(editText);
final Class<?> clazz = editor.getClass();
final Field fCursorDrawable = clazz.getDeclaredField("mCursorDrawable");
fCursorDrawable.setAccessible(true);
final Drawable[] drawables = new Drawable[2];
drawables[0] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
drawables[1] = editText.getContext().getResources().getDrawable(mCursorDrawableRes);
drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawables[1].setColorFilter(color, PorterDuff.Mode.SRC_IN);
fCursorDrawable.set(editor, drawables);
} catch (final Throwable ignored) {
}
}
return this;
}
}