diff options
author | 2025-02-04 06:52:05 -0800 | |
---|---|---|
committer | 2025-02-04 06:52:05 -0800 | |
commit | 694f01b016f137012fe39740bb7804d5d9740e4f (patch) | |
tree | 087f0e8e8b33c7cca16c257c54ef8c1a8f6bc37c | |
parent | 6270b48bedb00dc1a826fe5c15955e502ba2e7cf (diff) | |
parent | d97eddfde4fc25485c3ba5b9eeb102137fa31889 (diff) |
Merge "Supporting TLC and SLC with Material3" into main
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) { |