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

Commit 672db054 authored by Justin Weir's avatar Justin Weir
Browse files

Reconnect "full width" shade logic with scenes enabled

QS, ScrimController, and NSSL all have a boolean field for whether the
shade is using the entire width of the device. At this time, this
directly corresponds to whether the device is not fullscreen. When the
scene container is enabled, there is no NPVC to set these values, so
this change collects from a flow and set them.

Test: added new tests and ran affected tests
Fixes: 347739712
Fixes: 349333683
Flag: com.android.systemui.scene_container
Change-Id: Ia5066859a7fc67fd6a3477420e71951f4258ffe5
parent 1d39426b
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -24,9 +24,11 @@ import androidx.asynclayoutinflater.view.AsyncLayoutInflater
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.display.data.repository.displayStateRepository
import com.android.systemui.dump.DumpManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testCase
@@ -117,6 +119,7 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
        }

    private val shadeInteractor = kosmos.shadeInteractor
    private val displayStateInteractor = kosmos.displayStateInteractor
    private val dumpManager = mock<DumpManager>()

    private val underTest =
@@ -124,6 +127,7 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            qsSceneComponentFactory,
            qsImplProvider,
            shadeInteractor,
            displayStateInteractor,
            dumpManager,
            testDispatcher,
            testScope.backgroundScope,
@@ -582,6 +586,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            verify(qsImpl!!).closeCustomizer()
        }

    @Test
    fun setIsNotificationPanelFullWidth() =
        testScope.runTest {
            val qsImpl by collectLastValue(underTest.qsImpl)

            underTest.inflate(context)
            runCurrent()

            kosmos.displayStateRepository.setIsLargeScreen(true)
            runCurrent()

            verify(qsImpl!!).setIsNotificationPanelFullWidth(false)

            underTest.inflate(context)
            runCurrent()

            verify(qsImpl!!).setIsNotificationPanelFullWidth(false)
        }

    @Test
    fun setBrightnessMirrorController() =
        testScope.runTest {
+16 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.authentication.data.repository.fakeAuthenticationRep
import com.android.systemui.authentication.shared.model.AuthenticationMethodModel
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.display.data.repository.displayStateRepository
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
@@ -41,6 +42,8 @@ import com.android.systemui.shade.ShadeExpansionListener
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.shared.flag.DualShade
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.notification.stack.notificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.scrimController
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
@@ -54,6 +57,7 @@ import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.verify
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@@ -167,6 +171,18 @@ class ShadeStartableTest(flags: FlagsParameterization) : SysuiTestCase() {
            }
        }

    @Test
    @EnableSceneContainer
    fun hydrateFullWidth() =
        testScope.runTest {
            underTest.start()

            kosmos.displayStateRepository.setIsLargeScreen(true)
            runCurrent()
            verify(kosmos.notificationStackScrollLayoutController).setIsFullWidth(false)
            assertThat(kosmos.scrimController.clipQsScrim).isFalse()
        }

    private fun TestScope.changeScene(
        toScene: SceneKey,
        transitionState: MutableStateFlow<ObservableTransitionState>,
+8 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import androidx.annotation.VisibleForTesting
import androidx.asynclayoutinflater.view.AsyncLayoutInflater
import com.android.settingslib.applications.InterestingConfigChanges
import com.android.systemui.Dumpable
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -196,6 +197,7 @@ constructor(
    private val qsSceneComponentFactory: QSSceneComponent.Factory,
    private val qsImplProvider: Provider<QSImpl>,
    shadeInteractor: ShadeInteractor,
    displayStateInteractor: DisplayStateInteractor,
    dumpManager: DumpManager,
    @Main private val mainDispatcher: CoroutineDispatcher,
    @Application applicationScope: CoroutineScope,
@@ -208,6 +210,7 @@ constructor(
        qsSceneComponentFactory: QSSceneComponent.Factory,
        qsImplProvider: Provider<QSImpl>,
        shadeInteractor: ShadeInteractor,
        displayStateInteractor: DisplayStateInteractor,
        dumpManager: DumpManager,
        @Main dispatcher: CoroutineDispatcher,
        @Application scope: CoroutineScope,
@@ -216,6 +219,7 @@ constructor(
        qsSceneComponentFactory,
        qsImplProvider,
        shadeInteractor,
        displayStateInteractor,
        dumpManager,
        dispatcher,
        scope,
@@ -319,6 +323,10 @@ constructor(
                    qsImpl.value?.setInSplitShade(it == ShadeMode.Split)
                }
            }
            launch {
                combine(displayStateInteractor.isLargeScreen, qsImpl.filterNotNull(), ::Pair)
                    .collect { it.second.setIsNotificationPanelFullWidth(!it.first) }
            }
        }
    }

+17 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.shade.domain.startable

import android.content.Context
import com.android.systemui.CoreStartable
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.common.ui.data.repository.ConfigurationRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -32,6 +33,7 @@ import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
import com.android.systemui.shade.transition.ScrimShadeTransitionController
import com.android.systemui.statusbar.PulseExpansionHandler
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.policy.SplitShadeStateController
import javax.inject.Inject
import javax.inject.Provider
@@ -56,11 +58,14 @@ constructor(
    private val panelExpansionInteractorProvider: Provider<PanelExpansionInteractor>,
    private val shadeExpansionStateManager: ShadeExpansionStateManager,
    private val pulseExpansionHandler: PulseExpansionHandler,
    private val displayStateInteractor: DisplayStateInteractor,
    private val nsslc: NotificationStackScrollLayoutController,
    private val scrimController: ScrimController,
) : CoreStartable {

    override fun start() {
        hydrateShadeLayoutWidth()
        hydrateFullWidth()
        hydrateShadeExpansionStateManager()
        logTouchesTo(touchLog)
        scrimShadeTransitionController.init()
@@ -98,4 +103,16 @@ constructor(
                }
        }
    }

    private fun hydrateFullWidth() {
        if (SceneContainerFlag.isEnabled) {
            applicationScope.launch {
                displayStateInteractor.isLargeScreen.collect {
                    val isFullWidth = !it
                    nsslc.setIsFullWidth(isFullWidth)
                    scrimController.setClipsQsScrim(isFullWidth)
                }
            }
        }
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.shade.domain.startable

import android.content.applicationContext
import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
import com.android.systemui.common.ui.data.repository.configurationRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
@@ -28,6 +29,7 @@ import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.domain.interactor.panelExpansionInteractor
import com.android.systemui.shade.transition.ScrimShadeTransitionController
import com.android.systemui.statusbar.notification.stack.notificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.scrimController
import com.android.systemui.statusbar.policy.splitShadeStateController
import com.android.systemui.statusbar.pulseExpansionHandler
import com.android.systemui.util.mockito.mock
@@ -48,6 +50,8 @@ val Kosmos.shadeStartable by Fixture {
        panelExpansionInteractorProvider = { panelExpansionInteractor },
        shadeExpansionStateManager = shadeExpansionStateManager,
        pulseExpansionHandler = pulseExpansionHandler,
        displayStateInteractor = displayStateInteractor,
        nsslc = notificationStackScrollLayoutController,
        scrimController = scrimController,
    )
}