From 661e63658da39cccfe49a129e4860455716ff3c9 Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Mon, 12 May 2014 10:55:37 -0700 Subject: [PATCH] Support for hollow switch and seek bar thumbs Also cleans up AbsSeekBar. Change-Id: I996ea90c732c1da6a801aad3079f6bb3692d5c67 --- api/current.txt | 5 + core/java/android/widget/AbsSeekBar.java | 219 +++++++++++------- core/java/android/widget/ProgressBar.java | 21 +- core/java/android/widget/Switch.java | 90 +++++-- .../scrubber_control_off_qntm_alpha.png | Bin 341 -> 232 bytes .../scrubber_control_on_qntm_alpha.png | Bin 241 -> 184 bytes .../drawable-hdpi/switch_off_qntm_alpha.9.png | Bin 546 -> 523 bytes .../drawable-hdpi/switch_on_qntm_alpha.9.png | Bin 222 -> 187 bytes .../scrubber_control_off_qntm_alpha.png | Bin 230 -> 181 bytes .../scrubber_control_on_qntm_alpha.png | Bin 182 -> 154 bytes .../drawable-mdpi/switch_off_qntm_alpha.9.png | Bin 390 -> 371 bytes .../drawable-mdpi/switch_on_qntm_alpha.9.png | Bin 184 -> 156 bytes .../scrubber_control_off_qntm_alpha.png | Bin 495 -> 314 bytes .../scrubber_control_on_qntm_alpha.png | Bin 304 -> 248 bytes .../switch_off_qntm_alpha.9.png | Bin 827 -> 767 bytes .../drawable-xhdpi/switch_on_qntm_alpha.9.png | Bin 279 -> 223 bytes .../scrubber_control_off_qntm_alpha.png | Bin 1014 -> 388 bytes .../scrubber_control_on_qntm_alpha.png | Bin 881 -> 294 bytes .../switch_off_qntm_alpha.9.png | Bin 1153 -> 1089 bytes .../switch_on_qntm_alpha.9.png | Bin 508 -> 293 bytes .../scrubber_progress_horizontal_quantum.xml | 16 +- core/res/res/values/attrs.xml | 4 + core/res/res/values/public.xml | 1 + core/res/res/values/styles_quantum.xml | 6 +- 24 files changed, 244 insertions(+), 118 deletions(-) diff --git a/api/current.txt b/api/current.txt index 89261b284a7b5..dae6cdae24c85 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1047,6 +1047,7 @@ package android { field public static final int spinnerStyle = 16842881; // 0x1010081 field public static final int spinnersShown = 16843595; // 0x101034b field public static final int splitMotionEvents = 16843503; // 0x10102ef + field public static final int splitTrack = 16843858; // 0x1010452 field public static final int src = 16843033; // 0x1010119 field public static final int ssp = 16843747; // 0x10103e3 field public static final int sspPattern = 16843749; // 0x10103e5 @@ -34345,9 +34346,11 @@ package android.widget { ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int); ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int, int); method public int getKeyProgressIncrement(); + method public boolean getSplitTrack(); method public android.graphics.drawable.Drawable getThumb(); method public int getThumbOffset(); method public void setKeyProgressIncrement(int); + method public void setSplitTrack(boolean); method public void setThumb(android.graphics.drawable.Drawable); method public void setThumbOffset(int); } @@ -36150,6 +36153,7 @@ package android.widget { ctor public Switch(android.content.Context, android.util.AttributeSet); ctor public Switch(android.content.Context, android.util.AttributeSet, int); ctor public Switch(android.content.Context, android.util.AttributeSet, int, int); + method public boolean getSplitTrack(); method public int getSwitchMinWidth(); method public int getSwitchPadding(); method public java.lang.CharSequence getTextOff(); @@ -36158,6 +36162,7 @@ package android.widget { method public int getThumbTextPadding(); method public android.graphics.drawable.Drawable getTrackDrawable(); method public void onMeasure(int, int); + method public void setSplitTrack(boolean); method public void setSwitchMinWidth(int); method public void setSwitchPadding(int); method public void setSwitchTextAppearance(android.content.Context, int); diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 225cd6d589ca1..4f2d9c647fdad 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -19,7 +19,9 @@ package android.widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.Insets; import android.graphics.Rect; +import android.graphics.Region.Op; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.AttributeSet; @@ -32,9 +34,12 @@ import android.view.accessibility.AccessibilityNodeInfo; import com.android.internal.R; public abstract class AbsSeekBar extends ProgressBar { + private final Rect mTempRect = new Rect(); + private Drawable mThumb; private int mThumbOffset; - + private boolean mSplitTrack; + /** * On touch, this offset plus the scaled value from the position of the * touch will form the progress value. Usually 0. @@ -51,10 +56,10 @@ public abstract class AbsSeekBar extends ProgressBar { * progress. */ private int mKeyProgressIncrement = 1; - + private static final int NO_ALPHA = 0xFF; private float mDisabledAlpha; - + private int mScaledTouchSlop; private float mTouchDownX; private boolean mIsDragging; @@ -76,12 +81,16 @@ public abstract class AbsSeekBar extends ProgressBar { TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.SeekBar, defStyleAttr, defStyleRes); - Drawable thumb = a.getDrawable(com.android.internal.R.styleable.SeekBar_thumb); - setThumb(thumb); // will guess mThumbOffset if thumb != null... - // ...but allow layout to override this - int thumbOffset = a.getDimensionPixelOffset( + + final Drawable thumb = a.getDrawable(com.android.internal.R.styleable.SeekBar_thumb); + setThumb(thumb); + + // Guess thumb offset if thumb != null, but allow layout to override. + final int thumbOffset = a.getDimensionPixelOffset( com.android.internal.R.styleable.SeekBar_thumbOffset, getThumbOffset()); setThumbOffset(thumbOffset); + + mSplitTrack = a.getBoolean(com.android.internal.R.styleable.SeekBar_splitTrack, false); a.recycle(); a = context.obtainStyledAttributes(attrs, @@ -97,7 +106,7 @@ public abstract class AbsSeekBar extends ProgressBar { *

* If the thumb is a valid drawable (i.e. not null), half its width will be * used as the new thumb offset (@see #setThumbOffset(int)). - * + * * @param thumb Drawable representing the thumb */ public void setThumb(Drawable thumb) { @@ -132,7 +141,7 @@ public abstract class AbsSeekBar extends ProgressBar { mThumb = thumb; invalidate(); if (needUpdate) { - updateThumbPos(getWidth(), getHeight()); + updateThumbAndTrackPos(getWidth(), getHeight()); if (thumb != null && thumb.isStateful()) { // Note that if the states are different this won't work. // For now, let's consider that an app bug. @@ -162,7 +171,7 @@ public abstract class AbsSeekBar extends ProgressBar { /** * Sets the thumb offset that allows the thumb to extend out of the range of * the track. - * + * * @param thumbOffset The offset amount in pixels. */ public void setThumbOffset(int thumbOffset) { @@ -170,9 +179,28 @@ public abstract class AbsSeekBar extends ProgressBar { invalidate(); } + /** + * Specifies whether the track should be split by the thumb. When true, + * the thumb's optical bounds will be clipped out of the track drawable, + * then the thumb will be drawn into the resulting gap. + * + * @param splitTrack Whether the track should be split by the thumb + */ + public void setSplitTrack(boolean splitTrack) { + mSplitTrack = splitTrack; + invalidate(); + } + + /** + * Returns whether the track should be split by the thumb. + */ + public boolean getSplitTrack() { + return mSplitTrack; + } + /** * Sets the amount of progress changed via the arrow keys. - * + * * @param increment The amount to increment or decrement when the user * presses the arrow keys. */ @@ -184,14 +212,14 @@ public abstract class AbsSeekBar extends ProgressBar { * Returns the amount of progress changed via the arrow keys. *

* By default, this will be a value that is derived from the max progress. - * + * * @return The amount to increment or decrement when the user presses the * arrow keys. This will be positive. */ public int getKeyProgressIncrement() { return mKeyProgressIncrement; } - + @Override public synchronized void setMax(int max) { super.setMax(max); @@ -217,79 +245,85 @@ public abstract class AbsSeekBar extends ProgressBar { @Override protected void drawableStateChanged() { super.drawableStateChanged(); - - Drawable progressDrawable = getProgressDrawable(); + + final Drawable progressDrawable = getProgressDrawable(); if (progressDrawable != null) { progressDrawable.setAlpha(isEnabled() ? NO_ALPHA : (int) (NO_ALPHA * mDisabledAlpha)); } - - if (mThumb != null && mThumb.isStateful()) { - int[] state = getDrawableState(); - mThumb.setState(state); + + final Drawable thumb = mThumb; + if (thumb != null && thumb.isStateful()) { + thumb.setState(getDrawableState()); } } - + @Override void onProgressRefresh(float scale, boolean fromUser) { super.onProgressRefresh(scale, fromUser); - Drawable thumb = mThumb; + + final Drawable thumb = mThumb; if (thumb != null) { setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE); - /* - * Since we draw translated, the drawable's bounds that it signals - * for invalidation won't be the actual bounds we want invalidated, - * so just invalidate this whole view. - */ + + // Since we draw translated, the drawable's bounds that it signals + // for invalidation won't be the actual bounds we want invalidated, + // so just invalidate this whole view. invalidate(); } } - - + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - updateThumbPos(w, h); + + updateThumbAndTrackPos(w, h); } - private void updateThumbPos(int w, int h) { - Drawable d = getCurrentDrawable(); - Drawable thumb = mThumb; - int thumbHeight = thumb == null ? 0 : thumb.getIntrinsicHeight(); + private void updateThumbAndTrackPos(int w, int h) { + final Drawable track = getCurrentDrawable(); + final Drawable thumb = mThumb; + // The max height does not incorporate padding, whereas the height - // parameter does - int trackHeight = Math.min(mMaxHeight, h - mPaddingTop - mPaddingBottom); - - int max = getMax(); - float scale = max > 0 ? (float) getProgress() / (float) max : 0; - + // parameter does. + final int trackHeight = Math.min(mMaxHeight, h - mPaddingTop - mPaddingBottom); + final int thumbHeight = thumb == null ? 0 : thumb.getIntrinsicHeight(); + + // Apply offset to whichever item is taller. + final int trackOffset; + final int thumbOffset; if (thumbHeight > trackHeight) { - if (thumb != null) { - setThumbPos(w, thumb, scale, 0); - } - int gapForCenteringTrack = (thumbHeight - trackHeight) / 2; - if (d != null) { - // Canvas will be translated by the padding, so 0,0 is where we start drawing - d.setBounds(0, gapForCenteringTrack, - w - mPaddingRight - mPaddingLeft, h - mPaddingBottom - gapForCenteringTrack - - mPaddingTop); - } + trackOffset = (thumbHeight - trackHeight) / 2; + thumbOffset = 0; } else { - if (d != null) { - // Canvas will be translated by the padding, so 0,0 is where we start drawing - d.setBounds(0, 0, w - mPaddingRight - mPaddingLeft, h - mPaddingBottom - - mPaddingTop); - } - int gap = (trackHeight - thumbHeight) / 2; - if (thumb != null) { - setThumbPos(w, thumb, scale, gap); - } + trackOffset = 0; + thumbOffset = (trackHeight - thumbHeight) / 2; + } + + if (track != null) { + track.setBounds(0, trackOffset, w - mPaddingRight - mPaddingLeft, + h - mPaddingBottom - trackOffset - mPaddingTop); + } + + if (thumb != null) { + setThumbPos(w, thumb, getScale(), thumbOffset); } } + private float getScale() { + final int max = getMax(); + return max > 0 ? getProgress() / (float) max : 0; + } + /** - * @param gap If set to {@link Integer#MIN_VALUE}, this will be ignored and + * Updates the thumb drawable bounds. + * + * @param w Width of the view, including padding + * @param thumb Drawable used for the thumb + * @param scale Current progress between 0 and 1 + * @param offset Vertical offset for centering. If set to + * {@link Integer#MIN_VALUE}, the current offset will be used. */ - private void setThumbPos(int w, Drawable thumb, float scale, int gap) { + private void setThumbPos(int w, Drawable thumb, float scale, int offset) { int available = w - mPaddingLeft - mPaddingRight; final int thumbWidth = thumb.getIntrinsicWidth(); final int thumbHeight = thumb.getIntrinsicHeight(); @@ -301,13 +335,13 @@ public abstract class AbsSeekBar extends ProgressBar { final int thumbPos = (int) (scale * available + 0.5f); final int top, bottom; - if (gap == Integer.MIN_VALUE) { + if (offset == Integer.MIN_VALUE) { final Rect oldBounds = thumb.getBounds(); top = oldBounds.top; bottom = oldBounds.bottom; } else { - top = gap; - bottom = gap + thumbHeight; + top = offset; + bottom = offset + thumbHeight; } final int left = (isLayoutRtl() && mMirrorForRtl) ? available - thumbPos : thumbPos; @@ -342,6 +376,33 @@ public abstract class AbsSeekBar extends ProgressBar { protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); + drawThumb(canvas); + } + + @Override + void drawTrack(Canvas canvas) { + final Drawable thumbDrawable = mThumb; + if (thumbDrawable != null && mSplitTrack) { + final Insets insets = thumbDrawable.getOpticalInsets(); + final Rect tempRect = mTempRect; + thumbDrawable.copyBounds(tempRect); + tempRect.offset(mPaddingLeft - mThumbOffset, mPaddingTop); + tempRect.left += insets.left; + tempRect.right -= insets.right; + + final int saveCount = canvas.save(); + canvas.clipRect(tempRect, Op.DIFFERENCE); + super.drawTrack(canvas); + canvas.restoreToCount(saveCount); + } else { + super.drawTrack(canvas); + } + } + + /** + * Draw the thumb. + */ + void drawThumb(Canvas canvas) { if (mThumb != null) { canvas.save(); // Translate the padding. For the x, we need to allow the thumb to @@ -366,17 +427,17 @@ public abstract class AbsSeekBar extends ProgressBar { } dw += mPaddingLeft + mPaddingRight; dh += mPaddingTop + mPaddingBottom; - + setMeasuredDimension(resolveSizeAndState(dw, widthMeasureSpec, 0), resolveSizeAndState(dh, heightMeasureSpec, 0)); } - + @Override public boolean onTouchEvent(MotionEvent event) { if (!mIsUserSeekable || !isEnabled()) { return false; } - + switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (isInScrollingContainer()) { @@ -391,7 +452,7 @@ public abstract class AbsSeekBar extends ProgressBar { attemptClaimDrag(); } break; - + case MotionEvent.ACTION_MOVE: if (mIsDragging) { trackTouchEvent(event); @@ -408,7 +469,7 @@ public abstract class AbsSeekBar extends ProgressBar { } } break; - + case MotionEvent.ACTION_UP: if (mIsDragging) { trackTouchEvent(event); @@ -426,7 +487,7 @@ public abstract class AbsSeekBar extends ProgressBar { // value has not apparently changed) invalidate(); break; - + case MotionEvent.ACTION_CANCEL: if (mIsDragging) { onStopTrackingTouch(); @@ -493,7 +554,7 @@ public abstract class AbsSeekBar extends ProgressBar { mParent.requestDisallowInterceptTouchEvent(true); } } - + /** * This is called when the user has started touching this widget. */ @@ -526,7 +587,7 @@ public abstract class AbsSeekBar extends ProgressBar { setProgress(progress - mKeyProgressIncrement, true); onKeyChange(); return true; - + case KeyEvent.KEYCODE_DPAD_RIGHT: if (progress >= getMax()) break; setProgress(progress + mKeyProgressIncrement, true); @@ -595,17 +656,13 @@ public abstract class AbsSeekBar extends ProgressBar { public void onRtlPropertiesChanged(int layoutDirection) { super.onRtlPropertiesChanged(layoutDirection); - int max = getMax(); - float scale = max > 0 ? (float) getProgress() / (float) max : 0; - - Drawable thumb = mThumb; + final Drawable thumb = mThumb; if (thumb != null) { - setThumbPos(getWidth(), thumb, scale, Integer.MIN_VALUE); - /* - * Since we draw translated, the drawable's bounds that it signals - * for invalidation won't be the actual bounds we want invalidated, - * so just invalidate this whole view. - */ + setThumbPos(getWidth(), thumb, getScale(), Integer.MIN_VALUE); + + // Since we draw translated, the drawable's bounds that it signals + // for invalidation won't be the actual bounds we want invalidated, + // so just invalidate this whole view. invalidate(); } } diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index f7e81b8bd2c7f..0c3715dc6b7b1 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -1066,21 +1066,30 @@ public class ProgressBar extends View { protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); - Drawable d = mCurrentDrawable; + drawTrack(canvas); + } + + /** + * Draws the progress bar track. + */ + void drawTrack(Canvas canvas) { + final Drawable d = mCurrentDrawable; if (d != null) { // Translate canvas so a indeterminate circular progress bar with padding // rotates properly in its animation - canvas.save(); + final int saveCount = canvas.save(); + if(isLayoutRtl() && mMirrorForRtl) { canvas.translate(getWidth() - mPaddingRight, mPaddingTop); canvas.scale(-1.0f, 1.0f); } else { canvas.translate(mPaddingLeft, mPaddingTop); } - long time = getDrawingTime(); + + final long time = getDrawingTime(); if (mHasAnimation) { mAnimation.getTransformation(time, mTransformation); - float scale = mTransformation.getAlpha(); + final float scale = mTransformation.getAlpha(); try { mInDrawing = true; d.setLevel((int) (scale * MAX_LEVEL)); @@ -1089,8 +1098,10 @@ public class ProgressBar extends View { } postInvalidateOnAnimation(); } + d.draw(canvas); - canvas.restore(); + canvas.restoreToCount(saveCount); + if (mShouldStartAnimationDrawable && d instanceof Animatable) { ((Animatable) d).start(); mShouldStartAnimationDrawable = false; diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index 08af4dee6c641..438e16476e0da 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -22,9 +22,11 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.Insets; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; +import android.graphics.Region.Op; import android.graphics.drawable.Drawable; import android.text.Layout; import android.text.StaticLayout; @@ -85,6 +87,7 @@ public class Switch extends CompoundButton { private int mThumbTextPadding; private int mSwitchMinWidth; private int mSwitchPadding; + private boolean mSplitTrack; private CharSequence mTextOn; private CharSequence mTextOff; @@ -174,13 +177,13 @@ public class Switch extends CompoundButton { super(context, attrs, defStyleAttr, defStyleRes); mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); - Resources res = getResources(); + + final Resources res = getResources(); mTextPaint.density = res.getDisplayMetrics().density; mTextPaint.setCompatibilityScaling(res.getCompatibilityInfo().applicationScale); final TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.Switch, defStyleAttr, defStyleRes); - mThumbDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_thumb); mTrackDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_track); mTextOn = a.getText(com.android.internal.R.styleable.Switch_textOn); @@ -191,15 +194,16 @@ public class Switch extends CompoundButton { com.android.internal.R.styleable.Switch_switchMinWidth, 0); mSwitchPadding = a.getDimensionPixelSize( com.android.internal.R.styleable.Switch_switchPadding, 0); + mSplitTrack = a.getBoolean(com.android.internal.R.styleable.Switch_splitTrack, false); - int appearance = a.getResourceId( + final int appearance = a.getResourceId( com.android.internal.R.styleable.Switch_switchTextAppearance, 0); if (appearance != 0) { setSwitchTextAppearance(context, appearance); } a.recycle(); - ViewConfiguration config = ViewConfiguration.get(context); + final ViewConfiguration config = ViewConfiguration.get(context); mTouchSlop = config.getScaledTouchSlop(); mMinFlingVelocity = config.getScaledMinimumFlingVelocity(); @@ -468,6 +472,29 @@ public class Switch extends CompoundButton { return mThumbDrawable; } + /** + * Specifies whether the track should be split by the thumb. When true, + * the thumb's optical bounds will be clipped out of the track drawable, + * then the thumb will be drawn into the resulting gap. + * + * @param splitTrack Whether the track should be split by the thumb + * + * @attr ref android.R.styleable#Switch_splitTrack + */ + public void setSplitTrack(boolean splitTrack) { + mSplitTrack = splitTrack; + invalidate(); + } + + /** + * Returns whether the track should be split by the thumb. + * + * @attr ref android.R.styleable#Switch_splitTrack + */ + public boolean getSplitTrack() { + return mSplitTrack; + } + /** * Returns the text displayed when the button is in the checked state. * @@ -518,13 +545,15 @@ public class Switch extends CompoundButton { mTrackDrawable.getPadding(mTempRect); - final int maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()); + final int maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth()) + + mThumbTextPadding * 2; + mThumbWidth = Math.max(maxTextWidth, mThumbDrawable.getIntrinsicWidth()); + final int switchWidth = Math.max(mSwitchMinWidth, - maxTextWidth * 2 + mThumbTextPadding * 4 + mTempRect.left + mTempRect.right); + 2 * mThumbWidth + mTempRect.left + mTempRect.right); final int switchHeight = Math.max(mTrackDrawable.getIntrinsicHeight(), mThumbDrawable.getIntrinsicHeight()); - mThumbWidth = maxTextWidth + mThumbTextPadding * 2; mSwitchWidth = switchWidth; mSwitchHeight = switchHeight; @@ -777,7 +806,7 @@ public class Switch extends CompoundButton { final Drawable trackDrawable = mTrackDrawable; final Drawable thumbDrawable = mThumbDrawable; - // Draw the switch + // Layout the track. final int switchLeft = mSwitchLeft; final int switchTop = mSwitchTop; final int switchRight = mSwitchRight; @@ -793,9 +822,10 @@ public class Switch extends CompoundButton { // Relies on mTempRect, MUST be called first! final int thumbPos = getThumbOffset(); + // Layout the thumb. thumbDrawable.getPadding(tempRect); - int thumbLeft = switchInnerLeft - tempRect.left + thumbPos; - int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + tempRect.right; + final int thumbLeft = switchInnerLeft - tempRect.left + thumbPos; + final int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + tempRect.right; thumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom); final Drawable background = getBackground(); @@ -805,20 +835,32 @@ public class Switch extends CompoundButton { super.onDraw(canvas); - trackDrawable.draw(canvas); + if (mSplitTrack) { + final Insets insets = thumbDrawable.getOpticalInsets(); + thumbDrawable.copyBounds(tempRect); + tempRect.left += insets.left; + tempRect.right -= insets.right; + + final int saveCount = canvas.save(); + canvas.clipRect(tempRect, Op.DIFFERENCE); + trackDrawable.draw(canvas); + canvas.restoreToCount(saveCount); + } else { + trackDrawable.draw(canvas); + } final int saveCount = canvas.save(); canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom); thumbDrawable.draw(canvas); - final int drawableState[] = getDrawableState(); - if (mTextColors != null) { - mTextPaint.setColor(mTextColors.getColorForState(drawableState, 0)); - } - mTextPaint.drawableState = drawableState; - final Layout switchText = getTargetCheckedState() ? mOnLayout : mOffLayout; if (switchText != null) { + final int drawableState[] = getDrawableState(); + if (mTextColors != null) { + mTextPaint.setColor(mTextColors.getColorForState(drawableState, 0)); + } + mTextPaint.drawableState = drawableState; + final int left = (thumbLeft + thumbRight) / 2 - switchText.getWidth() / 2; final int top = (switchInnerTop + switchInnerBottom) / 2 - switchText.getHeight() / 2; canvas.translate(left, top); @@ -889,12 +931,16 @@ public class Switch extends CompoundButton { protected void drawableStateChanged() { super.drawableStateChanged(); - int[] myDrawableState = getDrawableState(); + final int[] myDrawableState = getDrawableState(); - // Set the state of the Drawable - // Drawable may be null when checked state is set from XML, from super constructor - if (mThumbDrawable != null) mThumbDrawable.setState(myDrawableState); - if (mTrackDrawable != null) mTrackDrawable.setState(myDrawableState); + if (mThumbDrawable != null && mThumbDrawable.setState(myDrawableState)) { + // Handle changes to thumb width and height. + requestLayout(); + } + + if (mTrackDrawable != null) { + mTrackDrawable.setState(myDrawableState); + } invalidate(); } diff --git a/core/res/res/drawable-hdpi/scrubber_control_off_qntm_alpha.png b/core/res/res/drawable-hdpi/scrubber_control_off_qntm_alpha.png index f1023eafb9bdc3c2dd5516f63d8ed2f81f59e54e..5a9952823c1019b19b856b02ca825eb089e16057 100644 GIT binary patch literal 232 zcmVP)fG#f-39T{xFNy$hPwmr627ljk(*j zgSC~UfmxYT3;qS19e!MlOSppV$a0Q7=-B7~ka=>%^Ik3kF!Z?Ej;J)pqD65xMW zW(vD>G%3cP{V{=~%xTs&Y-3 jF7~U(LEcPhQL(v9yP4s|fae>4PGRtL^>bP0l+XkKL3%{y literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt9iA?ZAr-gYUO&ir*nr33qQh?Y zJ-)`yY^yfUTd&4k($qFbM6%?>!V4y*5ljC!>K$Y6jOe>l3e?D8BQUZ1nD66t6HVrc zoxIkz>3H_1y>8RKpPKhT_h;Z^#p6@=E}s76aQn&k-5he~YNmZIx;$^gvOm`@Y-)&D z*l=T0L&(C0E1Md&Ix)UpFTSCmMaul+5z}AW?Kj;OC@-7xLh_kbedkYyPn&la{yN&M oc1v`3gi5rwZ~fDk>>yWfVC0zN8!a6oRR(g3r>mdKI;Vst04IWJ%>V!Z diff --git a/core/res/res/drawable-hdpi/switch_off_qntm_alpha.9.png b/core/res/res/drawable-hdpi/switch_off_qntm_alpha.9.png index 90b1498c8de86b981ac7cda7d372936878f927ad..73e8f1c99fd95f26b80ac9b1aba06d377a785a27 100644 GIT binary patch literal 523 zcmV+m0`&cfP)h#`6b<*ovCGIA3^C3vc|3eDu4>0bO7sL00co$hpwO@^aQOSAKF1{c{h|b zbz=ZQ zU$s~O;_y{-@Ci8y_KPDnJd{s64!}$^e1OgqZ*SO$Est3wfcjpV!DHrg1|OQw{!su- zoN60xZtSoh?x&54bqv6zMO&z05TGGGe};PiAW6oj-F|I6<-sSN4quYhFF>2<-gC>l z@J(^r3^1mNMUDUqiZf<_B~5g41n5wlB?EBMXyyoT!O4vQb~It<2w+p39Rv6U0i1;a ztP1)B&9F~U)F!;4IM09T7#5X?-og@*o{F6uf;*w9xb(}2uH#K<*D)2LJUj!zJln literal 546 zcmV+-0^R+IP)=zXsd-dl-qc%VlL_ripK@_AIkU&9rwk#`yECU{5S=-Sl}|nOc${F)6kNRV{*4G3R&0A|N>IQnEW;Ss%}klk8^c z0Ymd3kOuj+Ud7HDkek$LNPrATfvF(Kl++nWfXqpOrXWa@)R{|w(BV}R1UaWeRsv*0 z3WS0nA*r*G07)HzoJoT$9Nk(q>08Uy!+uTbJnHuA!9aYG9*F#i5(z*=;zyK!b7&;T z_|?%L7TB|FKdK k1yK+MQ4lKwF*|YvpHLxF!Z*OemZ7|?rIUsVg zeWJkR0~(2zMvOvtAD5^(H0O3civOi16uz`#(j{AiFM{119m4+`m`_~t+$C{q-}&j< zdhE?5&Hh=RP2wKRUi9&IxkpDjh1LD$SQI{zm9u)jr~Sn({})n*3%~x5U%L7E nkLUd2ALl=~#y;nI`&{9#m%2tDnm{r-UW|?J!Io literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETrJgR1Ar-gY-t^{ka1dyDXvxDZ zE^;WT?_lJ_YfYwxx^F**2X*p3yY1Jy!Hw_L+~DWcha7bmI5aRYep2t~5V_?htzTBT zeM7?%1*^9jFK2Gq%k5G>CzE~S=}&9VFb8$jYVmvQVH9d)U}R$95KsW=gEKxEpGaTl z^I2MNWAXaPh41 diff --git a/core/res/res/drawable-mdpi/scrubber_control_off_qntm_alpha.png b/core/res/res/drawable-mdpi/scrubber_control_off_qntm_alpha.png index 1833704179e75cbdc8a76ee594e06812ad204f01..e40cba8999c25c0a5db1a84566f7f14e314a6ce5 100644 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^JV30#!3HGNq-U-IQZ=3~jv*Dd-cB;)JD|YfYS}n> z_3Y`77;IO0FQ0eJ(^>JS^JO!&9k2ZFG08Jd&B!+F^a$Zwsv#<$CCMh!bQ(4If`dhY>+=3%yD|=p#=&Df|qmMQQkTITkPuJ h50~vbc8zHlL literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJwVp1HAr-gYPPOK1HV|-WY!jZr zeBnuepKSaTwag;nAZ3;`w^>3fa(tG^zVw_{z9hE#?@F!7CsTffAC<_y(Dm!o5!s4H z#-66f2O{1*;s3y99C1)3>}>6elRJyl;tz=1Gz!NRciY7FF*SvqbouMIC%k9g1gpx$ zcEzjzcAh`&oIiOJ!@Mu^f4%jq@sq2%J&CnvCAY@yrbq1`9!UN2UZ41}{e_tSM_oH* dpp{;0dBrErjA=>oUjlSEgQu&X%Q~loCIHfvU(Nsk diff --git a/core/res/res/drawable-mdpi/scrubber_control_on_qntm_alpha.png b/core/res/res/drawable-mdpi/scrubber_control_on_qntm_alpha.png index e64d3f2958da1a93a712c4f759aa07b8268a4f82..437a3e3dde7ca573dbde25c79e65214101c21bb7 100644 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^JV30#!3HGNq-U-IQi+}}jv*Ddk`p9Ym3jXB{~yoN z5#0DgL!iF-(c%C@!IGm|4mDgI|Nk6ksb5f}bwX|aFMo+SOt)FKe&QFDa>xpjT<}gs zOeVFVsxRV0uMV$@b!UqIWU)0W?lO^{$s#>K8#X2XnzCWhL`NW#!PC{xWt~$(69Cs3 BGRXh{ literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJT2B|pkcwMxryk@ypupoQyJ+r_ zxv%QZ^1TbT^`7OBryIhr81S!|--%_vXOAW$14Bg1O!JG1R<6@Mue&DSYfldp<*hT) znP!_G_jC5ENu1svXBaG~?rLXzRC(gCL%hL-#k^bMrzz~=OrD?kL!nCY=q=&1E@6vg g=Zi8htSMr?f8v)Ik0H-SphFluUHx3vIVCg!0639BJpcdz diff --git a/core/res/res/drawable-mdpi/switch_off_qntm_alpha.9.png b/core/res/res/drawable-mdpi/switch_off_qntm_alpha.9.png index ffd6c39ea1e5038b22cd8e5476a950b06101464a..8949b52955ba1eddaa2ecc787f1af6ecd6a554cd 100644 GIT binary patch literal 371 zcmV-(0gV2MP)P{5&61o*~S$_Qy~G%kb&9+YI}OOu(* zc%I!*KQp#rw%|Von^%+yp%IioTj&Di{7$$QT7luPfDX`2RgW8O=5N6;3ZM-guTTc9 zpdr+uhMdc2qv#XVf!9z0ouL`jtGTKkZO-&r8^QWW++7<^8%GJY^wDGS0%o8N+<9)D z0_9I>-y;M11dkbvtnT=4t|cR5EWs&{vidl2%Yf>UO7M=8{V%|MGIkQ2bJG6;?30m8 z@WlbRYXZBxioNULElt7uS-OQxZnqCaRJ6yFo>)L9l~3AGgicV@pa?~@tu8{MY{uNZ z5M^_~bn^NAD4PXsdjEfgGSH>+Cpb2d;8Jd0D$-0n8)}J}P9*a@C1x>qgA0>WL17adp;-6f4 zCn$L1(hF!Scj;+uz>>SmwKibLhy`hKd{xVGZVsg4XBX!ZSO5S307*qoM6N<$f;|YUb^rhX diff --git a/core/res/res/drawable-mdpi/switch_on_qntm_alpha.9.png b/core/res/res/drawable-mdpi/switch_on_qntm_alpha.9.png index 15faff081b89ff8a7f08718a4c8584dc6735cb8d..d7276838f108fcd67a38aba41a88b40c31992b8c 100644 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<9!3HG593zhdsbo(V$B>F!$q5du|2vOJ%sRpP zzkM>}|NsBRnUYwQHVSkxIy_)IlHT~kZlc7JYrOBO6rLZczjTl@h56s4!~^yz%qN%@ zv-Lb&k?om8)E#r@Fsh+%<7Y8>^c$GsAN8pw(5Ub{cIhcl6u zyNzaliBOPod7_h||FU!5gq3?PMO~U~t0*bpz`)1?BAz6kFlY{(9#}Zz;m_FDEM|M- eowMXM_6qSeci)>cw{|kfZ492SelF{r5}E*+%|x*P diff --git a/core/res/res/drawable-xhdpi/scrubber_control_off_qntm_alpha.png b/core/res/res/drawable-xhdpi/scrubber_control_off_qntm_alpha.png index ad72f069e99b786fa81bebc3d7819b5c11dfb2e6..729e0bfa01a4a6734e75542010e01fc95a1f9393 100644 GIT binary patch literal 314 zcmV-A0mc4_P)((pR$Fo%IWf!womVn0kb7QR zk_6F96#XMdZ`0_57Wb-%e%U3tu9G}C(VxsDkAAY>7C{gMK@gJj2DMM+(RVk|dH?_b M07*qoM6N<$f}|6R7XSbN literal 495 zcmVLvnRzeIQb`CQgb+dqA%qY@2yt!VIIh4NtW)#3lJ}%6Aig>$%#53}VpW8M?^p8O5$!jJfT%sr1LhOfz2;R{?llKX`lxS|_=XR~IE zs*jI-kI5zZf$#7cwqb*s&m%bFHAz;C75KCOO~+$z4!b@KUCD6KLSD0QY=@>V$=7&@ z*~xcc`Got+@WHVNV=t-$%h=p{><6bLZ!N;W+72dW%ZCLRTBXkH>$?-tlk?QXZru#@O?g>5h^6KT7;yQ{LJa#A`Fgo+#7j0Q>rHtAsT!h}W=6sfk@L z@&YWgz5s>a0>wTAkCef%5M}V68==0hjgYGq{yMW2?s(e@7ye}^kxci%>+p<+TYg`M zPZ)^o90QSEZU!RONUWD~B=+g`NX*&}_i%E?P;|m-;`dP0S_s!zd`a^=7C+K47VD1@ lA%qY@2qAR=j8vuQC^)8?waHv698sQF|nrl#*{zIXb>IGM7k>v6iDO|Q%^rd7XZb&s?cApdCo z93=1EdDrvkk2mpbDSAHTo?V`14G`ewIf~~pidnp1P%PqAiK2>^K8h_Q0Q`#Jj|@*! yc%fli1-#jXwCj+810R_oLqF`>LI@#*kZ`UE%9sXo)LX{@0000~)z2V5!Y#`8@82ie1 zPursQoawfm6->4*JBl(DXO}Q-7Vy%HVwU}DKf~9PxiU#j%@e2<1QeLw*Q$kjTn#c` z8JBhO)z|G&$5YayYc#KV`39Y6~9tG7v`}xL?885;*7Jr~9{$fJ8i9{an^LB{Ts5IfH#k diff --git a/core/res/res/drawable-xhdpi/switch_off_qntm_alpha.9.png b/core/res/res/drawable-xhdpi/switch_off_qntm_alpha.9.png index 309b528f8eb05185524bee0d8ca06ec4ce33f398..a7a972c2af2eb23bfc220fcc6f27de8b3514bbfe 100644 GIT binary patch literal 767 zcmV89LE9FfFkHIv;%#D&Y){(1P%Gy4*NtL6XXsGCv(s$)Q7%77lfMBM(nG` zyo1`xmUU1VorhMSP3SV7y-Pvx*it^0Zv~2h_o0u_PlMqTXpJ!S3~!{)zG}>=!JhIlP(G&uu{6)&#Cdg^qe$e`QG^3pJXjTZxNA;z zxO42d+)X_$SEc}wv82)M%Z5H}*uQL;aDB5bu5X5f(ywpU x3%$N6u~iGy-!6Ml59&cZs0Vd#3ymFD?Kj63tJ)-zIp+WX002ovPDHLkV1ggMZkzxB literal 827 zcmV-B1H}A^P)4e-6vr>z267}OrOg$4CZ(H?a0JqrE6hhwFy7Y)Xr+Z$#7C3iJNq0tRAoeou1j!V4q4^U0&(qg1 zpL0SKu}?r;p#en4wpKrpBs zD@95XwCcB{8*Kf=H}qRI0$(1BjSon`>0!5=0OBV+8OePsLaP zh!)4bG>NI_62ueh*?jG-qk^%mSf08B@yQyz=MhBDisiFQ5Myib*dvJ8ie>B)gxzO| zJc5YqzJ*H==K+CO@Co81phu(Q^U=`7GQjlt%4ho2f=Wwl-E`&NhD)b<$svR#j%nIE zr`zy=8#5arwdxWFAi` zW4X-Gt4ePVD?BLjpo);I0?}k@o$aGTR^Bgqm~2QN^*c;9Wp8qMyl~4nUO48Y?c;@8 z|JCur8kvGHK`0Fcp&%55f>00&LP0191yNp!ozA!#e*qK<)~_W(F!Z*Mws9SY!SdFbxH z=y_JST*UMy?uC2X)+RIQHAM*inx*xJdGp!r^QRcehrV)Gux4UoV~b-E_v|grw~eU2 z>i>VwTQ}i{bH8TH-4gfb+sU;Y+ph(_KHh6~DE;YEp@-2*Hm(+?2T*}MQ@)vNj@iDH zbG~<9A9(gS{MP|7^`oo5#!1S4NefCb1KRNKu)fbx^{>~@zhRGfJh!^{p8Ff1iy1s! L{an^LB{Ts5^XOn1 literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^P9V&|1|%PcFuVX#_dH!3Ln>~)y=BOC$UuVi!KKMB zcD{PjSSljZQpLM=KWAA%h)=fHe)fFd6XvNEzMs8nZY+Jex?J~TV{k(w10xd)hk$}Z z!w=C#cQOTYUzwH8zvce(%j26r`?jTZ_`Xss?RYuqyxp_iS#2+Z-W%3_l8rqpuzZI8 z^I3{{#!ft@&S#`R+TrHlWc=exv@&s$nA|H+e2%-^)cMK5Ou6QDbp^ld9QQ4;<5G@E qKE$~x&EaktaqI1jjl3-eJg%1u zj1?{#bJ?1*3LCIlE5x2xFlXHI<^Y?ArSi@lN}K{6U;Kah|Ke4;vB~$%5eX*_#TEfD z@u_+1Hj&arfhOHy7nenSy}9E36iwMoSNZC>wZ6ZXC~wW!^!?`k!26|X8_pXav6$q( z?75fJXYF%7X113#m;1S;34UGV71Ci8y6}8e?Q?^m^6WJ8OEDg`#fLU3elc&Y=#CTo z`s318#jNXx0`7j{&ylZPF)wEJJaZ%dcbN-4wx)Acc6wfR{5371F+2a$MU@Ok-ve=( zTR5#2Pu`&aYta?Sw`V-LEEgScU;MbKTWg{7)Z@=`O47Z2 z!PxC&wjBclv#_U&V@SoVw=)m=2?vU_?Pqe#ys(00@isP}6`X7an}qK%YSBpaD3_Qzwe%rVb3#|AYv84a<&JyL1uSVcHfo-?ezx)DdDhS8SHFL` z_jyyIL>m%1_TT+kzR4=)nus^KuhMtBXD;s*OX!xGU32@N);soNcjhtd(lj_?zGNn@swS!@FCGCk2E}ZanyS<&s6`x@G6@ z>C$4YI&^u;CQg3kg&z-GxqHF+tGU{#T^)6{SKJb;`qgz6mhW`AV+M_$>*kP-z_=h zuDs9HIn*`PiSxvZY3uKYnMf_=k5c-{S9mK{*Qj}x`ca+^b)8+(%XiACc4;v68NA8q zubg)1=@%Xy!~W-aF%LbAm~LrWR5xGRSL2;yvAh3U3d@#{+N^m&eE;XqYBZYt&d5F5 zh$+hAT~7b0eKp$q6iakgS_+8Ai9FX}+V(`it z7d+An_I5jEpw*ne*UT64ha4yun{)S+#?OLUg%ifFq@DDC%i^7#eXKN}o2;6Xw?|0l@T{9&59=*%+#U_MbT zag8WRNi0dVN-jzTQVd20h9|r{k{}y`^V3So6N^$A98>a>QWZRN6Vp?JQWH}u3s0un02MKKy85}Sb4q9e E0G3?4WB>pF diff --git a/core/res/res/drawable-xxhdpi/scrubber_control_on_qntm_alpha.png b/core/res/res/drawable-xxhdpi/scrubber_control_on_qntm_alpha.png index cde797ec62dbf36e99debaafb6651f0d902d5584..caabc2c1bc214170bcd147fe15b9c77e127a8ec4 100644 GIT binary patch literal 294 zcmV+>0oneEP)Soxnjl!8wQ<2x)|TC{#-Q$NdWL1NkDY1TUK0nE?O*0002s zjk~uIL&O*{Ma&UP#+=v2{7rjjB7MZu_gnwdUztc3QT)919^Khw9)7*Ykwlt<%d=-0 zn?1=CzhC(&shgk7$CIj2GskKw-=`f|K%O!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YPV z+ueoXKL{?^yL>WGgtNdSvKUBvfU(=jY&!-9CPz;f$B>F!Z*TAQ3keiC`muBYt2gft zh9sXWEQ>n*6O)^+)LjvqwIbl7jzVkav^`B_$0R;79`LYkapI`&uFlDGxnQuy`0%f- z&S`V^mOs05`i^ms3pQ}XLgO9lAMOWzOWG$rQ@J~#Waqvu+Aq78=z8XRY0BTtmgPPm z@`2+9%eF>kzp{}3Wx^FqKD%E_SRP>cAR{qn(L;5~E8k}oTsJjpn4W&&$G+6^*t5*f z8ciQ0a4=i2Tx+Z>pXW>zjW0HNoAZ^$72W1yzPgv<^zpI*knALX1RgqnbJ6}J^SR{Vf za?b8Y>#|cACYOkx{A--?$L@pFjFRi7MGct`4FCUU?p=OBwOqFT@*(Gs!HcauH)_1x zwQIgc>`MK=0pEp}uAgKEjGsH%y&c%Vj)*$Oyj!b0D$g560aKM~iEBhjN@7W>RdP`( zkYX@0Ff`FMFw!+L4>2^bGB&d^GSoG&ure@ceLATfMMG|WN@iLmZVg{{Xjua_NP=t# r&QB{TPb^Aha7@WhN>%X8O-xS>N=;0uEIgSCO8N|*u6{1-oD!MJk4Ns-psbU-JRX{lK+KHXWp+nGy7)d4UQA7xv6bDN@fOUa0X{^ z24`>vXK)5*a0X{^22b;Hn86u5N#L&QW8V7b%{E=Vh0XR^@5&)_TBL8D`*yUEf(P5NFQj+?VO3W`XU2| z#tWb-=)~>3onYHHI|>dB&VWwc=uP-A6FN9F(gS+Yf`dOmWza*=m^^FatUrdItzlWe zCVc7%1sp2A0eWNL#5rgOv=&pMLM%`+ zoJ)j{qk(`!MT4O42JhW+n1Kfli8X_`K=?Y?7C2PUZP2|xgC;u`YeHMtrmov}w*$Ve zdCJcs3$~$c&C_3R2^?Qpl)Z|4r2#%@e0<~!Tm%Nhd-?){hfEB>#kj8#PySR9xZhg#WXi;MiUEi0+cJ06a$w(|u`}UI8B`V(*e;iD8#l#r6|k;0ubvJJ#(a zUM_6BY{3h>qA0v{T6osZO2EVUhdM|^k;@rH&;Ca=0Lk9n;C^Td-_>h9> zSO)hr$8saM{(+w*4IEdRTJWO;cJ&dHu3k^;*=GPt)~fMv$1FqbkXl-V;7OGb%K*Z+@Z6?_VPE+?PdI8k`EM~ z$VI&Z`|Z>nAz=m7pY=84VMBw&sf7IWUxpdv;Mw;^ zM-u#`Mny{JfniE#F$Cx$)~&OHz*0J;#s_dV_nX9qppo5U-88!&CcuS4C$nG|J* znCtogHvvcfUa`QTl*hE~vca(O+#=JA>Gr_?+sOMJgG7Dd!@X7z+8K8RjPRnono(%g z{U9cuK4M{$yvsNqtGckSU+rNVy+ODf#wsa27w$Aa#xUr%bj7lP*D77b6-!ZeIBd6^ zlp2Gl5}f}>1cNg;gEKgTGdP1YID<1dgEKgTN4y?)QzqvR1mVQ~`pG2H00000NkvXX Hu0mjffT9hb literal 1153 zcmV-{1b+L8P)616vmf;Bv25AlM8009tHMjD1W@_q6o`91jy`H*}XUg(It z#h*>`cXI%7y-Kem_mC&ZOXO|xd3bf5^ZzdKwahi^03sSdBl#71FZ8GHP<#Ag_>*!{l|$W#6l55L5v}xKtLo;@=J~rSiiL%X2^=beyVF`XCP$r%ztfUDIAWD|trxk*jw&YUM0Aj}y{D49b1D0HNM1!CJ z+a0})oI(&eM?US6K|HhseGn*>iQSS@pJWhImY`=8gP5`8G$k3t2TRa{ia|WFYc!fWV6(At18!s`Rtw zSEap<#REk}5Q^Ft57arf=N{kiL(Uh3cE@s>A1ap9a3Wb=VD{2Skv=EN*0JO=We}W@ zYZ3Am79l4Df)iVH+~Q*bL5yW?Sw1ILh}fv|R>BlHkDyl~HmVfVg5V@yL~M&H2>?-w zh|%|{1Y$Nbj-&`-q$V~qa6)dX2yW|IDM^bO`G1Q^uNNV%l zyIRrE3UdUm`M@!W_Ao#U5F7i)~K0pf$7c|H16E+3y+hgMZ1++*#ka$c2HKjYq;D z;XngpHT!h&iBY?+^KFW0>t8sJ<@IB?>MQq-_`AK;yuGh6`s3_v46henij!^Lymr%r zxj)WdYue55;9k>v#smD^e1bp&;3nZ=9GBHBWjt_{XALJq-XdSg@WSJZ()wmEU%y!S z#TS|D2d;mTlb*lzeCq=7w~Em>4j>Gg_mFu3OJ)`0@n;=O+N~-{Kz}oMy85}Sb4q9e E04s%XuK)l5 literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^Ng&L@1|(N6W#a=6G@Ot_6-0m%2=7+9Tq#%7i2GbMM>FISFpxGyc7~SQEQ`>Am>r zWk!c*Jghh(Y#iaH;K0Gc(a4}Epuob^;?N+#@phd`y5~OC$`d=}mepEFTXqF9O!o}) ztV^~0>$l0TsM1H^dSu>pWw%Sr0(N0nYeVPif9ct|c9s9#zb4Nk++xZvFflq| zxCAT+brn_x2xnJ#*MCdUJAa&^a67xecObQyU10T2^B0q^{NKKIRrkBPImJ4g - - - + + + - + + + diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 28e75e65b41b7..9bb3852737530 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3343,6 +3343,8 @@ + + @@ -6393,6 +6395,8 @@ + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index ecb22aed01a24..dc5efea4bece9 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2169,6 +2169,7 @@ + diff --git a/core/res/res/values/styles_quantum.xml b/core/res/res/values/styles_quantum.xml index 88a2a9fc31fa3..e693673d8f287 100644 --- a/core/res/res/values/styles_quantum.xml +++ b/core/res/res/values/styles_quantum.xml @@ -455,10 +455,10 @@ please see styles_device_defaults.xml.