1091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes/*
2091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Copyright (C) 2015 The Android Open Source Project
3091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
4091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * you may not use this file except in compliance with the License.
6091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * You may obtain a copy of the License at
7091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
8091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes *
10091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * Unless required by applicable law or agreed to in writing, software
11091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * See the License for the specific language governing permissions and
14091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * limitations under the License.
15091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */
16091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
17091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banespackage android.support.v4.widget;
18091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
19091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.content.res.ColorStateList;
20091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.graphics.PorterDuff;
21091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.graphics.drawable.Drawable;
22091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.util.Log;
23091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.widget.CompoundButton;
24091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
25091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport java.lang.reflect.Field;
26091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
27091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesclass CompoundButtonCompatDonut {
28091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
29091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private static final String TAG = "CompoundButtonCompatDonut";
30091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
31091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private static Field sButtonDrawableField;
32091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    private static boolean sButtonDrawableFieldFetched;
33091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
34091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    static void setButtonTintList(CompoundButton button, ColorStateList tint) {
35091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (button instanceof TintableCompoundButton) {
36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            ((TintableCompoundButton) button).setSupportButtonTintList(tint);
37091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
38091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    static ColorStateList getButtonTintList(CompoundButton button) {
41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (button instanceof TintableCompoundButton) {
42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes             return((TintableCompoundButton) button).getSupportButtonTintList();
43091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
44091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        return null;
45091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
46091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
47091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    static void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
48091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (button instanceof TintableCompoundButton) {
49091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            ((TintableCompoundButton) button).setSupportButtonTintMode(tintMode);
50091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
51091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
52091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
53091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    static PorterDuff.Mode getButtonTintMode(CompoundButton button) {
54091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (button instanceof TintableCompoundButton) {
55091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            return ((TintableCompoundButton) button).getSupportButtonTintMode();
56091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
57091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        return null;
58091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
59091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
60091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    static Drawable getButtonDrawable(CompoundButton button) {
61091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (!sButtonDrawableFieldFetched) {
62091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            try {
63091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                sButtonDrawableField = CompoundButton.class.getDeclaredField("mButtonDrawable");
64091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                sButtonDrawableField.setAccessible(true);
65091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            } catch (NoSuchFieldException e) {
66091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                Log.i(TAG, "Failed to retrieve mButtonDrawable field", e);
67091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
68091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            sButtonDrawableFieldFetched = true;
69091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
70091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
71091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        if (sButtonDrawableField != null) {
72091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            try {
73091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                return (Drawable) sButtonDrawableField.get(button);
74091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            } catch (IllegalAccessException e) {
75091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                Log.i(TAG, "Failed to get button drawable via reflection", e);
76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes                sButtonDrawableField = null;
77091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes            }
78091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        }
79091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes        return null;
80091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes    }
81091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes
82091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes}
83