diff options
6 files changed, 65 insertions, 17 deletions
diff --git a/core/res/res/anim/app_starting_exit.xml b/core/res/res/anim/app_starting_exit.xml index 60e4109837d4..aaf7f156883b 100644 --- a/core/res/res/anim/app_starting_exit.xml +++ b/core/res/res/anim/app_starting_exit.xml @@ -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" /> diff --git a/core/res/res/anim/lock_screen_behind_enter.xml b/core/res/res/anim/lock_screen_behind_enter.xml index e8afada38285..6f3c4d4200f9 100644 --- a/core/res/res/anim/lock_screen_behind_enter.xml +++ b/core/res/res/anim/lock_screen_behind_enter.xml @@ -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" /> diff --git a/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml b/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml index ce974dc8099d..660b66258fed 100644 --- a/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml +++ b/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml @@ -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" /> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7ca8fc173a62..20e418cb44ce 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -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) { diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 8af85781c569..a90cc9572c68 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -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<>(); } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index e9290652151d..87d420f0d919 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -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) { |