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 214f64c048505a432e549ccb756634ecebf28f9e80Alan Viveretteimport android.annotation.Nullable; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 234f64c048505a432e549ccb756634ecebf28f9e80Alan Viveretteimport android.content.res.ColorStateList; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 264f64c048505a432e549ccb756634ecebf28f9e80Alan Viveretteimport android.graphics.PorterDuff; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 302356c5e69b0911e6334ebf6374217898371be5acAlan Viveretteimport android.view.RemotableViewMethod; 317a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeiglerimport android.view.ViewDebug; 3275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent; 3334ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An extension to TextView that supports the {@link android.widget.Checkable} interface. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is useful when used in a {@link android.widget.ListView ListView} where the it's 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ListView#setChoiceMode(int) setChoiceMode} has been set to 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * something other than {@link android.widget.ListView#CHOICE_MODE_NONE CHOICE_MODE_NONE}. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 422fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checked 432fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 458b5e7c046d4ab2fff7c4e1c67488058ff736b9eaRomain Guypublic class CheckedTextView extends TextView implements Checkable { 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mChecked; 474f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCheckMarkResource; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mCheckMarkDrawable; 50a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette private ColorStateList mCheckMarkTintList = null; 51b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette private PorterDuff.Mode mCheckMarkTintMode = null; 524f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette private boolean mHasCheckMarkTint = false; 53b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette private boolean mHasCheckMarkTintMode = false; 544f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 55aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio private int mBasePadding; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCheckMarkWidth; 5716f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell private int mCheckMarkGravity = Gravity.END; 5816f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell 59aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio private boolean mNeedRequestlayout; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] CHECKED_STATE_SET = { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.attr.state_checked 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CheckedTextView(Context context) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CheckedTextView(Context context, AttributeSet attrs) { 70b023a587adf9ca49f0cc33c5607b535c11efeb2bFabrice Di Meglio this(context, attrs, R.attr.checkedTextViewStyle); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr) { 74617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette this(context, attrs, defStyleAttr, 0); 75617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette } 76617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette 77617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public CheckedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 78617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette super(context, attrs, defStyleAttr, defStyleRes); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 80617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette final TypedArray a = context.obtainStyledAttributes( 81617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette attrs, R.styleable.CheckedTextView, defStyleAttr, defStyleRes); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 83b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette final Drawable d = a.getDrawable(R.styleable.CheckedTextView_checkMark); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckMarkDrawable(d); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 88b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette if (a.hasValue(R.styleable.CheckedTextView_checkMarkTintMode)) { 89b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette mCheckMarkTintMode = Drawable.parseTintMode(a.getInt( 90b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette R.styleable.CheckedTextView_checkMarkTintMode, -1), mCheckMarkTintMode); 91b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette mHasCheckMarkTintMode = true; 92b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette } 934f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 9416f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell if (a.hasValue(R.styleable.CheckedTextView_checkMarkTint)) { 9516f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell mCheckMarkTintList = a.getColorStateList(R.styleable.CheckedTextView_checkMarkTint); 964f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette mHasCheckMarkTint = true; 974f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 984f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 9916f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell mCheckMarkGravity = a.getInt(R.styleable.CheckedTextView_checkMarkGravity, Gravity.END); 10016f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell 101b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette final boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(checked); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 105b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette 106b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette applyCheckMarkTint(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void toggle() { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChecked(!mChecked); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1127a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeigler 1137a36788f4a69b3ddaf8fb8e250e1a13bee7238faSteve Zeigler @ViewDebug.ExportedProperty 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isChecked() { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChecked; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the checked state of this text view.</p> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param checked true to check the text, false to uncheck it 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChecked(boolean checked) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChecked != checked) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChecked = checked; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 12777e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette notifyViewAccessibilityStateChangedIfNeeded( 12877e9a28e2faa36f127231b842476d47f9823a83aAlan Viverette AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the checkmark to a given Drawable, identified by its resourece id. This will be drawn 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when {@link #isChecked()} is true. 136343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param resid The Drawable to use for the checkmark. 1382fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1392fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(Drawable) 1402fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #getCheckMarkDrawable() 1412fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1422fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCheckMarkDrawable(int resid) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resid != 0 && resid == mCheckMarkResource) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkResource = resid; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable d = null; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckMarkResource != 0) { 1538eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette d = getContext().getDrawable(mCheckMarkResource); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCheckMarkDrawable(d); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the checkmark to a given Drawable. This will be drawn when {@link #isChecked()} is true. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param d The Drawable to use for the checkmark. 1622fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1632fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(int) 1642fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #getCheckMarkDrawable() 1652fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 1662fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCheckMarkDrawable(Drawable d) { 169a8da17356f9a385e097e3eef205358462d214538Leon Scroggins if (mCheckMarkDrawable != null) { 170a8da17356f9a385e097e3eef205358462d214538Leon Scroggins mCheckMarkDrawable.setCallback(null); 171a8da17356f9a385e097e3eef205358462d214538Leon Scroggins unscheduleDrawable(mCheckMarkDrawable); 172a8da17356f9a385e097e3eef205358462d214538Leon Scroggins } 173aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mNeedRequestlayout = (d != mCheckMarkDrawable); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d != null) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setCallback(this); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setVisible(getVisibility() == VISIBLE, false); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(CHECKED_STATE_SET); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMinHeight(d.getIntrinsicHeight()); 179343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkWidth = d.getIntrinsicWidth(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d.setState(getDrawableState()); 1824f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette applyCheckMarkTint(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 184aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mCheckMarkWidth = 0; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 186a8da17356f9a385e097e3eef205358462d214538Leon Scroggins mCheckMarkDrawable = d; 1872356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 1882356c5e69b0911e6334ebf6374217898371be5acAlan Viverette // Do padding resolution. This will call internalSetPadding() and do a 1892356c5e69b0911e6334ebf6374217898371be5acAlan Viverette // requestLayout() if needed. 190aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio resolvePadding(); 191aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio } 192aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio 1934f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette /** 1944f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * Applies a tint to the check mark drawable. Does not modify the 195b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * current tint mode, which is {@link PorterDuff.Mode#SRC_IN} by default. 1964f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * <p> 1974f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * Subsequent calls to {@link #setCheckMarkDrawable(Drawable)} will 1984f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * automatically mutate the drawable and apply the specified tint and 1994f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * tint mode using 200a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * {@link Drawable#setTintList(ColorStateList)}. 2014f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * 2024f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @param tint the tint to apply, may be {@code null} to clear tint 2034f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * 2044f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @attr ref android.R.styleable#CheckedTextView_checkMarkTint 205a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #getCheckMarkTintList() 206a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see Drawable#setTintList(ColorStateList) 2074f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette */ 208a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setCheckMarkTintList(@Nullable ColorStateList tint) { 209a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette mCheckMarkTintList = tint; 2104f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette mHasCheckMarkTint = true; 2114f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2124f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette applyCheckMarkTint(); 2134f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2144f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2154f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette /** 216b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * Returns the tint applied to the check mark drawable, if specified. 217b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * 2184f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @return the tint applied to the check mark drawable 2194f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @attr ref android.R.styleable#CheckedTextView_checkMarkTint 220a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setCheckMarkTintList(ColorStateList) 2214f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette */ 2224f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette @Nullable 223a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public ColorStateList getCheckMarkTintList() { 224a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette return mCheckMarkTintList; 2254f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2264f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2274f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette /** 2284f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * Specifies the blending mode used to apply the tint specified by 229a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * {@link #setCheckMarkTintList(ColorStateList)} to the check mark 230b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}. 2314f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * 2324f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @param tintMode the blending mode used to apply the tint, may be 2334f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * {@code null} to clear tint 2344f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @attr ref android.R.styleable#CheckedTextView_checkMarkTintMode 235a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setCheckMarkTintList(ColorStateList) 236a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see Drawable#setTintMode(PorterDuff.Mode) 2374f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette */ 2384f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette public void setCheckMarkTintMode(@Nullable PorterDuff.Mode tintMode) { 2394f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette mCheckMarkTintMode = tintMode; 240b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette mHasCheckMarkTintMode = true; 2414f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2424f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette applyCheckMarkTint(); 2434f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2444f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2454f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette /** 246b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * Returns the blending mode used to apply the tint to the check mark 247b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * drawable, if specified. 248b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * 249b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * @return the blending mode used to apply the tint to the check mark 250b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette * drawable 2514f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @attr ref android.R.styleable#CheckedTextView_checkMarkTintMode 2524f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette * @see #setCheckMarkTintMode(PorterDuff.Mode) 2534f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette */ 2544f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette @Nullable 2554f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette public PorterDuff.Mode getCheckMarkTintMode() { 2564f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette return mCheckMarkTintMode; 2574f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2584f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2594f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette private void applyCheckMarkTint() { 260b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette if (mCheckMarkDrawable != null && (mHasCheckMarkTint || mHasCheckMarkTintMode)) { 2614f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette mCheckMarkDrawable = mCheckMarkDrawable.mutate(); 262b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette 263b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette if (mHasCheckMarkTint) { 264b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette mCheckMarkDrawable.setTintList(mCheckMarkTintList); 265b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette } 266b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette 267b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette if (mHasCheckMarkTintMode) { 268b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette mCheckMarkDrawable.setTintMode(mCheckMarkTintMode); 269b56f5d2ab18f881eb075b698e9ce1b4a4a09ff64Alan Viverette } 270d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette 271d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette // The drawable (or one of its children) may not have been 272d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette // stateful before applying the tint, so let's try again. 273d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette if (mCheckMarkDrawable.isStateful()) { 274d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette mCheckMarkDrawable.setState(getDrawableState()); 275d5133792391443521dc15f7da7de5d280e6703ddAlan Viverette } 2764f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2774f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette } 2784f64c048505a432e549ccb756634ecebf28f9e80Alan Viverette 2792356c5e69b0911e6334ebf6374217898371be5acAlan Viverette @RemotableViewMethod 2802356c5e69b0911e6334ebf6374217898371be5acAlan Viverette @Override 2812356c5e69b0911e6334ebf6374217898371be5acAlan Viverette public void setVisibility(int visibility) { 2822356c5e69b0911e6334ebf6374217898371be5acAlan Viverette super.setVisibility(visibility); 2832356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 2842356c5e69b0911e6334ebf6374217898371be5acAlan Viverette if (mCheckMarkDrawable != null) { 2852356c5e69b0911e6334ebf6374217898371be5acAlan Viverette mCheckMarkDrawable.setVisible(visibility == VISIBLE, false); 2862356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 2872356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 2882356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 2892356c5e69b0911e6334ebf6374217898371be5acAlan Viverette @Override 2902356c5e69b0911e6334ebf6374217898371be5acAlan Viverette public void jumpDrawablesToCurrentState() { 2912356c5e69b0911e6334ebf6374217898371be5acAlan Viverette super.jumpDrawablesToCurrentState(); 2922356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 2932356c5e69b0911e6334ebf6374217898371be5acAlan Viverette if (mCheckMarkDrawable != null) { 2942356c5e69b0911e6334ebf6374217898371be5acAlan Viverette mCheckMarkDrawable.jumpToCurrentState(); 2952356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 2962356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 2972356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 2982356c5e69b0911e6334ebf6374217898371be5acAlan Viverette @Override 2992356c5e69b0911e6334ebf6374217898371be5acAlan Viverette protected boolean verifyDrawable(Drawable who) { 3002356c5e69b0911e6334ebf6374217898371be5acAlan Viverette return who == mCheckMarkDrawable || super.verifyDrawable(who); 3012356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 3022356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 3032fb40285c78db71f41774650e4da47dda191e787Gilles Debunne /** 3042fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * Gets the checkmark drawable 3052fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 3062fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @return The drawable use to represent the checkmark, if any. 3072fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 3082fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(Drawable) 3092fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @see #setCheckMarkDrawable(int) 3102fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * 3112fb40285c78db71f41774650e4da47dda191e787Gilles Debunne * @attr ref android.R.styleable#CheckedTextView_checkMark 3122fb40285c78db71f41774650e4da47dda191e787Gilles Debunne */ 3132fb40285c78db71f41774650e4da47dda191e787Gilles Debunne public Drawable getCheckMarkDrawable() { 3142fb40285c78db71f41774650e4da47dda191e787Gilles Debunne return mCheckMarkDrawable; 3152fb40285c78db71f41774650e4da47dda191e787Gilles Debunne } 3162fb40285c78db71f41774650e4da47dda191e787Gilles Debunne 31723c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio /** 31823c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio * @hide 31923c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio */ 32023c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio @Override 32123c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio protected void internalSetPadding(int left, int top, int right, int bottom) { 32223c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio super.internalSetPadding(left, top, right, bottom); 32316f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell setBasePadding(isCheckMarkAtStart()); 32423c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio } 32523c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio 326aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio @Override 327343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio public void onRtlPropertiesChanged(int layoutDirection) { 328343e11345ed496003f605e1b3bba5850d3e6cf0eFabrice Di Meglio super.onRtlPropertiesChanged(layoutDirection); 32915bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio updatePadding(); 33015bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio } 33115bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio 33215bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio private void updatePadding() { 33347fb191841c50f45f39c5fcce3554e4990188583Fabrice Di Meglio resetPaddingToInitialValues(); 334aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio int newPadding = (mCheckMarkDrawable != null) ? 335aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mCheckMarkWidth + mBasePadding : mBasePadding; 33616f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell if (isCheckMarkAtStart()) { 33784ebb35f392478600ddf8f08107fb345f13ef91cFabrice Di Meglio mNeedRequestlayout |= (mPaddingLeft != newPadding); 338e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio mPaddingLeft = newPadding; 339e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio } else { 34084ebb35f392478600ddf8f08107fb345f13ef91cFabrice Di Meglio mNeedRequestlayout |= (mPaddingRight != newPadding); 341e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio mPaddingRight = newPadding; 342e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio } 343aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio if (mNeedRequestlayout) { 344aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio requestLayout(); 345aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio mNeedRequestlayout = false; 346aff599b4abb10bad6711ff9348f97a56240e0612Fabrice Di Meglio } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34815bbde41dafd592b8d45a7ee6003c1f0b439cb68Fabrice Di Meglio 34916f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell private void setBasePadding(boolean checkmarkAtStart) { 35016f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell if (checkmarkAtStart) { 3510dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio mBasePadding = mPaddingLeft; 3520dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } else { 3530dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio mBasePadding = mPaddingRight; 3540dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } 355bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio } 356bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio 35716f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell private boolean isCheckMarkAtStart() { 35816f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell final int gravity = Gravity.getAbsoluteGravity(mCheckMarkGravity, getLayoutDirection()); 35916f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell final int hgrav = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; 36016f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell return hgrav == Gravity.LEFT; 36116f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell } 36216f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell 363bf923ebb250a112266bd9bcae106cb84f42b6f15Fabrice Di Meglio @Override 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDraw(Canvas canvas) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDraw(canvas); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Drawable checkMarkDrawable = mCheckMarkDrawable; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (checkMarkDrawable != null) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int height = checkMarkDrawable.getIntrinsicHeight(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = 0; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (verticalGravity) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.BOTTOM: 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = getHeight() - height; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.CENTER_VERTICAL: 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = (getHeight() - height) / 2; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38316f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell final boolean checkMarkAtStart = isCheckMarkAtStart(); 384e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int width = getWidth(); 385e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int top = y; 386e2386c184a75b15a0fe7e3791e7ad06d59be7c80Fabrice Di Meglio final int bottom = top + height; 38723c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio final int left; 38823c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio final int right; 38916f2b90d6a54a824e60f09a31bb2a9263166cdd2Adam Powell if (checkMarkAtStart) { 3900dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio left = mBasePadding; 39123c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio right = left + mCheckMarkWidth; 3920dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio } else { 3930dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio right = width - mBasePadding; 3940dc9646e7e8caa7ec78dbd75b21af153168a1df5Fabrice Di Meglio left = right - mCheckMarkWidth; 39523c89fd1685a006957dc0f2aacf167b4449f3d80Fabrice Di Meglio } 39678cdc55f74bbbccf882a7ea5b2b1cf2dc41c87caJorn Jacobsson checkMarkDrawable.setBounds(mScrollX + left, top, mScrollX + right, bottom); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project checkMarkDrawable.draw(canvas); 3982356c5e69b0911e6334ebf6374217898371be5acAlan Viverette 3992356c5e69b0911e6334ebf6374217898371be5acAlan Viverette final Drawable background = getBackground(); 4002356c5e69b0911e6334ebf6374217898371be5acAlan Viverette if (background != null) { 4012356c5e69b0911e6334ebf6374217898371be5acAlan Viverette background.setHotspotBounds(mScrollX + left, top, mScrollX + right, bottom); 4022356c5e69b0911e6334ebf6374217898371be5acAlan Viverette } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isChecked()) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mergeDrawableStates(drawableState, CHECKED_STATE_SET); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawableState; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCheckMarkDrawable != null) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] myDrawableState = getDrawableState(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set the state of the Drawable 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCheckMarkDrawable.setState(myDrawableState); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 42875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 429cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette @Override 4308de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette public void drawableHotspotChanged(float x, float y) { 4318de1494557cf1d00c1c3fce439138a28de7fbd61Alan Viverette super.drawableHotspotChanged(x, y); 432cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette 433cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette if (mCheckMarkDrawable != null) { 434cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette mCheckMarkDrawable.setHotspot(x, y); 435cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette } 436cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette } 437cebc6bab51d9c77db8f346c1390169eabac4f27dAlan Viverette 43875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov @Override 43930401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 44030401328c1026389171d454c934c15875c3f7ff0Svetoslav Ganov super.onInitializeAccessibilityEvent(event); 4418a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov event.setClassName(CheckedTextView.class.getName()); 442736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov event.setChecked(mChecked); 44375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 4447650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov 4457650259a597dd24137420d32acc35efc44db381eSvetoslav Ganov @Override 44634ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 44734ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov super.onInitializeAccessibilityNodeInfo(info); 4488a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov info.setClassName(CheckedTextView.class.getName()); 449c85015cd0409b5ffd55bf94a068828385d032f47Svetoslav Ganov info.setCheckable(true); 45034ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov info.setChecked(mChecked); 45134ffaabc30eed123c12258ea63c3a53d1c92b559Svetoslav Ganov } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 453