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

Commit 686ab5a8 authored by Govinda Wasserman's avatar Govinda Wasserman Committed by android-build-merger
Browse files

Merge "Ensure that handles are hidden and stay hidden when not fully awake" into qt-qpr1-dev

am: 77e4d230

Change-Id: I8d4f374d329c3965510f0f14a19ec32a7b527f64
parents 86785143 77e4d230
Loading
Loading
Loading
Loading
+37 −9
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.annotation.Nullable;

import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;

@@ -39,26 +40,33 @@ import dagger.Lazy;
@Singleton
final class AssistHandleLikeHomeBehavior implements BehaviorController {

    private final StatusBarStateController.StateListener mStatusBarStateListener =
            new StatusBarStateController.StateListener() {
                @Override
                public void onDozingChanged(boolean isDozing) {
                    handleDozingChanged(isDozing);
                }
            };
    private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
            new WakefulnessLifecycle.Observer() {
                @Override
                public void onStartedWakingUp() {
                    handleDozingChanged(/* isDozing = */ true);
                    handleWakefullnessChanged(/* isAwake = */ false);
                }

                @Override
                public void onFinishedWakingUp() {
                    handleDozingChanged(/* isDozing = */ false);
                    handleWakefullnessChanged(/* isAwake = */ true);
                }

                @Override
                public void onStartedGoingToSleep() {
                    handleDozingChanged(/* isDozing = */ true);
                    handleWakefullnessChanged(/* isAwake = */ false);
                }

                @Override
                public void onFinishedGoingToSleep() {
                    handleDozingChanged(/* isDozing = */ true);
                    handleWakefullnessChanged(/* isAwake = */ false);
                }
            };
    private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
@@ -69,19 +77,22 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
        }
    };


    private final Lazy<StatusBarStateController> mStatusBarStateController;
    private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;
    private final Lazy<OverviewProxyService> mOverviewProxyService;

    private boolean mIsDozing;
    private boolean mIsAwake;
    private boolean mIsHomeHandleHiding;

    @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;

    @Inject
    AssistHandleLikeHomeBehavior(
            Lazy<StatusBarStateController> statusBarStateController,
            Lazy<WakefulnessLifecycle> wakefulnessLifecycle,
            Lazy<OverviewProxyService> overviewProxyService) {
        mStatusBarStateController = statusBarStateController;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mOverviewProxyService = overviewProxyService;
    }
@@ -89,8 +100,10 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
    @Override
    public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
        mAssistHandleCallbacks = callbacks;
        mIsDozing = mWakefulnessLifecycle.get().getWakefulness()
                != WakefulnessLifecycle.WAKEFULNESS_AWAKE;
        mIsDozing = mStatusBarStateController.get().isDozing();
        mStatusBarStateController.get().addCallback(mStatusBarStateListener);
        mIsAwake = mWakefulnessLifecycle.get().getWakefulness()
                == WakefulnessLifecycle.WAKEFULNESS_AWAKE;
        mWakefulnessLifecycle.get().addObserver(mWakefulnessLifecycleObserver);
        mOverviewProxyService.get().addCallback(mOverviewProxyListener);
        callbackForCurrentState();
@@ -99,6 +112,7 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
    @Override
    public void onModeDeactivated() {
        mAssistHandleCallbacks = null;
        mStatusBarStateController.get().removeCallback(mStatusBarStateListener);
        mWakefulnessLifecycle.get().removeObserver(mWakefulnessLifecycleObserver);
        mOverviewProxyService.get().removeCallback(mOverviewProxyListener);
    }
