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 1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.R; 2075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 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.util.AttributeSet; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 277a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 2875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent; 2934ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An extension to TextView that supports the {@link android.widget.Checkable} interface. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is useful when used in a {@link android.widget.ListView ListView} where the it's 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ListView#setChoiceMode(int) setChoiceMode} has been set to 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * something other than {@link android.widget.ListView#CHOICE_MODE_NONE CHOICE_MODE_NONE}. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 382fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checked 392fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 418b5e7c046d4ab2fff7c4e1c67488058ff736b9eaRomain Guypublic class CheckedTextView extends TextView implements Checkable { 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mChecked; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCheckMarkResource; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCheckMarkDrawable; 45aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio private int mBasePadding; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCheckMarkWidth; 47aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio private boolean mNeedRequestlayout; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] CHECKED_STATE_SET = { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.attr.state_checked 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CheckedTextView(Context context) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CheckedTextView(Context context, AttributeSet attrs) { 58b023a587adf9ca49f0cc33c5607b535c11efeb2bFabrice Di Meglio this(context, attrs, R.attr.checkedTextViewStyle); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CheckedTextView(Context context, AttributeSet attrs, int defStyle) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.CheckedTextView, defStyle, 0); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckMarkDrawable(d); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(checked); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggle() { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(!mChecked); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 817a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeigler 827a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeigler @ViewDebug.ExportedProperty 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isChecked() { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChecked; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the checked state of this text view.</p> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param checked true to check the text, false to uncheck it 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChecked(boolean checked) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChecked != checked) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChecked = checked; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 9677e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette notifyViewAccessibilityStateChangedIfNeeded( 9777e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the checkmark to a given Drawable, identified by its resourece id. This will be drawn 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when {@link #isChecked()} is true. 105343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio * 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The Drawable to use for the checkmark. 1072fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1082fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(Drawable) 1092fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #getCheckMarkDrawable() 1102fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1112fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCheckMarkDrawable(int resid) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0 && resid == mCheckMarkResource) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkResource = resid; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = null; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckMarkResource != 0) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = getResources().getDrawable(mCheckMarkResource); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckMarkDrawable(d); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the checkmark to a given Drawable. This will be drawn when {@link #isChecked()} is true. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d The Drawable to use for the checkmark. 1312fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1322fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(int) 1332fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #getCheckMarkDrawable() 1342fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1352fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCheckMarkDrawable(Drawable d) { 138a8da17356f9a385e097e3eef205358462d214538Leon Scroggins if (mCheckMarkDrawable != null) { 139a8da17356f9a385e097e3eef205358462d214538Leon Scroggins mCheckMarkDrawable.setCallback(null); 140a8da17356f9a385e097e3eef205358462d214538Leon Scroggins unscheduleDrawable(mCheckMarkDrawable); 141a8da17356f9a385e097e3eef205358462d214538Leon Scroggins } 142aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mNeedRequestlayout = (d != mCheckMarkDrawable); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setVisible(getVisibility() == VISIBLE, false); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(CHECKED_STATE_SET); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMinHeight(d.getIntrinsicHeight()); 148343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkWidth = d.getIntrinsicWidth(); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(getDrawableState()); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 152aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mCheckMarkWidth = 0; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 154a8da17356f9a385e097e3eef205358462d214538Leon Scroggins mCheckMarkDrawable = d; 15523c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio // Do padding resolution. This will call internalSetPadding() and do a requestLayout() if needed. 156aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio resolvePadding(); 157aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio } 158aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio 1592fb40285c78db71f41774650e4da47dda191e787Gilles Debunne /** 1602fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * Gets the checkmark drawable 1612fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1622fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @return The drawable use to represent the checkmark, if any. 1632fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1642fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(Drawable) 1652fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(int) 1662fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1672fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 1682fb40285c78db71f41774650e4da47dda191e787Gilles Debunne */ 1692fb40285c78db71f41774650e4da47dda191e787Gilles Debunne public Drawable getCheckMarkDrawable() { 1702fb40285c78db71f41774650e4da47dda191e787Gilles Debunne return mCheckMarkDrawable; 1712fb40285c78db71f41774650e4da47dda191e787Gilles Debunne } 1722fb40285c78db71f41774650e4da47dda191e787Gilles Debunne 17323c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio /** 17423c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio * @hide 17523c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio */ 17623c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio @Override 17723c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio protected void internalSetPadding(int left, int top, int right, int bottom) { 17823c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio super.internalSetPadding(left, top, right, bottom); 1790dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio setBasePadding(isLayoutRtl()); 18023c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio } 18123c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio 182aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio @Override 183343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio public void onRtlPropertiesChanged(int layoutDirection) { 184343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio super.onRtlPropertiesChanged(layoutDirection); 18515bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio updatePadding(); 18615bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio } 18715bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio 18815bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio private void updatePadding() { 18947fb191841c50f45f39c5fcce3554e4990188583Fabrice Di Meglio resetPaddingToInitialValues(); 190aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio int newPadding = (mCheckMarkDrawable != null) ? 191aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mCheckMarkWidth + mBasePadding : mBasePadding; 192e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio if (isLayoutRtl()) { 19384ebb35f392478600ddf8f08107fb345f13ef91cFabrice Di Meglio mNeedRequestlayout |= (mPaddingLeft != newPadding); 194e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio mPaddingLeft = newPadding; 195e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio } else { 19684ebb35f392478600ddf8f08107fb345f13ef91cFabrice Di Meglio mNeedRequestlayout |= (mPaddingRight != newPadding); 197e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio mPaddingRight = newPadding; 198e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio } 199aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio if (mNeedRequestlayout) { 200aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio requestLayout(); 201aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mNeedRequestlayout = false; 202aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20415bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio 2050dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio private void setBasePadding(boolean isLayoutRtl) { 2060dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio if (isLayoutRtl) { 2070dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio mBasePadding = mPaddingLeft; 2080dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } else { 2090dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio mBasePadding = mPaddingRight; 2100dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } 211bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio } 212bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio 213bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio @Override 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDraw(Canvas canvas) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable checkMarkDrawable = mCheckMarkDrawable; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (checkMarkDrawable != null) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int height = checkMarkDrawable.getIntrinsicHeight(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = 0; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (verticalGravity) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.BOTTOM: 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = getHeight() - height; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.CENTER_VERTICAL: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = (getHeight() - height) / 2; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 233e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final boolean isLayoutRtl = isLayoutRtl(); 234e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int width = getWidth(); 235e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int top = y; 236e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int bottom = top + height; 23723c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio final int left; 23823c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio final int right; 23923c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio if (isLayoutRtl) { 2400dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio left = mBasePadding; 24123c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio right = left + mCheckMarkWidth; 2420dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } else { 2430dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio right = width - mBasePadding; 2440dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio left = right - mCheckMarkWidth; 24523c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio } 24678cdc55f74bbbccf882a7ea5b2b1cf2dc41c87caJorn Jacobsson checkMarkDrawable.setBounds(mScrollX + left, top, mScrollX + right, bottom); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkMarkDrawable.draw(canvas); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isChecked()) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mergeDrawableStates(drawableState, CHECKED_STATE_SET); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawableState; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckMarkDrawable != null) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] myDrawableState = getDrawableState(); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the state of the Drawable 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkDrawable.setState(myDrawableState); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 27475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov @Override 27530401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 27630401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 2778a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(CheckedTextView.class.getName()); 278736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setChecked(mChecked); 27975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 2807650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov 2817650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov @Override 28234ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 28334ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 2848a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(CheckedTextView.class.getName()); 285c85015cd0409b5ffd55bf94a068828385d032f47Svetoslav Ganov info.setCheckable(true); 28634ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov info.setChecked(mChecked); 28734ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 289