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

Commit 9e7ee4ab authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[flexiglass] Improved structured concurrency in SceneContainer.

In an effort to improve performance by leveraging structured
concurrency:

1. Changed Scene.destinationScenes from StateFlow to just Flow
2. Changed SceneContainer to collect only the destinationScenes of the
   current scene
3. Added Scene.activate to hydrate scenes
4. Changed SceneContainer to call activate on the current scene and
   cancel the one that was previously activated
5. Removed @Application CoroutineScope from scene view-model classes
   that didn't need it anymore (more cleanup to come)

Bug: 354270224
Test: manually ran a smoke test on Flexiglass: can change scenes to
shade, QS, and bouncer over lockscreen, can unlock, can change to shade
and QS, and re-lock.
Flag: com.android.systemui.scene_container

Change-Id: I3dfee72630322e0cb93ac76324be9d935e3a67f1
parent 1c80a98d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import javax.inject.Inject
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.Flow

object Bouncer {
    object Elements {
@@ -56,7 +56,7 @@ constructor(
) : ComposableScene {
    override val key = Scenes.Bouncer

    override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        viewModel.destinationScenes

    @Composable
+2 −2
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.statusbar.phone.SystemUIDialogFactory
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow

/** The communal scene shows glanceable hub when the device is locked and docked. */
@@ -45,7 +45,7 @@ constructor(
) : ComposableScene {
    override val key = Scenes.Communal

    override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        MutableStateFlow<Map<UserAction, UserActionResult>>(
                mapOf(
                    Swipe(SwipeDirection.Right) to UserActionResult(Scenes.Lockscreen),
+2 −2
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import dagger.Lazy
import javax.inject.Inject
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.Flow

/** The lock screen scene shows when the device is locked. */
@SysUISingleton
@@ -42,7 +42,7 @@ constructor(
) : ComposableScene {
    override val key = Scenes.Lockscreen

    override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        viewModel.destinationScenes

    @Composable
+2 −2
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ import com.android.systemui.statusbar.phone.ui.TintedIconManager
import dagger.Lazy
import java.util.Optional
import javax.inject.Inject
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.Flow

@SysUISingleton
class NotificationsShadeScene
@@ -64,7 +64,7 @@ constructor(

    override val key = Scenes.NotificationsShade

    override val destinationScenes: StateFlow<Map<UserAction, UserActionResult>> =
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        sceneViewModel.destinationScenes

    @Composable
+5 −11
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.SceneScope
import com.android.compose.animation.scene.TransitionState
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.animateSceneDpAsState
import com.android.compose.animation.scene.animateSceneFloatAsState
import com.android.compose.modifiers.thenIf
@@ -79,7 +81,6 @@ import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.common.ui.compose.windowinsets.LocalRawScreenHeight
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.media.controls.ui.composable.MediaCarousel
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
@@ -109,16 +110,13 @@ import dagger.Lazy
import javax.inject.Inject
import javax.inject.Named
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.Flow

/** The Quick Settings (AKA "QS") scene shows the quick setting tiles. */
@SysUISingleton
class QuickSettingsScene
@Inject
constructor(
    @Application private val applicationScope: CoroutineScope,
    private val shadeSession: SaveableSession,
    private val notificationStackScrollView: Lazy<NotificationScrollView>,
    private val viewModel: QuickSettingsSceneViewModel,
@@ -131,12 +129,8 @@ constructor(
) : ComposableScene {
    override val key = Scenes.QuickSettings

    override val destinationScenes =
        viewModel.destinationScenes.stateIn(
            scope = applicationScope,
            started = SharingStarted.WhileSubscribed(),
            initialValue = emptyMap(),
        )
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        viewModel.destinationScenes

    @Composable
    override fun SceneScope.Content(
Loading