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

Commit aa7929f6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Dual Shade] Do not switch shades when swiping below on a narrow screen." into main

parents 6bd58916 26d100e2
Loading
Loading
Loading
Loading
+27 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea
import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.shade.ui.viewmodel.notificationsShadeOverlayActionsViewModel
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -72,8 +73,10 @@ class NotificationsShadeOverlayActionsViewModelTest : SysuiTestCase() {
        }

    @Test
    fun downFromEndHalf_switchesToQuickSettingsShade() =
    fun downFromEndHalf_wideScreen_switchesToQuickSettingsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = true)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.EndHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.QuickSettingsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
@@ -81,8 +84,30 @@ class NotificationsShadeOverlayActionsViewModelTest : SysuiTestCase() {
        }

    @Test
    fun downFromTopEdgeEndHalf_switchesToQuickSettingsShade() =
    fun downFromEndHalf_narrowScreen_doesNothing() =
        kosmos.runTest {
            enableDualShade(wideLayout = false)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.EndHalf))
            assertThat(action).isNull()
        }

    @Test
    fun downFromTopEdgeEndHalf_wideScreen_switchesToQuickSettingsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = true)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.TopEdgeEndHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.QuickSettingsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
                .containsExactly(Overlays.NotificationsShade)
        }

    @Test
    fun downFromTopEdgeEndHalf_narrowScreen_switchesToQuickSettingsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = false)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.TopEdgeEndHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.QuickSettingsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
+27 −2
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.systemui.lifecycle.activateIn
import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea
import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -100,8 +101,10 @@ class QuickSettingsShadeOverlayActionsViewModelTest : SysuiTestCase() {
        }

    @Test
    fun downFromStartHalf_switchesToNotificationsShade() =
    fun downFromStartHalf_wideScreen_switchesToNotificationsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = true)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.StartHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.NotificationsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
@@ -109,8 +112,30 @@ class QuickSettingsShadeOverlayActionsViewModelTest : SysuiTestCase() {
        }

    @Test
    fun downFromTopEdgeStartHalf_switchesToNotificationsShade() =
    fun downFromStartHalf_narrowScreen_doesNothing() =
        kosmos.runTest {
            enableDualShade(wideLayout = false)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.StartHalf))
            assertThat(action).isNull()
        }

    @Test
    fun downFromTopEdgeStartHalf_wideScreen_switchesToNotificationsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = true)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.TopEdgeStartHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.NotificationsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
                .containsExactly(Overlays.QuickSettingsShade)
        }

    @Test
    fun downFromTopEdgeStartHalf_narrowScreen_switchesToNotificationsShade() =
        kosmos.runTest {
            enableDualShade(wideLayout = false)

            val action = actions?.get(Swipe.Down(fromSource = SceneContainerArea.TopEdgeStartHalf))
            assertThat((action as ShowOverlay).overlay).isEqualTo(Overlays.NotificationsShade)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
+18 −10
Original line number Diff line number Diff line
@@ -27,12 +27,15 @@ import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea.EndHalf
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea.TopEdgeEndHalf
import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.map

/** Models the UI state for the user actions for navigating to other scenes or overlays. */
class NotificationsShadeOverlayActionsViewModel @AssistedInject constructor() :
    UserActionsViewModel() {
class NotificationsShadeOverlayActionsViewModel
@AssistedInject
constructor(private val shadeModeInteractor: ShadeModeInteractor) : UserActionsViewModel() {

    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
        val hideNotificationsShade = HideOverlay(Overlays.NotificationsShade)
@@ -41,14 +44,19 @@ class NotificationsShadeOverlayActionsViewModel @AssistedInject constructor() :
                Overlays.QuickSettingsShade,
                hideCurrentOverlays = HideCurrentOverlays.Some(Overlays.NotificationsShade),
            )
        setActions(
            mapOf(
                Swipe.Up to hideNotificationsShade,
                Back to hideNotificationsShade,
                Swipe.Down(fromSource = EndHalf) to openQuickSettingsShade,
                Swipe.Down(fromSource = TopEdgeEndHalf) to openQuickSettingsShade,
            )
        )

        shadeModeInteractor.isFullWidthShade
            .map { isFullWidthShade ->
                buildMap {
                    put(Swipe.Up, hideNotificationsShade)
                    put(Back, hideNotificationsShade)
                    if (!isFullWidthShade) {
                        put(Swipe.Down(fromSource = EndHalf), openQuickSettingsShade)
                    }
                    put(Swipe.Down(fromSource = TopEdgeEndHalf), openQuickSettingsShade)
                }
            }
            .collect { actions -> setActions(actions) }
    }

    @AssistedFactory
+12 −5
Original line number Diff line number Diff line
@@ -29,18 +29,23 @@ import com.android.systemui.scene.ui.viewmodel.SceneContainerArea.BottomEdge
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea.StartHalf
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea.TopEdgeStartHalf
import com.android.systemui.scene.ui.viewmodel.UserActionsViewModel
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.combine

/** Models the UI state for the user actions for navigating to other scenes or overlays. */
class QuickSettingsShadeOverlayActionsViewModel
@AssistedInject
constructor(private val editModeViewModel: EditModeViewModel) : UserActionsViewModel() {
constructor(
    private val editModeViewModel: EditModeViewModel,
    private val shadeModeInteractor: ShadeModeInteractor,
) : UserActionsViewModel() {

    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
        editModeViewModel.isEditing
            .map { isEditing ->
        combine(editModeViewModel.isEditing, shadeModeInteractor.isFullWidthShade) {
                isEditing,
                isFullWidthShade ->
                val hideQuickSettings = HideOverlay(Overlays.QuickSettingsShade)
                val openNotificationsShade =
                    ShowOverlay(
@@ -57,9 +62,11 @@ constructor(private val editModeViewModel: EditModeViewModel) : UserActionsViewM
                        put(Swipe.Up, hideQuickSettings)
                    }
                    put(Swipe.Down(fromSource = TopEdgeStartHalf), openNotificationsShade)
                    if (!isFullWidthShade) {
                        put(Swipe.Down(fromSource = StartHalf), openNotificationsShade)
                    }
                }
            }
            .collect { actions -> setActions(actions) }
    }

+5 −1
Original line number Diff line number Diff line
@@ -19,8 +19,12 @@ package com.android.systemui.qs.ui.viewmodel
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel
import com.android.systemui.shade.domain.interactor.shadeModeInteractor

val Kosmos.quickSettingsShadeOverlayActionsViewModel:
    QuickSettingsShadeOverlayActionsViewModel by Fixture {
    QuickSettingsShadeOverlayActionsViewModel(editModeViewModel)
    QuickSettingsShadeOverlayActionsViewModel(
        editModeViewModel = editModeViewModel,
        shadeModeInteractor = shadeModeInteractor,
    )
}
Loading