diff options
| author | 2017-07-12 16:36:06 -0400 | |
|---|---|---|
| committer | 2017-07-12 16:43:59 -0400 | |
| commit | 929bd54c6a91e78de4634cb50b781a9616157f5c (patch) | |
| tree | f873ae9c00982b274c10f387c8a58738e3249dc4 | |
| parent | 3d0a74a9e4f54851f223ca70488b249c2acaa226 (diff) | |
Fix qs tile drawing in edit QS panel
The problem here was reuse:
1. Tile has a SlashState -> gets SlashDrawable
2. Reused tile has no SlashState -> doesn't know how to gracefully
remove the slash and draw regularly, so it gets a slash anyway.
Unrelated, but also fixed: turn off slash animations in QS edit panel
Fixes: 63160044
Test: runtest -x
frameworks/base/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
Change-Id: I6841bfafcef0588d1ca63b3326dfee1a856618f3
4 files changed, 57 insertions, 13 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java index a10aa5413ca9..b8535a3f5a40 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java @@ -61,6 +61,7 @@ public class SlashDrawable extends Drawable { private boolean mSlashed; private Mode mTintMode; private ColorStateList mTintList; + private boolean mAnimationEnabled = true; public SlashDrawable(Drawable d) { mDrawable = d; @@ -97,6 +98,10 @@ public class SlashDrawable extends Drawable { invalidateSelf(); } + public void setAnimationEnabled(boolean enabled) { + mAnimationEnabled = enabled; + } + // Animate this value on change private float mCurrentSlashLength; private final FloatProperty mSlashLengthProp = new FloatProperty<SlashDrawable>("slashLength") { @@ -119,12 +124,15 @@ public class SlashDrawable extends Drawable { final float end = mSlashed ? SLASH_HEIGHT / SCALE : 0f; final float start = mSlashed ? 0f : SLASH_HEIGHT / SCALE; - ObjectAnimator anim = ObjectAnimator.ofFloat(this, mSlashLengthProp, start, end); - anim.addUpdateListener((ValueAnimator valueAnimator) -> { + if (mAnimationEnabled) { + ObjectAnimator anim = ObjectAnimator.ofFloat(this, mSlashLengthProp, start, end); + anim.addUpdateListener((ValueAnimator valueAnimator) -> invalidateSelf()); + anim.setDuration(QS_ANIM_LENGTH); + anim.start(); + } else { + mCurrentSlashLength = end; invalidateSelf(); - }); - anim.setDuration(QS_ANIM_LENGTH); - anim.start(); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java index 5ab3927ff098..8074cb9b0443 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java @@ -98,10 +98,14 @@ public class QSIconViewImpl extends QSIconView { d.setAutoMirrored(false); d.setLayoutDirection(getLayoutDirection()); } - iv.setImageDrawable(d); - if (state.slash != null && iv instanceof SlashImageView) { - ((SlashImageView) iv).setState(state.slash); + + if (iv instanceof SlashImageView) { + ((SlashImageView) iv).setAnimationEnabled(shouldAnimate); + ((SlashImageView) iv).setState(state.slash, d); + } else { + iv.setImageDrawable(d); } + iv.setTag(R.id.qs_icon_tag, state.icon); iv.setTag(R.id.qs_slash_tag, state.slash); iv.setPadding(0, padding, 0, padding); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java index 315a815af100..13912fe0c16d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java @@ -14,8 +14,10 @@ package com.android.systemui.qs.tileimpl; +import android.annotation.Nullable; import android.content.Context; import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; import android.widget.ImageView; import com.android.internal.annotations.VisibleForTesting; @@ -26,6 +28,7 @@ public class SlashImageView extends ImageView { @VisibleForTesting protected SlashDrawable mSlash; + private boolean mAnimationEnabled = true; public SlashImageView(Context context) { super(context); @@ -34,6 +37,7 @@ public class SlashImageView extends ImageView { private void ensureSlashDrawable() { if (mSlash == null) { mSlash = new SlashDrawable(getDrawable()); + mSlash.setAnimationEnabled(mAnimationEnabled); super.setImageDrawable(mSlash); } } @@ -46,13 +50,28 @@ public class SlashImageView extends ImageView { } else if (mSlash == null) { super.setImageDrawable(drawable); } else { + mSlash.setAnimationEnabled(mAnimationEnabled); mSlash.setDrawable(drawable); } } - public void setState(SlashState slashState) { + public void setAnimationEnabled(boolean enabled) { + mAnimationEnabled = enabled; + } + + private void setSlashState(@NonNull SlashState slashState) { ensureSlashDrawable(); mSlash.setRotation(slashState.rotation); mSlash.setSlashed(slashState.isSlashed); } + + public void setState(@Nullable SlashState state, @Nullable Drawable drawable) { + if (state != null) { + setImageDrawable(drawable); + setSlashState(state); + } else { + mSlash = null; + setImageDrawable(drawable); + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java index aef584f8d986..9fe3e10b752e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java @@ -38,16 +38,29 @@ public class SlashImageViewTest extends SysuiTestCase { private TestableSlashImageView mSlashView; @Test - public void testSetSlashStateCreatesSlashDrawable() { + public void testSetNonNullSlashStateCreatesSlashDrawable() { SlashState mockState = mock(SlashState.class); Drawable mockDrawable = mock(Drawable.class); mSlashView = new TestableSlashImageView(mContext); assertTrue(mSlashView.getSlashDrawable() == null); - mSlashView.setImageDrawable(mockDrawable); - mSlashView.setState(mockState); + mSlashView.setState(mockState, mockDrawable); + + assertTrue(mSlashView.getSlashDrawable() != null); + } + + @Test + public void testSetNullSlashStateRemovesSlashDrawable() { + SlashState mockState = mock(SlashState.class); + Drawable mockDrawable = mock(Drawable.class); + mSlashView = new TestableSlashImageView(mContext); + mSlashView.setState(mockState, mockDrawable); assertTrue(mSlashView.getSlashDrawable() != null); + + mSlashView.setState(null, mockDrawable); + + assertTrue(mSlashView.getSlashDrawable() == null); } @Test @@ -57,7 +70,7 @@ public class SlashImageViewTest extends SysuiTestCase { mSlashView = new TestableSlashImageView(mContext); mSlashView.setImageDrawable(mockDrawable); - mSlashView.setState(mockState); + mSlashView.setState(mockState, mockDrawable); mSlashView.setImageDrawable(null); assertTrue(mSlashView.getSlashDrawable() == null); |