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

Commit 543c39b8 authored by Mike Schneider's avatar Mike Schneider
Browse files

Change the use of ScreenLifecycle to WakefulnessLifecycle.

This is a better fit for the signal in launcher, since it identifies
whether the device is awake or asleep, where asleep also inclues AoD.

Also adding SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to the IntDef and
debug getSystemUiStateString, since it was missing.

Test: manual, unit tests
Bug: 275319714

Change-Id: I8a3275e177967c24f3bcd30308f11b3524e9d53d
parent 86305544
Loading
Loading
Loading
Loading
+27 −26
Original line number Diff line number Diff line
@@ -115,28 +115,25 @@ public class QuickStepContract {
    public static final int SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE = 1 << 26;
    // Device dreaming state
    public static final int SYSUI_STATE_DEVICE_DREAMING = 1 << 27;
    // Whether the screen is currently on. Note that the screen is considered on while turning on,
    // but not while turning off.
    public static final int SYSUI_STATE_SCREEN_ON = 1 << 28;
    // Whether the screen is currently transitioning into the state indicated by
    // SYSUI_STATE_SCREEN_ON.
    public static final int SYSUI_STATE_SCREEN_TRANSITION = 1 << 29;
    // Whether the device is currently awake (as opposed to asleep, see WakefulnessLifecycle).
    // Note that the device is awake on while waking up on, but not while going to sleep.
    public static final int SYSUI_STATE_AWAKE = 1 << 28;
    // Whether the device is currently transitioning between awake/asleep indicated by
    // SYSUI_STATE_AWAKE.
    public static final int SYSUI_STATE_WAKEFULNESS_TRANSITION = 1 << 29;
    // The notification panel expansion fraction is > 0
    public static final int SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE = 1 << 30;

    // Mask for SystemUiStateFlags to isolate SYSUI_STATE_SCREEN_ON and
    // SYSUI_STATE_SCREEN_TRANSITION, to match SCREEN_STATE_*
    public static final int SYSUI_STATE_SCREEN_STATE_MASK =
            SYSUI_STATE_SCREEN_ON | SYSUI_STATE_SCREEN_TRANSITION;
    // Screen is off.
    public static final int SCREEN_STATE_OFF = 0;
    // Screen is on.
    public static final int SCREEN_STATE_ON = SYSUI_STATE_SCREEN_ON;
    // Screen is still on, but transitioning to turn off.
    public static final int SCREEN_STATE_TURNING_OFF = SYSUI_STATE_SCREEN_TRANSITION;
    // Screen was off and is now turning on.
    public static final int SCREEN_STATE_TURNING_ON =
            SYSUI_STATE_SCREEN_TRANSITION | SYSUI_STATE_SCREEN_ON;
    // Mask for SystemUiStateFlags to isolate SYSUI_STATE_AWAKE and
    // SYSUI_STATE_WAKEFULNESS_TRANSITION, to match WAKEFULNESS_* constants
    public static final int SYSUI_STATE_WAKEFULNESS_MASK =
            SYSUI_STATE_AWAKE | SYSUI_STATE_WAKEFULNESS_TRANSITION;
    // Mirroring the WakefulnessLifecycle#Wakefulness states
    public static final int WAKEFULNESS_ASLEEP = 0;
    public static final int WAKEFULNESS_AWAKE = SYSUI_STATE_AWAKE;
    public static final int WAKEFULNESS_GOING_TO_SLEEP = SYSUI_STATE_WAKEFULNESS_TRANSITION;
    public static final int WAKEFULNESS_WAKING =
            SYSUI_STATE_WAKEFULNESS_TRANSITION | SYSUI_STATE_AWAKE;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({SYSUI_STATE_SCREEN_PINNING,
@@ -167,8 +164,9 @@ public class QuickStepContract {
            SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING,
            SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE,
            SYSUI_STATE_DEVICE_DREAMING,
            SYSUI_STATE_SCREEN_ON,
            SYSUI_STATE_SCREEN_TRANSITION,
            SYSUI_STATE_AWAKE,
            SYSUI_STATE_WAKEFULNESS_TRANSITION,
            SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE,
    })
    public @interface SystemUiStateFlags {}

@@ -190,7 +188,7 @@ public class QuickStepContract {
            str.add("navbar_hidden");
        }
        if ((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0) {
            str.add("notif_visible");
            str.add("notif_expanded");
        }
        if ((flags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) != 0) {
            str.add("qs_visible");
@@ -258,11 +256,14 @@ public class QuickStepContract {
        if ((flags & SYSUI_STATE_DEVICE_DREAMING) != 0) {
            str.add("device_dreaming");
        }
        if ((flags & SYSUI_STATE_SCREEN_TRANSITION) != 0) {
            str.add("screen_transition");
        if ((flags & SYSUI_STATE_WAKEFULNESS_TRANSITION) != 0) {
            str.add("wakefulness_transition");
        }
        if ((flags & SYSUI_STATE_AWAKE) != 0) {
            str.add("awake");
        }
        if ((flags & SYSUI_STATE_SCREEN_ON) != 0) {
            str.add("screen_on");
        if ((flags & SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE) != 0) {
            str.add("notif_visible");
        }

        return str.toString();
+86 −70
Original line number Diff line number Diff line
@@ -21,21 +21,22 @@ import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;

import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SUPPORTS_WINDOW_CORNERS;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_WINDOW_CORNER_RADIUS;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_ON;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_TRANSITION;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_TRANSITION;

import android.annotation.FloatRange;
import android.app.ActivityTaskManager;
@@ -83,6 +84,7 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationBar;
import com.android.systemui.navigationbar.NavigationBarController;
@@ -518,6 +520,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
            NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
            UserTracker userTracker,
            ScreenLifecycle screenLifecycle,
            WakefulnessLifecycle wakefulnessLifecycle,
            UiEventLogger uiEventLogger,
            DisplayTracker displayTracker,
            KeyguardUnlockAnimationController sysuiUnlockAnimationController,
@@ -595,8 +598,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
        // Listen for user setup
        mUserTracker.addCallback(mUserChangedCallback, mMainExecutor);

        screenLifecycle.addObserver(mLifecycleObserver);

        screenLifecycle.addObserver(mScreenLifecycleObserver);
        wakefulnessLifecycle.addObserver(mWakefulnessLifecycleObserver);
        // Connect to the service
        updateEnabledState();
        startConnectionToCurrentUser();
@@ -860,54 +863,36 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
        }
    }

    private final ScreenLifecycle.Observer mLifecycleObserver = new ScreenLifecycle.Observer() {
    private final ScreenLifecycle.Observer mScreenLifecycleObserver =
            new ScreenLifecycle.Observer() {
                /**
                 * Notifies the Launcher that screen turned on and ready to use
                 */
                @Override
                public void onScreenTurnedOn() {
            mSysUiState
                .setFlag(SYSUI_STATE_SCREEN_ON, true)
                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, false)
                .commitUpdate(mContext.getDisplayId());

                    try {
                        if (mOverviewProxy != null) {
                            mOverviewProxy.onScreenTurnedOn();
                        } else {
                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turned on event.");
                            Log.e(TAG_OPS,
                                    "Failed to get overview proxy for screen turned on event.");
                        }
                    } catch (RemoteException e) {
                        Log.e(TAG_OPS, "Failed to call onScreenTurnedOn()", e);
                    }
                }

        /**
         * Notifies the Launcher that screen turned off.
         */
        @Override
        public void onScreenTurnedOff() {
            mSysUiState
                .setFlag(SYSUI_STATE_SCREEN_ON, false)
                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, false)
                .commitUpdate(mContext.getDisplayId());
        }

                /**
                 * Notifies the Launcher that screen is starting to turn on.
                 */
                @Override
                public void onScreenTurningOff() {
            mSysUiState
                .setFlag(SYSUI_STATE_SCREEN_ON, false)
                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, true)
                .commitUpdate(mContext.getDisplayId());

                    try {
                        if (mOverviewProxy != null) {
                            mOverviewProxy.onScreenTurningOff();
                        } else {
                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turning off event.");
                            Log.e(TAG_OPS,
                                    "Failed to get overview proxy for screen turning off event.");
                        }
                    } catch (RemoteException e) {
                        Log.e(TAG_OPS, "Failed to call onScreenTurningOff()", e);
@@ -919,16 +904,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
                 */
                @Override
                public void onScreenTurningOn() {
            mSysUiState
                .setFlag(SYSUI_STATE_SCREEN_ON, true)
                .setFlag(SYSUI_STATE_SCREEN_TRANSITION, true)
                .commitUpdate(mContext.getDisplayId());

                    try {
                        if (mOverviewProxy != null) {
                            mOverviewProxy.onScreenTurningOn();
                        } else {
                    Log.e(TAG_OPS, "Failed to get overview proxy for screen turning on event.");
                            Log.e(TAG_OPS,
                                    "Failed to get overview proxy for screen turning on event.");
                        }
                    } catch (RemoteException e) {
                        Log.e(TAG_OPS, "Failed to call onScreenTurningOn()", e);
@@ -936,6 +917,41 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
                }
            };

    private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
            new WakefulnessLifecycle.Observer() {
                @Override
                public void onStartedWakingUp() {
                    mSysUiState
                            .setFlag(SYSUI_STATE_AWAKE, true)
                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, true)
                            .commitUpdate(mContext.getDisplayId());
                }

                @Override
                public void onFinishedWakingUp() {
                    mSysUiState
                            .setFlag(SYSUI_STATE_AWAKE, true)
                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, false)
                            .commitUpdate(mContext.getDisplayId());
                }

                @Override
                public void onStartedGoingToSleep() {
                    mSysUiState
                            .setFlag(SYSUI_STATE_AWAKE, false)
                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, true)
                            .commitUpdate(mContext.getDisplayId());
                }

                @Override
                public void onFinishedGoingToSleep() {
                    mSysUiState
                            .setFlag(SYSUI_STATE_AWAKE, false)
                            .setFlag(SYSUI_STATE_WAKEFULNESS_TRANSITION, false)
                            .commitUpdate(mContext.getDisplayId());
                }
            };

    void notifyToggleRecentApps() {
        for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
            mConnectionCallbacks.get(i).onToggleRecentApps();
+31 −17
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.recents
import android.content.ComponentName
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.os.PowerManager
import android.testing.AndroidTestingRunner
import android.testing.TestableContext
import android.testing.TestableLooper
@@ -30,6 +31,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.KeyguardUnlockAnimationController
import com.android.systemui.keyguard.ScreenLifecycle
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.model.SysUiState
import com.android.systemui.navigationbar.NavigationBarController
import com.android.systemui.navigationbar.NavigationModeController
@@ -37,16 +39,17 @@ import com.android.systemui.recents.OverviewProxyService.ACTION_QUICKSTEP
import com.android.systemui.settings.FakeDisplayTracker
import com.android.systemui.settings.UserTracker
import com.android.systemui.shared.recents.IOverviewProxy
import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_OFF
import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_ON
import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_TURNING_OFF
import com.android.systemui.shared.system.QuickStepContract.SCREEN_STATE_TURNING_ON
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_STATE_MASK
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK
import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_ASLEEP
import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_AWAKE
import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_GOING_TO_SLEEP
import com.android.systemui.shared.system.QuickStepContract.WAKEFULNESS_WAKING
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.android.wm.shell.sysui.ShellInterface
import com.google.common.util.concurrent.MoreExecutors
import dagger.Lazy
@@ -60,6 +63,7 @@ import org.mockito.ArgumentMatchers
import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.intThat
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
@@ -75,8 +79,11 @@ class OverviewProxyServiceTest : SysuiTestCase() {
    private lateinit var subject: OverviewProxyService
    private val dumpManager = DumpManager()
    private val displayTracker = FakeDisplayTracker(mContext)
    private val fakeSystemClock = FakeSystemClock()
    private val sysUiState = SysUiState(displayTracker)
    private val screenLifecycle = ScreenLifecycle(dumpManager)
    private val wakefulnessLifecycle =
        WakefulnessLifecycle(mContext, null, fakeSystemClock, dumpManager)

    @Mock private lateinit var overviewProxy: IOverviewProxy.Stub
    @Mock private lateinit var packageManager: PackageManager
@@ -130,6 +137,7 @@ class OverviewProxyServiceTest : SysuiTestCase() {
                sysUiState,
                userTracker,
                screenLifecycle,
                wakefulnessLifecycle,
                uiEventLogger,
                displayTracker,
                sysuiUnlockAnimationController,
@@ -145,42 +153,48 @@ class OverviewProxyServiceTest : SysuiTestCase() {
    }

    @Test
    fun `ScreenLifecycle - screenTurnedOn triggers SysUI state flag changes `() {
        screenLifecycle.dispatchScreenTurnedOn()
    fun `WakefulnessLifecycle - dispatchFinishedWakingUp sets SysUI flag to AWAKE`() {
        // WakefulnessLifecycle is initialized to AWAKE initially, and won't emit a noop.
        wakefulnessLifecycle.dispatchFinishedGoingToSleep()
        clearInvocations(overviewProxy)

        wakefulnessLifecycle.dispatchFinishedWakingUp()

        verify(overviewProxy)
            .onSystemUiStateChanged(
                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_ON }
                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_AWAKE }
            )
    }

    @Test
    fun `ScreenLifecycle - screenTurningOn triggers SysUI state flag changes `() {
        screenLifecycle.dispatchScreenTurningOn()
    fun `WakefulnessLifecycle - dispatchStartedWakingUp sets SysUI flag to WAKING`() {
        wakefulnessLifecycle.dispatchStartedWakingUp(PowerManager.WAKE_REASON_UNKNOWN)

        verify(overviewProxy)
            .onSystemUiStateChanged(
                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_TURNING_ON }
                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_WAKING }
            )
    }

    @Test
    fun `ScreenLifecycle - screenTurnedOff triggers SysUI state flag changes `() {
        screenLifecycle.dispatchScreenTurnedOff()
    fun `WakefulnessLifecycle - dispatchFinishedGoingToSleep sets SysUI flag to ASLEEP`() {
        wakefulnessLifecycle.dispatchFinishedGoingToSleep()

        verify(overviewProxy)
            .onSystemUiStateChanged(
                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_OFF }
                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_ASLEEP }
            )
    }

    @Test
    fun `ScreenLifecycle - screenTurningOff triggers SysUI state flag changes `() {
        screenLifecycle.dispatchScreenTurningOff()
    fun `WakefulnessLifecycle - dispatchStartedGoingToSleep sets SysUI flag to GOING_TO_SLEEP`() {
        wakefulnessLifecycle.dispatchStartedGoingToSleep(
            PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON
        )

        verify(overviewProxy)
            .onSystemUiStateChanged(
                intThat { it and SYSUI_STATE_SCREEN_STATE_MASK == SCREEN_STATE_TURNING_OFF }
                intThat { it and SYSUI_STATE_WAKEFULNESS_MASK == WAKEFULNESS_GOING_TO_SLEEP }
            )
    }
}