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

Commit 061dbb28 authored by amehfooz's avatar amehfooz Committed by Ahmed Mehfooz
Browse files

[DesktopStatusBar] Add click handlers for status bar shade entry points

Bug: 433589833
Flag: com.android.systemui.status_bar_for_desktop
Test: HomeStatusBarViewModelImplTest
Change-Id: I7055c2f31c16eb345fa1bcf2f94906eb4cd14105
parent 901ad623
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -65,6 +65,10 @@ class FakeHomeStatusBarViewModel(

    override fun onChipBoundsChanged(key: String, bounds: RectF) {}

    override fun onSystemIconChipClicked() {}

    override fun onNotificationIconChipClicked() {}

    override val ongoingActivityChipsLegacy =
        MutableStateFlow(MultipleOngoingActivityChipsModelLegacy())

+76 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import com.android.systemui.mediaprojection.data.model.MediaProjectionState
import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.scene.data.repository.sceneContainerRepository
import com.android.systemui.scene.data.repository.setSceneTransition
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Overlays
@@ -67,6 +68,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.screenrecord.data.model.ScreenRecordModel
import com.android.systemui.screenrecord.data.repository.screenRecordRepository
import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository
import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.shade.shadeTestUtil
import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.NORMAL_PACKAGE
import com.android.systemui.statusbar.chips.mediaprojection.domain.interactor.MediaProjectionChipInteractorTest.Companion.setUpPackageManagerForMediaProjection
@@ -76,6 +78,7 @@ import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsCallChip
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsScreenRecordChip
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipsViewModelTest.Companion.assertIsShareToAppChip
import com.android.systemui.statusbar.core.StatusBarForDesktop
import com.android.systemui.statusbar.core.StatusBarRootModernization
import com.android.systemui.statusbar.data.model.StatusBarMode
import com.android.systemui.statusbar.data.repository.fakeStatusBarModeRepository
@@ -1901,6 +1904,79 @@ class HomeStatusBarViewModelImplTest(flags: FlagsParameterization) : SysuiTestCa
            assertThat(systemInfoVisible!!.baseVisibility.visibility).isEqualTo(View.GONE)
        }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onSystemIconChipClicked_qsShadeIsOpen_collapsesShade() =
        kosmos.runTest {
            enableDualShade()
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)

            sceneContainerRepository.showOverlay(Overlays.QuickSettingsShade)
            setSceneTransition(
                ObservableTransitionState.Idle(
                    sceneInteractor.currentScene.value,
                    checkNotNull(currentOverlays),
                )
            )
            assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade)

            underTest.onSystemIconChipClicked()
            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)
        }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onSystemIconChipClicked_qsShadeIsClosed_expandsShade() =
        kosmos.runTest {
            enableDualShade()
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)

            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)

            underTest.onSystemIconChipClicked()

            assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
        }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onNotificationIconChipClicked_notificationsShadeIsOpen_collapsesShade() =
        kosmos.runTest {
            enableDualShade()
            val currentScene by collectLastValue(sceneInteractor.currentScene)
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)

            sceneContainerRepository.showOverlay(Overlays.NotificationsShade)
            setSceneTransition(
                ObservableTransitionState.Idle(
                    checkNotNull(currentScene),
                    checkNotNull(currentOverlays),
                )
            )
            assertThat(currentOverlays).contains(Overlays.NotificationsShade)

            underTest.onNotificationIconChipClicked()

            assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)
        }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onNotificationIconChipClicked_notificationsShadeIsClosed_expandsShade() =
        kosmos.runTest {
            enableDualShade()
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
            assertThat(currentOverlays).doesNotContain(Overlays.NotificationsShade)

            underTest.onNotificationIconChipClicked()

            assertThat(currentOverlays).contains(Overlays.NotificationsShade)
        }

    private fun activeNotificationsStore(notifications: List<ActiveNotificationModel>) =
        ActiveNotificationsStore.Builder()
            .apply { notifications.forEach(::addIndividualNotif) }
+26 −2
Original line number Diff line number Diff line
@@ -161,6 +161,12 @@ interface HomeStatusBarViewModel : Activatable {
    /** Invoked each time a chip's on-screen bounds have changed. */
    fun onChipBoundsChanged(key: String, bounds: RectF)

    /** Notifies that the system icons container was clicked. */
    fun onSystemIconChipClicked()

    /** Notifies that the notification icons container was clicked. */
    fun onNotificationIconChipClicked()

    /**
     * The multiple ongoing activity chips that should be shown on the left-hand side of the status
     * bar.
@@ -252,9 +258,9 @@ constructor(
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    keyguardInteractor: KeyguardInteractor,
    override val operatorNameViewModel: StatusBarOperatorNameViewModel,
    sceneInteractor: SceneInteractor,
    private val sceneInteractor: SceneInteractor,
    sceneContainerOcclusionInteractor: SceneContainerOcclusionInteractor,
    shadeInteractor: ShadeInteractor,
    private val shadeInteractor: ShadeInteractor,
    shareToAppChipViewModel: ShareToAppChipViewModel,
    @DisplayAware private val ongoingActivityChipsViewModel: OngoingActivityChipsViewModel,
    statusBarPopupChipsViewModelFactory: StatusBarPopupChipsViewModel.Factory,
@@ -595,6 +601,24 @@ constructor(
        ongoingActivityChipsViewModel.onChipBoundsChanged(key, bounds)
    }

    override fun onSystemIconChipClicked() {
        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
            return
        }
        shadeInteractor.toggleQuickSettingsShade(
            loggingReason = "HomeStatusBarViewModel.onSystemIconChipClicked"
        )
    }

    override fun onNotificationIconChipClicked() {
        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
            return
        }
        shadeInteractor.toggleNotificationsShade(
            loggingReason = "HomeStatusBarViewModel.onNotificationIconChipClicked"
        )
    }

    private val hasOngoingActivityChips =
        if (StatusBarChipsModernization.isEnabled) {
            chipsVisibilityModel.map { it.chips.active.any { chip -> !chip.isHidden } }