From be9f1ab1dbf2bc99106dadd91e87c0bc1cb2adef Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Mon, 17 Mar 2025 19:40:29 -0400 Subject: Adjust animations for edit mode Adds a slight bounce to the placement of tiles in edit mode to match the motion mocks. Also cleans up leftover code from bounceables Test: manually Flag: com.android.systemui.qs_ui_refactor_compose_fragment Bug: 339262264 Change-Id: I765c8fe5069ec394fe34b98f84ee80b860a76070 --- .../qs/panels/ui/compose/infinitegrid/EditTile.kt | 43 ++++++++++++---------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index f8eaa6c3bcfb..b064f0b243ad 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -22,8 +22,11 @@ import androidx.compose.animation.AnimatedContent import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.Spring +import androidx.compose.animation.core.VisibilityThreshold import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.spring import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -118,6 +121,7 @@ import androidx.compose.ui.text.style.Hyphens import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastMap import com.android.compose.gesture.effect.rememberOffsetOverscrollEffectFactory @@ -157,7 +161,6 @@ import com.android.systemui.qs.panels.ui.model.AvailableTileGridCell import com.android.systemui.qs.panels.ui.model.GridCell import com.android.systemui.qs.panels.ui.model.SpacerGridCell import com.android.systemui.qs.panels.ui.model.TileGridCell -import com.android.systemui.qs.panels.ui.viewmodel.BounceableTileViewModel import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.shared.model.groupAndSort @@ -220,7 +223,6 @@ private fun EditModeTopBar(onStopEditing: () -> Unit, onReset: (() -> Unit)?) { ) } -@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun DefaultEditTileGrid( listState: EditTileListState, @@ -526,11 +528,7 @@ private fun CurrentTilesGrid( var gridContentOffset by remember { mutableStateOf(Offset(0f, 0f)) } val coroutineScope = rememberCoroutineScope() - val cells = - remember(listState.tiles) { - listState.tiles.fastMap { Pair(it, BounceableTileViewModel()) } - } - + val cells = listState.tiles val primaryColor = MaterialTheme.colorScheme.primary TileLazyGrid( state = gridState, @@ -561,11 +559,11 @@ private fun CurrentTilesGrid( .testTag(CURRENT_TILES_GRID_TEST_TAG), ) { EditTiles( - cells, - listState, - selectionState, - coroutineScope, - largeTilesSpan, + cells = cells, + dragAndDropState = listState, + selectionState = selectionState, + coroutineScope = coroutineScope, + largeTilesSpan = largeTilesSpan, onRemoveTile = onRemoveTile, ) { resizingOperation -> when (resizingOperation) { @@ -662,7 +660,7 @@ private fun GridCell.key(index: Int): Any { /** * Adds a list of [GridCell] to the lazy grid * - * @param cells the pairs of [GridCell] to [BounceableTileViewModel] + * @param cells the list of [GridCell] * @param dragAndDropState the [DragAndDropState] for this grid * @param selectionState the [MutableSelectionState] for this grid * @param coroutineScope the [CoroutineScope] to be used for the tiles @@ -671,7 +669,7 @@ private fun GridCell.key(index: Int): Any { * @param onResize the callback when a tile has a new [ResizeOperation] */ fun LazyGridScope.EditTiles( - cells: List>, + cells: List, dragAndDropState: DragAndDropState, selectionState: MutableSelectionState, coroutineScope: CoroutineScope, @@ -681,11 +679,11 @@ fun LazyGridScope.EditTiles( ) { items( count = cells.size, - key = { cells[it].first.key(it) }, - span = { cells[it].first.span }, + key = { cells[it].key(it) }, + span = { cells[it].span }, contentType = { TileType }, ) { index -> - when (val cell = cells[index].first) { + when (val cell = cells[index]) { is TileGridCell -> if (dragAndDropState.isMoving(cell.tile.tileSpec)) { // If the tile is being moved, replace it with a visible spacer @@ -708,7 +706,15 @@ fun LazyGridScope.EditTiles( onRemoveTile = onRemoveTile, coroutineScope = coroutineScope, largeTilesSpan = largeTilesSpan, - modifier = Modifier.animateItem(), + modifier = + Modifier.animateItem( + placementSpec = + spring( + stiffness = Spring.StiffnessMediumLow, + dampingRatio = Spring.DampingRatioLowBouncy, + visibilityThreshold = IntOffset.VisibilityThreshold, + ) + ), ) } is SpacerGridCell -> @@ -851,7 +857,6 @@ private fun TileGridCell( } } -@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable private fun AvailableTileGridCell( cell: AvailableTileGridCell, -- cgit v1.2.3-59-g8ed1b From 2f79ff0f9a46568602689ece0fa647a0d7806dd2 Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Tue, 18 Mar 2025 15:51:10 -0400 Subject: Add categories icons for edit mode Test: manually Flag: com.android.systemui.qs_ui_refactor_compose_fragment Bug: 339262264 Change-Id: I2b4062c2c5138b61bbee0975579cf1797fd23aed --- .../res/drawable/ic_qs_category_accessibility.xml | 26 +++++++++++++++ .../res/drawable/ic_qs_category_connectivty.xml | 26 +++++++++++++++ .../res/drawable/ic_qs_category_display.xml | 26 +++++++++++++++ .../res/drawable/ic_qs_category_privacy.xml | 26 +++++++++++++++ .../drawable/ic_qs_category_provided_by_apps.xml | 26 +++++++++++++++ .../res/drawable/ic_qs_category_unknown.xml | 26 +++++++++++++++ .../res/drawable/ic_qs_category_utilities.xml | 26 +++++++++++++++ .../qs/panels/ui/compose/infinitegrid/EditTile.kt | 31 +++++++++++++++--- .../systemui/qs/shared/model/TileCategory.kt | 37 +++++++++++++++++----- 9 files changed, 237 insertions(+), 13 deletions(-) create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_accessibility.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_connectivty.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_display.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_privacy.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_provided_by_apps.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_unknown.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_category_utilities.xml diff --git a/packages/SystemUI/res/drawable/ic_qs_category_accessibility.xml b/packages/SystemUI/res/drawable/ic_qs_category_accessibility.xml new file mode 100644 index 000000000000..bc62d38f1932 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_accessibility.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_connectivty.xml b/packages/SystemUI/res/drawable/ic_qs_category_connectivty.xml new file mode 100644 index 000000000000..91644873c064 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_connectivty.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_display.xml b/packages/SystemUI/res/drawable/ic_qs_category_display.xml new file mode 100644 index 000000000000..c238e940eb01 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_display.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_privacy.xml b/packages/SystemUI/res/drawable/ic_qs_category_privacy.xml new file mode 100644 index 000000000000..915cf41ba1f6 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_privacy.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_provided_by_apps.xml b/packages/SystemUI/res/drawable/ic_qs_category_provided_by_apps.xml new file mode 100644 index 000000000000..cea43ae1bc2f --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_provided_by_apps.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_unknown.xml b/packages/SystemUI/res/drawable/ic_qs_category_unknown.xml new file mode 100644 index 000000000000..ec2ce15e2d01 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_unknown.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_category_utilities.xml b/packages/SystemUI/res/drawable/ic_qs_category_utilities.xml new file mode 100644 index 000000000000..4dfac8393b8e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_category_utilities.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index b064f0b243ad..b8cb2c4844e4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -111,6 +111,7 @@ import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.CustomAccessibilityAction import androidx.compose.ui.semantics.contentDescription @@ -163,6 +164,7 @@ import com.android.systemui.qs.panels.ui.model.SpacerGridCell import com.android.systemui.qs.panels.ui.model.TileGridCell import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.shared.model.TileCategory import com.android.systemui.qs.shared.model.groupAndSort import com.android.systemui.res.R import kotlin.math.abs @@ -616,11 +618,9 @@ private fun AvailableTileGrid( } .padding(16.dp), ) { - Text( - text = category.label.load() ?: "", - style = MaterialTheme.typography.titleMediumEmphasized, - color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.fillMaxWidth().padding(start = 8.dp, bottom = 16.dp), + CategoryHeader( + category, + modifier = Modifier.fillMaxWidth().padding(bottom = 16.dp), ) tiles.chunked(columns).forEach { row -> Row( @@ -857,6 +857,27 @@ private fun TileGridCell( } } +@OptIn(ExperimentalMaterial3ExpressiveApi::class) +@Composable +private fun CategoryHeader(category: TileCategory, modifier: Modifier = Modifier) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = spacedBy(8.dp), + modifier = modifier, + ) { + Icon( + painter = painterResource(category.iconId), + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurface, + ) + Text( + text = category.label.load() ?: "", + style = MaterialTheme.typography.titleMediumEmphasized, + color = MaterialTheme.colorScheme.onSurface, + ) + } +} + @Composable private fun AvailableTileGridCell( cell: AvailableTileGridCell, diff --git a/packages/SystemUI/src/com/android/systemui/qs/shared/model/TileCategory.kt b/packages/SystemUI/src/com/android/systemui/qs/shared/model/TileCategory.kt index 59cb7d3d5345..c8225e7a3509 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/shared/model/TileCategory.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/shared/model/TileCategory.kt @@ -20,14 +20,35 @@ import com.android.systemui.common.shared.model.Text import com.android.systemui.res.R /** Categories for tiles. This can be used to sort tiles in edit mode. */ -enum class TileCategory(val label: Text) { - CONNECTIVITY(Text.Resource(R.string.qs_edit_mode_category_connectivity)), - UTILITIES(Text.Resource(R.string.qs_edit_mode_category_utilities)), - DISPLAY(Text.Resource(R.string.qs_edit_mode_category_display)), - PRIVACY(Text.Resource(R.string.qs_edit_mode_category_privacy)), - ACCESSIBILITY(Text.Resource(R.string.qs_edit_mode_category_accessibility)), - PROVIDED_BY_APP(Text.Resource(R.string.qs_edit_mode_category_providedByApps)), - UNKNOWN(Text.Resource(R.string.qs_edit_mode_category_unknown)), +enum class TileCategory(val label: Text, val iconId: Int) { + CONNECTIVITY( + Text.Resource(R.string.qs_edit_mode_category_connectivity), + R.drawable.ic_qs_category_connectivty, + ), + UTILITIES( + Text.Resource(R.string.qs_edit_mode_category_utilities), + R.drawable.ic_qs_category_utilities, + ), + DISPLAY( + Text.Resource(R.string.qs_edit_mode_category_display), + R.drawable.ic_qs_category_display, + ), + PRIVACY( + Text.Resource(R.string.qs_edit_mode_category_privacy), + R.drawable.ic_qs_category_privacy, + ), + ACCESSIBILITY( + Text.Resource(R.string.qs_edit_mode_category_accessibility), + R.drawable.ic_qs_category_accessibility, + ), + PROVIDED_BY_APP( + Text.Resource(R.string.qs_edit_mode_category_providedByApps), + R.drawable.ic_qs_category_provided_by_apps, + ), + UNKNOWN( + Text.Resource(R.string.qs_edit_mode_category_unknown), + R.drawable.ic_qs_category_unknown, + ), } interface CategoryAndName { -- cgit v1.2.3-59-g8ed1b