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

Commit b66774dd authored by burakov's avatar burakov
Browse files

[bc25] Set Dual Shade destination scenes to match the shade alignment.

Bug: 343744476
Test: Manually verified on a device by opening and closing the
notifications dual shade.
Test: Added unit tests, and existing ones still pass.
Flag: com.android.systemui.dual_shade

Change-Id: I04689b675fcddd375c0a076030dae3dcc4fd737d
parent a9deae30
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.fakeShadeRepository
import com.android.systemui.shade.ui.viewmodel.notificationsShadeSceneViewModel
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -56,7 +57,7 @@ class NotificationsShadeSceneViewModelTest : SysuiTestCase() {
    private val sceneInteractor by lazy { kosmos.sceneInteractor }
    private val deviceUnlockedInteractor by lazy { kosmos.deviceUnlockedInteractor }

    private val underTest = kosmos.notificationsShadeSceneViewModel
    private val underTest by lazy { kosmos.notificationsShadeSceneViewModel }

    @Test
    fun upTransitionSceneKey_deviceLocked_lockscreen() =
@@ -65,6 +66,7 @@ class NotificationsShadeSceneViewModelTest : SysuiTestCase() {
            lockDevice()

            assertThat(destinationScenes?.get(Swipe.Up)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Down)).isNull()
            assertThat(kosmos.homeSceneFamilyResolver.resolvedScene.value)
                .isEqualTo(Scenes.Lockscreen)
        }
@@ -77,6 +79,33 @@ class NotificationsShadeSceneViewModelTest : SysuiTestCase() {
            unlockDevice()

            assertThat(destinationScenes?.get(Swipe.Up)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Down)).isNull()
            assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Gone)
        }

    @Test
    fun downTransitionSceneKey_deviceLocked_bottomAligned_lockscreen() =
        testScope.runTest {
            kosmos.fakeShadeRepository.setDualShadeAlignedToBottom(true)
            val destinationScenes by collectLastValue(underTest.destinationScenes)
            lockDevice()

            assertThat(destinationScenes?.get(Swipe.Down)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Up)).isNull()
            assertThat(kosmos.homeSceneFamilyResolver.resolvedScene.value)
                .isEqualTo(Scenes.Lockscreen)
        }

    @Test
    fun downTransitionSceneKey_deviceUnlocked_bottomAligned_gone() =
        testScope.runTest {
            kosmos.fakeShadeRepository.setDualShadeAlignedToBottom(true)
            val destinationScenes by collectLastValue(underTest.destinationScenes)
            lockDevice()
            unlockDevice()

            assertThat(destinationScenes?.get(Swipe.Down)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Up)).isNull()
            assertThat(sceneInteractor.currentScene.value).isEqualTo(Scenes.Gone)
        }

+31 −1
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.fakeShadeRepository
import com.android.systemui.shade.ui.viewmodel.quickSettingsShadeSceneViewModel
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -56,7 +57,7 @@ class QuickSettingsShadeSceneViewModelTest : SysuiTestCase() {
    private val sceneInteractor = kosmos.sceneInteractor
    private val deviceUnlockedInteractor = kosmos.deviceUnlockedInteractor

    private val underTest = kosmos.quickSettingsShadeSceneViewModel
    private val underTest by lazy { kosmos.quickSettingsShadeSceneViewModel }

    @Test
    fun upTransitionSceneKey_deviceLocked_lockscreen() =
@@ -66,6 +67,7 @@ class QuickSettingsShadeSceneViewModelTest : SysuiTestCase() {
            lockDevice()

            assertThat(destinationScenes?.get(Swipe.Up)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Down)).isNull()
            assertThat(homeScene).isEqualTo(Scenes.Lockscreen)
        }

@@ -78,6 +80,34 @@ class QuickSettingsShadeSceneViewModelTest : SysuiTestCase() {
            unlockDevice()

            assertThat(destinationScenes?.get(Swipe.Up)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Down)).isNull()
            assertThat(homeScene).isEqualTo(Scenes.Gone)
        }

    @Test
    fun downTransitionSceneKey_deviceLocked_bottomAligned_lockscreen() =
        testScope.runTest {
            kosmos.fakeShadeRepository.setDualShadeAlignedToBottom(true)
            val destinationScenes by collectLastValue(underTest.destinationScenes)
            val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene)
            lockDevice()

            assertThat(destinationScenes?.get(Swipe.Down)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Up)).isNull()
            assertThat(homeScene).isEqualTo(Scenes.Lockscreen)
        }

    @Test
    fun downTransitionSceneKey_deviceUnlocked_bottomAligned_gone() =
        testScope.runTest {
            kosmos.fakeShadeRepository.setDualShadeAlignedToBottom(true)
            val destinationScenes by collectLastValue(underTest.destinationScenes)
            val homeScene by collectLastValue(kosmos.homeSceneFamilyResolver.resolvedScene)
            lockDevice()
            unlockDevice()

            assertThat(destinationScenes?.get(Swipe.Down)?.toScene).isEqualTo(SceneFamilies.Home)
            assertThat(destinationScenes?.get(Swipe.Up)).isNull()
            assertThat(homeScene).isEqualTo(Scenes.Gone)
        }

