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

Commit 5a416673 authored by Ben Lin's avatar Ben Lin
Browse files

Have Keyguard drive Unlock/Lock transition directly to Shell.

Currently we have the following back-and-forth for keyguard transitions:
1) Keyguard/SystemUI talks to Core via ATMS to show/hide keyguard, or
   tell that keyguard is about to go away
2) Core shows apps
3) Core sends a transition request to Shell
4) Shell chooses KeyguardTransitionHandler to handle it and sends off to
   RemoteAnimation to animate keyguard going away

This new change changes it so that instead of SystemUI -> Core, it's now
SystemUI -> Shell:
1) Keyguard/SystemUI starts a Transition immediately as it
   show/hide/"about to hide" keyguard (keyguardGoingAway)
2) Shell uses KeyguardTransitionHandler to start the transition with a
   WCT=DisplayOperation.setKeyguardShowing(true/false)
3) Core receives WCT and calls on KeyguardController#setKeyguardShown to
   show apps
4) Transition system comes back to
   KeyguardTransitionHandler#startAnimation and process the new Changes
w.r.t. app showing

This change mostly focuses only on the simple unlock/lock use case,
where the user just swipes up and keyguard unlocks. Other use cases
need more care and will be addressed on subsequent CLs. This new logic
is also behind a flag.

Bug: 364930619
Test: Manually swipe up to see that it animates properly with Flag on
Flag: com.android.window.flags.ensure_keyguard_does_transition_starting

Change-Id: I3d770b41249a54452b8b01d7a3159f59168811ee
parent 761f72e9
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING;
import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING;
import static android.view.WindowManager.TRANSIT_SLEEP;
import static android.view.WindowManager.TRANSIT_TO_BACK;
import static android.view.WindowManager.TRANSIT_TO_FRONT;

import static com.android.wm.shell.shared.TransitionUtil.isOpeningType;

@@ -44,6 +46,7 @@ import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.KeyguardState;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerToken;
@@ -388,5 +391,18 @@ public class KeyguardTransitionHandler
            mMainExecutor.execute(() ->
                    mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen);
        }

        @Override
        public void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) {
            final WindowContainerTransaction wct = new WindowContainerTransaction();
            final KeyguardState keyguardState =
                    new KeyguardState.Builder(android.view.Display.DEFAULT_DISPLAY)
                            .setKeyguardShowing(keyguardShowing).setAodShowing(aodShowing).build();
            wct.addKeyguardState(keyguardState);
            mMainExecutor.execute(() -> {
                mTransitions.startTransition(keyguardShowing ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK,
                        wct, KeyguardTransitionHandler.this);
            });
        }
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -44,4 +44,11 @@ public interface KeyguardTransitions {
     * Notify whether keyguard has created a remote animation runner for next app launch.
     */
    default void setLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) {}

    /**
     * Notifies Shell to start a keyguard transition directly.
     * @param keyguardShowing whether keyguard is showing or not.
     * @param aodShowing whether aod is showing or not.
     */
    default void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) {}
}
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransition
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.time.FakeSystemClock
import com.android.wm.shell.keyguard.KeyguardTransitions
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -46,6 +47,7 @@ class WindowManagerLockscreenVisibilityManagerTest : SysuiTestCase() {
    @Mock private lateinit var keyguardSurfaceBehindAnimator: KeyguardSurfaceBehindParamsApplier
    @Mock
    private lateinit var keyguardDismissTransitionInteractor: KeyguardDismissTransitionInteractor
    @Mock private lateinit var keyguardTransitions: KeyguardTransitions

    @Before
    fun setUp() {
@@ -59,6 +61,7 @@ class WindowManagerLockscreenVisibilityManagerTest : SysuiTestCase() {
                keyguardStateController = keyguardStateController,
                keyguardSurfaceBehindAnimator = keyguardSurfaceBehindAnimator,
                keyguardDismissTransitionInteractor = keyguardDismissTransitionInteractor,
                keyguardTransitions = keyguardTransitions,
            )
    }

+35 −15
Original line number Diff line number Diff line
@@ -178,6 +178,7 @@ import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.settings.SystemSettings;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.wallpapers.data.repository.WallpaperRepository;
import com.android.window.flags.Flags;
import com.android.wm.shell.keyguard.KeyguardTransitions;

import dagger.Lazy;
@@ -236,6 +237,9 @@ import java.util.function.Consumer;
 */
public class KeyguardViewMediator implements CoreStartable, Dumpable,
        StatusBarStateController.StateListener {

    private static final boolean ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS =
            Flags.ensureKeyguardDoesTransitionStarting();
    private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
    private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;

@@ -2865,10 +2869,15 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                return;
            }

            if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
                mKeyguardTransitions.startKeyguardTransition(showing, aodShowing);
            } else {
                try {

                    mActivityTaskManagerService.setLockScreenShown(showing, aodShowing);
                } catch (RemoteException ignored) {
                }
            }
        });
    }

