diff options
9 files changed, 84 insertions, 34 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 5a5cce8f5093..70837385b858 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -51,6 +51,7 @@ import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardService; import com.android.internal.policy.IKeyguardStateCallback; import com.android.systemui.SystemUIApplication; +import com.android.wm.shell.transition.Transitions; import javax.inject.Inject; @@ -62,16 +63,29 @@ public class KeyguardService extends Service { * Run Keyguard animation as remote animation in System UI instead of local animation in * the server process. * + * 0: Runs all keyguard animation as local animation + * 1: Only runs keyguard going away animation as remote animation + * 2: Runs all keyguard animation as remote animation + * * Note: Must be consistent with WindowManagerService. */ private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY = "persist.wm.enable_remote_keyguard_animation"; + private static final int sEnableRemoteKeyguardAnimation = + SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1); + /** * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY */ - public static boolean sEnableRemoteKeyguardAnimation = - SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false); + public static boolean sEnableRemoteKeyguardGoingAwayAnimation = + !Transitions.ENABLE_SHELL_TRANSITIONS && sEnableRemoteKeyguardAnimation >= 1; + + /** + * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY + */ + public static boolean sEnableRemoteKeyguardOccludeAnimation = + !Transitions.ENABLE_SHELL_TRANSITIONS && sEnableRemoteKeyguardAnimation >= 2; private final KeyguardViewMediator mKeyguardViewMediator; private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher; @@ -83,20 +97,22 @@ public class KeyguardService extends Service { mKeyguardViewMediator = keyguardViewMediator; mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher; - if (sEnableRemoteKeyguardAnimation) { - RemoteAnimationDefinition definition = new RemoteAnimationDefinition(); + RemoteAnimationDefinition definition = new RemoteAnimationDefinition(); + if (sEnableRemoteKeyguardGoingAwayAnimation) { final RemoteAnimationAdapter exitAnimationAdapter = new RemoteAnimationAdapter(mExitAnimationRunner, 0, 0); definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, exitAnimationAdapter); definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER, exitAnimationAdapter); + } + if (sEnableRemoteKeyguardOccludeAnimation) { final RemoteAnimationAdapter occludeAnimationAdapter = new RemoteAnimationAdapter(mOccludeAnimationRunner, 0, 0); definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_OCCLUDE, occludeAnimationAdapter); definition.addRemoteAnimation(TRANSIT_OLD_KEYGUARD_UNOCCLUDE, occludeAnimationAdapter); - ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay( - DEFAULT_DISPLAY, definition); } + ActivityTaskManager.getInstance().registerRemoteAnimationsForDisplay( + DEFAULT_DISPLAY, definition); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 665376ac4569..38d153e38ca9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -162,7 +162,8 @@ class KeyguardUnlockAnimationController @Inject constructor( // If the surface alpha is 0f, it's no longer visible so we can safely be done with // the animation. if (surfaceBehindAlpha == 0f) { - keyguardViewMediator.get().finishSurfaceBehindRemoteAnimation() + keyguardViewMediator.get().finishSurfaceBehindRemoteAnimation( + false /* cancelled */) } } }) @@ -175,7 +176,8 @@ class KeyguardUnlockAnimationController @Inject constructor( } surfaceBehindEntryAnimator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished() + keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished( + false /* cancelled */) } }) @@ -317,7 +319,7 @@ class KeyguardUnlockAnimationController @Inject constructor( } override fun onKeyguardDismissAmountChanged() { - if (!KeyguardService.sEnableRemoteKeyguardAnimation) { + if (!KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation) { return } @@ -370,7 +372,7 @@ class KeyguardUnlockAnimationController @Inject constructor( } else if (keyguardViewMediator.get() .isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe && reachedHideKeyguardThreshold) { - keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished() + keyguardViewMediator.get().onKeyguardExitRemoteAnimationFinished(false /* cancelled */) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 56efafba4640..f0d7d833a9fb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2180,7 +2180,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, IRemoteAnimationRunner runner = mKeyguardExitAnimationRunner; mKeyguardExitAnimationRunner = null; - if (KeyguardService.sEnableRemoteKeyguardAnimation && runner != null + if (KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation && runner != null && finishedCallback != null) { // Wrap finishedCallback to clean up the keyguard state once the animation is done. IRemoteAnimationFinishedCallback callback = @@ -2211,7 +2211,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, // When remaining on the shade, there's no need to do a fancy remote animation, // it will dismiss the panel in that case. - } else if (KeyguardService.sEnableRemoteKeyguardAnimation + } else if (KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation && !mStatusBarStateController.leaveOpenOnKeyguardHide() && apps != null && apps.length > 0) { mSurfaceBehindRemoteAnimationFinishedCallback = finishedCallback; @@ -2315,15 +2315,15 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, } /** - * Called if the keyguard exit animation has been cancelled and we should return to the + * Called if the keyguard exit animation has been cancelled and we should dismiss to the * keyguard. * - * This can happen due to the system cancelling the RemoteAnimation (due to a timeout), or the - * user cancelling the unlock swipe gesture. + * This can happen due to the system cancelling the RemoteAnimation (due to a timeout, a new + * app transition before finishing the current RemoteAnimation). */ private void handleCancelKeyguardExitAnimation() { - hideSurfaceBehindKeyguard(); - mKeyguardUnlockAnimationControllerLazy.get().notifyCancelKeyguardExitAnimation(); + showSurfaceBehindKeyguard(); + onKeyguardExitRemoteAnimationFinished(true /* cancelled */); } /** @@ -2332,8 +2332,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, * This will call {@link #mSurfaceBehindRemoteAnimationFinishedCallback} to let WM know that * we're done with the RemoteAnimation, actually hide the keyguard, and clean up state related * to the keyguard exit animation. + * + * @param cancelled {@code true} if the animation was cancelled before it finishes. */ - public void onKeyguardExitRemoteAnimationFinished() { + public void onKeyguardExitRemoteAnimationFinished(boolean cancelled) { if (!mSurfaceBehindRemoteAnimationRunning && !mSurfaceBehindRemoteAnimationRequested) { return; } @@ -2347,7 +2349,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation(); } - finishSurfaceBehindRemoteAnimation(); + finishSurfaceBehindRemoteAnimation(cancelled); mSurfaceBehindRemoteAnimationRequested = false; mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation(); InteractionJankMonitor.getInstance().end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION); @@ -2389,12 +2391,14 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, } /** If it's running, finishes the RemoteAnimation on the surface behind the keyguard. */ - public void finishSurfaceBehindRemoteAnimation() { + public void finishSurfaceBehindRemoteAnimation(boolean cancelled) { mSurfaceBehindRemoteAnimationRunning = false; if (mSurfaceBehindRemoteAnimationFinishedCallback != null) { try { - mSurfaceBehindRemoteAnimationFinishedCallback.onAnimationFinished(); + if (!cancelled) { + mSurfaceBehindRemoteAnimationFinishedCallback.onAnimationFinished(); + } mSurfaceBehindRemoteAnimationFinishedCallback = null; } catch (RemoteException e) { e.printStackTrace(); @@ -2638,10 +2642,10 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, } /** - * Cancel the keyguard exit animation, usually because we were swiping to unlock and the swipe - * gesture was cancelled. + * Cancel the keyguard exit animation, usually because we were swiping to unlock but WM starts + * a new remote animation before finishing the keyguard exit animation. * - * This will re-show the keyguard and animate out the app/launcher surface behind the keyguard. + * This will dismiss the keyguard. */ public void cancelKeyguardExitAnimation() { Trace.beginSection("KeyguardViewMediator#cancelKeyguardExitAnimation"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 7c0559610e0c..ed3564879eae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2101,7 +2101,7 @@ public class StatusBar extends SystemUI implements DemoMode, // launches as they can break the animation. // TODO(b/184121838): Support non activity launches on the lockscreen. return isActivityIntent - && KeyguardService.sEnableRemoteKeyguardAnimation + && KeyguardService.sEnableRemoteKeyguardGoingAwayAnimation && mKeyguardStateController.canDismissLockScreen(); } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a2421355e868..e6adeb3abab8 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3051,7 +3051,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private int handleStartTransitionForKeyguardLw(boolean keyguardGoingAway, long duration) { final int res = applyKeyguardOcclusionChange(); if (res != 0) return res; - if (!WindowManagerService.sEnableRemoteKeyguardAnimation && keyguardGoingAway) { + if (!WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation && keyguardGoingAway) { if (DEBUG_KEYGUARD) Slog.d(TAG, "Starting keyguard exit animation"); startKeyguardExitAnimation(SystemClock.uptimeMillis(), duration); } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index cdce660835b6..0535af57d8ab 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -264,7 +264,8 @@ public class KeyguardServiceDelegate { */ @Deprecated public void setOccluded(boolean isOccluded, boolean animate) { - if (!WindowManagerService.sEnableRemoteKeyguardAnimation && mKeyguardService != null) { + if (!WindowManagerService.sEnableRemoteKeyguardOccludeAnimation + && mKeyguardService != null) { if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ") animate=" + animate); mKeyguardService.setOccluded(isOccluded, animate); } @@ -405,7 +406,8 @@ public class KeyguardServiceDelegate { } public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { - if (!WindowManagerService.sEnableRemoteKeyguardAnimation && mKeyguardService != null) { + if (!WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation + && mKeyguardService != null) { mKeyguardService.startKeyguardExitAnimation(startTime, fadeoutDuration); } } diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index e7c51a4ac65a..eaebb6f1ce74 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -800,7 +800,8 @@ public class AppTransitionController { } private void handleNonAppWindowsInTransition(@TransitionOldType int transit, int flags) { - if (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY) { + if (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY + && !WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation) { if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0 && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0 && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) == 0) { @@ -812,8 +813,9 @@ public class AppTransitionController { } } } - if (transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY - || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) { + if ((transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY + || transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER) + && !WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation) { mDisplayContent.startKeyguardExitOnNonAppWindows( transit == TRANSIT_OLD_KEYGUARD_GOING_AWAY_ON_WALLPAPER, (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0, diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 42e2d2fc79d3..0cd098070401 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -401,7 +401,8 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe if (dc == null) { return; } - if (transit == TRANSIT_KEYGUARD_GOING_AWAY) { + if (transit == TRANSIT_KEYGUARD_GOING_AWAY + && !WindowManagerService.sEnableRemoteKeyguardGoingAwayAnimation) { if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0 && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0 && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) == 0) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1042a0b13e1c..c1e29ebc4703 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -422,18 +422,41 @@ public class WindowManagerService extends IWindowManager.Stub SystemProperties.getBoolean(DISABLE_CUSTOM_TASK_ANIMATION_PROPERTY, true); /** + * Use WMShell for app transition. + */ + public static final String ENABLE_SHELL_TRANSITIONS = "persist.debug.shell_transit"; + + /** + * @see #ENABLE_SHELL_TRANSITIONS + */ + public static final boolean sEnableShellTransitions = + SystemProperties.getBoolean(ENABLE_SHELL_TRANSITIONS, false); + + /** * Run Keyguard animation as remote animation in System UI instead of local animation in * the server process. + * + * 0: Runs all keyguard animation as local animation + * 1: Only runs keyguard going away animation as remote animation + * 2: Runs all keyguard animation as remote animation */ private static final String ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY = "persist.wm.enable_remote_keyguard_animation"; + private static final int sEnableRemoteKeyguardAnimation = + SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1); + /** * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY */ - public static boolean sEnableRemoteKeyguardAnimation = - SystemProperties.getBoolean(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, false); + public static final boolean sEnableRemoteKeyguardGoingAwayAnimation = !sEnableShellTransitions + && sEnableRemoteKeyguardAnimation >= 1; + /** + * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY + */ + public static final boolean sEnableRemoteKeyguardOccludeAnimation = !sEnableShellTransitions + && sEnableRemoteKeyguardAnimation >= 2; /** * Allows a fullscreen windowing mode activity to launch in its desired orientation directly |