Loading packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.view.View import android.view.WindowInsets import androidx.activity.ComponentActivity import androidx.lifecycle.LifecycleOwner import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.scene.shared.model.Scene Loading Loading @@ -66,6 +67,7 @@ object ComposeFacade : BaseComposeFacade { override fun createCommunalView( context: Context, viewModel: CommunalViewModel, ): View { throwComposeUnavailableError() } Loading packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt +5 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.DisplayCutout import com.android.systemui.common.ui.compose.windowinsets.DisplayCutoutProvider import com.android.systemui.communal.ui.compose.CommunalHub import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.compose.FooterActions Loading Loading @@ -96,8 +97,11 @@ object ComposeFacade : BaseComposeFacade { override fun createCommunalView( context: Context, viewModel: CommunalViewModel, ): View { return ComposeView(context).apply { setContent { PlatformTheme { CommunalHub() } } } return ComposeView(context).apply { setContent { PlatformTheme { CommunalHub(viewModel = viewModel) } } } } // TODO(b/298525212): remove once Compose exposes window inset bounds. Loading packages/SystemUI/compose/features/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ android_library { ], static_libs: [ "CommunalLayoutLib", "SystemUI-core", "PlatformComposeCore", "PlatformComposeSceneTransitionLayout", Loading packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt +48 −5 Original line number Diff line number Diff line Loading @@ -3,20 +3,63 @@ package com.android.systemui.communal.ui.compose import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Text import androidx.compose.material3.Card import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.integerResource import com.android.systemui.communal.layout.ui.compose.CommunalGridLayout import com.android.systemui.communal.layout.ui.compose.config.CommunalGridLayoutCard import com.android.systemui.communal.layout.ui.compose.config.CommunalGridLayoutConfig import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.res.R @Composable fun CommunalHub(modifier: Modifier = Modifier) { fun CommunalHub( modifier: Modifier = Modifier, viewModel: CommunalViewModel, ) { val showTutorial by viewModel.showTutorialContent.collectAsState(initial = false) Box( modifier = modifier.fillMaxSize().background(Color.White), ) { Text( modifier = Modifier.align(Alignment.Center), text = "Hello Communal!", CommunalGridLayout( modifier = Modifier.align(Alignment.CenterStart), layoutConfig = CommunalGridLayoutConfig( gridColumnSize = dimensionResource(R.dimen.communal_grid_column_size), gridGutter = dimensionResource(R.dimen.communal_grid_gutter_size), gridHeight = dimensionResource(R.dimen.communal_grid_height), gridColumnsPerCard = integerResource(R.integer.communal_grid_columns_per_card), ), communalCards = if (showTutorial) tutorialContent else emptyList(), ) } } private val tutorialContent = listOf( tutorialCard(CommunalGridLayoutCard.Size.FULL), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), ) private fun tutorialCard(size: CommunalGridLayoutCard.Size): CommunalGridLayoutCard { return object : CommunalGridLayoutCard() { override val supportedSizes = listOf(size) @Composable override fun Content(modifier: Modifier) { Card(modifier = modifier, content = {}) } } } packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt +7 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.communal.ui.compose import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.SceneKey Loading @@ -32,7 +33,11 @@ import kotlinx.coroutines.flow.asStateFlow /** The communal scene shows glanceable hub when the device is locked and docked. */ @SysUISingleton class CommunalScene @Inject constructor() : ComposableScene { class CommunalScene @Inject constructor( private val viewModel: CommunalViewModel, ) : ComposableScene { override val key = SceneKey.Communal override val destinationScenes: StateFlow<Map<UserAction, SceneModel>> = Loading @@ -45,6 +50,6 @@ class CommunalScene @Inject constructor() : ComposableScene { @Composable override fun SceneScope.Content(modifier: Modifier) { CommunalHub(modifier) CommunalHub(modifier, viewModel) } } Loading
packages/SystemUI/compose/facade/disabled/src/com/android/systemui/compose/ComposeFacade.kt +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.view.View import android.view.WindowInsets import androidx.activity.ComponentActivity import androidx.lifecycle.LifecycleOwner import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel import com.android.systemui.scene.shared.model.Scene Loading Loading @@ -66,6 +67,7 @@ object ComposeFacade : BaseComposeFacade { override fun createCommunalView( context: Context, viewModel: CommunalViewModel, ): View { throwComposeUnavailableError() } Loading
packages/SystemUI/compose/facade/enabled/src/com/android/systemui/compose/ComposeFacade.kt +5 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation import com.android.systemui.common.ui.compose.windowinsets.DisplayCutout import com.android.systemui.common.ui.compose.windowinsets.DisplayCutoutProvider import com.android.systemui.communal.ui.compose.CommunalHub import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import com.android.systemui.qs.footer.ui.compose.FooterActions Loading Loading @@ -96,8 +97,11 @@ object ComposeFacade : BaseComposeFacade { override fun createCommunalView( context: Context, viewModel: CommunalViewModel, ): View { return ComposeView(context).apply { setContent { PlatformTheme { CommunalHub() } } } return ComposeView(context).apply { setContent { PlatformTheme { CommunalHub(viewModel = viewModel) } } } } // TODO(b/298525212): remove once Compose exposes window inset bounds. Loading
packages/SystemUI/compose/features/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ android_library { ], static_libs: [ "CommunalLayoutLib", "SystemUI-core", "PlatformComposeCore", "PlatformComposeSceneTransitionLayout", Loading
packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt +48 −5 Original line number Diff line number Diff line Loading @@ -3,20 +3,63 @@ package com.android.systemui.communal.ui.compose import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Text import androidx.compose.material3.Card import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.integerResource import com.android.systemui.communal.layout.ui.compose.CommunalGridLayout import com.android.systemui.communal.layout.ui.compose.config.CommunalGridLayoutCard import com.android.systemui.communal.layout.ui.compose.config.CommunalGridLayoutConfig import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.res.R @Composable fun CommunalHub(modifier: Modifier = Modifier) { fun CommunalHub( modifier: Modifier = Modifier, viewModel: CommunalViewModel, ) { val showTutorial by viewModel.showTutorialContent.collectAsState(initial = false) Box( modifier = modifier.fillMaxSize().background(Color.White), ) { Text( modifier = Modifier.align(Alignment.Center), text = "Hello Communal!", CommunalGridLayout( modifier = Modifier.align(Alignment.CenterStart), layoutConfig = CommunalGridLayoutConfig( gridColumnSize = dimensionResource(R.dimen.communal_grid_column_size), gridGutter = dimensionResource(R.dimen.communal_grid_gutter_size), gridHeight = dimensionResource(R.dimen.communal_grid_height), gridColumnsPerCard = integerResource(R.integer.communal_grid_columns_per_card), ), communalCards = if (showTutorial) tutorialContent else emptyList(), ) } } private val tutorialContent = listOf( tutorialCard(CommunalGridLayoutCard.Size.FULL), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.THIRD), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), tutorialCard(CommunalGridLayoutCard.Size.HALF), ) private fun tutorialCard(size: CommunalGridLayoutCard.Size): CommunalGridLayoutCard { return object : CommunalGridLayoutCard() { override val supportedSizes = listOf(size) @Composable override fun Content(modifier: Modifier) { Card(modifier = modifier, content = {}) } } }
packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalScene.kt +7 −2 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.communal.ui.compose import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.android.compose.animation.scene.SceneScope import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.SceneKey Loading @@ -32,7 +33,11 @@ import kotlinx.coroutines.flow.asStateFlow /** The communal scene shows glanceable hub when the device is locked and docked. */ @SysUISingleton class CommunalScene @Inject constructor() : ComposableScene { class CommunalScene @Inject constructor( private val viewModel: CommunalViewModel, ) : ComposableScene { override val key = SceneKey.Communal override val destinationScenes: StateFlow<Map<UserAction, SceneModel>> = Loading @@ -45,6 +50,6 @@ class CommunalScene @Inject constructor() : ComposableScene { @Composable override fun SceneScope.Content(modifier: Modifier) { CommunalHub(modifier) CommunalHub(modifier, viewModel) } }