+12 −2
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeAlignment
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -29,11 +31,19 @@ import kotlinx.coroutines.flow.asStateFlow

/** Models UI state and handles user input for the Notifications Shade scene. */
@SysUISingleton
class NotificationsShadeSceneViewModel @Inject constructor() {
class NotificationsShadeSceneViewModel
@Inject
constructor(
    shadeInteractor: ShadeInteractor,
) {
    val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
        MutableStateFlow(
                mapOf(
                    Swipe.Up to SceneFamilies.Home,
                    if (shadeInteractor.shadeAlignment == ShadeAlignment.Top) {
                        Swipe.Up
                    } else {
                        Swipe.Down
                    } to SceneFamilies.Home,
                    Back to SceneFamilies.Home,
                )
            )
+8 −1
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeAlignment
import com.android.systemui.shade.ui.viewmodel.OverlayShadeViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
@@ -37,6 +39,7 @@ import kotlinx.coroutines.flow.asStateFlow
class QuickSettingsShadeSceneViewModel
@Inject
constructor(
    shadeInteractor: ShadeInteractor,
    val overlayShadeViewModel: OverlayShadeViewModel,
    val brightnessSliderViewModel: BrightnessSliderViewModel,
    val tileGridViewModel: TileGridViewModel,
@@ -46,7 +49,11 @@ constructor(
    val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
        MutableStateFlow(
                mapOf(
                    Swipe.Up to SceneFamilies.Home,
                    if (shadeInteractor.shadeAlignment == ShadeAlignment.Top) {
                        Swipe.Up
                    } else {
                        Swipe.Down
                    } to SceneFamilies.Home,
                    Back to SceneFamilies.Home,
                )
            )
+11 −4
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.asStateFlow
@SysUISingleton
class FakeShadeRepository @Inject constructor() : ShadeRepository {
    private val _qsExpansion = MutableStateFlow(0f)
    override val qsExpansion = _qsExpansion
    @Deprecated("Use ShadeInteractor.qsExpansion instead") override val qsExpansion = _qsExpansion

    private val _udfpsTransitionToFullShadeProgress = MutableStateFlow(0f)
    override val udfpsTransitionToFullShadeProgress = _udfpsTransitionToFullShadeProgress
@@ -59,12 +59,15 @@ class FakeShadeRepository @Inject constructor() : ShadeRepository {
    private val _legacyIsQsExpanded = MutableStateFlow(false)
    @Deprecated("Use ShadeInteractor instead") override val legacyIsQsExpanded = _legacyIsQsExpanded

    @Deprecated("Use ShadeInteractor.isUserInteractingWithShade instead")
    override val legacyLockscreenShadeTracking = MutableStateFlow(false)

    private val _shadeMode = MutableStateFlow<ShadeMode>(ShadeMode.Single)
    override val shadeMode: StateFlow<ShadeMode> = _shadeMode.asStateFlow()

    override val isDualShadeAlignedToBottom = false
    private var _isDualShadeAlignedToBottom = false
    override val isDualShadeAlignedToBottom
        get() = _isDualShadeAlignedToBottom

    @Deprecated("Use ShadeInteractor instead")
    override fun setLegacyIsQsExpanded(legacyIsQsExpanded: Boolean) {
@@ -139,8 +142,12 @@ class FakeShadeRepository @Inject constructor() : ShadeRepository {
        _legacyShadeExpansion.value = expandedFraction
    }

    override fun setShadeMode(shadeMode: ShadeMode) {
        _shadeMode.value = shadeMode
    override fun setShadeMode(mode: ShadeMode) {
        _shadeMode.value = mode
    }

    fun setDualShadeAlignedToBottom(isAlignedToBottom: Boolean) {
        _isDualShadeAlignedToBottom = isAlignedToBottom
    }
}

Loading