@@ -3004,6 +3013,11 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                // will be in order.
                final int keyguardFlag = flags;
                mUiBgExecutor.execute(() -> {
                    if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
                        mKeyguardTransitions.startKeyguardTransition(
                                false /* keyguardShowing */, false /* aodShowing */);
                        return;
                    }
                    try {
                        mActivityTaskManagerService.keyguardGoingAway(keyguardFlag);
                    } catch (RemoteException e) {
@@ -3464,6 +3478,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
    public void showSurfaceBehindKeyguard() {
        mSurfaceBehindRemoteAnimationRequested = true;

        if (ENABLE_NEW_KEYGUARD_SHELL_TRANSITIONS) {
            mKeyguardTransitions.startKeyguardTransition(
                    false /* keyguardShowing */, false /* aodShowing */);
            return;
        }

        try {
            int flags = KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS
                    | KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
+18 −1
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissTransitionInteractor
import com.android.systemui.keyguard.ui.binder.KeyguardSurfaceBehindParamsApplier
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.window.flags.Flags
import com.android.wm.shell.keyguard.KeyguardTransitions
import java.util.concurrent.Executor
import javax.inject.Inject

@@ -42,6 +44,7 @@ constructor(
    private val keyguardStateController: KeyguardStateController,
    private val keyguardSurfaceBehindAnimator: KeyguardSurfaceBehindParamsApplier,
    private val keyguardDismissTransitionInteractor: KeyguardDismissTransitionInteractor,
    private val keyguardTransitions: KeyguardTransitions
) {

    /**
@@ -97,6 +100,9 @@ constructor(
    /** Callback provided by WM to call once we're done with the going away animation. */
    private var goingAwayRemoteAnimationFinishedCallback: IRemoteAnimationFinishedCallback? = null

    private val enableNewKeyguardShellTransitions: Boolean =
        Flags.ensureKeyguardDoesTransitionStarting()

    /**
     * Set the visibility of the surface behind the keyguard, making the appropriate calls to Window
     * Manager to effect the change.
@@ -114,7 +120,14 @@ constructor(
            return
        }



        if (visible) {
            if (enableNewKeyguardShellTransitions) {
                keyguardTransitions.startKeyguardTransition(false /* keyguardShowing */, false /* aodShowing */)
                isKeyguardGoingAway = true
                return
            }
            // Make the surface visible behind the keyguard by calling keyguardGoingAway. The
            // lockscreen is still showing as well, allowing us to animate unlocked.
            Log.d(TAG, "ActivityTaskManagerService#keyguardGoingAway()")
@@ -220,7 +233,11 @@ constructor(
                "isLockscreenShowing=$lockscreenShowing, " +
                "aodVisible=$aodVisible)."
        )
        if (enableNewKeyguardShellTransitions) {
            keyguardTransitions.startKeyguardTransition(lockscreenShowing, aodVisible)
        } else {
            activityTaskManagerService.setLockScreenShown(lockscreenShowing, aodVisible)
        }
        this.isLockscreenShowing = lockscreenShowing
        this.isAodVisible = aodVisible
    }
Loading