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

Commit 546136c2 authored by Anton Potapov's avatar Anton Potapov
Browse files

Hide UMO from the shade when QS is disabled

With the flexiglass off UMO is not visible in the Shade. This CL
replicates this behaviour when flexiglass on

Flag: com.android.systemui.scene_container
Bug: 371545613
Test: manually. Start playing music and observe UMO absence in the Shade. The commands used are:
$ adb shell cmd statusbar send-disable-flag quick-settings
$ adb shell cmd statusbar send-disable-flag none

Change-Id: Id677504f982abad7d1d1cec9e0a2d5a19882546e
parent ac2a1f25
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -270,6 +270,7 @@ private fun SceneScope.SingleShade(
        )
    val isEmptySpaceClickable by viewModel.isEmptySpaceClickable.collectAsStateWithLifecycle()
    val isMediaVisible by viewModel.isMediaVisible.collectAsStateWithLifecycle()
    val isQsEnabled by viewModel.isQsEnabled.collectAsStateWithLifecycle()

    val shouldPunchHoleBehindScrim =
        layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
@@ -361,6 +362,7 @@ private fun SceneScope.SingleShade(
                    carouselController = mediaCarouselController,
                    modifier = Modifier.layoutId(SingleShadeMeasurePolicy.LayoutId.Media),
                    usingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia,
                    isQsEnabled = isQsEnabled,
                    isInSplitShade = false,
                )

@@ -416,6 +418,7 @@ private fun SceneScope.SplitShade(
    val screenCornerRadius = LocalScreenCornerRadius.current

    val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsStateWithLifecycle()
    val isQsEnabled by viewModel.isQsEnabled.collectAsStateWithLifecycle()
    val isCustomizerShowing by
        viewModel.qsSceneAdapter.isCustomizerShowing.collectAsStateWithLifecycle()
    val customizingAnimationDuration by
@@ -567,6 +570,7 @@ private fun SceneScope.SplitShade(
                                        Modifier.zIndex(1f)
                                    },
                                carouselController = mediaCarouselController,
                                isQsEnabled = isQsEnabled,
                                isInSplitShade = true,
                            )
                        }
@@ -620,10 +624,14 @@ private fun SceneScope.ShadeMediaCarousel(
    mediaHost: MediaHost,
    carouselController: MediaCarouselController,
    mediaOffsetProvider: ShadeMediaOffsetProvider,
    isInSplitShade: Boolean,
    isQsEnabled: Boolean,
    modifier: Modifier = Modifier,
    usingCollapsedLandscapeMedia: Boolean = false,
    isInSplitShade: Boolean,
) {
    if (!isQsEnabled) {
        return
    }
    MediaCarousel(
        modifier = modifier.fillMaxWidth(),
        isVisible = isVisible,
+20 −9
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.shade.ui.viewmodel

import android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS
import android.platform.test.annotations.DisableFlags
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -42,6 +43,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.shared.flag.DualShade
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository
import com.android.systemui.testKosmos
import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider
import com.google.common.truth.Truth.assertThat
@@ -49,6 +51,7 @@ import java.util.Locale
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -158,10 +161,7 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() {
                        underTest.unfoldTranslationX(isOnStartSide = true),
                        underTest.unfoldTranslationX(isOnStartSide = false),
                    ) { start, end ->
                        Translations(
                            start = start,
                            end = end,
                        )
                        Translations(start = start, end = end)
                    }
                )

@@ -186,6 +186,20 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() {
            assertThat(translations?.end).isEqualTo(-0f)
        }

    @Test
    fun disable2QuickSettings_isQsEnabledIsFalse() =
        testScope.runTest {
            val isQsEnabled by collectLastValue(underTest.isQsEnabled)
            assertThat(isQsEnabled).isTrue()

            kosmos.fakeDisableFlagsRepository.disableFlags.update {
                it.copy(disable2 = DISABLE2_QUICK_SETTINGS)
            }
            runCurrent()

            assertThat(isQsEnabled).isFalse()
        }

    private fun prepareConfiguration(): Int {
        val configuration = context.resources.configuration
        configuration.setLayoutDirection(Locale.US)
@@ -193,7 +207,7 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() {
        val maxTranslation = 10
        kosmos.fakeConfigurationRepository.setDimensionPixelSize(
            R.dimen.notification_side_paddings,
            maxTranslation
            maxTranslation,
        )
        return maxTranslation
    }
@@ -224,8 +238,5 @@ class ShadeSceneContentViewModelTest : SysuiTestCase() {
        runCurrent()
    }

    private data class Translations(
        val start: Float,
        val end: Float,
    )
    private data class Translations(val start: Float, val end: Float)
}
+20 −4
Original line number Diff line number Diff line
@@ -30,15 +30,21 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.disableflags.domain.interactor.DisableFlagsInteractor
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.util.concurrent.atomic.AtomicBoolean
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach

/**
 * Models UI state used to render the content of the shade scene.
@@ -54,6 +60,7 @@ constructor(
    val brightnessMirrorViewModelFactory: BrightnessMirrorViewModel.Factory,
    val mediaCarouselInteractor: MediaCarouselInteractor,
    shadeInteractor: ShadeInteractor,
    private val disableFlagsInteractor: DisableFlagsInteractor,
    private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
    private val footerActionsController: FooterActionsController,
    private val unfoldTransitionInteractor: UnfoldTransitionInteractor,
@@ -70,12 +77,21 @@ constructor(

    val isMediaVisible: StateFlow<Boolean> = mediaCarouselInteractor.hasActiveMediaOrRecommendation

    private val _isQsEnabled =
        MutableStateFlow(!disableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled())
    val isQsEnabled: StateFlow<Boolean> = _isQsEnabled.asStateFlow()

    private val footerActionsControllerInitialized = AtomicBoolean(false)

    override suspend fun onActivated(): Nothing {
        deviceEntryInteractor.isDeviceEntered.collect { isDeviceEntered ->
            _isEmptySpaceClickable.value = !isDeviceEntered
        }
    override suspend fun onActivated(): Nothing = coroutineScope {
        deviceEntryInteractor.isDeviceEntered
            .onEach { isDeviceEntered -> _isEmptySpaceClickable.value = !isDeviceEntered }
            .launchIn(this)
        disableFlagsInteractor.disableFlags
            .map { it.isQuickSettingsEnabled() }
            .onEach { _isQsEnabled.value = it }
            .launchIn(this)
        awaitCancellation()
    }

    /**
+2 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.qs.ui.adapter.qsSceneAdapter
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModelFactory
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.disableflags.domain.interactor.disableFlagsInteractor
import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor

val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture {
@@ -35,6 +36,7 @@ val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture {
        brightnessMirrorViewModelFactory = brightnessMirrorViewModelFactory,
        mediaCarouselInteractor = mediaCarouselInteractor,
        shadeInteractor = shadeInteractor,
        disableFlagsInteractor = disableFlagsInteractor,
        footerActionsViewModelFactory = footerActionsViewModelFactory,
        footerActionsController = footerActionsController,
        unfoldTransitionInteractor = unfoldTransitionInteractor,