Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 929bd54c authored by Evan Laird's avatar Evan Laird
Browse files

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
parent 3d0a74a9
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -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;

        if (mAnimationEnabled) {
            ObjectAnimator anim = ObjectAnimator.ofFloat(this, mSlashLengthProp, start, end);
        anim.addUpdateListener((ValueAnimator valueAnimator) -> {
            invalidateSelf();
        });
            anim.addUpdateListener((ValueAnimator valueAnimator) -> invalidateSelf());
            anim.setDuration(QS_ANIM_LENGTH);
            anim.start();
        } else {
            mCurrentSlashLength = end;
            invalidateSelf();
        }
    }

    @Override
+7 −3
Original line number Diff line number Diff line
@@ -98,10 +98,14 @@ public class QSIconViewImpl extends QSIconView {
                d.setAutoMirrored(false);
                d.setLayoutDirection(getLayoutDirection());
            }

            if (iv instanceof SlashImageView) {
                ((SlashImageView) iv).setAnimationEnabled(shouldAnimate);
                ((SlashImageView) iv).setState(state.slash, d);
            } else {
                iv.setImageDrawable(d);
            if (state.slash != null && iv instanceof SlashImageView) {
                ((SlashImageView) iv).setState(state.slash);
            }

            iv.setTag(R.id.qs_icon_tag, state.icon);
            iv.setTag(R.id.qs_slash_tag, state.slash);
            iv.setPadding(0, padding, 0, padding);
+20 −1
Original line number Diff line number Diff line
@@ -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);
        }
    }
}
+17 −4
Original line number Diff line number Diff line
@@ -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);