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

Commit 1aec93f1 authored by Jason Monk's avatar Jason Monk
Browse files

Fix QS icon animations once and for all

Bug: 27250295
Change-Id: I6449b9cea19acf120dfc02d146fe608da46fe790
parent 1f67c874
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import android.widget.ImageView.ScaleType;
import com.android.systemui.R;

@@ -34,6 +33,7 @@ public class QSIconView extends ViewGroup {
    private final View mIcon;
    private final int mIconSizePx;
    private final int mTilePaddingBelowIconPx;
    private boolean mAnimationEnabled = true;

    public QSIconView(Context context) {
        super(context);
@@ -46,6 +46,10 @@ public class QSIconView extends ViewGroup {
        addView(mIcon);
    }

    public void disableAnimation() {
        mAnimationEnabled = false;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int w = MeasureSpec.getSize(widthMeasureSpec);
@@ -69,7 +73,9 @@ public class QSIconView extends ViewGroup {

    protected void setIcon(ImageView iv, QSTile.State state) {
        if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag))) {
            Drawable d = state.icon != null ? state.icon.getDrawable(mContext) : null;
            Drawable d = state.icon != null
                    ? iv.isShown() && mAnimationEnabled ? state.icon.getDrawable(mContext)
                    : state.icon.getInvisibleDrawable(mContext) : null;
            int padding = state.icon != null ? state.icon.getPadding() : null;
            if (d != null && state.autoMirrorDrawable) {
                d.setAutoMirrored(true);
@@ -77,7 +83,7 @@ public class QSIconView extends ViewGroup {
            iv.setImageDrawable(d);
            iv.setTag(R.id.qs_icon_tag, state.icon);
            iv.setPadding(0, padding, 0, padding);
            if (d instanceof Animatable) {
            if (d instanceof Animatable && iv.isShown()) {
                Animatable a = (Animatable) d;
                a.start();
                if (!iv.isShown()) {
+20 −3
Original line number Diff line number Diff line
@@ -416,6 +416,10 @@ public abstract class QSTile<TState extends State> implements Listenable {
    public static abstract class Icon {
        abstract public Drawable getDrawable(Context context);

        public Drawable getInvisibleDrawable(Context context) {
            return getDrawable(context);
        }

        @Override
        public int hashCode() {
            return Icon.class.hashCode();
@@ -437,6 +441,11 @@ public abstract class QSTile<TState extends State> implements Listenable {
        public Drawable getDrawable(Context context) {
            return mDrawable;
        }

        @Override
        public Drawable getInvisibleDrawable(Context context) {
            return mDrawable;
        }
    }

    public static class ResourceIcon extends Icon {
@@ -462,6 +471,11 @@ public abstract class QSTile<TState extends State> implements Listenable {
            return context.getDrawable(mResId);
        }

        @Override
        public Drawable getInvisibleDrawable(Context context) {
            return context.getDrawable(mResId);
        }

        @Override
        public boolean equals(Object o) {
            return o instanceof ResourceIcon && ((ResourceIcon) o).mResId == mResId;
@@ -474,14 +488,17 @@ public abstract class QSTile<TState extends State> implements Listenable {
    }

    protected class AnimationIcon extends ResourceIcon {
        public AnimationIcon(int resId) {
            super(resId);
        private final int mAnimatedResId;

        public AnimationIcon(int resId, int staticResId) {
            super(staticResId);
            mAnimatedResId = resId;
        }

        @Override
        public Drawable getDrawable(Context context) {
            // workaround: get a clean state for every new AVD
            return context.getDrawable(mResId).getConstantState().newDrawable();
            return context.getDrawable(mAnimatedResId).getConstantState().newDrawable();
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ public class QSTileBaseView extends LinearLayout {
        setContentDescription(state.contentDescription);
    }

    View getIcon() {
    public QSIconView getIcon() {
        return mIcon;
    }

+1 −0
Original line number Diff line number Diff line
@@ -172,6 +172,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta
            if (itemView instanceof FrameLayout) {
                mTileView = (QSTileView) ((FrameLayout) itemView).getChildAt(0);
                mTileView.setBackground(null);
                mTileView.getIcon().disableAnimation();
            }
        }

+4 −2
Original line number Diff line number Diff line
@@ -33,9 +33,11 @@ import com.android.systemui.qs.QSTile;
/** Quick settings tile: Airplane mode **/
public class AirplaneModeTile extends QSTile<QSTile.BooleanState> {
    private final AnimationIcon mEnable =
            new AnimationIcon(R.drawable.ic_signal_airplane_enable_animation);
            new AnimationIcon(R.drawable.ic_signal_airplane_enable_animation,
                    R.drawable.ic_signal_airplane_disable);
    private final AnimationIcon mDisable =
            new AnimationIcon(R.drawable.ic_signal_airplane_disable_animation);
            new AnimationIcon(R.drawable.ic_signal_airplane_disable_animation,
                    R.drawable.ic_signal_airplane_enable);
    private final GlobalSetting mSetting;

    private boolean mListening;
Loading