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

Commit 05f45a09 authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Enable WM remote occlude flag; fix occlude state issues.

The flag in KeyguardService was updated, but this one was
not, leading to some duplicate setOccluded calls.

Also, we should not be setting the keyguard occluded if
the occlusion launch animator is cancelled. Cancellations
should be ignored, if we're cancelling due to unoccluding
then we'll set occluded = false in the unocclude method.

Fixes: 228800628
Fixes: 229749961
Fixes: 230135606
Fixes: 229890065
Test: launch Camera a lot
Change-Id: I978cc051c35f84c4a967528801d3bf0f6944430b
parent e133038e
Loading
Loading
Loading
Loading
+42 −4
Original line number Diff line number Diff line
@@ -849,7 +849,8 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,

                @Override
                public void onLaunchAnimationCancelled() {
                    setOccluded(true /* occluded */, false /* animate */);
                    Log.d(TAG, "Occlude launch animation cancelled. "
                            + "Occluded state is now: " + mOccluded);
                }

                @NonNull
@@ -894,7 +895,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
            };

    private IRemoteAnimationRunner mOccludeAnimationRunner =
            new ActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);
            new OccludeActivityLaunchRemoteAnimationRunner(mOccludeAnimationController);

    /**
     * Animation controller for activities that unocclude the keyguard. This does not use the
@@ -919,13 +920,17 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
                        RemoteAnimationTarget[] wallpapers,
                        RemoteAnimationTarget[] nonApps,
                        IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
                    final RemoteAnimationTarget primary = apps[0];
                    if (apps == null || apps.length == 0 || apps[0] == null) {
                        Log.d(TAG, "No apps provided to unocclude runner; "
                                + "skipping animation and unoccluding.");

                    if (primary == null) {
                        finishedCallback.onAnimationFinished();
                        setOccluded(false /* isOccluded */, true /* animate */);
                        return;
                    }

                    final RemoteAnimationTarget primary = apps[0];

                    final SyncRtSurfaceTransactionApplier applier =
                            new SyncRtSurfaceTransactionApplier(
                                    mKeyguardViewControllerLazy.get().getViewRootImpl().getView());
@@ -965,6 +970,7 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                try {
                                    setOccluded(false /* isOccluded */, true /* animate */);
                                    finishedCallback.onAnimationFinished();
                                    mUnoccludeAnimator = null;
                                } catch (RemoteException e) {
@@ -3125,4 +3131,36 @@ public class KeyguardViewMediator extends CoreStartable implements Dumpable,
            mRunner.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback);
        }
    }

    /**
     * Subclass of {@link ActivityLaunchRemoteAnimationRunner} that calls {@link #setOccluded} when
     * onAnimationStart is called.
     */
    private class OccludeActivityLaunchRemoteAnimationRunner
            extends ActivityLaunchRemoteAnimationRunner {

        OccludeActivityLaunchRemoteAnimationRunner(
                ActivityLaunchAnimator.Controller controller) {
            super(controller);
        }

        @Override
        public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
                RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
                IRemoteAnimationFinishedCallback finishedCallback) throws RemoteException {
            super.onAnimationStart(transit, apps, wallpapers, nonApps, finishedCallback);

            // This is the first signal we have from WM that we're going to be occluded. Set our
            // internal state to reflect that immediately, vs. waiting for the launch animator to
            // begin. Otherwise, calls to setShowingLocked, etc. will not know that we're about to
            // be occluded and might re-show the keyguard.
            setOccluded(true /* isOccluded */, false /* animate */);
        }

        @Override
        public void onAnimationCancelled() throws RemoteException {
            super.onAnimationCancelled();
            Log.d(TAG, "Occlude launch animation cancelled. Occluded state is now: " + mOccluded);
        }
    }
}
+17 −0
Original line number Diff line number Diff line
@@ -1743,6 +1743,23 @@ public class CentralSurfaces extends CoreStartable implements
                    }
                }

                @Override
                public void onLaunchAnimationStart(boolean isExpandingFullyAbove) {
                    super.onLaunchAnimationStart(isExpandingFullyAbove);

                    // Double check that the keyguard is still showing and not going away, but if so
                    // set the keyguard occluded. Typically, WM will let KeyguardViewMediator know
                    // directly, but we're overriding that to play the custom launch animation, so
                    // we need to take care of that here. The unocclude animation is not overridden,
                    // so WM will call KeyguardViewMediator's unocclude animation runner when the
                    // activity is exited.
                    if (mKeyguardStateController.isShowing()
                            && !mKeyguardStateController.isKeyguardGoingAway()) {
                        mKeyguardViewMediator.setOccluded(true /* isOccluded */,
                                true /* animate */);
                    }
                }

                @Override
                public void onLaunchAnimationEnd(boolean isExpandingFullyAbove) {
                    // Set mIsLaunchingActivityOverLockscreen to false before actually finishing the
+1 −1
Original line number Diff line number Diff line
@@ -423,7 +423,7 @@ public class WindowManagerService extends IWindowManager.Stub
            "persist.wm.enable_remote_keyguard_animation";

    private static final int sEnableRemoteKeyguardAnimation =
            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 1);
            SystemProperties.getInt(ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY, 2);

    /**
     * @see #ENABLE_REMOTE_KEYGUARD_ANIMATION_PROPERTY