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

Commit c9fb5edc authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[Flexiglass] Replaces isSplitShade with shadeMode

As per suggestion from justinweir@, introduces a three-way enum for the
mode of the shade due to upcoming work on dual shade.

Fix: 328815438
Bug: 328473018
Test: unit and integration tests updated
Test: manually verified on foldable that the right shade is shown when
folded and when unfolded
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT

Change-Id: I7c0c90efb07ca51efe4dc660edbb7a6475780f34
parent 9cbc2654
Loading
Loading
Loading
Loading
+24 −21
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ import com.android.systemui.qs.ui.composable.QuickSettings
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
@@ -152,9 +153,10 @@ private fun SceneScope.ShadeScene(
    mediaHost: MediaHost,
    modifier: Modifier = Modifier,
) {
    val isSplitShade by viewModel.isSplitShade.collectAsState()
    if (isSplitShade) {
        SplitShade(
    val shadeMode by viewModel.shadeMode.collectAsState()
    when (shadeMode) {
        is ShadeMode.Single ->
            SingleShade(
                viewModel = viewModel,
                createTintedIconManager = createTintedIconManager,
                createBatteryMeterViewController = createBatteryMeterViewController,
@@ -163,8 +165,8 @@ private fun SceneScope.ShadeScene(
                mediaHost = mediaHost,
                modifier = modifier,
            )
    } else {
        SingleShade(
        is ShadeMode.Split ->
            SplitShade(
                viewModel = viewModel,
                createTintedIconManager = createTintedIconManager,
                createBatteryMeterViewController = createBatteryMeterViewController,
@@ -173,6 +175,7 @@ private fun SceneScope.ShadeScene(
                mediaHost = mediaHost,
                modifier = modifier,
            )
        is ShadeMode.Dual -> error("Dual shade is not yet implemented!")
    }
}

+9 −8
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.userRepository
import com.google.common.truth.Truth
@@ -562,17 +563,17 @@ class ShadeInteractorSceneContainerImplTest : SysuiTestCase() {
        }

    @Test
    fun isSplitShade() =
    fun shadeMode() =
        testScope.runTest {
            val isSplitShade by collectLastValue(underTest.isSplitShade)
            val shadeMode by collectLastValue(underTest.shadeMode)

            shadeRepository.setSplitShade(true)
            assertThat(isSplitShade).isTrue()
            shadeRepository.setShadeMode(ShadeMode.Split)
            assertThat(shadeMode).isEqualTo(ShadeMode.Split)

            shadeRepository.setSplitShade(false)
            assertThat(isSplitShade).isFalse()
            shadeRepository.setShadeMode(ShadeMode.Single)
            assertThat(shadeMode).isEqualTo(ShadeMode.Single)

            shadeRepository.setSplitShade(true)
            assertThat(isSplitShade).isTrue()
            shadeRepository.setShadeMode(ShadeMode.Split)
            assertThat(shadeMode).isEqualTo(ShadeMode.Split)
        }
}
+6 −5
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -42,20 +43,20 @@ class ShadeStartableTest : SysuiTestCase() {
    private val underTest = kosmos.shadeStartable

    @Test
    fun hydrateSplitShade() =
    fun hydrateShadeMode() =
        testScope.runTest {
            overrideResource(R.bool.config_use_split_notification_shade, false)
            val isSplitShade by collectLastValue(shadeInteractor.isSplitShade)
            val shadeMode by collectLastValue(shadeInteractor.shadeMode)

            underTest.start()
            assertThat(isSplitShade).isFalse()
            assertThat(shadeMode).isEqualTo(ShadeMode.Single)

            overrideResource(R.bool.config_use_split_notification_shade, true)
            fakeConfigurationRepository.onAnyConfigurationChange()
            assertThat(isSplitShade).isTrue()
            assertThat(shadeMode).isEqualTo(ShadeMode.Split)

            overrideResource(R.bool.config_use_split_notification_shade, false)
            fakeConfigurationRepository.onAnyConfigurationChange()
            assertThat(isSplitShade).isFalse()
            assertThat(shadeMode).isEqualTo(ShadeMode.Single)
        }
}
+18 −0
Original line number Diff line number Diff line
@@ -37,10 +37,12 @@ import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.domain.interactor.privacyChipInteractor
import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.domain.startable.shadeStartable
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationsPlaceholderViewModel
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
@@ -72,6 +74,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() {
    private val testScope = kosmos.testScope
    private val sceneInteractor by lazy { kosmos.sceneInteractor }
    private val deviceEntryInteractor by lazy { kosmos.deviceEntryInteractor }
    private val shadeRepository by lazy { kosmos.shadeRepository }

    private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
    private val flags = FakeFeatureFlagsClassic().also { it.set(Flags.NEW_NETWORK_SLICE_UI, false) }
@@ -274,4 +277,19 @@ class ShadeSceneViewModelTest : SysuiTestCase() {
            assertThat(destinationScenes?.get(Swipe(SwipeDirection.Down))?.toScene)
                .isEqualTo(Scenes.QuickSettings)
        }

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

            shadeRepository.setShadeMode(ShadeMode.Split)
            assertThat(shadeMode).isEqualTo(ShadeMode.Split)

            shadeRepository.setShadeMode(ShadeMode.Single)
            assertThat(shadeMode).isEqualTo(ShadeMode.Single)

            shadeRepository.setShadeMode(ShadeMode.Split)
            assertThat(shadeMode).isEqualTo(ShadeMode.Split)
        }
}
+3 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -69,8 +70,8 @@ constructor(

    /** The key of the scene we should switch to when swiping down from the top edge. */
    val downFromTopEdgeDestinationSceneKey: StateFlow<SceneKey?> =
        shadeInteractor.isSplitShade
            .map { isSplitShade -> Scenes.QuickSettings.takeUnless { isSplitShade } }
        shadeInteractor.shadeMode
            .map { shadeMode -> Scenes.QuickSettings.takeIf { shadeMode is ShadeMode.Single } }
            .stateIn(
                scope = applicationScope,
                started = SharingStarted.WhileSubscribed(),
Loading