1415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes/* 2415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Copyright (C) 2014 The Android Open Source Project 3415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * 4415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * you may not use this file except in compliance with the License. 6415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * You may obtain a copy of the License at 7415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * 8415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * 10415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * Unless required by applicable law or agreed to in writing, software 11415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * See the License for the specific language governing permissions and 14415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes * limitations under the License. 15415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes */ 16415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 172cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banespackage android.support.v7.widget; 18415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 19415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.content.Context; 20091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.content.res.ColorStateList; 21091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.graphics.PorterDuff; 2291fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banesimport android.graphics.drawable.Drawable; 232cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.annotation.DrawableRes; 24091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.annotation.Nullable; 25091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v4.content.ContextCompat; 26091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banesimport android.support.v4.widget.TintableCompoundButton; 272cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banesimport android.support.v7.appcompat.R; 28415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.util.AttributeSet; 29415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banesimport android.widget.CheckBox; 30415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 31415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes/** 32091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * A {@link CheckBox} which supports compatible features on older version of the platform, 33091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * including: 34091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <ul> 35091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows dynamic tint of it background via the background tint methods in 36091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link android.support.v4.widget.CompoundButtonCompat}.</li> 37091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <li>Allows setting of the background tint using {@link R.attr#buttonTint} and 38091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * {@link R.attr#buttonTintMode}.</li> 39091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * </ul> 40091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * 41091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * <p>This will automatically be used when you use {@link CheckBox} in your layouts. 42091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * You should only need to manually use this class when writing custom views.</p> 43415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes */ 44091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banespublic class AppCompatCheckBox extends CheckBox implements TintableCompoundButton { 45415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 467e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes private AppCompatDrawableManager mDrawableManager; 47091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes private AppCompatCompoundButtonHelper mCompoundButtonHelper; 48415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 492cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatCheckBox(Context context) { 50415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes this(context, null); 51415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes } 52415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 532cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatCheckBox(Context context, AttributeSet attrs) { 542cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes this(context, attrs, R.attr.checkboxStyle); 55415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes } 56415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 572cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public AppCompatCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { 58e4beadba70aecabbd7f6677943ab7c0b94809b8aChris Banes super(TintContextWrapper.wrap(context), attrs, defStyleAttr); 597e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes mDrawableManager = AppCompatDrawableManager.get(); 607e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes mCompoundButtonHelper = new AppCompatCompoundButtonHelper(this, mDrawableManager); 61091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mCompoundButtonHelper.loadFromAttributes(attrs, defStyleAttr); 62415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes } 63415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes 64415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes @Override 6591fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes public void setButtonDrawable(Drawable buttonDrawable) { 6691fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes super.setButtonDrawable(buttonDrawable); 67091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mCompoundButtonHelper != null) { 68091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mCompoundButtonHelper.onSetButtonDrawable(); 69091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 7091fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes } 7191fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes 7291fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes @Override 732cccf609662389d6a23dbc0711d5fb2e826e8c63Chris Banes public void setButtonDrawable(@DrawableRes int resId) { 747e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes setButtonDrawable(mDrawableManager != null 757e4e8b664820f773bc96e37ee1d2bbf500d64e69Chris Banes ? mDrawableManager.getDrawable(getContext(), resId) 76091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes : ContextCompat.getDrawable(getContext(), resId)); 77415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes } 7891fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes 7991fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes @Override 8091fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes public int getCompoundPaddingLeft() { 81091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes final int value = super.getCompoundPaddingLeft(); 82091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mCompoundButtonHelper != null 83091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mCompoundButtonHelper.getCompoundPaddingLeft(value) 84091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes : value; 85091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 86091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 87091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes /** 88091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * This should be accessed from {@link android.support.v4.widget.CompoundButtonCompat} 89091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * @hide 90091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */ 91091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 92091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setSupportButtonTintList(@Nullable ColorStateList tint) { 93091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mCompoundButtonHelper != null) { 94091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mCompoundButtonHelper.setSupportButtonTintList(tint); 9591fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes } 9691fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes } 9791fcb7588ef27ffdb5a221a401c05bb77aecc00eChris Banes 98091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes /** 99091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * This should be accessed from {@link android.support.v4.widget.CompoundButtonCompat} 100091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * @hide 101091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */ 102091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Nullable 103091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 104091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public ColorStateList getSupportButtonTintList() { 105091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mCompoundButtonHelper != null 106091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mCompoundButtonHelper.getSupportButtonTintList() 107091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes : null; 108091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 109091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 110091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes /** 111091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * This should be accessed from {@link android.support.v4.widget.CompoundButtonCompat} 112091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * @hide 113091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */ 114091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 115091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) { 116091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes if (mCompoundButtonHelper != null) { 117091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes mCompoundButtonHelper.setSupportButtonTintMode(tintMode); 118091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 119091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 120091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes 121091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes /** 122091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * This should be accessed from {@link android.support.v4.widget.CompoundButtonCompat} 123091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes * @hide 124091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes */ 125091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Nullable 126091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes @Override 127091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes public PorterDuff.Mode getSupportButtonTintMode() { 128091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes return mCompoundButtonHelper != null 129091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes ? mCompoundButtonHelper.getSupportButtonTintMode() 130091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes : null; 131091b0f935e68ce9bfecc2422e60eada33fa3b09cChris Banes } 132415f740df4981ef2f5fb462a50c7cf095cc21128Chris Banes} 133