@@ -116,6 +130,15 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
        callbackForCurrentState();
    }

    private void handleWakefullnessChanged(boolean isAwake) {
        if (mIsAwake == isAwake) {
            return;
        }

        mIsAwake = isAwake;
        callbackForCurrentState();
    }

    private void handleSystemUiStateChange(int sysuiStateFlags) {
        boolean isHomeHandleHiding = isHomeHandleHiding(sysuiStateFlags);
        if (mIsHomeHandleHiding == isHomeHandleHiding) {
@@ -131,18 +154,23 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
            return;
        }

        if (mIsHomeHandleHiding || mIsDozing) {
        if (mIsHomeHandleHiding || !isFullyAwake()) {
            mAssistHandleCallbacks.hide();
        } else {
            mAssistHandleCallbacks.showAndStay();
        }
    }

    private boolean isFullyAwake() {
        return mIsAwake && !mIsDozing;
    }

    @Override
    public void dump(PrintWriter pw, String prefix) {
        pw.println("Current AssistHandleLikeHomeBehavior State:");
        pw.println(prefix + "Current AssistHandleLikeHomeBehavior State:");

        pw.println(prefix + "   mIsDozing=" + mIsDozing);
        pw.println(prefix + "   mIsAwake=" + mIsAwake);
        pw.println(prefix + "   mIsHomeHandleHiding=" + mIsHomeHandleHiding);
    }
}
+43 −8
Original line number Diff line number Diff line
@@ -93,6 +93,11 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
                public void onStateChanged(int newState) {
                    handleStatusBarStateChanged(newState);
                }

                @Override
                public void onDozingChanged(boolean isDozing) {
                    handleDozingChanged(isDozing);
                }
            };
    private final TaskStackChangeListener mTaskStackChangeListener =
            new TaskStackChangeListener() {
@@ -120,14 +125,24 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
            };
    private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
            new WakefulnessLifecycle.Observer() {
                @Override
                public void onStartedWakingUp() {
                    handleWakefullnessChanged(/* isAwake = */ false);
                }

                @Override
                public void onFinishedWakingUp() {
                    handleDozingChanged(false);
                    handleWakefullnessChanged(/* isAwake = */ true);
                }

                @Override
                public void onStartedGoingToSleep() {
                    handleDozingChanged(true);
                    handleWakefullnessChanged(/* isAwake = */ false);
                }

                @Override
                public void onFinishedGoingToSleep() {
                    handleWakefullnessChanged(/* isAwake = */ false);
                }
            };
    private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() {
@@ -150,6 +165,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {

    private boolean mOnLockscreen;
    private boolean mIsDozing;
    private boolean mIsAwake;
    private int mRunningTaskId;
    private boolean mIsNavBarHidden;
    private boolean mIsLauncherShowing;
@@ -200,14 +216,15 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
        mDefaultHome = getCurrentDefaultHome();
        context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter);
        mOnLockscreen = onLockscreen(mStatusBarStateController.get().getState());
        mIsDozing = mStatusBarStateController.get().isDozing();
        mStatusBarStateController.get().addCallback(mStatusBarStateListener);
        ActivityManager.RunningTaskInfo runningTaskInfo =
                mActivityManagerWrapper.get().getRunningTask();
        mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId;
        mActivityManagerWrapper.get().registerTaskStackListener(mTaskStackChangeListener);
        mOverviewProxyService.get().addCallback(mOverviewProxyListener);
        mIsDozing = mWakefulnessLifecycle.get().getWakefulness()
                != WakefulnessLifecycle.WAKEFULNESS_AWAKE;
        mIsAwake = mWakefulnessLifecycle.get().getWakefulness()
                == WakefulnessLifecycle.WAKEFULNESS_AWAKE;
        mWakefulnessLifecycle.get().addObserver(mWakefulnessLifecycleObserver);

        mLearningTimeElapsed = Settings.Secure.getLong(
@@ -249,7 +266,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {

    @Override
    public void onAssistHandlesRequested() {
        if (mAssistHandleCallbacks != null && !mIsDozing && !mIsNavBarHidden && !mOnLockscreen) {
        if (mAssistHandleCallbacks != null
                && isFullyAwake()
                && !mIsNavBarHidden
                && !mOnLockscreen) {
            mAssistHandleCallbacks.showAndGo();
        }
    }
@@ -296,6 +316,16 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
        callbackForCurrentState(/* justUnlocked = */ false);
    }

    private void handleWakefullnessChanged(boolean isAwake) {
        if (mIsAwake == isAwake) {
            return;
        }

        resetConsecutiveTaskSwitches();
        mIsAwake = isAwake;
        callbackForCurrentState(/* justUnlocked = */ false);
    }

    private void handleTaskStackTopChanged(int taskId, @Nullable ComponentName taskComponentName) {
        if (mRunningTaskId == taskId || taskComponentName == null) {
            return;
@@ -349,7 +379,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
            return;
        }

        if (mIsDozing || mIsNavBarHidden || mOnLockscreen || !getShowWhenTaught()) {
        if (!isFullyAwake() || mIsNavBarHidden || mOnLockscreen || !getShowWhenTaught()) {
            mAssistHandleCallbacks.hide();
        } else if (justUnlocked) {
            long currentEpochDay = LocalDate.now().toEpochDay();
@@ -371,7 +401,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
            return;
        }

        if (mIsDozing || mIsNavBarHidden || isSuppressed()) {
        if (!isFullyAwake() || mIsNavBarHidden || isSuppressed()) {
            mAssistHandleCallbacks.hide();
        } else if (mOnLockscreen) {
            mAssistHandleCallbacks.showAndStay();
@@ -422,6 +452,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
        mHandler.postDelayed(mResetConsecutiveTaskSwitches, getShowAndGoDelayResetTimeoutMs());
    }

    private boolean isFullyAwake() {
        return mIsAwake && !mIsDozing;
    }

    private long getLearningTimeMs() {
        return mPhenotypeHelper.getLong(
                SystemUiDeviceConfigFlags.ASSIST_HANDLES_LEARN_TIME_MS,
@@ -481,6 +515,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
        pw.println(prefix + "Current AssistHandleReminderExpBehavior State:");
        pw.println(prefix + "   mOnLockscreen=" + mOnLockscreen);
        pw.println(prefix + "   mIsDozing=" + mIsDozing);
        pw.println(prefix + "   mIsAwake=" + mIsAwake);
        pw.println(prefix + "   mRunningTaskId=" + mRunningTaskId);
        pw.println(prefix + "   mDefaultHome=" + mDefaultHome);
        pw.println(prefix + "   mIsNavBarHidden=" + mIsNavBarHidden);
+136 −22
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest;

import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;

@@ -47,6 +48,7 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {

    private AssistHandleLikeHomeBehavior mAssistHandleLikeHomeBehavior;

    @Mock private StatusBarStateController mMockStatusBarStateController;
    @Mock private WakefulnessLifecycle mMockWakefulnessLifecycle;
    @Mock private OverviewProxyService mMockOverviewProxyService;
    @Mock private AssistHandleCallbacks mMockAssistHandleCallbacks;
@@ -55,7 +57,9 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mAssistHandleLikeHomeBehavior = new AssistHandleLikeHomeBehavior(
                () -> mMockWakefulnessLifecycle, () -> mMockOverviewProxyService);
                () -> mMockStatusBarStateController,
                () -> mMockWakefulnessLifecycle,
                () -> mMockOverviewProxyService);
    }

    @Test
@@ -66,6 +70,9 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);

        // Assert
        verify(mMockStatusBarStateController).isDozing();
        verify(mMockStatusBarStateController).addCallback(
                any(StatusBarStateController.StateListener.class));
        verify(mMockWakefulnessLifecycle).getWakefulness();
        verify(mMockWakefulnessLifecycle).addObserver(any(WakefulnessLifecycle.Observer.class));
        verify(mMockOverviewProxyService).addCallback(any(
@@ -74,8 +81,9 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
    }

    @Test
    public void onModeActivated_showsHandlesWhenAwake() {
    public void onModeActivated_showsHandlesWhenFullyAwake() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(false);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);

@@ -90,6 +98,7 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
    @Test
    public void onModeActivated_hidesHandlesWhenNotAwake() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(true);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP);

@@ -101,73 +110,140 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        verifyNoMoreInteractions(mMockAssistHandleCallbacks);
    }

    @Test
    public void onModeActivated_hidesHandlesWhenDozing() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(true);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);

        // Act
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);

        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(mMockAssistHandleCallbacks);
    }

    @Test
    public void onModeDeactivated_stopsObserving() {
        // Arrange
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        ArgumentCaptor<StatusBarStateController.StateListener> stateListener =
                ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
        ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
                ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
        ArgumentCaptor<OverviewProxyService.OverviewProxyListener> overviewProxyListener =
                ArgumentCaptor.forClass(OverviewProxyService.OverviewProxyListener.class);
        verify(mMockStatusBarStateController).addCallback(stateListener.capture());
        verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
        verify(mMockOverviewProxyService).addCallback(overviewProxyListener.capture());
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        mAssistHandleLikeHomeBehavior.onModeDeactivated();

        // Assert
        verify(mMockStatusBarStateController).removeCallback(eq(stateListener.getValue()));
        verify(mMockWakefulnessLifecycle).removeObserver(eq(observer.getValue()));
        verify(mMockOverviewProxyService).removeCallback(eq(overviewProxyListener.getValue()));
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onAssistantGesturePerformed_doesNothing() {
        // Arrange
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        mAssistHandleLikeHomeBehavior.onAssistantGesturePerformed();

        // Assert
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onAssistHandlesRequested_doesNothing() {
        // Arrange
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        mAssistHandleLikeHomeBehavior.onAssistHandlesRequested();

        // Assert
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onWake_handlesShow() {
    public void onBothAwakeAndUnDoze_handlesShow() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(true);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP);
        ArgumentCaptor<StatusBarStateController.StateListener> stateListener =
                ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
        ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
                ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        verify(mMockStatusBarStateController).addCallback(stateListener.capture());
        verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        observer.getValue().onStartedWakingUp();
        observer.getValue().onFinishedWakingUp();

        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Arrange
        observer.getValue().onFinishedGoingToSleep();
        reset(mMockAssistHandleCallbacks);

        // Act
        stateListener.getValue().onDozingChanged(false);

        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        observer.getValue().onFinishedWakingUp();
@@ -175,19 +251,30 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        // Assert
        verify(mMockAssistHandleCallbacks).showAndStay();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onSleep_handlesHide() {
    public void onSleepOrDoze_handlesHide() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(false);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
        ArgumentCaptor<StatusBarStateController.StateListener> stateListener =
                ArgumentCaptor.forClass(StatusBarStateController.StateListener.class);
        ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
                ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        verify(mMockStatusBarStateController).addCallback(stateListener.capture());
        verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        observer.getValue().onStartedGoingToSleep();
@@ -195,26 +282,42 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Arrange
        observer.getValue().onFinishedWakingUp();
        reset(mMockAssistHandleCallbacks);

        // Act
        observer.getValue().onFinishedGoingToSleep();
        stateListener.getValue().onDozingChanged(true);

        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onHomeHandleHide_handlesHide() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(false);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
        ArgumentCaptor<OverviewProxyService.OverviewProxyListener> sysUiStateCallback =
                ArgumentCaptor.forClass(OverviewProxyService.OverviewProxyListener.class);
        mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
        verify(mMockOverviewProxyService).addCallback(sysUiStateCallback.capture());
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        sysUiStateCallback.getValue().onSystemUiStateChanged(
@@ -223,12 +326,16 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        // Assert
        verify(mMockAssistHandleCallbacks).hide();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }

    @Test
    public void onHomeHandleUnhide_handlesShow() {
        // Arrange
        when(mMockStatusBarStateController.isDozing()).thenReturn(false);
        when(mMockWakefulnessLifecycle.getWakefulness())
                .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
        ArgumentCaptor<OverviewProxyService.OverviewProxyListener> sysUiStateCallback =
@@ -237,7 +344,11 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        verify(mMockOverviewProxyService).addCallback(sysUiStateCallback.capture());
        sysUiStateCallback.getValue().onSystemUiStateChanged(
                QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN);
        reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
        reset(
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);

        // Act
        sysUiStateCallback.getValue().onSystemUiStateChanged(
@@ -246,6 +357,9 @@ public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
        // Assert
        verify(mMockAssistHandleCallbacks).showAndStay();
        verifyNoMoreInteractions(
                mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
                mMockStatusBarStateController,
                mMockWakefulnessLifecycle,
                mMockOverviewProxyService,
                mMockAssistHandleCallbacks);
    }
}