diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java index 13c0ac4bbaa7dac559c9ac9bdf5657aad72fe11c..b71c48e16acb945bd29bc4e5d2655d0a278a6200 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java @@ -76,6 +76,10 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler private IRemoteTransition mOccludeByDreamTransition = null; private IRemoteTransition mUnoccludeTransition = null; + // While set true, Keyguard has created a remote animation runner to handle the open app + // transition. + private boolean mIsLaunchingActivityOverLockscreen; + private final class StartedTransition { final TransitionInfo mInfo; final SurfaceControl.Transaction mFinishT; @@ -120,7 +124,7 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull TransitionFinishCallback finishCallback) { - if (!handles(info)) { + if (!handles(info) || mIsLaunchingActivityOverLockscreen) { return false; } @@ -313,5 +317,11 @@ public class KeyguardTransitionHandler implements Transitions.TransitionHandler mUnoccludeTransition = unoccludeTransition; }); } + + @Override + public void setLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) { + mMainExecutor.execute(() -> + mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen); + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java index b4b327f0eff24c2228d80d64c03c10c582fadd6c..33c299f0b1618e2bf1b38f79a847257490f6f3ba 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java @@ -38,4 +38,9 @@ public interface KeyguardTransitions { @NonNull IRemoteTransition occludeTransition, @NonNull IRemoteTransition occludeByDreamTransition, @NonNull IRemoteTransition unoccludeTransition) {} + + /** + * Notify whether keyguard has created a remote animation runner for next app launch. + */ + default void setLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) {} } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java index c45770280c8527c3dbdb0956b6dc3a30ea88b9eb..32cc6f8cebc0d8afd57bfb411f08f9ba9d446b34 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java @@ -327,12 +327,22 @@ public class DefaultMixedHandler implements Transitions.TransitionHandler, // the time of handleRequest, but we need more information than is available at that time. if (KeyguardTransitionHandler.handles(info)) { if (mixed != null && mixed.mType != MixedTransition.TYPE_KEYGUARD) { - ProtoLog.w(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, - "Converting mixed transition into a keyguard transition"); - onTransitionConsumed(transition, false, null); + final MixedTransition keyguardMixed = + new MixedTransition(MixedTransition.TYPE_KEYGUARD, transition); + mActiveTransitions.add(keyguardMixed); + final boolean hasAnimateKeyguard = animateKeyguard(keyguardMixed, info, + startTransaction, finishTransaction, finishCallback); + if (hasAnimateKeyguard) { + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, + "Converting mixed transition into a keyguard transition"); + // Consume the original mixed transition + onTransitionConsumed(transition, false, null); + return true; + } else { + // Keyguard handler cannot handle it, process through original mixed + mActiveTransitions.remove(keyguardMixed); + } } - mixed = new MixedTransition(MixedTransition.TYPE_KEYGUARD, transition); - mActiveTransitions.add(mixed); } if (mixed == null) return false; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 5eb7ba1e9fb3c8365d48cf9e0dac48383521acd2..2fe32019f261a6f6b275e59325c41f1dd83b7f59 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -3785,6 +3785,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } } + /** + * Notify whether keyguard has created a remote animation runner for next app launch. + */ + public void launchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) { + mKeyguardTransitions.setLaunchingActivityOverLockscreen(isLaunchingActivityOverLockscreen); + } + /** * Implementation of RemoteAnimationRunner that creates a new * {@link ActivityLaunchAnimator.Runner} whenever onAnimationStart is called, delegating the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index e76bae5e955b2b88b3558896ac5d24dc18ca3bdf..6f65f70e8072c7f7cfe7b93faf3ecbffa13633b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -3716,6 +3716,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @Override public void setIsLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) { mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen; + mKeyguardViewMediator.launchingActivityOverLockscreen(mIsLaunchingActivityOverLockscreen); } @Override