// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.widget; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; /** * Implementation of BitmapDrawable that allows to tint the color of the drawable for all * bitmap drawable states using chrome:tint attribute in XML. */ public class TintedDrawable extends BitmapDrawable { /** * The set of colors that just be used for tinting this bitmap drawable. */ protected ColorStateList mTint; public TintedDrawable(Resources res, Bitmap bitmap) { super(res, bitmap); mTint = ApiCompatibilityUtils.getColorStateList(res, R.color.dark_mode_tint); } @Override protected boolean onStateChange(int[] state) { boolean ret = updateTintColor(); super.onStateChange(state); return ret; } @Override public boolean isStateful() { return true; } /** * Sets the tint color for the given Drawable for all button states. * @param tint The set of colors to use to color the ImageButton. */ public void setTint(ColorStateList tint) { if (mTint == tint) return; mTint = tint; updateTintColor(); } /** * Factory method for creating a {@link TintedDrawable} with a resource id. */ public static TintedDrawable constructTintedDrawable(Resources res, int drawableId) { Bitmap icon = BitmapFactory.decodeResource(res, drawableId); return new TintedDrawable(res, icon); } /** * Factory method for creating a {@link TintedDrawable} with a resource id and specific tint. */ public static TintedDrawable constructTintedDrawable( Resources res, int drawableId, int tintColorId) { TintedDrawable drawable = constructTintedDrawable(res, drawableId); drawable.setTint(ApiCompatibilityUtils.getColorStateList(res, tintColorId)); return drawable; } /** * Factory method for creating a {@link TintedDrawable} with a {@link Bitmap} icon. */ public static TintedDrawable constructTintedDrawable(Resources res, Bitmap icon) { return new TintedDrawable(res, icon); } private boolean updateTintColor() { if (mTint == null) return false; setColorFilter(mTint.getColorForState(getState(), 0), PorterDuff.Mode.SRC_IN); return true; } }