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

Commit c76d2e1c authored by Ahmed Mehfooz's avatar Ahmed Mehfooz Committed by Android (Google) Code Review
Browse files

Merge "[DesktopStatusBar] Do not show ShadeHeader" into main

parents 32986864 cce5c5bd
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ constructor(
            modifier = modifier,
            onScrimClicked = viewModel::onScrimClicked,
            header = {
                if (viewModel.showHeader) {
                    val headerViewModel =
                        rememberViewModel("NotificationsShadeOverlayHeader") {
                            viewModel.shadeHeaderViewModelFactory.create()
@@ -123,6 +124,7 @@ constructor(
                        showClock = !isFullWidth,
                        modifier = Modifier.element(NotificationsShade.Elements.StatusBar),
                    )
                }
            },
        ) {
            Column {
+10 −10
Original line number Diff line number Diff line
@@ -165,6 +165,7 @@ constructor(
                    )
                },
                header = {
                    if (contentViewModel.showHeader) {
                        OverlayShadeHeader(
                            viewModel = quickSettingsContainerViewModel.shadeHeaderViewModel,
                            notificationsHighlight = ShadeHeader.ChipHighlight.Weak,
@@ -172,6 +173,7 @@ constructor(
                            showClock = true,
                            modifier = Modifier.element(QuickSettingsShade.Elements.StatusBar),
                        )
                    }
                },
            ) {
                QuickSettingsContainer(viewModel = quickSettingsContainerViewModel)
@@ -268,9 +270,7 @@ fun ContentScope.QuickSettingsLayout(
        // TODO(b/428805936): Double check this padding.
        VerticalSeparator()

        Column(
            modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
        ) {
        Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) {
            MediaCarousel(
                isVisible = viewModel.showMedia,
                mediaHost = viewModel.mediaHost,
+38 −1
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.systemui.notifications.ui.viewmodel

import android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS
import android.content.res.Configuration
import android.content.testableContext
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper
@@ -31,12 +33,14 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.media.controls.data.repository.mediaFilterRepository
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.startable.sceneContainerStartable
import com.android.systemui.scene.shared.model.Overlays
@@ -46,7 +50,9 @@ import com.android.systemui.shade.domain.interactor.enableSingleShade
import com.android.systemui.shade.domain.interactor.enableSplitShade
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.ui.viewmodel.notificationsShadeOverlayContentViewModel
import com.android.systemui.statusbar.core.StatusBarForDesktop
import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository
import com.android.systemui.statusbar.policy.configurationController
import com.android.systemui.testKosmos
import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
import com.google.common.truth.Truth.assertThat
@@ -66,7 +72,7 @@ import org.junit.runner.RunWith
@EnableSceneContainer
class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val kosmos = testKosmos().useUnconfinedTestDispatcher()
    private val testScope = kosmos.testScope
    private val sceneInteractor by lazy { kosmos.sceneInteractor }
    private val underTest by lazy { kosmos.notificationsShadeOverlayContentViewModel }
@@ -79,6 +85,29 @@ class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() {
        underTest.activateIn(testScope)
    }

    @Test
    fun showHeader_desktopFeatureSetDisabled_true() =
        testScope.runTest {
            setEnableDesktopFeatureSet(false)
            assertThat(underTest.showHeader).isTrue()
        }

    @Test
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun showHeader_desktopFeatureSetEnabled_statusBarForDesktopEnabled_false() =
        testScope.runTest {
            setEnableDesktopFeatureSet(true)
            assertThat(underTest.showHeader).isFalse()
        }

    @Test
    @DisableFlags(StatusBarForDesktop.FLAG_NAME)
    fun showHeader_desktopFeatureSetEnabled_statusBarForDesktopDisabled_true() =
        testScope.runTest {
            setEnableDesktopFeatureSet(true)
            assertThat(underTest.showHeader).isTrue()
        }

    @Test
    fun onScrimClicked_hidesShade() =
        testScope.runTest {
@@ -228,6 +257,14 @@ class NotificationsShadeOverlayContentViewModelTest : SysuiTestCase() {
        assertThat(currentScene).isEqualTo(Scenes.Lockscreen)
    }

    private fun setEnableDesktopFeatureSet(enable: Boolean) {
        kosmos.testableContext.orCreateTestableResources.addOverride(
            R.bool.config_enableDesktopFeatureSet,
            enable,
        )
        kosmos.configurationController.onConfigurationChanged(Configuration())
    }

    private suspend fun TestScope.unlockDevice() {
        val currentScene by collectLastValue(sceneInteractor.currentScene)
        kosmos.powerInteractor.setAwakeForTest()
+41 −1
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.systemui.qs.ui.viewmodel

import android.content.res.Configuration
import android.content.testableContext
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -27,11 +31,13 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment
import com.android.systemui.res.R
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.startable.sceneContainerStartable
import com.android.systemui.scene.shared.model.Overlays
@@ -40,9 +46,11 @@ import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.shade.domain.interactor.enableSingleShade
import com.android.systemui.shade.domain.interactor.enableSplitShade
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.core.StatusBarForDesktop
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.notificationScrollViewModel
import com.android.systemui.statusbar.policy.configurationController
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -61,9 +69,10 @@ import org.junit.runner.RunWith
class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() {

    private val kosmos =
        testKosmos().apply {
        testKosmos().useUnconfinedTestDispatcher().apply {
            usingMediaInComposeFragment = false // This is not for the compose fragment
        }

    private val testScope = kosmos.testScope
    private val sceneInteractor by lazy { kosmos.sceneInteractor }
    private val underTest by lazy { kosmos.quickSettingsShadeOverlayContentViewModel }
@@ -169,6 +178,37 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() {
            assertThat(actual).isEqualTo(expected)
        }

    @Test
    fun showHeader_desktopFeatureSetDisabled_true() =
        testScope.runTest {
            setEnableDesktopFeatureSet(false)
            assertThat(underTest.showHeader).isTrue()
        }

    @Test
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun showHeader_desktopFeatureSetEnabled_statusBarForDesktopEnabled_false() =
        testScope.runTest {
            setEnableDesktopFeatureSet(true)
            assertThat(underTest.showHeader).isFalse()
        }

    @Test
    @DisableFlags(StatusBarForDesktop.FLAG_NAME)
    fun showHeader_desktopFeatureSetEnabled_statusBarForDesktopDisabled_true() =
        testScope.runTest {
            setEnableDesktopFeatureSet(true)
            assertThat(underTest.showHeader).isTrue()
        }

    private fun setEnableDesktopFeatureSet(enable: Boolean) {
        kosmos.testableContext.orCreateTestableResources.addOverride(
            R.bool.config_enableDesktopFeatureSet,
            enable,
        )
        kosmos.configurationController.onConfigurationChanged(Configuration())
    }

    private fun TestScope.lockDevice() {
        val currentScene by collectLastValue(sceneInteractor.currentScene)
        kosmos.powerInteractor.setAsleepForTest()
+21 −1
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@
package com.android.systemui.notifications.ui.viewmodel

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.Flags
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.desktop.domain.interactor.DesktopInteractor
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
@@ -29,6 +31,7 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
import com.android.systemui.statusbar.core.StatusBarForDesktop
import com.android.systemui.statusbar.disableflags.domain.interactor.DisableFlagsInteractor
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated
@@ -41,6 +44,7 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext

/**
@@ -55,6 +59,7 @@ constructor(
    @Main private val mainDispatcher: CoroutineDispatcher,
    val shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
    val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
    private val desktopInteractor: DesktopInteractor,
    val sceneInteractor: SceneInteractor,
    private val shadeInteractor: ShadeInteractor,
    private val shadeModeInteractor: ShadeModeInteractor,
@@ -65,6 +70,21 @@ constructor(

    private val hydrator = Hydrator("NotificationsShadeOverlayContentViewModel.hydrator")

    /**
     * The Shade header can only be shown if desktop features are disabled. This is because the
     * status bar is always visible when desktop features are enabled.
     */
    val showHeader: Boolean by
        if (StatusBarForDesktop.isEnabled) {
            hydrator.hydratedStateOf(
                traceName = "showHeader",
                initialValue = !desktopInteractor.isDesktopFeatureSetEnabled.value,
                source = desktopInteractor.isDesktopFeatureSetEnabled.map { !it },
            )
        } else {
            mutableStateOf(true)
        }

    val showMedia: Boolean by
        hydrator.hydratedStateOf(
            traceName = "showMedia",
Loading