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

Commit 696c3f38 authored by Darrell Shi's avatar Darrell Shi Committed by William Xiao
Browse files

Introduce communal tutorial content

This change allows the communal hub to show placeholder tutorial content
when user enters the hub for the first time.

Test: verified locally that tutorial content is shown
Bug: 303506432
Fix: 303506432
Change-Id: I8f4843c9a8588c8a1f4b0f1e590cc79449c2a839
parent adff68f0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -66,6 +67,7 @@ object ComposeFacade : BaseComposeFacade {

    override fun createCommunalView(
        context: Context,
        viewModel: CommunalViewModel,
    ): View {
        throwComposeUnavailableError()
    }
+5 −1
Original line number Diff line number Diff line
@@ -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
@@ -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.
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ android_library {
    ],

    static_libs: [
        "CommunalLayoutLib",
        "SystemUI-core",
        "PlatformComposeCore",
        "PlatformComposeSceneTransitionLayout",
+48 −5
Original line number Diff line number Diff line
@@ -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 = {})
        }
    }
}
+7 −2
Original line number Diff line number Diff line
@@ -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
@@ -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>> =
@@ -45,6 +50,6 @@ class CommunalScene @Inject constructor() : ComposableScene {

    @Composable
    override fun SceneScope.Content(modifier: Modifier) {
        CommunalHub(modifier)
        CommunalHub(modifier, viewModel)
    }
}
Loading