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 Original line 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.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
import com.android.systemui.scene.ui.composable.ComposableScene
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.Flow


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


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


    @Composable
    @Composable
+2 −2
Original line number Original line 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.scene.ui.composable.ComposableScene
import com.android.systemui.statusbar.phone.SystemUIDialogFactory
import com.android.systemui.statusbar.phone.SystemUIDialogFactory
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.asStateFlow


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


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


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


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


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


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


    override val key = Scenes.NotificationsShade
    override val key = Scenes.NotificationsShade


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


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


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


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


    @Composable
    @Composable
    override fun SceneScope.Content(
    override fun SceneScope.Content(
Loading