diff options
| author | 2023-05-17 16:57:43 -0700 | |
|---|---|---|
| committer | 2023-05-17 17:08:15 -0700 | |
| commit | 72ace2744f290abce61774fe0a49de99548aa57c (patch) | |
| tree | b208a773b2ac5f1050f4d1449b1f520dc382c532 | |
| parent | c6eeba236f039cf2956d243681d6acf5cc53554f (diff) | |
[flexiglass] Fixes compose-enabled sysuig build.
Bug: 279501596
Test: built and deployed sysuig with compose build time flag enabled,
disabled, and Compose gallery when the flag is disabled.
Change-Id: I8c48055d90d9f9fa6a994ed035f71d472b1639fd
13 files changed, 88 insertions, 36 deletions
diff --git a/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/scene/shared/page/SceneModule.kt b/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt index 18c9513acf2a..24064b1261b7 100644 --- a/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/scene/shared/page/SceneModule.kt +++ b/packages/SystemUI/compose/facade/disabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.scene.shared.page +package com.android.systemui.scene.ui.composable import com.android.systemui.scene.shared.model.Scene import dagger.Module diff --git a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt index 530706e47dcc..ee53ece5c944 100644 --- a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt +++ b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/ui/composable/SceneModule.kt @@ -17,7 +17,7 @@ package com.android.systemui.scene.ui.composable import com.android.systemui.bouncer.ui.composable.BouncerScene -import com.android.systemui.keyguard.ui.composable.LockScreenScene +import com.android.systemui.keyguard.ui.composable.LockscreenScene import com.android.systemui.qs.ui.composable.QuickSettingsScene import com.android.systemui.scene.shared.model.Scene import com.android.systemui.shade.ui.composable.ShadeScene @@ -30,7 +30,7 @@ object SceneModule { fun scenes( bouncer: BouncerScene, gone: GoneScene, - lockScreen: LockScreenScene, + lockScreen: LockscreenScene, qs: QuickSettingsScene, shade: ShadeScene, ): Set<Scene> { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt index 6f6d0f97b542..f48bab90ba42 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt @@ -55,11 +55,13 @@ import kotlinx.coroutines.flow.asStateFlow class BouncerScene @Inject constructor( - private val viewModel: BouncerViewModel, + private val viewModelFactory: BouncerViewModel.Factory, ) : ComposableScene { override val key = SceneKey.Bouncer - override fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = + override fun destinationScenes( + containerName: String, + ): StateFlow<Map<UserAction, SceneModel>> = MutableStateFlow<Map<UserAction, SceneModel>>( mapOf( UserAction.Back to SceneModel(SceneKey.Lockscreen), @@ -67,7 +69,11 @@ constructor( ) .asStateFlow() - @Composable override fun Content(modifier: Modifier) = BouncerScene(viewModel, modifier) + @Composable + override fun Content( + containerName: String, + modifier: Modifier, + ) = BouncerScene(viewModelFactory.create(containerName), modifier) } @Composable diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt index ab7bc26d59e1..7c07a8b3d054 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenScene.kt @@ -52,25 +52,32 @@ class LockscreenScene @Inject constructor( @Application private val applicationScope: CoroutineScope, - private val viewModel: LockscreenSceneViewModel, + private val viewModelFactory: LockscreenSceneViewModel.Factory, ) : ComposableScene { override val key = SceneKey.Lockscreen - override fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = - viewModel.upDestinationSceneKey - .map { pageKey -> destinationScenes(up = pageKey) } - .stateIn( - scope = applicationScope, - started = SharingStarted.Eagerly, - initialValue = destinationScenes(up = viewModel.upDestinationSceneKey.value) - ) + private var unsafeViewModel: LockscreenSceneViewModel? = null + + override fun destinationScenes( + containerName: String, + ): StateFlow<Map<UserAction, SceneModel>> = + getOrCreateViewModelSingleton(containerName).let { viewModel -> + viewModel.upDestinationSceneKey + .map { pageKey -> destinationScenes(up = pageKey) } + .stateIn( + scope = applicationScope, + started = SharingStarted.Eagerly, + initialValue = destinationScenes(up = viewModel.upDestinationSceneKey.value) + ) + } @Composable override fun Content( + containerName: String, modifier: Modifier, ) { LockscreenScene( - viewModel = viewModel, + viewModel = getOrCreateViewModelSingleton(containerName), modifier = modifier, ) } @@ -83,6 +90,13 @@ constructor( UserAction.Swipe(Direction.DOWN) to SceneModel(SceneKey.Shade) ) } + + private fun getOrCreateViewModelSingleton( + containerName: String, + ): LockscreenSceneViewModel { + return unsafeViewModel + ?: viewModelFactory.create(containerName).also { unsafeViewModel = it } + } } @Composable diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt index 130395a38512..58db37eca8d5 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt @@ -44,11 +44,13 @@ import kotlinx.coroutines.flow.asStateFlow class QuickSettingsScene @Inject constructor( - private val viewModel: QuickSettingsSceneViewModel, + private val viewModelFactory: QuickSettingsSceneViewModel.Factory, ) : ComposableScene { override val key = SceneKey.QuickSettings - override fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = + override fun destinationScenes( + containerName: String, + ): StateFlow<Map<UserAction, SceneModel>> = MutableStateFlow<Map<UserAction, SceneModel>>( mapOf( UserAction.Swipe(Direction.UP) to SceneModel(SceneKey.Shade), @@ -58,10 +60,11 @@ constructor( @Composable override fun Content( + containerName: String, modifier: Modifier, ) { QuickSettingsScene( - viewModel = viewModel, + viewModel = viewModelFactory.create(containerName), modifier = modifier, ) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/ComposableScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/ComposableScene.kt index a21366695f66..6f3363e940e5 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/ComposableScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/ComposableScene.kt @@ -22,5 +22,5 @@ import com.android.systemui.scene.shared.model.Scene /** Compose-capable extension of [Scene]. */ interface ComposableScene : Scene { - @Composable fun Content(modifier: Modifier) + @Composable fun Content(containerName: String, modifier: Modifier) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt index 007055221691..b387463d3d90 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/GoneScene.kt @@ -41,7 +41,9 @@ import kotlinx.coroutines.flow.asStateFlow class GoneScene @Inject constructor() : ComposableScene { override val key = SceneKey.Gone - override fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = + override fun destinationScenes( + containerName: String, + ): StateFlow<Map<UserAction, SceneModel>> = MutableStateFlow<Map<UserAction, SceneModel>>( mapOf( UserAction.Swipe(Direction.DOWN) to SceneModel(SceneKey.Shade), @@ -51,6 +53,7 @@ class GoneScene @Inject constructor() : ComposableScene { @Composable override fun Content( + containerName: String, modifier: Modifier, ) { /* diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt index f8a73d5294bc..5e0761063af2 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/scene/ui/composable/SceneContainer.kt @@ -75,6 +75,7 @@ fun SceneContainer( if (key == currentSceneKey) { Scene( scene = composableScene, + containerName = viewModel.containerName, onSceneChanged = viewModel::setCurrentScene, modifier = Modifier.fillMaxSize(), ) @@ -87,6 +88,7 @@ fun SceneContainer( @Composable private fun Scene( scene: ComposableScene, + containerName: String, onSceneChanged: (SceneModel) -> Unit, modifier: Modifier = Modifier, ) { @@ -97,11 +99,12 @@ private fun Scene( modifier = Modifier.align(Alignment.Center), ) { scene.Content( + containerName = containerName, modifier = Modifier, ) val destinationScenes: Map<UserAction, SceneModel> by - scene.destinationScenes().collectAsState() + scene.destinationScenes(containerName).collectAsState() val swipeLeftDestinationScene = destinationScenes[UserAction.Swipe(Direction.LEFT)] val swipeUpDestinationScene = destinationScenes[UserAction.Swipe(Direction.UP)] val swipeRightDestinationScene = destinationScenes[UserAction.Swipe(Direction.RIGHT)] diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt index 5a092041df93..e4513d01ea37 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt @@ -48,25 +48,32 @@ class ShadeScene @Inject constructor( @Application private val applicationScope: CoroutineScope, - private val viewModel: ShadeSceneViewModel, + private val viewModelFactory: ShadeSceneViewModel.Factory, ) : ComposableScene { override val key = SceneKey.Shade - override fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = - viewModel.upDestinationSceneKey - .map { sceneKey -> destinationScenes(up = sceneKey) } - .stateIn( - scope = applicationScope, - started = SharingStarted.Eagerly, - initialValue = destinationScenes(up = viewModel.upDestinationSceneKey.value), - ) + private var unsafeViewModel: ShadeSceneViewModel? = null + + override fun destinationScenes( + containerName: String, + ): StateFlow<Map<UserAction, SceneModel>> = + getOrCreateViewModelSingleton(containerName).let { viewModel -> + viewModel.upDestinationSceneKey + .map { sceneKey -> destinationScenes(up = sceneKey) } + .stateIn( + scope = applicationScope, + started = SharingStarted.Eagerly, + initialValue = destinationScenes(up = viewModel.upDestinationSceneKey.value), + ) + } @Composable override fun Content( + containerName: String, modifier: Modifier, ) { ShadeScene( - viewModel = viewModel, + viewModel = getOrCreateViewModelSingleton(containerName), modifier = modifier, ) } @@ -79,6 +86,13 @@ constructor( UserAction.Swipe(Direction.DOWN) to SceneModel(SceneKey.QuickSettings), ) } + + private fun getOrCreateViewModelSingleton( + containerName: String, + ): ShadeSceneViewModel { + return unsafeViewModel + ?: viewModelFactory.create(containerName).also { unsafeViewModel = it } + } } @Composable diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt index eaa8ed5b358e..c6528d0736cd 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModel.kt @@ -20,6 +20,8 @@ import android.content.Context import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor import com.android.systemui.dagger.qualifiers.Application +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted @@ -34,7 +36,7 @@ constructor( @Application private val applicationContext: Context, @Application private val applicationScope: CoroutineScope, interactorFactory: BouncerInteractor.Factory, - containerName: String, + @Assisted containerName: String, ) { private val interactor: BouncerInteractor = interactorFactory.create(containerName) @@ -94,4 +96,11 @@ constructor( else -> null } } + + @AssistedFactory + interface Factory { + fun create( + containerName: String, + ): BouncerViewModel + } } diff --git a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt index 0ed8b21c100e..6d7455f2b259 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt @@ -16,7 +16,7 @@ package com.android.systemui.scene -import com.android.systemui.scene.shared.page.SceneModule +import com.android.systemui.scene.ui.composable.SceneModule import dagger.Module @Module( diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt index 435ff4baffd8..354de8ac7aa5 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/model/Scene.kt @@ -59,7 +59,7 @@ interface Scene { * The API is designed such that it's possible to emit ever-changing values for each * [UserAction] to enable, disable, or change the destination scene of a given user action. */ - fun destinationScenes(): StateFlow<Map<UserAction, SceneModel>> = + fun destinationScenes(containerName: String): StateFlow<Map<UserAction, SceneModel>> = MutableStateFlow(emptyMap<UserAction, SceneModel>()).asStateFlow() } diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt index afc053151ab5..a4daafccd75b 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/viewmodel/SceneContainerViewModel.kt @@ -29,7 +29,7 @@ class SceneContainerViewModel @AssistedInject constructor( private val interactor: SceneInteractor, - @Assisted private val containerName: String, + @Assisted val containerName: String, ) { /** * Keys of all scenes in the container. |