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

Commit 50442834 authored by Bryce Lee's avatar Bryce Lee
Browse files

Transition to Glanceable Hub on dream exit.

This changelist redirects dream exit/wakeup to transition to the
glanceable hub when available.

Test: atest DreamOverlayServiceTest#testRedirectExit
Test: atest DreamoverlayServicetest#testTransitionToGlanceableHub
Flag: aconfig android.service.dreams.Flags.dream_exit_redirect disabled
Fixes: 334083490
Change-Id: I0f51e8ba346658f0f6e66de714b2c8fb24ef9952
parent 5cc04a86
Loading
Loading
Loading
Loading
+67 −1
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@ package com.android.systemui.dreams

import android.content.ComponentName
import android.content.Intent
import android.os.RemoteException
import android.platform.test.annotations.EnableFlags
import android.service.dreams.Flags
import android.service.dreams.IDreamOverlay
import android.service.dreams.IDreamOverlayCallback
import android.service.dreams.IDreamOverlayClient
@@ -44,7 +47,9 @@ import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepositor
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.communal.data.repository.FakeCommunalRepository
import com.android.systemui.communal.data.repository.fakeCommunalRepository
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.complication.ComplicationHostViewController
import com.android.systemui.complication.ComplicationLayoutEngine
@@ -57,12 +62,14 @@ import com.android.systemui.testKosmos
import com.android.systemui.touch.TouchInsetManager
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -70,6 +77,9 @@ import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.isNull
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations

@@ -87,6 +97,8 @@ class DreamOverlayServiceTest : SysuiTestCase() {

    private lateinit var lifecycleRegistry: FakeLifecycleRegistry

    lateinit var mCommunalInteractor: CommunalInteractor

    private lateinit var mWindowParams: WindowManager.LayoutParams

    @Mock lateinit var mDreamOverlayCallback: IDreamOverlayCallback
@@ -162,6 +174,9 @@ class DreamOverlayServiceTest : SysuiTestCase() {
        whenever(mComplicationComponent.getComplicationHostViewController())
            .thenReturn(mComplicationHostViewController)
        whenever(mLifecycleOwner.registry).thenReturn(lifecycleRegistry)

        mCommunalInteractor = Mockito.spy(kosmos.communalInteractor)

        whenever(mComplicationComponentFactory.create(any(), any(), any(), any()))
            .thenReturn(mComplicationComponent)
        whenever(mComplicationComponent.getVisibilityController())
@@ -192,7 +207,7 @@ class DreamOverlayServiceTest : SysuiTestCase() {
                mStateController,
                mKeyguardUpdateMonitor,
                mScrimManager,
                kosmos.communalInteractor,
                mCommunalInteractor,
                mSystemDialogsCloser,
                mUiEventLogger,
                mTouchInsetManager,
@@ -605,6 +620,57 @@ class DreamOverlayServiceTest : SysuiTestCase() {
            .isTrue()
    }

    @Test
    @EnableFlags(Flags.FLAG_DREAM_WAKE_REDIRECT)
    @kotlin.Throws(RemoteException::class)
    fun testTransitionToGlanceableHub() =
        testScope.runTest {
            // Inform the overlay service of dream starting. Do not show dream complications.
            client.startDream(
                mWindowParams,
                mDreamOverlayCallback,
                DREAM_COMPONENT,
                false /*shouldShowComplication*/
            )
            mMainExecutor.runAllReady()

            verify(mDreamOverlayCallback).onRedirectWake(false)
            clearInvocations(mDreamOverlayCallback)
            kosmos.setCommunalAvailable(true)
            mMainExecutor.runAllReady()
            runCurrent()
            verify(mDreamOverlayCallback).onRedirectWake(true)
            client.onWakeRequested()
            verify(mCommunalInteractor).changeScene(eq(CommunalScenes.Communal), isNull())
        }

    @Test
    @EnableFlags(Flags.FLAG_DREAM_WAKE_REDIRECT)
    @Throws(RemoteException::class)
    fun testRedirectExit() =
        testScope.runTest {
            // Inform the overlay service of dream starting. Do not show dream complications.
            client.startDream(
                mWindowParams,
                mDreamOverlayCallback,
                DREAM_COMPONENT,
                false /*shouldShowComplication*/
            )
            // Set communal available, verify that overlay callback is informed.
            kosmos.setCommunalAvailable(true)
            mMainExecutor.runAllReady()
            runCurrent()
            verify(mDreamOverlayCallback).onRedirectWake(true)

            clearInvocations(mDreamOverlayCallback)

            // Set communal unavailable, verify that overlay callback is informed.
            kosmos.setCommunalAvailable(false)
            mMainExecutor.runAllReady()
            runCurrent()
            verify(mDreamOverlayCallback).onRedirectWake(false)
        }

    // Tests that the bouncer closes when DreamOverlayService is told that the dream is coming to
    // the front.
    @Test
+27 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.dreams;

import static android.service.dreams.Flags.dreamWakeRedirect;

import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_WINDOW_TITLE;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_TOUCH_INSET_MANAGER;
import static com.android.systemui.dreams.dagger.DreamModule.HOME_CONTROL_PANEL_DREAM_COMPONENT;
@@ -149,6 +151,14 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ

    private final CommunalInteractor mCommunalInteractor;

    private boolean mCommunalAvailable;

    final Consumer<Boolean> mIsCommunalAvailableCallback =
            isAvailable -> {
                mCommunalAvailable = isAvailable;
                updateRedirectWakeup();
            };

    private final SystemDialogsCloser mSystemDialogsCloser;

    private final KeyguardUpdateMonitorCallback mKeyguardCallback =
@@ -287,6 +297,8 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ

        mExecutor.execute(() -> setLifecycleStateLocked(Lifecycle.State.CREATED));

        collectFlow(getLifecycle(), mCommunalInteractor.isCommunalAvailable(),
                mIsCommunalAvailableCallback);
        collectFlow(getLifecycle(), communalInteractor.isCommunalVisible(),
                mCommunalVisibleConsumer);
        collectFlow(getLifecycle(), keyguardInteractor.primaryBouncerShowing,
@@ -372,6 +384,16 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ

        mDreamOverlayCallbackController.onStartDream();
        mStarted = true;

        updateRedirectWakeup();
    }

    private void updateRedirectWakeup() {
        if (!mStarted || !dreamWakeRedirect()) {
            return;
        }

        redirectWake(mCommunalAvailable);
    }

    @Override
@@ -379,6 +401,11 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ
        resetCurrentDreamOverlayLocked();
    }

    @Override
    public void onWakeRequested() {
        mCommunalInteractor.changeScene(CommunalScenes.Communal, null);
    }

    private Lifecycle.State getLifecycleStateLocked() {
        return mLifecycleRegistry.getCurrentState();
    }