summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vignesh Ramanathan <vigneshrsastra@google.com> 2025-02-04 06:52:05 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-02-04 06:52:05 -0800
commit694f01b016f137012fe39740bb7804d5d9740e4f (patch)
tree087f0e8e8b33c7cca16c257c54ef8c1a8f6bc37c
parent6270b48bedb00dc1a826fe5c15955e502ba2e7cf (diff)
parentd97eddfde4fc25485c3ba5b9eeb102137fa31889 (diff)
Merge "Supporting TLC and SLC with Material3" into main
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt12
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt155
2 files changed, 120 insertions, 47 deletions
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt b/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt
index 5e774676e..db3711670 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt
@@ -18,6 +18,7 @@ package com.android.permissioncontroller.wear.permission.components
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
+import androidx.compose.foundation.layout.BoxScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -26,6 +27,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.fragment.app.FragmentActivity
+import androidx.wear.compose.foundation.ExpandableState
import androidx.wear.compose.foundation.SwipeToDismissValue
import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState
import androidx.wear.compose.material.SwipeToDismissBox
@@ -42,6 +44,7 @@ import com.android.permissioncontroller.wear.permission.components.theme.WearPer
@Composable
fun ScrollableScreen(
materialUIVersion: WearPermissionMaterialUIVersion = ResourceHelper.materialUIVersionInSettings,
+ asScalingList: Boolean = false,
showTimeText: Boolean = true,
title: String? = null,
subtitle: CharSequence? = null,
@@ -73,6 +76,7 @@ fun ScrollableScreen(
SwipeToDismissBox(state = state) { isBackground ->
WearPermissionScaffold(
materialUIVersion,
+ asScalingList,
showTimeText,
title,
subtitle,
@@ -86,6 +90,7 @@ fun ScrollableScreen(
} else {
WearPermissionScaffold(
materialUIVersion,
+ asScalingList,
showTimeText,
title,
subtitle,
@@ -129,4 +134,11 @@ fun Context.findActivity(): Activity {
interface ListScopeWrapper {
fun item(key: Any? = null, contentType: Any? = null, content: @Composable () -> Unit)
+
+ fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((index: Int) -> Any)? = null,
+ itemContent: @Composable BoxScope.(index: Int) -> Unit,
+ )
}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
index c1077d645..5110a5812 100644
--- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
@@ -18,6 +18,7 @@ package com.android.permissioncontroller.wear.permission.components.material3
import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.ScrollableState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.PaddingValues
@@ -37,11 +38,16 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.Hyphens
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.ExpandableState
import androidx.wear.compose.foundation.ScrollInfoProvider
+import androidx.wear.compose.foundation.expandableItems
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.foundation.lazy.TransformingLazyColumn
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnScope
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState
+import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.CircularProgressIndicator
@@ -68,12 +74,30 @@ private class TransformingScopeConverter(private val scope: TransformingLazyColu
// TODO:https://buganizer.corp.google.com/issues/389093588.
scope.item { Box(modifier = Modifier.scrollTransform(this)) { content() } }
}
+
+ override fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((Int) -> Any)?,
+ itemContent: @Composable (BoxScope.(Int) -> Unit),
+ ) {
+ throw Exception("Expandable Items are not implemented on TLC Yet. Use SLC.")
+ }
}
private class ScalingScopeConverter(private val scope: ScalingLazyListScope) : ListScopeWrapper {
override fun item(key: Any?, contentType: Any?, content: @Composable () -> Unit) {
scope.item { content() }
}
+
+ override fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((Int) -> Any)?,
+ itemContent: @Composable (BoxScope.(Int) -> Unit),
+ ) {
+ scope.expandableItems(state, count, key, itemContent)
+ }
}
/**
@@ -83,6 +107,7 @@ private class ScalingScopeConverter(private val scope: ScalingLazyListScope) : L
@Composable
fun WearPermissionScaffold(
materialUIVersion: WearPermissionMaterialUIVersion = ResourceHelper.materialUIVersionInSettings,
+ asScalingList: Boolean = false,
showTimeText: Boolean,
title: String?,
subtitle: CharSequence?,
@@ -106,59 +131,61 @@ fun WearPermissionScaffold(
)
} else {
WearPermissionScaffoldInternal(
- showTimeText,
- title,
- subtitle,
- image,
- isLoading,
- { content.invoke(TransformingScopeConverter(this)) },
- titleTestTag,
- subtitleTestTag,
+ asScalingList = asScalingList,
+ showTimeText = showTimeText,
+ title = title,
+ subtitle = subtitle,
+ image = image,
+ isLoading = isLoading,
+ content = content,
+ titleTestTag = titleTestTag,
+ subtitleTestTag = subtitleTestTag,
)
}
}
@Composable
private fun WearPermissionScaffoldInternal(
+ asScalingList: Boolean = false,
showTimeText: Boolean,
title: String?,
subtitle: CharSequence?,
image: Any?,
isLoading: Boolean,
- content: TransformingLazyColumnScope.() -> Unit,
+ content: ListScopeWrapper.() -> Unit,
titleTestTag: String? = null,
subtitleTestTag: String? = null,
) {
- val screenWidth = LocalConfiguration.current.screenWidthDp
- val screenHeight = LocalConfiguration.current.screenHeightDp
- val paddingDefaults =
- WearPermissionScaffoldPaddingDefaults(
- screenWidth = screenWidth,
- screenHeight = screenHeight,
- )
- val columnState = rememberTransformingLazyColumnState()
+
+ val scalingListState = rememberScalingLazyListState()
+ val transformingLazyColumnState = rememberTransformingLazyColumnState()
+ val listState = if (asScalingList) scalingListState else transformingLazyColumnState
+ val scrollInfoProvider =
+ if (asScalingList) ScrollInfoProvider(scalingListState)
+ else ScrollInfoProvider(transformingLazyColumnState)
+ val positionIndicator =
+ if (asScalingList) wearPermissionScrollIndicator(!isLoading, scalingListState)
+ else wearPermissionScrollIndicator(!isLoading, transformingLazyColumnState)
+
WearPermissionTheme(version = WearPermissionMaterialUIVersion.MATERIAL3) {
AppScaffold(timeText = wearPermissionTimeText(showTimeText && !isLoading)) {
ScreenScaffold(
- scrollInfoProvider = ScrollInfoProvider(columnState),
- scrollIndicator = wearPermissionScrollIndicator(!isLoading, columnState),
+ scrollInfoProvider = scrollInfoProvider,
+ scrollIndicator = positionIndicator,
) {
Box(modifier = Modifier.fillMaxSize()) {
if (isLoading) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
} else {
- ScrollingView(
- contentPadding = paddingDefaults.scrollContentPadding,
- columnState = columnState,
- icon = painterFromImage(image),
+ LazyColumnView(
+ asScalingList = asScalingList,
+ listState = listState,
title = title,
- titleTestTag = titleTestTag,
- titlePaddingValues =
- paddingDefaults.titlePaddingValues(subtitle == null),
subtitle = subtitle,
- subtitleTestTag = subtitleTestTag,
- subTitlePaddingValues = paddingDefaults.subTitlePaddingValues,
+ image = image,
content = content,
+ titleTestTag = titleTestTag,
+ subtitleTestTag = subtitleTestTag,
)
}
}
@@ -168,37 +195,60 @@ private fun WearPermissionScaffoldInternal(
}
@Composable
-private fun BoxScope.ScrollingView(
- contentPadding: PaddingValues,
- columnState: TransformingLazyColumnState,
- icon: Painter?,
+private fun BoxScope.LazyColumnView(
+ asScalingList: Boolean = false,
+ listState: ScrollableState,
title: String?,
- titleTestTag: String?,
subtitle: CharSequence?,
- subtitleTestTag: String?,
- titlePaddingValues: PaddingValues,
- subTitlePaddingValues: PaddingValues,
- content: TransformingLazyColumnScope.() -> Unit,
+ image: Any?,
+ content: ListScopeWrapper.() -> Unit,
+ titleTestTag: String? = null,
+ subtitleTestTag: String? = null,
) {
- TransformingLazyColumn(
- contentPadding = contentPadding,
- state = columnState,
- modifier = Modifier.background(MaterialTheme.colorScheme.background),
- ) {
- with(TransformingScopeConverter(this)) {
- iconItem(icon, Modifier.size(IconButtonDefaults.LargeIconSize))
+ val screenWidth = LocalConfiguration.current.screenWidthDp
+ val screenHeight = LocalConfiguration.current.screenHeightDp
+ val paddingDefaults =
+ WearPermissionScaffoldPaddingDefaults(
+ screenWidth = screenWidth,
+ screenHeight = screenHeight,
+ )
+ val painterImage = image?.let { painterFromImage(image = image) }
+
+ fun BoxScope.scrollingViewContent(scopeWrapper: ListScopeWrapper) {
+ with(scopeWrapper) {
+ iconItem(
+ painter = painterImage,
+ modifier = Modifier.size(IconButtonDefaults.LargeIconSize),
+ )
titleItem(
text = title,
testTag = titleTestTag,
- contentPaddingValues = titlePaddingValues,
+ contentPaddingValues = paddingDefaults.titlePaddingValues(subtitle == null),
)
subtitleItem(
text = subtitle,
testTag = subtitleTestTag,
- modifier = Modifier.align(Alignment.Center).padding(subTitlePaddingValues),
+ modifier =
+ Modifier.align(Alignment.Center).padding(paddingDefaults.subTitlePaddingValues),
)
+ content()
}
- content()
+ }
+
+ if (asScalingList) {
+ ScalingLazyColumn(
+ contentPadding = paddingDefaults.scrollContentPadding,
+ state = listState as ScalingLazyListState,
+ modifier = Modifier.background(MaterialTheme.colorScheme.background),
+ content = { scrollingViewContent(ScalingScopeConverter(this)) },
+ )
+ } else {
+ TransformingLazyColumn(
+ contentPadding = paddingDefaults.scrollContentPadding,
+ state = listState as TransformingLazyColumnState,
+ modifier = Modifier.background(MaterialTheme.colorScheme.background),
+ content = { scrollingViewContent(TransformingScopeConverter(this)) },
+ )
}
}
@@ -221,6 +271,17 @@ private fun wearPermissionScrollIndicator(
}
}
+private fun wearPermissionScrollIndicator(
+ showIndicator: Boolean,
+ columnState: ScalingLazyListState,
+): @Composable (BoxScope.() -> Unit)? {
+ return if (showIndicator) {
+ { ScrollIndicator(modifier = Modifier.align(Alignment.CenterEnd), state = columnState) }
+ } else {
+ null
+ }
+}
+
@Composable
private fun painterFromImage(image: Any?): Painter? {
return when (image) {