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

Commit 3b139a9e authored by John Spurlock's avatar John Spurlock
Browse files

Transition bars to opaque on user interaction.

When the transient bars are revealed, smoothly transition the
bar style to opaque to blend with the other panel chrome.

Bug:8706719
Change-Id: I65e5b22e2f91a3db0394c0f571127397ba692f46
parent 89835ddf
Loading
Loading
Loading
Loading
+40 −15
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.systemui.statusbar.phone;

import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Resources;
@@ -29,25 +32,31 @@ import com.android.systemui.R;
public class BarTransitions {
    private static final boolean DEBUG = false;

    public static final int MODE_NORMAL = 0;
    public static final int MODE_OPAQUE = 0;
    public static final int MODE_SEMI_TRANSPARENT = 1;
    public static final int MODE_TRANSPARENT = 2;

    private final String mTag;
    private final View mTarget;
    private final Drawable mOpaque;
    private final Drawable mSemiTransparent;
    private final int mOpaque;
    private final int mSemiTransparent;

    protected Drawable mTransparent;
    private int mMode;

    private final AnimatorUpdateListener mBackgroundColorListener = new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animator) {
            mTarget.setBackgroundColor((Integer) animator.getAnimatedValue());
        }
    };

    public BarTransitions(Context context, View target) {
        mTag = "BarTransitions." + target.getClass().getSimpleName();
        mTarget = target;
        final Resources res = context.getResources();
        mOpaque = new ColorDrawable(res.getColor(R.drawable.status_bar_background));
        mSemiTransparent =
                new ColorDrawable(res.getColor(R.color.status_bar_background_semi_transparent));
        mOpaque = res.getColor(R.drawable.status_bar_background);
        mSemiTransparent = res.getColor(R.color.status_bar_background_semi_transparent);
    }

    public void setTransparent(Drawable transparent) {
@@ -58,24 +67,40 @@ public class BarTransitions {
    }

    public void transitionTo(int mode) {
        transitionTo(mode, false);
    }

    public void transitionTo(int mode, boolean animate) {
        if (mMode == mode) return;
        int oldMode = mMode;
        mMode = mode;
        if (!ActivityManager.isHighEndGfx()) return;
        if (DEBUG) Log.d(mTag, String.format("transition from %s to %s",
                modeToString(oldMode), modeToString(mode)));
        onTransition(oldMode, mMode);
        if (DEBUG) Log.d(mTag, modeToString(oldMode) + " -> " + modeToString(mode));
        onTransition(oldMode, mMode, animate);
    }

    protected void onTransition(int oldMode, int newMode, boolean animate) {
        if (animate && oldMode == MODE_SEMI_TRANSPARENT && newMode == MODE_OPAQUE) {
            startColorAnimation(mSemiTransparent, mOpaque);
        } else if (animate && oldMode == MODE_OPAQUE && newMode == MODE_SEMI_TRANSPARENT) {
            startColorAnimation(mOpaque, mSemiTransparent);
        } else if (newMode == MODE_OPAQUE || newMode == MODE_SEMI_TRANSPARENT) {
            mTarget.setBackgroundColor(newMode == MODE_OPAQUE ? mOpaque : mSemiTransparent);
        } else {
            mTarget.setBackground(newMode == MODE_TRANSPARENT? mTransparent
                    : newMode == MODE_SEMI_TRANSPARENT ? new ColorDrawable(mSemiTransparent)
                    : new ColorDrawable(mOpaque));
        }
    }

    protected void onTransition(int oldMode, int newMode) {
        Drawable background = newMode == MODE_SEMI_TRANSPARENT ? mSemiTransparent
                : newMode == MODE_TRANSPARENT ? mTransparent
                : mOpaque;
        mTarget.setBackground(background);
    private void startColorAnimation(int from, int to) {
        ValueAnimator anim = ValueAnimator.ofObject(new ArgbEvaluator(), from, to);
        anim.addUpdateListener(mBackgroundColorListener);
        anim.start();
    }

    public static String modeToString(int mode) {
        if (mode == MODE_NORMAL) return "MODE_NORMAL";
        if (mode == MODE_OPAQUE) return "MODE_OPAQUE";
        if (mode == MODE_SEMI_TRANSPARENT) return "MODE_SEMI_TRANSPARENT";
        if (mode == MODE_TRANSPARENT) return "MODE_TRANSPARENT";
        throw new IllegalArgumentException("Unknown mode " + mode);
+3 −3
Original line number Diff line number Diff line
@@ -132,9 +132,9 @@ public class NavigationBarView extends LinearLayout {
        }

        @Override
        protected void onTransition(int oldMode, int newMode) {
            super.onTransition(oldMode, newMode);
            final float alpha = newMode == MODE_NORMAL ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f;
        protected void onTransition(int oldMode, int newMode, boolean animate) {
            super.onTransition(oldMode, newMode, animate);
            final float alpha = newMode == MODE_OPAQUE ? KeyButtonView.DEFAULT_QUIESCENT_ALPHA : 1f;
            setKeyButtonViewQuiescentAlpha(getBackButton(), alpha);
            setKeyButtonViewQuiescentAlpha(getHomeButton(), alpha);
            setKeyButtonViewQuiescentAlpha(getRecentsButton(), alpha);
+11 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.statusbar.phone;

import static com.android.systemui.statusbar.phone.BarTransitions.MODE_NORMAL;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;

@@ -1938,13 +1938,21 @@ public class PhoneStatusBar extends BaseStatusBar {
    private int barMode(int vis, int transientFlag, int transparentFlag) {
        return (vis & transientFlag) != 0 ? MODE_SEMI_TRANSPARENT
                : (vis & transparentFlag) != 0 ? MODE_TRANSPARENT
                : MODE_NORMAL;
                : MODE_OPAQUE;
    }

    @Override
    public void resumeAutohide() {
        if (mAutohideSuspended) {
            scheduleAutohide();
            animateTransitionTo(BarTransitions.MODE_SEMI_TRANSPARENT);
        }
    }

    private void animateTransitionTo(int newMode) {
        mStatusBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
        if (mNavigationBarView != null) {
            mNavigationBarView.getBarTransitions().transitionTo(newMode, true /*animate*/);
        }
    }

@@ -1952,6 +1960,7 @@ public class PhoneStatusBar extends BaseStatusBar {
    public void suspendAutohide() {
        mHandler.removeCallbacks(mAutohide);
        mAutohideSuspended = 0 != (mSystemUiVisibility & STATUS_OR_NAV_TRANSIENT);
        animateTransitionTo(BarTransitions.MODE_OPAQUE);
    }

    private void cancelAutohide() {