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

Commit 89f239c2 authored by burakov's avatar burakov Committed by Danny Burakov
Browse files

[Dual Shade] Expand the other shade when swiping down the top edge.

In ag/34710720 we ensured the shade invocation zones are the entire
empty half of the screen (when a shade is already open), but in our
gesture detection that area does not overlap with the top edge of the
screen, which is detected separately. Therefore, we re-add the same
user action mapping for the corresponding top edge sides.

Fix: 434662377
Fix: 433545749
Test: Tested manually by swiping down on the empty side's top edge when
 either shade was open (on a wide-screen device), and verifying the
 expected behavior.
Test: Updated unit tests.
Flag: com.android.systemui.scene_container
Change-Id: I4890b8727c8370de62cc7cfa5b200865e9fc7cc6
parent 31c4658f
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -79,4 +79,13 @@ class NotificationsShadeOverlayActionsViewModelTest : SysuiTestCase() {
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
                .containsExactly(Overlays.NotificationsShade)
                .containsExactly(Overlays.NotificationsShade)
        }
        }

    @Test
    fun downFromTopEdgeEndHalf_switchesToQuickSettingsShade() =
        kosmos.runTest {
            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)
        }
}
}
+9 −0
Original line number Original line Diff line number Diff line
@@ -107,4 +107,13 @@ class QuickSettingsShadeOverlayActionsViewModelTest : SysuiTestCase() {
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
            assertThat((action.hideCurrentOverlays as HideCurrentOverlays.Some).overlays)
                .containsExactly(Overlays.QuickSettingsShade)
                .containsExactly(Overlays.QuickSettingsShade)
        }
        }

    @Test
    fun downFromTopEdgeStartHalf_switchesToNotificationsShade() =
        kosmos.runTest {
            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)
        }
}
}
+12 −8
Original line number Original line Diff line number Diff line
@@ -24,7 +24,8 @@ import com.android.compose.animation.scene.UserActionResult.HideOverlay
import com.android.compose.animation.scene.UserActionResult.ShowOverlay
import com.android.compose.animation.scene.UserActionResult.ShowOverlay
import com.android.compose.animation.scene.UserActionResult.ShowOverlay.HideCurrentOverlays
import com.android.compose.animation.scene.UserActionResult.ShowOverlay.HideCurrentOverlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea
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.scene.ui.viewmodel.UserActionsViewModel
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
@@ -34,15 +35,18 @@ class NotificationsShadeOverlayActionsViewModel @AssistedInject constructor() :
    UserActionsViewModel() {
    UserActionsViewModel() {


    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
    override suspend fun hydrateActions(setActions: (Map<UserAction, UserActionResult>) -> Unit) {
        setActions(
        val hideNotificationsShade = HideOverlay(Overlays.NotificationsShade)
            mapOf(
        val openQuickSettingsShade =
                Swipe.Up to HideOverlay(Overlays.NotificationsShade),
                Back to HideOverlay(Overlays.NotificationsShade),
                Swipe.Down(fromSource = SceneContainerArea.EndHalf) to
            ShowOverlay(
            ShowOverlay(
                Overlays.QuickSettingsShade,
                Overlays.QuickSettingsShade,
                hideCurrentOverlays = HideCurrentOverlays.Some(Overlays.NotificationsShade),
                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,
            )
            )
        )
        )
    }
    }
+11 −10
Original line number Original line Diff line number Diff line
@@ -25,7 +25,9 @@ import com.android.compose.animation.scene.UserActionResult.ShowOverlay
import com.android.compose.animation.scene.UserActionResult.ShowOverlay.HideCurrentOverlays
import com.android.compose.animation.scene.UserActionResult.ShowOverlay.HideCurrentOverlays
import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.ui.viewmodel.SceneContainerArea
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.scene.ui.viewmodel.UserActionsViewModel
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
@@ -40,23 +42,22 @@ constructor(private val editModeViewModel: EditModeViewModel) : UserActionsViewM
        editModeViewModel.isEditing
        editModeViewModel.isEditing
            .map { isEditing ->
            .map { isEditing ->
                val hideQuickSettings = HideOverlay(Overlays.QuickSettingsShade)
                val hideQuickSettings = HideOverlay(Overlays.QuickSettingsShade)
                val openNotificationsShade =
                    ShowOverlay(
                        Overlays.NotificationsShade,
                        hideCurrentOverlays = HideCurrentOverlays.Some(Overlays.QuickSettingsShade),
                    )
                buildMap {
                buildMap {
                    if (isEditing) {
                    if (isEditing) {
                        // When editing, the back gesture is handled outside of this view-model.
                        // When editing, the back gesture is handled outside of this view-model.
                        // TODO(b/418003378): Back should go back to the QS grid layout.
                        // TODO(b/418003378): Back should go back to the QS grid layout.
                        put(Swipe.Up(fromSource = SceneContainerArea.BottomEdge), hideQuickSettings)
                        put(Swipe.Up(fromSource = BottomEdge), hideQuickSettings)
                    } else {
                    } else {
                        put(Back, hideQuickSettings)
                        put(Back, hideQuickSettings)
                        put(Swipe.Up, hideQuickSettings)
                        put(Swipe.Up, hideQuickSettings)
                    }
                    }
                    put(
                    put(Swipe.Down(fromSource = TopEdgeStartHalf), openNotificationsShade)
                        Swipe.Down(fromSource = SceneContainerArea.StartHalf),
                    put(Swipe.Down(fromSource = StartHalf), openNotificationsShade)
                        ShowOverlay(
                            Overlays.NotificationsShade,
                            hideCurrentOverlays =
                                HideCurrentOverlays.Some(Overlays.QuickSettingsShade),
                        ),
                    )
                }
                }
            }
            }
            .collect { actions -> setActions(actions) }
            .collect { actions -> setActions(actions) }