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

Commit 4d68d7bb authored by Ale Nijamkin's avatar Ale Nijamkin
Browse files

[flexiglass] SysUiState correction during SUW.

During SUW (setup wizard), before the device is "provisioned", the
SysUiState published by System UI wasn't right.

This CL addresses that by taking the visibility of System UI into
account when publishing SysUiState flags. The visibility already takes
device provisioning state into account.

The command that can show the current SysUiState flags is:
$ adb shell dumpsys activity service com.android.systemui/.SystemUIService | grep SysUiState -A 10

Bug: 396690884
Test: unit tested updated
Test: running the command above during SUW yields the same output with flexiglass
on or off
Test: passed SUW, manually smoke tested all scenes with flexiglass on
Flag: com.android.systemui.scene_container

Change-Id: If349f5885ee576baeaa6496b929f61347cbcd249
parent 7c1fca5d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.model

import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -35,7 +34,7 @@ class SysUiStateExtTest : SysuiTestCase() {

    @Test
    fun updateFlags() {
        underTest.updateFlags(Display.DEFAULT_DISPLAY, 1L to true, 2L to false, 4L to true)
        underTest.updateFlags(1L to true, 2L to false, 4L to true)

        assertThat(underTest.flags and 1L).isNotEqualTo(0L)
        assertThat(underTest.flags and 2L).isEqualTo(0L)
+3 −4
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import android.os.PowerManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.provider.Settings
import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.compose.animation.scene.ObservableTransitionState
@@ -1213,15 +1212,15 @@ class SceneContainerStartableTest : SysuiTestCase() {
                    fakeSceneDataSource.pause()
                    sceneInteractor.changeScene(sceneKey, "reason")
                    runCurrent()
                    verify(sysUiState, times(index)).commitUpdate(Display.DEFAULT_DISPLAY)
                    verify(sysUiState, times(index)).commitUpdate()

                    fakeSceneDataSource.unpause(expectedScene = sceneKey)
                    runCurrent()
                    verify(sysUiState, times(index)).commitUpdate(Display.DEFAULT_DISPLAY)
                    verify(sysUiState, times(index)).commitUpdate()

                    transitionStateFlow.value = ObservableTransitionState.Idle(sceneKey)
                    runCurrent()
                    verify(sysUiState, times(index + 1)).commitUpdate(Display.DEFAULT_DISPLAY)
                    verify(sysUiState, times(index + 1)).commitUpdate()
                }
        }

+18 −7
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ constructor(
                SceneContainerPluginState(
                    scene = idleState.currentScene,
                    overlays = idleState.currentOverlays,
                    isVisible = sceneInteractor.get().isVisible.value,
                    invisibleDueToOcclusion = invisibleDueToOcclusion,
                )
            )
@@ -100,12 +101,17 @@ constructor(
            mapOf<Long, (SceneContainerPluginState) -> Boolean>(
                SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE to
                    {
                        it.scene != Scenes.Gone || it.overlays.isNotEmpty()
                        when {
                            !it.isVisible -> false
                            it.scene != Scenes.Gone -> true
                            it.overlays.isNotEmpty() -> true
                            else -> false
                        }
                    },
                SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED to
                    {
                        when {
                            it.invisibleDueToOcclusion -> false
                            !it.isVisible -> false
                            it.scene == Scenes.Lockscreen -> true
                            it.scene == Scenes.Shade -> true
                            Overlays.NotificationsShade in it.overlays -> true
@@ -114,19 +120,23 @@ constructor(
                    },
                SYSUI_STATE_QUICK_SETTINGS_EXPANDED to
                    {
                        it.scene == Scenes.QuickSettings ||
                            Overlays.QuickSettingsShade in it.overlays
                        when {
                            !it.isVisible -> false
                            it.scene == Scenes.QuickSettings -> true
                            Overlays.QuickSettingsShade in it.overlays -> true
                            else -> false
                        }
                    },
                SYSUI_STATE_BOUNCER_SHOWING to { Overlays.Bouncer in it.overlays },
                SYSUI_STATE_BOUNCER_SHOWING to { it.isVisible && Overlays.Bouncer in it.overlays },
                SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to
                    {
                        it.scene == Scenes.Lockscreen && !it.invisibleDueToOcclusion
                        it.isVisible && it.scene == Scenes.Lockscreen
                    },
                SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED to
                    {
                        it.scene == Scenes.Lockscreen && it.invisibleDueToOcclusion
                    },
                SYSUI_STATE_COMMUNAL_HUB_SHOWING to { it.scene == Scenes.Communal },
                SYSUI_STATE_COMMUNAL_HUB_SHOWING to { it.isVisible && it.scene == Scenes.Communal },
            )
    }

@@ -134,5 +144,6 @@ constructor(
        val scene: SceneKey,
        val overlays: Set<OverlayKey>,
        val invisibleDueToOcclusion: Boolean,
        val isVisible: Boolean,
    )
}
+2 −12
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.systemui.model

import com.android.systemui.dagger.qualifiers.DisplayId

/**
 * In-bulk updates multiple flag values and commits the update.
 *
@@ -32,16 +30,8 @@ import com.android.systemui.dagger.qualifiers.DisplayId
 *     SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING to (sceneKey == Scenes.Lockscreen),
 * )
 * ```
 *
 * You can inject [displayId] by injecting it using:
 * ```
 *     @DisplayId private val displayId: Int`,
 * ```
 */
fun SysUiState.updateFlags(
    @DisplayId displayId: Int,
    vararg flagValuePairs: Pair<Long, Boolean>,
) {
fun SysUiState.updateFlags(vararg flagValuePairs: Pair<Long, Boolean>) {
    flagValuePairs.forEach { (flag, enabled) -> setFlag(flag, enabled) }
    commitUpdate(displayId)
    commitUpdate()
}
+13 −10
Original line number Diff line number Diff line
@@ -33,10 +33,8 @@ import com.android.systemui.bouncer.domain.interactor.SimBouncerInteractor
import com.android.systemui.bouncer.shared.logging.BouncerUiEvent
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollectorActual
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.DisplayId
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
@@ -82,6 +80,7 @@ import com.android.systemui.util.kotlin.pairwise
import com.android.systemui.util.kotlin.sample
import com.android.systemui.util.printSection
import com.android.systemui.util.println
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import com.google.android.msdl.data.model.MSDLToken
import com.google.android.msdl.domain.MSDLPlayer
import dagger.Lazy
@@ -123,7 +122,6 @@ constructor(
    private val bouncerInteractor: BouncerInteractor,
    private val keyguardInteractor: KeyguardInteractor,
    private val sysUiState: SysUiState,
    @DisplayId private val displayId: Int,
    private val sceneLogger: SceneLogger,
    @FalsingCollectorActual private val falsingCollector: FalsingCollector,
    private val falsingManager: FalsingManager,
@@ -732,21 +730,26 @@ constructor(
                    sceneInteractor.transitionState
                        .mapNotNull { it as? ObservableTransitionState.Idle }
                        .distinctUntilChanged(),
                    sceneInteractor.isVisible,
                    occlusionInteractor.invisibleDueToOcclusion,
                ) { idleState, invisibleDueToOcclusion ->
                ) { idleState, isVisible, invisibleDueToOcclusion ->
                    SceneContainerPlugin.SceneContainerPluginState(
                        scene = idleState.currentScene,
                        overlays = idleState.currentOverlays,
                        isVisible = isVisible,
                        invisibleDueToOcclusion = invisibleDueToOcclusion,
                    )
                }
                .collect { sceneContainerPluginState ->
                    sysUiState.updateFlags(
                        displayId,
                        *SceneContainerPlugin.EvaluatorByFlag.map { (flag, evaluator) ->
                                flag to evaluator.invoke(sceneContainerPluginState)
                .map { sceneContainerPluginState ->
                    SceneContainerPlugin.EvaluatorByFlag.map { (flag, evaluator) ->
                            flag to evaluator(sceneContainerPluginState)
                        }
                            .toTypedArray(),
                        .toMap()
                }
                .distinctUntilChanged()
                .collect { flags ->
                    sysUiState.updateFlags(
                        *(flags.entries.map { (key, value) -> key to value }).toTypedArray()
                    )
                }
        }
Loading