Merge "Improve lockscreen launch animations" into lmp-mr1-dev

This commit is contained in:
Jorim Jaggi
2014-11-12 15:48:16 +00:00
committed by Android (Google) Code Review
6 changed files with 65 additions and 17 deletions

View File

@@ -18,8 +18,11 @@
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:detachWallpaper="true" android:interpolator="@interpolator/decelerate_quad">
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="160" />
</set>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:detachWallpaper="true"
android:interpolator="@interpolator/decelerate_quad"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="160" />

View File

@@ -21,7 +21,7 @@
android:shareInterpolator="false"
android:startOffset="100">
<translate android:fromYDelta="110%" android:toYDelta="0"
<translate android:fromYDelta="110%p" android:toYDelta="0"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
android:interpolator="@interpolator/decelerate_quint"
android:duration="300" />

View File

@@ -23,7 +23,7 @@
android:interpolator="@interpolator/decelerate_quint"
android:duration="400"/>
<translate android:fromYDelta="11%" android:toYDelta="0"
<translate android:fromYDelta="11%p" android:toYDelta="0"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
android:interpolator="@interpolator/decelerate_quint"
android:duration="300" />

View File

@@ -113,6 +113,8 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
*/
public class KeyguardViewMediator extends SystemUI {
private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;
final static boolean DEBUG = false;
private final static boolean DBG_WAKE = false;
@@ -136,6 +138,7 @@ public class KeyguardViewMediator extends SystemUI {
private static final int DISMISS = 17;
private static final int START_KEYGUARD_EXIT_ANIM = 18;
private static final int ON_ACTIVITY_DRAWN = 19;
private static final int KEYGUARD_DONE_PENDING_TIMEOUT = 20;
/**
* The default amount of time we stay awake (used for all key input)
@@ -294,7 +297,7 @@ public class KeyguardViewMediator extends SystemUI {
// ActivityManagerService) will not reconstruct the keyguard if it is already showing.
synchronized (KeyguardViewMediator.this) {
mSwitchingUser = true;
mKeyguardDonePending = false;
resetKeyguardDonePendingLocked();
resetStateLocked();
adjustStatusBarLocked();
// When we switch users we want to bring the new user to the biometric unlock even
@@ -450,6 +453,8 @@ public class KeyguardViewMediator extends SystemUI {
mKeyguardDonePending = true;
mHideAnimationRun = true;
mStatusBarKeyguardViewManager.startPreHideAnimation(null /* finishRunnable */);
mHandler.sendEmptyMessageDelayed(KEYGUARD_DONE_PENDING_TIMEOUT,
KEYGUARD_DONE_PENDING_TIMEOUT_MS);
}
@Override
@@ -584,7 +589,7 @@ public class KeyguardViewMediator extends SystemUI {
mScreenOn = false;
if (DEBUG) Log.d(TAG, "onScreenTurnedOff(" + why + ")");
mKeyguardDonePending = false;
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
// Lock immediately based on setting if secure (user has a pin/pattern/password).
@@ -1108,6 +1113,9 @@ public class KeyguardViewMediator extends SystemUI {
StartKeyguardExitAnimParams params = (StartKeyguardExitAnimParams) msg.obj;
handleStartKeyguardExitAnimation(params.startTime, params.fadeoutDuration);
break;
case KEYGUARD_DONE_PENDING_TIMEOUT:
Log.w(TAG, "Timeout while waiting for activity drawn!");
// Fall through.
case ON_ACTIVITY_DRAWN:
handleOnActivityDrawn();
break;
@@ -1122,7 +1130,7 @@ public class KeyguardViewMediator extends SystemUI {
private void handleKeyguardDone(boolean authenticated, boolean wakeup) {
if (DEBUG) Log.d(TAG, "handleKeyguardDone");
synchronized (this) {
mKeyguardDonePending = false;
resetKeyguardDonePendingLocked();
}
if (authenticated) {
@@ -1242,7 +1250,7 @@ public class KeyguardViewMediator extends SystemUI {
mStatusBarKeyguardViewManager.show(options);
mHiding = false;
mShowing = true;
mKeyguardDonePending = false;
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
updateActivityLockScreenState();
adjustStatusBarLocked();
@@ -1321,7 +1329,7 @@ public class KeyguardViewMediator extends SystemUI {
mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration);
mShowing = false;
mKeyguardDonePending = false;
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
updateActivityLockScreenState();
adjustStatusBarLocked();
@@ -1417,6 +1425,11 @@ public class KeyguardViewMediator extends SystemUI {
&& mSearchManager.getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
}
private void resetKeyguardDonePendingLocked() {
mKeyguardDonePending = false;
mHandler.removeMessages(KEYGUARD_DONE_PENDING_TIMEOUT);
}
public void onBootCompleted() {
mUpdateMonitor.dispatchBootCompleted();
synchronized (this) {

View File

@@ -349,7 +349,8 @@ public class WindowAnimator {
} else {
boolean applyExistingExitAnimation = mPostKeyguardExitAnimation != null
&& !winAnimator.mKeyguardGoingAwayAnimation
&& win.hasDrawnLw();
&& win.hasDrawnLw()
&& win.mAttachedWindow == null;
// If the window is already showing and we don't need to apply an existing
// Keyguard exit animation, skip.
@@ -364,7 +365,8 @@ public class WindowAnimator {
}
if (DEBUG_KEYGUARD || WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
"Now policy shown: " + win);
if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
&& win.mAttachedWindow == null) {
if (unForceHiding == null) {
unForceHiding = new ArrayList<>();
}

View File

@@ -53,10 +53,13 @@ import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerPolicy;
import android.view.WindowManager.LayoutParams;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
import com.android.internal.R;
import com.android.server.wm.WindowManagerService.H;
import java.io.PrintWriter;
@@ -98,6 +101,7 @@ class WindowStateAnimator {
int mAnimLayer;
int mLastLayer;
long mAnimationStartTime;
long mLastAnimationTime;
SurfaceControl mSurfaceControl;
SurfaceControl mPendingDestroySurface;
@@ -312,6 +316,7 @@ class WindowStateAnimator {
mAnimating = true;
}
if ((mAnimation != null) && mLocalAnimating) {
mLastAnimationTime = currentTime;
if (stepAnimation(currentTime)) {
return true;
}
@@ -1794,11 +1799,14 @@ class WindowStateAnimator {
if ((mLocalAnimating && mAnimationIsEntrance == isEntrance)
|| mKeyguardGoingAwayAnimation) {
// If we are trying to apply an animation, but already running
// an animation of the same type, or when we are playing the Keyguard dismissing
// animation, then just leave that one alone.
// an animation of the same type, then just leave that one alone.
// TODO: if mKeyguardGoingAwayAnimation and this is a exiting starting window, modify
// existing animation to fade it out as well.
// If we are in a keyguard exit animation, and the window should animate away, modify
// keyguard exit animation such that it also fades out.
if (mAnimation != null && mKeyguardGoingAwayAnimation
&& transit == WindowManagerPolicy.TRANSIT_PREVIEW_DONE) {
applyFadeoutDuringKeyguardExitAnimation();
}
return true;
}
@@ -1856,6 +1864,28 @@ class WindowStateAnimator {
return mAnimation != null;
}
private void applyFadeoutDuringKeyguardExitAnimation() {
long startTime = mAnimation.getStartTime();
long duration = mAnimation.getDuration();
long elapsed = mLastAnimationTime - startTime;
long fadeDuration = duration - elapsed;
if (fadeDuration <= 0) {
// Never mind, this would be no visible animation, so abort the animation change.
return;
}
AnimationSet newAnimation = new AnimationSet(false /* shareInterpolator */);
newAnimation.setDuration(duration);
newAnimation.setStartTime(startTime);
newAnimation.addAnimation(mAnimation);
Animation fadeOut = AnimationUtils.loadAnimation(
mContext, com.android.internal.R.anim.app_starting_exit);
fadeOut.setDuration(fadeDuration);
fadeOut.setStartOffset(elapsed);
newAnimation.addAnimation(fadeOut);
newAnimation.initialize(mWin.mFrame.width(), mWin.mFrame.height(), mAnimDw, mAnimDh);
mAnimation = newAnimation;
}
public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
if (mAnimating || mLocalAnimating || mAnimationIsEntrance
|| mAnimation != null) {