From 16f2b90d6a54a824e60f09a31bb2a9263166cdd2 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Mon, 11 Aug 2014 17:30:19 -0700 Subject: [PATCH] Show checkmarks at the start of material AlertDialog list items Also fix a bug in parsing CheckedTextView tinting attributes Bug 16552638 Change-Id: I20d41b6f6d418fdc115108d31f4f463e371794d2 --- core/java/android/widget/CheckedTextView.java | 28 +++++++++++++------ .../select_dialog_multichoice_material.xml | 1 + .../select_dialog_singlechoice_material.xml | 1 + core/res/res/values/attrs.xml | 11 ++++++++ core/res/res/values/symbols.xml | 3 ++ 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java index ccd0480164f76..29a6a7d4177f9 100644 --- a/core/java/android/widget/CheckedTextView.java +++ b/core/java/android/widget/CheckedTextView.java @@ -53,6 +53,8 @@ public class CheckedTextView extends TextView implements Checkable { private int mBasePadding; private int mCheckMarkWidth; + private int mCheckMarkGravity = Gravity.END; + private boolean mNeedRequestlayout; private static final int[] CHECKED_STATE_SET = { @@ -83,15 +85,17 @@ public class CheckedTextView extends TextView implements Checkable { } mCheckMarkTintMode = Drawable.parseTintMode(a.getInt( - R.styleable.CompoundButton_buttonTintMode, -1), mCheckMarkTintMode); + R.styleable.CheckedTextView_checkMarkTintMode, -1), mCheckMarkTintMode); - if (a.hasValue(R.styleable.CompoundButton_buttonTint)) { - mCheckMarkTintList = a.getColorStateList(R.styleable.CompoundButton_buttonTint); + if (a.hasValue(R.styleable.CheckedTextView_checkMarkTint)) { + mCheckMarkTintList = a.getColorStateList(R.styleable.CheckedTextView_checkMarkTint); mHasCheckMarkTint = true; applyCheckMarkTint(); } + mCheckMarkGravity = a.getInt(R.styleable.CheckedTextView_checkMarkGravity, Gravity.END); + boolean checked = a.getBoolean(R.styleable.CheckedTextView_checked, false); setChecked(checked); @@ -293,7 +297,7 @@ public class CheckedTextView extends TextView implements Checkable { @Override protected void internalSetPadding(int left, int top, int right, int bottom) { super.internalSetPadding(left, top, right, bottom); - setBasePadding(isLayoutRtl()); + setBasePadding(isCheckMarkAtStart()); } @Override @@ -306,7 +310,7 @@ public class CheckedTextView extends TextView implements Checkable { resetPaddingToInitialValues(); int newPadding = (mCheckMarkDrawable != null) ? mCheckMarkWidth + mBasePadding : mBasePadding; - if (isLayoutRtl()) { + if (isCheckMarkAtStart()) { mNeedRequestlayout |= (mPaddingLeft != newPadding); mPaddingLeft = newPadding; } else { @@ -319,14 +323,20 @@ public class CheckedTextView extends TextView implements Checkable { } } - private void setBasePadding(boolean isLayoutRtl) { - if (isLayoutRtl) { + private void setBasePadding(boolean checkmarkAtStart) { + if (checkmarkAtStart) { mBasePadding = mPaddingLeft; } else { mBasePadding = mPaddingRight; } } + private boolean isCheckMarkAtStart() { + final int gravity = Gravity.getAbsoluteGravity(mCheckMarkGravity, getLayoutDirection()); + final int hgrav = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; + return hgrav == Gravity.LEFT; + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); @@ -347,13 +357,13 @@ public class CheckedTextView extends TextView implements Checkable { break; } - final boolean isLayoutRtl = isLayoutRtl(); + final boolean checkMarkAtStart = isCheckMarkAtStart(); final int width = getWidth(); final int top = y; final int bottom = top + height; final int left; final int right; - if (isLayoutRtl) { + if (checkMarkAtStart) { left = mBasePadding; right = left + mCheckMarkWidth; } else { diff --git a/core/res/res/layout/select_dialog_multichoice_material.xml b/core/res/res/layout/select_dialog_multichoice_material.xml index 8b4c59df87288..01e4cfa89960e 100644 --- a/core/res/res/layout/select_dialog_multichoice_material.xml +++ b/core/res/res/layout/select_dialog_multichoice_material.xml @@ -26,4 +26,5 @@ android:paddingStart="16dip" android:paddingEnd="16dip" android:checkMark="?android:attr/listChoiceIndicatorMultiple" + android:checkMarkGravity="start" android:ellipsize="marquee" /> diff --git a/core/res/res/layout/select_dialog_singlechoice_material.xml b/core/res/res/layout/select_dialog_singlechoice_material.xml index 27a6648b53ec5..0f3c277a8a508 100644 --- a/core/res/res/layout/select_dialog_singlechoice_material.xml +++ b/core/res/res/layout/select_dialog_singlechoice_material.xml @@ -26,4 +26,5 @@ android:paddingStart="16dip" android:paddingEnd="16dip" android:checkMark="?android:attr/listChoiceIndicatorSingle" + android:checkMarkGravity="start" android:ellipsize="marquee" /> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 989cabaed3bfc..89bda8217d958 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3163,6 +3163,17 @@ result to valid color values. Saturate(S + D) --> + + + + + + + + + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 220f5ab872242..94b2f4b9efe35 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1979,4 +1979,7 @@ + + +