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

Commit 32183dd8 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[flexiglass] Scene class hierarchy changes

1. Removes the default implementation of activate from the Scene
   interface. awaitCancellation nodes are actually expensive. Removing the default
implementation from the interface forces each scene class to implement a
better node.
2. Changes scenes to extend ExclusiveActivatable instead of Activatable
   directly so they can benefit from the reentrant protection
3. This also led me to discover an oversight where the QS shade scene
wasn't activating its actions view-model, so win-win.

Bug: 354270224
Test: manually verified that all scenes can be navigated to and between
Flag: com.android.systemui.scene_container
Change-Id: I9d88012226ac2ed8b2fb95179e38cdc48623adde
parent cdfbbc11
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneActionsViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
@@ -56,7 +57,7 @@ constructor(
    private val actionsViewModelFactory: BouncerSceneActionsViewModel.Factory,
    private val contentViewModelFactory: BouncerSceneContentViewModel.Factory,
    private val dialogFactory: BouncerDialogFactory,
) : ComposableScene {
) : ExclusiveActivatable(), ComposableScene {
    override val key = Scenes.Bouncer

    private val actionsViewModel: BouncerSceneActionsViewModel by lazy {
@@ -66,7 +67,7 @@ constructor(
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        actionsViewModel.actions

    override suspend fun activate(): Nothing {
    override suspend fun onActivated(): Nothing {
        actionsViewModel.activate()
    }

+7 −1
Original line number Diff line number Diff line
@@ -27,10 +27,12 @@ import com.android.systemui.communal.ui.view.layout.sections.CommunalAppWidgetSe
import com.android.systemui.communal.ui.viewmodel.CommunalViewModel
import com.android.systemui.communal.widgets.WidgetInteractionHandler
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.ExclusiveActivatable
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.awaitCancellation
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
@@ -44,7 +46,7 @@ constructor(
    private val dialogFactory: SystemUIDialogFactory,
    private val interactionHandler: WidgetInteractionHandler,
    private val widgetSection: CommunalAppWidgetSection,
) : ComposableScene {
) : ExclusiveActivatable(), ComposableScene {
    override val key = Scenes.Communal

    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
@@ -55,6 +57,10 @@ constructor(
            )
            .asStateFlow()

    override suspend fun onActivated(): Nothing {
        awaitCancellation()
    }

    @Composable
    override fun SceneScope.Content(modifier: Modifier) {
        CommunalHub(
+3 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.animateSceneFloatAsState
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneActionsViewModel
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.qs.ui.composable.QuickSettings
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.ComposableScene
@@ -39,7 +40,7 @@ class LockscreenScene
constructor(
    actionsViewModelFactory: LockscreenSceneActionsViewModel.Factory,
    private val lockscreenContent: Lazy<LockscreenContent>,
) : ComposableScene {
) : ExclusiveActivatable(), ComposableScene {
    override val key = Scenes.Lockscreen

    private val actionsViewModel: LockscreenSceneActionsViewModel by lazy {
@@ -49,7 +50,7 @@ constructor(
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        actionsViewModel.actions

    override suspend fun activate(): Nothing {
    override suspend fun onActivated(): Nothing {
        actionsViewModel.activate()
    }

+3 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.ui.composable.LockscreenContent
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.notifications.ui.viewmodel.NotificationsShadeSceneActionsViewModel
import com.android.systemui.scene.session.ui.composable.SaveableSession
@@ -61,7 +62,7 @@ constructor(
    private val shadeSession: SaveableSession,
    private val stackScrollView: Lazy<NotificationScrollView>,
    private val lockscreenContent: Lazy<Optional<LockscreenContent>>,
) : ComposableScene {
) : ExclusiveActivatable(), ComposableScene {

    override val key = Scenes.NotificationsShade

@@ -72,7 +73,7 @@ constructor(
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        actionsViewModel.actions

    override suspend fun activate(): Nothing {
    override suspend fun onActivated(): Nothing {
        actionsViewModel.activate()
    }

+3 −2
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ 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.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.composable.MediaCarousel
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
@@ -129,7 +130,7 @@ constructor(
    private val statusBarIconController: StatusBarIconController,
    private val mediaCarouselController: MediaCarouselController,
    @Named(MediaModule.QS_PANEL) private val mediaHost: MediaHost,
) : ComposableScene {
) : ExclusiveActivatable(), ComposableScene {
    override val key = Scenes.QuickSettings

    private val actionsViewModel: QuickSettingsSceneActionsViewModel by lazy {
@@ -139,7 +140,7 @@ constructor(
    override val destinationScenes: Flow<Map<UserAction, UserActionResult>> =
        actionsViewModel.actions

    override suspend fun activate(): Nothing {
    override suspend fun onActivated(): Nothing {
        actionsViewModel.activate()
    }

Loading