1b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov/* 2b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * Copyright (C) 2017 The Android Open Source Project 3b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * 4b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * you may not use this file except in compliance with the License. 6b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * You may obtain a copy of the License at 7b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * 8b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * http://www.apache.org/licenses/LICENSE-2.0 9b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * 10b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software 11b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS, 12b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * See the License for the specific language governing permissions and 14b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov * limitations under the License. 15b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov */ 16b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.core.widget; 18b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 19b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikovimport android.content.res.ColorStateList; 20b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikovimport android.graphics.PorterDuff; 21b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikovimport android.graphics.drawable.Drawable; 22b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikovimport android.os.Build; 239dede51868bbbe16aadcd65e04860bea8ea50e05Aurimas Liutikasimport android.widget.ImageView; 249dede51868bbbe16aadcd65e04860bea8ea50e05Aurimas Liutikas 25ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.NonNull; 26ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.Nullable; 27b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 28b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov/** 29645e5c8aa6b31961c5f73f3d30bb5261d5e04aebKirill Grouchnikov * Helper for accessing features in {@link ImageView}. 30b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov */ 31b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikovpublic class ImageViewCompat { 32b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton /** 33b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * Return the tint applied to the image drawable, if specified. 34b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton */ 35b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton @Nullable 36b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton public static ColorStateList getImageTintList(@NonNull ImageView view) { 37b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton if (Build.VERSION.SDK_INT >= 21) { 38b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov return view.getImageTintList(); 39b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 40b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton return (view instanceof TintableImageSourceView) 41b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton ? ((TintableImageSourceView) view).getSupportImageTintList() 42b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton : null; 43b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } 44b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 45b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton /** 46b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * Applies a tint to the image drawable. 47b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton */ 48b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton public static void setImageTintList(@NonNull ImageView view, 49b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton @Nullable ColorStateList tintList) { 50b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton if (Build.VERSION.SDK_INT >= 21) { 51b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov view.setImageTintList(tintList); 52b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 53b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if (Build.VERSION.SDK_INT == 21) { 54b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov // Work around a bug in L that did not update the state of the image source 55b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov // after applying the tint 56b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov Drawable imageViewDrawable = view.getDrawable(); 57b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov boolean hasTint = (view.getImageTintList() != null) 58b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov && (view.getImageTintMode() != null); 59b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if ((imageViewDrawable != null) && hasTint) { 60b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if (imageViewDrawable.isStateful()) { 61b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov imageViewDrawable.setState(view.getDrawableState()); 62b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 63b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov view.setImageDrawable(imageViewDrawable); 64b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 65b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 66b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } else if (view instanceof TintableImageSourceView) { 67b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton ((TintableImageSourceView) view).setSupportImageTintList(tintList); 68b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 69b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } 70b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 71b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton /** 72b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * Return the blending mode used to apply the tint to the image drawable, if specified. 73b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton */ 74b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton @Nullable 75b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton public static PorterDuff.Mode getImageTintMode(@NonNull ImageView view) { 76b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton if (Build.VERSION.SDK_INT >= 21) { 77b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton return view.getImageTintMode(); 78b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } 79b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton return (view instanceof TintableImageSourceView) 80b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton ? ((TintableImageSourceView) view).getSupportImageTintMode() 81b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton : null; 82b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } 83b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton 84b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton /** 85b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * Specifies the blending mode used to apply the tint specified by 86b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * {@link #setImageTintList(android.widget.ImageView, android.content.res.ColorStateList)} 87b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton * to the image drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}. 88b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton */ 89b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton public static void setImageTintMode(@NonNull ImageView view, @Nullable PorterDuff.Mode mode) { 90b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton if (Build.VERSION.SDK_INT >= 21) { 91b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov view.setImageTintMode(mode); 92b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 93b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if (Build.VERSION.SDK_INT == 21) { 94b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov // Work around a bug in L that did not update the state of the image source 95b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov // after applying the tint 96b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov Drawable imageViewDrawable = view.getDrawable(); 97b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov boolean hasTint = (view.getImageTintList() != null) 98b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov && (view.getImageTintMode() != null); 99b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if ((imageViewDrawable != null) && hasTint) { 100b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov if (imageViewDrawable.isStateful()) { 101b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov imageViewDrawable.setState(view.getDrawableState()); 102b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 103b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov view.setImageDrawable(imageViewDrawable); 104b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 105b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 106b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton } else if (view instanceof TintableImageSourceView) { 107b318fc9a82774909d20e089f6cdb1cfaf5504edcJake Wharton ((TintableImageSourceView) view).setSupportImageTintMode(mode); 108b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 109b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov } 110b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov 111b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov private ImageViewCompat() {} 112b277db249b60e227c7574bffaa41c5e81027426bKirill Grouchnikov} 113