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:
Jorim Jaggi
2015-02-04 16:37:11 +01:00
parent 24bec7ce7a
commit 33ae80e35a
4 changed files with 71 additions and 8 deletions

View File

@@ -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.

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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();
}
}