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

Commit 33ae80e3 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Make light status bar fade nicely during unlock transition

By using the timings supplied by window manager for the unlock
transition, the transition from dark -> light status bar looks much
nicer.

Bug: 19233606
Change-Id: I33b9048a10e2bd827ff504ab52f385cc88867112
parent 24bec7ce
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1300,6 +1300,8 @@ public class KeyguardViewMediator extends SystemUI {
        @Override
        public void run() {
            try {
                mStatusBarKeyguardViewManager.keyguardGoingAway();

                // Don't actually hide the Keyguard at the moment, wait for window
                // manager until it tells us it's safe to do so with
                // startKeyguardExitAnimation.
+34 −6
Original line number Diff line number Diff line
@@ -3115,6 +3115,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                                mLaunchTransitionFadingAway = false;
                            }
                        });
                mIconController.appTransitionStarting(SystemClock.uptimeMillis(),
                        StatusBarIconController.DEFAULT_TINT_ANIMATION_DURATION);
            }
        };
        if (mNotificationPanel.isLaunchTransitionRunning()) {
@@ -3181,17 +3183,32 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        return mKeyguardFadingAwayDelay + mKeyguardFadingAwayDuration;
    }

    /**
     * Notifies the status bar that Keyguard is going away very soon.
     */
    public void keyguardGoingAway() {

        // Treat Keyguard exit animation as an app transition to achieve nice transition for status
        // bar.
        mIconController.appTransitionPending();
    }

    /**
     * Notifies the status bar the Keyguard is fading away with the specified timings.
     *
     * @param delay the animation delay in miliseconds
     * @param startTime the start time of the animations in uptime millis
     * @param delay the precalculated animation delay in miliseconds
     * @param fadeoutDuration the duration of the exit animation, in milliseconds
     */
    public void setKeyguardFadingAway(long delay, long fadeoutDuration) {
    public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration) {
        mKeyguardFadingAway = true;
        mKeyguardFadingAwayDelay = delay;
        mKeyguardFadingAwayDuration = fadeoutDuration;
        mWaitingForKeyguardExit = false;
        mIconController.appTransitionStarting(
                startTime + fadeoutDuration
                        - StatusBarIconController.DEFAULT_TINT_ANIMATION_DURATION,
                StatusBarIconController.DEFAULT_TINT_ANIMATION_DURATION);
        disable(mDisabledUnmodified, true /* animate */);
    }

@@ -3207,8 +3224,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    }

    private void updatePublicMode() {
        setLockscreenPublicMode(mStatusBarKeyguardViewManager.isShowing()
                && mStatusBarKeyguardViewManager.isSecure(mCurrentUserId));
        setLockscreenPublicMode(
                mStatusBarKeyguardViewManager.isShowing() && mStatusBarKeyguardViewManager
                        .isSecure(mCurrentUserId));
    }

    private void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
@@ -3637,8 +3655,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

    @Override
    public void appTransitionPending() {

        // Use own timings when Keyguard is going away, see keyguardGoingAway and
        // setKeyguardFadingAway
        if (!mKeyguardFadingAway) {
            mIconController.appTransitionPending();
        }
    }

    @Override
    public void appTransitionCancelled() {
@@ -3647,8 +3670,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

    @Override
    public void appTransitionStarting(long startTime, long duration) {

        // Use own timings when Keyguard is going away, see keyguardGoingAway and
        // setKeyguardFadingAway
        if (!mKeyguardFadingAway) {
            mIconController.appTransitionStarting(startTime, duration);
        }
    }

    private final class ShadeUpdates {
        private final ArraySet<String> mVisibleNotifications = new ArraySet<String>();
+30 −1
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
@@ -50,7 +52,7 @@ import java.util.ArrayList;
 */
public class StatusBarIconController {

    private static final long DEFAULT_TINT_ANIMATION_DURATION = 120;
    public static final long DEFAULT_TINT_ANIMATION_DURATION = 120;

    private Context mContext;
    private PhoneStatusBar mPhoneStatusBar;
@@ -79,6 +81,18 @@ public class StatusBarIconController {
    private int mPendingIconTint;
    private ValueAnimator mTintAnimator;

    private final Handler mHandler;
    private boolean mTransitionDeferring;
    private long mTransitionDeferringStartTime;
    private long mTransitionDeferringDuration;

    private final Runnable mTransitionDeferringDoneRunnable = new Runnable() {
        @Override
        public void run() {
            mTransitionDeferring = false;
        }
    };

    public StatusBarIconController(Context context, View statusBar, View keyguardStatusBar,
            PhoneStatusBar phoneStatusBar) {
        mContext = context;
@@ -98,6 +112,7 @@ public class StatusBarIconController {
                android.R.interpolator.linear_out_slow_in);
        mFastOutSlowIn = AnimationUtils.loadInterpolator(mContext,
                android.R.interpolator.fast_out_slow_in);
        mHandler = new Handler();
        updateResources();
    }

@@ -282,6 +297,10 @@ public class StatusBarIconController {
    public void setIconTint(int tint) {
        if (mTransitionPending) {
            deferIconTintChange(tint);
        } else if (mTransitionDeferring) {
            animateIconTint(tint,
                    Math.max(0, mTransitionDeferringStartTime - SystemClock.uptimeMillis()),
                    mTransitionDeferringDuration);
        } else {
            animateIconTint(tint, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION);
        }
@@ -371,6 +390,16 @@ public class StatusBarIconController {
            animateIconTint(mPendingIconTint,
                    Math.max(0, startTime - SystemClock.uptimeMillis()),
                    duration);

        } else if (mTransitionPending) {

            // If we don't have a pending tint change yet, the change might come in the future until
            // startTime is reached.
            mTransitionDeferring = true;
            mTransitionDeferringStartTime = startTime;
            mTransitionDeferringDuration = duration;
            mHandler.removeCallbacks(mTransitionDeferringDoneRunnable);
            mHandler.postAtTime(mTransitionDeferringDoneRunnable, startTime);
        }
        mTransitionPending = false;
    }
+5 −1
Original line number Diff line number Diff line
@@ -257,7 +257,7 @@ public class StatusBarKeyguardViewManager {
                }
            });
        } else {
            mPhoneStatusBar.setKeyguardFadingAway(delay, fadeoutDuration);
            mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
            boolean staying = mPhoneStatusBar.hideKeyguard();
            if (!staying) {
                mStatusBarWindowManager.setKeyguardFadingAway(true);
@@ -435,4 +435,8 @@ public class StatusBarKeyguardViewManager {
    public boolean isInputRestricted() {
        return mViewMediatorCallback.isInputRestricted();
    }

    public void keyguardGoingAway() {
        mPhoneStatusBar.keyguardGoingAway();
    }
}