1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.messaging.util; 18 19 import android.content.res.ColorStateList; 20 import android.graphics.Color; 21 import android.graphics.PorterDuff; 22 import android.graphics.drawable.Drawable; 23 import androidx.appcompat.graphics.drawable.DrawableWrapper; 24 25 /* 26 * This is directly copied from v7/appcompat/src/androidx.appcompat.internal/widget/TintManager.java 27 */ 28 29 /** 30 * A {@link DrawableWrapper} which updates it's color filter using a {@link ColorStateList}. 31 */ 32 class TintDrawableWrapper extends DrawableWrapper { 33 private final ColorStateList mTintStateList; 34 private final PorterDuff.Mode mTintMode; 35 private int mCurrentColor; TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList)36 public TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList) { 37 this(drawable, tintStateList, PorterDuff.Mode.SRC_IN); 38 } TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList, PorterDuff.Mode tintMode)39 public TintDrawableWrapper(Drawable drawable, ColorStateList tintStateList, 40 PorterDuff.Mode tintMode) { 41 super(drawable); 42 mTintStateList = tintStateList; 43 mTintMode = tintMode; 44 } 45 @Override isStateful()46 public boolean isStateful() { 47 return (mTintStateList != null && mTintStateList.isStateful()) || super.isStateful(); 48 } 49 @Override setState(int[] stateSet)50 public boolean setState(int[] stateSet) { 51 boolean handled = super.setState(stateSet); 52 handled = updateTint(stateSet) || handled; 53 return handled; 54 } updateTint(int[] state)55 private boolean updateTint(int[] state) { 56 if (mTintStateList != null) { 57 final int color = mTintStateList.getColorForState(state, mCurrentColor); 58 if (color != mCurrentColor) { 59 if (color != Color.TRANSPARENT) { 60 setColorFilter(color, mTintMode); 61 } else { 62 clearColorFilter(); 63 } 64 mCurrentColor = color; 65 return true; 66 } 67 } 68 return false; 69 } 70 } 71