| Index: chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..17518f0db8836328481a1d9c9c9e40b174495c61
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ImageViewTinter.java
|
| @@ -0,0 +1,91 @@
|
| +// Copyright 2017 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.TypedArray;
|
| +import android.graphics.Canvas;
|
| +import android.graphics.PorterDuff;
|
| +import android.support.annotation.Nullable;
|
| +import android.util.AttributeSet;
|
| +import android.widget.ImageView;
|
| +
|
| +import org.chromium.chrome.R;
|
| +
|
| +/**
|
| + * Utility for tinting an ImageView and its Drawable.
|
| + *
|
| + * Example usage in XML:
|
| + * <ImageViewTinterInstanceOwner
|
| + * xmlns:android="http://schemas.android.com/apk/res/android"
|
| + * xmlns:chrome="http://schemas.android.com/apk/res-auto"
|
| + * chrome:chrometint="@color/light_active_color" />
|
| + *
|
| + * The default style used by the Application will likely cause your Drawable to be automatically
|
| + * tinted. To prevent this, set the value of chrome:chrometint to "@null".
|
| + */
|
| +public class ImageViewTinter {
|
| + /** Classes that own an ImageViewTinter must implement these functions. */
|
| + public static interface ImageViewTinterOwner {
|
| + /** See {@link ImageViewTinter#drawableStateChanged}. */
|
| + void drawableStateChanged();
|
| +
|
| + /** See {@link ImageViewTinter#setTint}. */
|
| + void setTint(ColorStateList tintList);
|
| +
|
| + /** See {@link ImageView#onDraw}. */
|
| + void onDraw(Canvas canvas);
|
| + }
|
| +
|
| + private ImageView mImageView;
|
| + private ColorStateList mTintList;
|
| +
|
| + /**
|
| + * Constructor. Should be called with the AttributeSet and style of the ImageView so that XML
|
| + * attributes for it can be parsed.
|
| + * @param view ImageView being tinted.
|
| + * @param attrs AttributeSet that is pulled in from an XML layout. May be null.
|
| + * @param defStyle Style that is pulled in from an XML layout.
|
| + */
|
| + public ImageViewTinter(ImageViewTinterOwner view, @Nullable AttributeSet attrs, int defStyle) {
|
| + assert view instanceof ImageView;
|
| + mImageView = (ImageView) view;
|
| +
|
| + // Parse out the attributes from the XML.
|
| + if (attrs != null) {
|
| + TypedArray a = mImageView.getContext().obtainStyledAttributes(
|
| + attrs, R.styleable.TintedImage, defStyle, 0);
|
| + setTint(a.getColorStateList(R.styleable.TintedImage_chrometint));
|
| + a.recycle();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Sets the tint color for the given ImageView for all states.
|
| + * @param tintList The set of colors to use.
|
| + */
|
| + public void setTint(ColorStateList tintList) {
|
| + if (mTintList == tintList) return;
|
| + mTintList = tintList;
|
| + updateTintColor();
|
| + }
|
| +
|
| + /** Call when the state of the Drawable has changed. */
|
| + public void drawableStateChanged() {
|
| + updateTintColor();
|
| + }
|
| +
|
| + private void updateTintColor() {
|
| + if (mImageView.getDrawable() == null) {
|
| + return;
|
| + } else if (mTintList == null) {
|
| + mImageView.clearColorFilter();
|
| + return;
|
| + }
|
| +
|
| + int tintColor = mTintList.getColorForState(mImageView.getDrawableState(), 0);
|
| + mImageView.setColorFilter(tintColor, PorterDuff.Mode.SRC_IN);
|
| + }
|
| +}
|
|
|