1ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes/* 2ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Copyright (C) 2016 The Android Open Source Project 3ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * 4ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * you may not use this file except in compliance with the License. 6ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * You may obtain a copy of the License at 7ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * 8ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * http://www.apache.org/licenses/LICENSE-2.0 9ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * 10ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * Unless required by applicable law or agreed to in writing, software 11ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * See the License for the specific language governing permissions and 14ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * limitations under the License. 15ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes */ 16ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 17ddf46923b9487ac3a021f01b55d96136d811e8beChris Banespackage android.support.design.widget; 18ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 198e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikasimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; 208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas 21ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.content.Context; 22c39d9c75590eca86a5e7e32a8824ba04a0d42e9bAlan Viveretteimport android.support.annotation.RestrictTo; 23ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.AccessibilityDelegateCompat; 24ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.ViewCompat; 25ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.accessibility.AccessibilityEventCompat; 26ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; 27ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.support.v7.widget.AppCompatImageButton; 28ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.util.AttributeSet; 29ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.view.View; 30ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.view.accessibility.AccessibilityEvent; 31ddf46923b9487ac3a021f01b55d96136d811e8beChris Banesimport android.widget.Checkable; 32ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 33ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes/** 34ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes * @hide 35ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes */ 368e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP) 37ddf46923b9487ac3a021f01b55d96136d811e8beChris Banespublic class CheckableImageButton extends AppCompatImageButton implements Checkable { 38ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 39ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes private static final int[] DRAWABLE_STATE_CHECKED = new int[]{android.R.attr.state_checked}; 40ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 41ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes private boolean mChecked; 42ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 43ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public CheckableImageButton(Context context) { 44ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes this(context, null); 45ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 46ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 47ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public CheckableImageButton(Context context, AttributeSet attrs) { 48ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes this(context, attrs, android.support.v7.appcompat.R.attr.imageButtonStyle); 49ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 50ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 51ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public CheckableImageButton(Context context, AttributeSet attrs, int defStyleAttr) { 52ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes super(context, attrs, defStyleAttr); 53ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 54ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() { 55ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 56ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { 57ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes super.onInitializeAccessibilityEvent(host, event); 58ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes event.setChecked(isChecked()); 59ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 60ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 61ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 62ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public void onInitializeAccessibilityNodeInfo(View host, 63ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes AccessibilityNodeInfoCompat info) { 64ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes super.onInitializeAccessibilityNodeInfo(host, info); 65ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes info.setCheckable(true); 66ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes info.setChecked(isChecked()); 67ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 68ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes }); 69ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 70ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 71ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 72ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public void setChecked(boolean checked) { 73ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes if (mChecked != checked) { 74ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes mChecked = checked; 75ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes refreshDrawableState(); 76ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes sendAccessibilityEvent( 77ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes AccessibilityEventCompat.TYPE_WINDOW_CONTENT_CHANGED); 78ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 79ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 80ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 81ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 82ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public boolean isChecked() { 83ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes return mChecked; 84ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 85ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 86ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 87ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public void toggle() { 88ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes setChecked(!mChecked); 89ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 90ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes 91ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes @Override 92ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes public int[] onCreateDrawableState(int extraSpace) { 93ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes if (mChecked) { 94ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes return mergeDrawableStates( 95ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes super.onCreateDrawableState(extraSpace + DRAWABLE_STATE_CHECKED.length), 96ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes DRAWABLE_STATE_CHECKED); 97ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } else { 98ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes return super.onCreateDrawableState(extraSpace); 99ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 100ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes } 101ddf46923b9487ac3a021f01b55d96136d811e8beChris Banes} 102