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