CompoundButton.java revision cebc6bab51d9c77db8f346c1390169eabac4f27d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 297a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 30cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queruimport android.view.accessibility.AccessibilityEvent; 3113774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A button with two states, checked and unchecked. When the button is pressed 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or clicked, the state changes automatically. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>XML attributes</strong></p> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See {@link android.R.styleable#CompoundButton 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * CompoundButton Attributes}, {@link android.R.styleable#Button Button 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attributes}, {@link android.R.styleable#TextView TextView Attributes}, {@link 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.R.styleable#View View Attributes} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class CompoundButton extends Button implements Checkable { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mChecked; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mButtonResource; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mBroadcasting; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mButtonDrawable; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnCheckedChangeListener mOnCheckedChangeListener; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnCheckedChangeListener mOnCheckedChangeWidgetListener; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] CHECKED_STATE_SET = { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.attr.state_checked 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CompoundButton(Context context) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CompoundButton(Context context, AttributeSet attrs) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr) { 68617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette this(context, attrs, defStyleAttr, 0); 69617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 70617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 71617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 72617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette super(context, attrs, defStyleAttr, defStyleRes); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette final TypedArray a = context.obtainStyledAttributes( 75617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette attrs, com.android.internal.R.styleable.CompoundButton, defStyleAttr, defStyleRes); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = a.getDrawable(com.android.internal.R.styleable.CompoundButton_button); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setButtonDrawable(d); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checked = a 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getBoolean(com.android.internal.R.styleable.CompoundButton_checked, false); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(checked); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggle() { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(!mChecked); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean performClick() { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XXX: These are tiny, need some surrounding 'expanded touch area', 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which will need to be implemented in Button if we only override 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * performClick() 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* When clicked, toggle the state */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project toggle(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.performClick(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1067a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeigler @ViewDebug.ExportedProperty 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isChecked() { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChecked; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the checked state of this button.</p> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param checked true to check the button, false to uncheck it 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChecked(boolean checked) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChecked != checked) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChecked = checked; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 12077e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette notifyViewAccessibilityStateChangedIfNeeded( 12177e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Avoid infinite recursions if setChecked() is called from a listener 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBroadcasting) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcasting = true; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnCheckedChangeListener != null) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeListener.onCheckedChanged(this, mChecked); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnCheckedChangeWidgetListener != null) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 135cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBroadcasting = false; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register a callback to be invoked when the checked state of this button 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes. 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener the callback to call on checked state change 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeListener = listener; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register a callback to be invoked when the checked state of this button 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * changes. This callback is used for internal purpose only. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener the callback to call on checked state change 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setOnCheckedChangeWidgetListener(OnCheckedChangeListener listener) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnCheckedChangeWidgetListener = listener; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when the checked state 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of a compound button changed. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface OnCheckedChangeListener { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the checked state of a compound button has changed. 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param buttonView The compound button view whose state has changed. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param isChecked The new checked state of buttonView. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onCheckedChanged(CompoundButton buttonView, boolean isChecked); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the background to a given Drawable, identified by its resource id. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid the resource id of the drawable to use as the background 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setButtonDrawable(int resid) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0 && resid == mButtonResource) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mButtonResource = resid; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = null; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mButtonResource != 0) { 1898eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette d = getContext().getDrawable(mButtonResource); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setButtonDrawable(d); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the background to a given Drawable 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d The Drawable to use as the background 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setButtonDrawable(Drawable d) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mButtonDrawable != null) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mButtonDrawable.setCallback(null); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unscheduleDrawable(mButtonDrawable); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setVisible(getVisibility() == VISIBLE, false); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mButtonDrawable = d; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMinHeight(mButtonDrawable.getIntrinsicHeight()); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21530401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 21630401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 2178a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(CompoundButton.class.getName()); 218736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setChecked(mChecked); 219cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru } 220cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru 221cf4550c3198d6b3d92cdc52707fe70d7cc0caa9fJean-Baptiste Queru @Override 22213774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 22313774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 2248a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(CompoundButton.class.getName()); 2250f55cc33f658b2793a12d609a0989348077324a4Svetoslav Ganov info.setCheckable(true); 22613774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov info.setChecked(mChecked); 22713774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov } 22813774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov 22913774d2e38e73ef4d0f6d0db3501ba032fa6da5aSvetoslav Ganov @Override 2302842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio public int getCompoundPaddingLeft() { 2312842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio int padding = super.getCompoundPaddingLeft(); 2322842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio if (!isLayoutRtl()) { 2332842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio final Drawable buttonDrawable = mButtonDrawable; 2342842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio if (buttonDrawable != null) { 2352842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio padding += buttonDrawable.getIntrinsicWidth(); 2362842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2372842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2382842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio return padding; 2392842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2402842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio 2412842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio @Override 2422842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio public int getCompoundPaddingRight() { 2432842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio int padding = super.getCompoundPaddingRight(); 2442842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio if (isLayoutRtl()) { 2452842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio final Drawable buttonDrawable = mButtonDrawable; 2462842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio if (buttonDrawable != null) { 2472842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio padding += buttonDrawable.getIntrinsicWidth(); 2482842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2492842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2502842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio return padding; 2512842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio } 2522842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio 253b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio /** 254b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio * @hide 255b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio */ 256b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio @Override 257b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio public int getHorizontalOffsetForDrawables() { 258b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio final Drawable buttonDrawable = mButtonDrawable; 259b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio return (buttonDrawable != null) ? buttonDrawable.getIntrinsicWidth() : 0; 260b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio } 261b878ddb56ec4e755706890110d76735176ff2295Fabrice Di Meglio 2622842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio @Override 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDraw(Canvas canvas) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable buttonDrawable = mButtonDrawable; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buttonDrawable != null) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; 2672842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio final int drawableHeight = buttonDrawable.getIntrinsicHeight(); 2682842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio final int drawableWidth = buttonDrawable.getIntrinsicWidth(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27061956606818918194a38e045a8e35e7108480e5eAlan Viverette final int top; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (verticalGravity) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.BOTTOM: 2732842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio top = getHeight() - drawableHeight; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.CENTER_VERTICAL: 2762842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio top = (getHeight() - drawableHeight) / 2; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 27861956606818918194a38e045a8e35e7108480e5eAlan Viverette default: 27961956606818918194a38e045a8e35e7108480e5eAlan Viverette top = 0; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28161956606818918194a38e045a8e35e7108480e5eAlan Viverette final int bottom = top + drawableHeight; 28261956606818918194a38e045a8e35e7108480e5eAlan Viverette final int left = isLayoutRtl() ? getWidth() - drawableWidth : 0; 28361956606818918194a38e045a8e35e7108480e5eAlan Viverette final int right = isLayoutRtl() ? getWidth() : drawableWidth; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2852842679d3426295b6674dfcfb8591fad79de6cb2Fabrice Di Meglio buttonDrawable.setBounds(left, top, right, bottom); 28661956606818918194a38e045a8e35e7108480e5eAlan Viverette 28761956606818918194a38e045a8e35e7108480e5eAlan Viverette final Drawable background = getBackground(); 288c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette if (background != null) { 28961956606818918194a38e045a8e35e7108480e5eAlan Viverette background.setHotspotBounds(left, top, right, bottom); 29061956606818918194a38e045a8e35e7108480e5eAlan Viverette } 29161956606818918194a38e045a8e35e7108480e5eAlan Viverette } 29261956606818918194a38e045a8e35e7108480e5eAlan Viverette 29361956606818918194a38e045a8e35e7108480e5eAlan Viverette super.onDraw(canvas); 29461956606818918194a38e045a8e35e7108480e5eAlan Viverette 29561956606818918194a38e045a8e35e7108480e5eAlan Viverette if (buttonDrawable != null) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buttonDrawable.draw(canvas); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isChecked()) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mergeDrawableStates(drawableState, CHECKED_STATE_SET); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawableState; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mButtonDrawable != null) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] myDrawableState = getDrawableState(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the state of the Drawable 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mButtonDrawable.setState(myDrawableState); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 323cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette /** @hide */ 324cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette @Override 325cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette protected void setDrawableHotspot(float x, float y) { 326cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette super.setDrawableHotspot(x, y); 327cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette 328cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette if (mButtonDrawable != null) { 329cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette mButtonDrawable.setHotspot(x, y); 330cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette } 331cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette } 332cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean verifyDrawable(Drawable who) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.verifyDrawable(who) || who == mButtonDrawable; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 338e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn @Override 339e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn public void jumpDrawablesToCurrentState() { 340e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn super.jumpDrawablesToCurrentState(); 341e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn if (mButtonDrawable != null) mButtonDrawable.jumpToCurrentState(); 342e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn } 343e213677037f836529efcc0ac201fc61dd95481c5Dianne Hackborn 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class SavedState extends BaseSavedState { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checked; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link CompoundButton#onSaveInstanceState()} 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState(Parcelable superState) { 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor called from {@link #CREATOR} 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checked = (Boolean)in.readValue(null); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(out, flags); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeValue(checked); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "CompoundButton.SavedState{" 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " checked=" + checked + "}"; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<SavedState>() { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Parcelable onSaveInstanceState() { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = new SavedState(superState); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss.checked = isChecked(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onRestoreInstanceState(Parcelable state) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(ss.checked); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 406