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

Commit 2b7a70d1 authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Hide brightness slider on external displays

Right now there is no way control the brightness of external displays. This removes the slider from the compose QS fragment if it is being displayed on an external display.

Bug: 362719719
Bug: 397156848
Test: QSFragmentComposeViewModelTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I34572262912ceb05e2dd4a2dc0626c0f44e5848d
parent d664e2b5
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@ package com.android.systemui.qs.ui.viewmodel
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper
import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR
import com.android.systemui.Flags.FLAG_SHADE_WINDOW_GOES_AROUND
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testScope
@@ -31,6 +33,7 @@ import com.android.systemui.media.controls.data.repository.mediaFilterRepository
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment
import com.android.systemui.scene.domain.startable.sceneContainerStartable
import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository
import com.android.systemui.shade.domain.interactor.enableDualShade
import com.android.systemui.testKosmos
import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
@@ -114,4 +117,27 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() {

            assertThat(underTest.isTransparencyEnabled).isFalse()
        }

    @Test
    fun isBrightnessSliderVisible_defaultDisplay_isVisible() =
        with(kosmos) {
            testScope.runTest {
                fakeShadeDisplaysRepository.setPendingDisplayId(Display.DEFAULT_DISPLAY)

                assertThat(underTest.isBrightnessSliderVisible).isTrue()
            }
        }

    @Test
    @EnableFlags(FLAG_SHADE_WINDOW_GOES_AROUND)
    fun isBrightnessSliderVisible_externalDisplay_isInvisible() =
        with(kosmos) {
            testScope.runTest {
                fakeShadeDisplaysRepository.setPendingDisplayId(
                    Display.DEFAULT_DISPLAY + 1
                ) // Not default.

                assertThat(underTest.isBrightnessSliderVisible).isFalse()
            }
        }
}
+7 −1
Original line number Diff line number Diff line
@@ -875,7 +875,12 @@ constructor(
                                    )
                        ) {
                            QuickSettingsLayout(
                                brightness = BrightnessSlider,
                                brightness =
                                    if (viewModel.isBrightnessSliderVisible) {
                                        { BrightnessSlider() }
                                    } else {
                                        {}
                                    },
                                tiles = TileGrid,
                                media = Media,
                                mediaInRow = viewModel.qsMediaInRow,
@@ -1381,6 +1386,7 @@ fun QuickQuickSettingsLayout(
    }
}

/** [brightness] is nullable as it might not be there (e.g. on connected displays). */
@Composable
@VisibleForTesting
fun QuickSettingsLayout(
+4 −0
Original line number Diff line number Diff line
@@ -259,6 +259,9 @@ constructor(
    val showingMirror: Boolean
        get() = containerViewModel.brightnessSliderViewModel.showMirror

    val isBrightnessSliderVisible: Boolean
        get() = containerViewModel.isBrightnessSliderVisible

    // The initial values in these two are not meaningful. The flow will emit on start the correct
    // values. This is because we need to lazily fetch them after initMediaHosts.
    val qqsMediaVisible by
@@ -536,6 +539,7 @@ constructor(
                println("isQSEnabled", isQsEnabled)
                println("isCustomizing", containerViewModel.editModeViewModel.isEditing.value)
                println("inFirstPage", inFirstPage)
                println("isBrightnessSliderVisible", containerViewModel.isBrightnessSliderVisible)
            }
            printSection("Expansion state") {
                println("qsExpansion", qsExpansion)
+30 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.qs.ui.viewmodel

import android.content.Context
import android.media.AudioManager
import android.view.Display
import androidx.compose.runtime.getValue
import com.android.settingslib.volume.shared.model.AudioStream
import com.android.systemui.Flags
@@ -35,10 +36,13 @@ import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel
import com.android.systemui.res.R
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.shade.domain.interactor.ShadeDisplaysInteractor
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
import com.android.systemui.volume.panel.component.volume.domain.model.SliderType
import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.AudioStreamSliderViewModel
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
import dagger.Lazy
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@@ -46,6 +50,7 @@ import javax.inject.Named
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch

class QuickSettingsContainerViewModel
@@ -65,6 +70,7 @@ constructor(
    mediaCarouselInteractor: MediaCarouselInteractor,
    val mediaCarouselController: MediaCarouselController,
    @Named(MediaModule.QS_PANEL) val mediaHost: MediaHost,
    shadeDisplaysInteractor: Lazy<ShadeDisplaysInteractor>,
) : ExclusiveActivatable() {

    private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator")
@@ -87,6 +93,20 @@ constructor(
                },
        )

    val isBrightnessSliderVisible by
        hydrator.hydratedStateOf(
            traceName = "isBrightnessSliderVisible",
            initialValue = shouldBrightnessSliderBeVisible(Display.DEFAULT_DISPLAY),
            source =
                if (ShadeWindowGoesAround.isEnabled) {
                    shadeDisplaysInteractor.get().pendingDisplayId.map {
                        shouldBrightnessSliderBeVisible(it)
                    }
                } else {
                    flowOf(true)
                },
        )

    val brightnessSliderViewModel =
        brightnessSliderViewModelFactory.create(supportsBrightnessMirroring)

@@ -133,6 +153,16 @@ constructor(
        }
    }

    private companion object {
        fun shouldBrightnessSliderBeVisible(displayId: Int): Boolean {
            return if (ShadeWindowGoesAround.isEnabled) {
                displayId == Display.DEFAULT_DISPLAY
            } else {
                true
            }
        }
    }

    @AssistedFactory
    interface Factory {
        fun create(
+2 −0
Original line number Diff line number Diff line
@@ -81,6 +81,8 @@ constructor(
    /** Current display id of the shade window. */
    val displayId: StateFlow<Int> = shadePositionRepository.displayId

    val pendingDisplayId: StateFlow<Int> = shadePositionRepository.pendingDisplayId

    override fun start() {
        ShadeWindowGoesAround.isUnexpectedlyInLegacyMode()
        listenForWindowContextConfigChanges()
Loading