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
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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,7 +3655,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
|
||||
@Override
|
||||
public void appTransitionPending() {
|
||||
mIconController.appTransitionPending();
|
||||
|
||||
// Use own timings when Keyguard is going away, see keyguardGoingAway and
|
||||
// setKeyguardFadingAway
|
||||
if (!mKeyguardFadingAway) {
|
||||
mIconController.appTransitionPending();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -3647,7 +3670,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
|
||||
|
||||
@Override
|
||||
public void appTransitionStarting(long startTime, long duration) {
|
||||
mIconController.appTransitionStarting(startTime, duration);
|
||||
|
||||
// Use own timings when Keyguard is going away, see keyguardGoingAway and
|
||||
// setKeyguardFadingAway
|
||||
if (!mKeyguardFadingAway) {
|
||||
mIconController.appTransitionStarting(startTime, duration);
|
||||
}
|
||||
}
|
||||
|
||||
private final class ShadeUpdates {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user