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