Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c21feaa1 authored by Robin Lee's avatar Robin Lee
Browse files

Add keyguard-appearing transition handler

This lets the SysUI implementation combine the keyguard appearing and
occluding events into a single transition after it has called
setLockScreenShown, so that it has all the information needed to play
the right animation in one step.

At the moment we won't play any animation and always just jump cut.

Flag: com.android.window.flags:keyguard_appear_transition
Bug: 337917376
Bug: 338606332
Bug: 338008315
Test: KeyguardManagerTest
Test: Crystalball run b/338008315#comment7
Change-Id: Id8e8518614386f8a3d92d4587701a96deb77fcef
parent 5f20f587
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.service.dreams.Flags.dismissDreamOnKeyguardDismiss;
import static android.view.WindowManager.KEYGUARD_VISIBILITY_TRANSIT_FLAGS;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_APPEARING;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
@@ -83,6 +84,7 @@ public class KeyguardTransitionHandler
     * @see KeyguardTransitions
     */
    private IRemoteTransition mExitTransition = null;
    private IRemoteTransition mAppearTransition = null;
    private IRemoteTransition mOccludeTransition = null;
    private IRemoteTransition mOccludeByDreamTransition = null;
    private IRemoteTransition mUnoccludeTransition = null;
@@ -170,26 +172,28 @@ public class KeyguardTransitionHandler

        // Choose a transition applicable for the changes and keyguard state.
        if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_GOING_AWAY) != 0) {
            return startAnimation(mExitTransition,
                    "going-away",
            return startAnimation(mExitTransition, "going-away",
                    transition, info, startTransaction, finishTransaction, finishCallback);
        }

        if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_APPEARING) != 0) {
            return startAnimation(mAppearTransition, "appearing",
                    transition, info, startTransaction, finishTransaction, finishCallback);
        }


        // Occlude/unocclude animations are only played if the keyguard is locked.
        if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0) {
            if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_OCCLUDING) != 0) {
                if (hasOpeningDream(info)) {
                    return startAnimation(mOccludeByDreamTransition,
                            "occlude-by-dream",
                    return startAnimation(mOccludeByDreamTransition, "occlude-by-dream",
                            transition, info, startTransaction, finishTransaction, finishCallback);
                } else {
                    return startAnimation(mOccludeTransition,
                            "occlude",
                    return startAnimation(mOccludeTransition, "occlude",
                            transition, info, startTransaction, finishTransaction, finishCallback);
                }
            } else if ((info.getFlags() & TRANSIT_FLAG_KEYGUARD_UNOCCLUDING) != 0) {
                return startAnimation(mUnoccludeTransition,
                        "unocclude",
                return startAnimation(mUnoccludeTransition, "unocclude",
                        transition, info, startTransaction, finishTransaction, finishCallback);
            }
        }
@@ -359,11 +363,13 @@ public class KeyguardTransitionHandler
        @Override
        public void register(
                IRemoteTransition exitTransition,
                IRemoteTransition appearTransition,
                IRemoteTransition occludeTransition,
                IRemoteTransition occludeByDreamTransition,
                IRemoteTransition unoccludeTransition) {
            mMainExecutor.execute(() -> {
                mExitTransition = exitTransition;
                mAppearTransition = appearTransition;
                mOccludeTransition = occludeTransition;
                mOccludeByDreamTransition = occludeByDreamTransition;
                mUnoccludeTransition = unoccludeTransition;
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ public interface KeyguardTransitions {
     */
    default void register(
            @NonNull IRemoteTransition unlockTransition,
            @NonNull IRemoteTransition appearTransition,
            @NonNull IRemoteTransition occludeTransition,
            @NonNull IRemoteTransition occludeByDreamTransition,
            @NonNull IRemoteTransition unoccludeTransition) {}
+35 −3
Original line number Diff line number Diff line
@@ -1077,6 +1077,33 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        }
    };

    /**
     * For now, the keyguard-appearing animation is a no-op, because we assume that this is
     * happening while the screen is already off or turning off.
     *
     * TODO(b/278086361): create an animation for keyguard appearing over a non-showWhenLocked
     * activity.
     */
    private final IRemoteAnimationRunner.Stub mAppearAnimationRunner =
            new IRemoteAnimationRunner.Stub() {
        @Override
        public void onAnimationStart(@WindowManager.TransitionOldType int transit,
                RemoteAnimationTarget[] apps,
                RemoteAnimationTarget[] wallpapers,
                RemoteAnimationTarget[] nonApps,
                IRemoteAnimationFinishedCallback finishedCallback) {
            try {
                finishedCallback.onAnimationFinished();
            } catch (RemoteException e) {
                Log.e(TAG, "Failed to finish transition", e);
            }
        }

        @Override
        public void onAnimationCancelled() {
        }
    };

    private final IRemoteAnimationRunner mOccludeAnimationRunner =
            new OccludeActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);

@@ -1165,7 +1192,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                                    finishedCallback.onAnimationFinished();
                                    mOccludeByDreamAnimator = null;
                                } catch (RemoteException e) {
                                    e.printStackTrace();
                                    Log.e(TAG, "Failed to finish transition", e);
                                }
                            }
                        });
@@ -1280,7 +1307,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,

                                    mInteractionJankMonitor.end(CUJ_LOCKSCREEN_OCCLUSION);
                                } catch (RemoteException e) {
                                    e.printStackTrace();
                                    Log.e(TAG, "Failed to finish transition", e);
                                }
                            }
                        });
@@ -1546,6 +1573,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,

        mKeyguardTransitions.register(
                KeyguardService.wrap(this, getExitAnimationRunner()),
                KeyguardService.wrap(this, getAppearAnimationRunner()),
                KeyguardService.wrap(this, getOccludeAnimationRunner()),
                KeyguardService.wrap(this, getOccludeByDreamAnimationRunner()),
                KeyguardService.wrap(this, getUnoccludeAnimationRunner()));
@@ -2124,6 +2152,10 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        return validatingRemoteAnimationRunner(mExitAnimationRunner);
    }

    public IRemoteAnimationRunner getAppearAnimationRunner() {
        return validatingRemoteAnimationRunner(mAppearAnimationRunner);
    }

    public IRemoteAnimationRunner getOccludeAnimationRunner() {
        if (KeyguardWmStateRefactor.isEnabled()) {
            return validatingRemoteAnimationRunner(mWmOcclusionManager.getOccludeAnimationRunner());
@@ -3357,7 +3389,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            }
        } catch (RemoteException e) {
            mSurfaceBehindRemoteAnimationRequested = false;
            e.printStackTrace();
            Log.e(TAG, "Failed to report keyguardGoingAway", e);
        }
    }