diff options
16 files changed, 187 insertions, 41 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt index 3910903af4aa..ae7c44e9b146 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt @@ -35,7 +35,7 @@ import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class EditTileListStateTest : SysuiTestCase() { - private val underTest = EditTileListState(TestEditTiles, 4) + private val underTest = EditTileListState(TestEditTiles, columns = 4, largeTilesSpan = 2) @Test fun startDrag_listHasSpacers() { diff --git a/packages/SystemUI/res/values-sw600dp-port/config.xml b/packages/SystemUI/res/values-sw600dp-port/config.xml index f556b97eefc2..53d921b5e534 100644 --- a/packages/SystemUI/res/values-sw600dp-port/config.xml +++ b/packages/SystemUI/res/values-sw600dp-port/config.xml @@ -33,6 +33,9 @@ <!-- The number of columns in the infinite grid QuickSettings --> <integer name="quick_settings_infinite_grid_num_columns">6</integer> + <!-- The maximum width of large tiles in the infinite grid QuickSettings --> + <integer name="quick_settings_infinite_grid_tile_max_width">3</integer> + <integer name="power_menu_lite_max_columns">2</integer> <integer name="power_menu_lite_max_rows">3</integer> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 0854eb46ffdd..48af82ad7943 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -79,6 +79,9 @@ <!-- The number of columns in the infinite grid QuickSettings --> <integer name="quick_settings_infinite_grid_num_columns">4</integer> + <!-- The maximum width of large tiles in the infinite grid QuickSettings --> + <integer name="quick_settings_infinite_grid_tile_max_width">4</integer> + <!-- The number of columns in the Dual Shade QuickSettings --> <integer name="quick_settings_dual_shade_num_columns">4</integer> diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepository.kt new file mode 100644 index 000000000000..58834037e2b7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepository.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.panels.data.repository + +import android.content.res.Resources +import com.android.systemui.common.ui.data.repository.ConfigurationRepository +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.res.R +import com.android.systemui.util.kotlin.emitOnStart +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.stateIn + +@OptIn(ExperimentalCoroutinesApi::class) +@SysUISingleton +class LargeTileSpanRepository +@Inject +constructor( + @Application scope: CoroutineScope, + @Main private val resources: Resources, + configurationRepository: ConfigurationRepository, +) { + val span: StateFlow<Int> = + configurationRepository.onConfigurationChange + .emitOnStart() + .mapLatest { + if (resources.configuration.fontScale >= FONT_SCALE_THRESHOLD) { + resources.getInteger(R.integer.quick_settings_infinite_grid_tile_max_width) + } else { + 2 + } + } + .distinctUntilChanged() + .stateIn(scope, SharingStarted.WhileSubscribed(), 2) + + private companion object { + const val FONT_SCALE_THRESHOLD = 2f + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt index ec61a0d5769e..23c79f576df5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt @@ -21,12 +21,14 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository +import com.android.systemui.qs.panels.data.repository.LargeTileSpanRepository import com.android.systemui.qs.panels.shared.model.PanelsLog import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor import com.android.systemui.qs.pipeline.shared.TileSpec import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn @@ -38,6 +40,7 @@ constructor( private val repo: DefaultLargeTilesRepository, private val currentTilesInteractor: CurrentTilesInteractor, private val preferencesInteractor: QSPreferencesInteractor, + largeTilesSpanRepo: LargeTileSpanRepository, @PanelsLog private val logBuffer: LogBuffer, @Application private val applicationScope: CoroutineScope, ) { @@ -46,6 +49,8 @@ constructor( .onEach { logChange(it) } .stateIn(applicationScope, SharingStarted.Eagerly, repo.defaultLargeTiles) + val largeTilesSpan: StateFlow<Int> = largeTilesSpanRepo.span + fun isIconTile(spec: TileSpec): Boolean = !largeTilesSpecs.value.contains(spec) fun setLargeTiles(specs: Set<TileSpec>) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt index 74fa0fef21d7..c729c7c15176 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditTileListState.kt @@ -37,13 +37,17 @@ import com.android.systemui.qs.pipeline.shared.TileSpec fun rememberEditListState( tiles: List<SizedTile<EditTileViewModel>>, columns: Int, + largeTilesSpan: Int, ): EditTileListState { - return remember(tiles, columns) { EditTileListState(tiles, columns) } + return remember(tiles, columns) { EditTileListState(tiles, columns, largeTilesSpan) } } /** Holds the temporary state of the tile list during a drag movement where we move tiles around. */ -class EditTileListState(tiles: List<SizedTile<EditTileViewModel>>, private val columns: Int) : - DragAndDropState { +class EditTileListState( + tiles: List<SizedTile<EditTileViewModel>>, + private val columns: Int, + private val largeTilesSpan: Int, +) : DragAndDropState { private val _draggedCell = mutableStateOf<SizedTile<EditTileViewModel>?>(null) override val draggedCell get() = _draggedCell.value @@ -86,7 +90,7 @@ class EditTileListState(tiles: List<SizedTile<EditTileViewModel>>, private val c if (fromIndex != -1) { val cell = _tiles.removeAt(fromIndex) cell as TileGridCell - _tiles.add(fromIndex, cell.copy(width = if (cell.isIcon) 2 else 1)) + _tiles.add(fromIndex, cell.copy(width = if (cell.isIcon) largeTilesSpan else 1)) regenerateGrid(fromIndex) } } 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 0e5de24a201f..31ea60e2f0bc 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 @@ -173,6 +173,7 @@ fun DefaultEditTileGrid( listState: EditTileListState, otherTiles: List<SizedTile<EditTileViewModel>>, columns: Int, + largeTilesSpan: Int, modifier: Modifier, onRemoveTile: (TileSpec) -> Unit, onSetTiles: (List<TileSpec>) -> Unit, @@ -230,7 +231,14 @@ fun DefaultEditTileGrid( } } - CurrentTilesGrid(listState, selectionState, columns, onResize, onSetTiles) + CurrentTilesGrid( + listState, + selectionState, + columns, + largeTilesSpan, + onResize, + onSetTiles, + ) // Hide available tiles when dragging AnimatedVisibility( @@ -273,7 +281,7 @@ private fun EditGridHeader( ) { Box( contentAlignment = Alignment.Center, - modifier = modifier.fillMaxWidth().height(EditModeTileDefaults.EditGridHeaderHeight), + modifier = modifier.fillMaxWidth().wrapContentHeight(), ) { content() } @@ -300,6 +308,7 @@ private fun CurrentTilesGrid( listState: EditTileListState, selectionState: MutableSelectionState, columns: Int, + largeTilesSpan: Int, onResize: (TileSpec, toIcon: Boolean) -> Unit, onSetTiles: (List<TileSpec>) -> Unit, ) { @@ -340,7 +349,8 @@ private fun CurrentTilesGrid( } .testTag(CURRENT_TILES_GRID_TEST_TAG), ) { - EditTiles(cells, columns, listState, selectionState, coroutineScope) { spec -> + EditTiles(cells, columns, listState, selectionState, coroutineScope, largeTilesSpan) { spec + -> // Toggle the current size of the tile currentListState.isIcon(spec)?.let { onResize(spec, !it) } } @@ -425,6 +435,7 @@ fun LazyGridScope.EditTiles( dragAndDropState: DragAndDropState, selectionState: MutableSelectionState, coroutineScope: CoroutineScope, + largeTilesSpan: Int, onToggleSize: (spec: TileSpec) -> Unit, ) { items( @@ -456,6 +467,7 @@ fun LazyGridScope.EditTiles( onToggleSize = onToggleSize, coroutineScope = coroutineScope, bounceableInfo = cells.bounceableInfo(index, columns), + largeTilesSpan = largeTilesSpan, modifier = Modifier.animateItem(), ) } @@ -472,6 +484,7 @@ private fun TileGridCell( selectionState: MutableSelectionState, onToggleSize: (spec: TileSpec) -> Unit, coroutineScope: CoroutineScope, + largeTilesSpan: Int, bounceableInfo: BounceableInfo, modifier: Modifier = Modifier, ) { @@ -514,8 +527,11 @@ private fun TileGridCell( .fillMaxWidth() .onSizeChanged { // Grab the size before the bounceable to get the idle width - val min = if (cell.isIcon) it.width else (it.width - padding) / 2 - val max = if (cell.isIcon) (it.width * 2) + padding else it.width + val totalPadding = (largeTilesSpan - 1) * padding + val min = + if (cell.isIcon) it.width else (it.width - totalPadding) / largeTilesSpan + val max = + if (cell.isIcon) (it.width * largeTilesSpan) + totalPadding else it.width tileWidths = TileWidths(it.width, min, max) } .bounceable( @@ -554,15 +570,13 @@ private fun TileGridCell( val targetValue = if (cell.isIcon) 0f else 1f val animatedProgress = remember { Animatable(targetValue) } - if (selected) { - val resizingState = selectionState.resizingState - LaunchedEffect(targetValue, resizingState) { - if (resizingState == null) { - animatedProgress.animateTo(targetValue) - } else { - snapshotFlow { resizingState.progression } - .collectLatest { animatedProgress.snapTo(it) } - } + val resizingState = selectionState.resizingState?.takeIf { selected } + LaunchedEffect(targetValue, resizingState) { + if (resizingState == null) { + animatedProgress.animateTo(targetValue) + } else { + snapshotFlow { resizingState.progression } + .collectLatest { animatedProgress.snapTo(it) } } } @@ -705,7 +719,6 @@ private fun Modifier.tileBackground(color: Color): Modifier { private object EditModeTileDefaults { const val PLACEHOLDER_ALPHA = .3f - val EditGridHeaderHeight = 60.dp val CurrentTilesGridPadding = 8.dp @Composable diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt index 5ac2ad02d671..29ff1715dea2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt @@ -79,7 +79,8 @@ constructor( } val columns = columnsWithMediaViewModel.columns - val sizedTiles = tiles.map { SizedTileImpl(it, it.spec.width()) } + val largeTilesSpan by iconTilesViewModel.largeTilesSpanState + val sizedTiles = tiles.map { SizedTileImpl(it, it.spec.width(largeTilesSpan)) } val bounceables = remember(sizedTiles) { List(sizedTiles.size) { BounceableTileViewModel() } } val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle() @@ -129,21 +130,23 @@ constructor( viewModel.columnsWithMediaViewModelFactory.createWithoutMediaTracking() } val columns = columnsViewModel.columns + val largeTilesSpan by iconTilesViewModel.largeTilesSpanState val largeTiles by iconTilesViewModel.largeTiles.collectAsStateWithLifecycle() // Non-current tiles should always be displayed as icon tiles. val sizedTiles = - remember(tiles, largeTiles) { + remember(tiles, largeTiles, largeTilesSpan) { tiles.map { SizedTileImpl( it, - if (!it.isCurrent || !largeTiles.contains(it.tileSpec)) 1 else 2, + if (!it.isCurrent || !largeTiles.contains(it.tileSpec)) 1 + else largeTilesSpan, ) } } val (currentTiles, otherTiles) = sizedTiles.partition { it.tile.isCurrent } - val currentListState = rememberEditListState(currentTiles, columns) + val currentListState = rememberEditListState(currentTiles, columns, largeTilesSpan) DefaultEditTileGrid( listState = currentListState, otherTiles = otherTiles, @@ -154,6 +157,7 @@ constructor( onResize = iconTilesViewModel::resize, onStopEditing = onStopEditing, onReset = viewModel::showResetDialog, + largeTilesSpan = largeTilesSpan, ) } @@ -171,7 +175,7 @@ constructor( .map { it.flatten().map { it.tile } } } - private fun TileSpec.width(): Int { - return if (iconTilesViewModel.isIconTile(this)) 1 else 2 + private fun TileSpec.width(largeSize: Int = iconTilesViewModel.largeTilesSpan.value): Int { + return if (iconTilesViewModel.isIconTile(this)) 1 else largeSize } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/ResizingState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/ResizingState.kt index 9552aa935bbf..41c3de55af70 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/ResizingState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/selection/ResizingState.kt @@ -22,7 +22,7 @@ import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.setValue import com.android.systemui.qs.panels.ui.compose.selection.ResizingDefaults.RESIZING_THRESHOLD -class ResizingState(private val widths: TileWidths, private val onResize: () -> Unit) { +class ResizingState(val widths: TileWidths, private val onResize: () -> Unit) { /** Total drag offset of this resize operation. */ private var totalOffset by mutableFloatStateOf(0f) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt index 9feaab83cc1f..a9d673aa7400 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt @@ -17,9 +17,13 @@ package com.android.systemui.qs.panels.ui.viewmodel import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.lifecycle.Hydrator import com.android.systemui.qs.panels.domain.interactor.DynamicIconTilesInteractor import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch /** View model to resize QS tiles down to icons when removed from the current tiles. */ class DynamicIconTilesViewModel @@ -28,10 +32,21 @@ constructor( interactorFactory: DynamicIconTilesInteractor.Factory, iconTilesViewModel: IconTilesViewModel, ) : IconTilesViewModel by iconTilesViewModel, ExclusiveActivatable() { + private val hydrator = Hydrator("DynamicIconTilesViewModel") private val interactor = interactorFactory.create() + val largeTilesSpanState = + hydrator.hydratedStateOf( + traceName = "largeTilesSpan", + source = iconTilesViewModel.largeTilesSpan, + ) + override suspend fun onActivated(): Nothing { - interactor.activate() + coroutineScope { + launch { hydrator.activate() } + launch { interactor.activate() } + awaitCancellation() + } } @AssistedFactory diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconTilesViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconTilesViewModel.kt index 4e698edf4e34..b8c5fbb72614 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconTilesViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconTilesViewModel.kt @@ -25,6 +25,8 @@ import kotlinx.coroutines.flow.StateFlow interface IconTilesViewModel { val largeTiles: StateFlow<Set<TileSpec>> + val largeTilesSpan: StateFlow<Int> + fun isIconTile(spec: TileSpec): Boolean fun resize(spec: TileSpec, toIcon: Boolean) @@ -34,6 +36,7 @@ interface IconTilesViewModel { class IconTilesViewModelImpl @Inject constructor(private val interactor: IconTilesInteractor) : IconTilesViewModel { override val largeTiles = interactor.largeTilesSpecs + override val largeTilesSpan = interactor.largeTilesSpan override fun isIconTile(spec: TileSpec): Boolean = interactor.isIconTile(spec) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt index 33ce5519b68c..adc4e4bf0870 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt @@ -70,18 +70,21 @@ constructor( source = quickQuickSettingsRowInteractor.rows, ) + private val largeTilesSpan by + hydrator.hydratedStateOf( + traceName = "largeTilesSpan", + source = iconTilesViewModel.largeTilesSpan, + ) + private val currentTiles by hydrator.hydratedStateOf(traceName = "currentTiles", source = tilesInteractor.currentTiles) val tileViewModels by derivedStateOf { currentTiles - .map { SizedTileImpl(TileViewModel(it.tile, it.spec), it.spec.width) } + .map { SizedTileImpl(TileViewModel(it.tile, it.spec), it.spec.width()) } .let { splitInRowsSequence(it, columns).take(rows).toList().flatten() } } - private val TileSpec.width: Int - get() = if (largeTiles.contains(this)) 2 else 1 - override suspend fun onActivated(): Nothing { coroutineScope { launch { hydrator.activate() } @@ -95,4 +98,6 @@ constructor( interface Factory { fun create(): QuickQuickSettingsViewModel } + + private fun TileSpec.width(): Int = if (largeTiles.contains(this)) largeTilesSpan else 1 } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt index 8a6df1cbb4de..d88d69da5e59 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt @@ -63,6 +63,7 @@ class DragAndDropTest : SysuiTestCase() { listState = listState, otherTiles = listOf(), columns = 4, + largeTilesSpan = 4, modifier = Modifier.fillMaxSize(), onRemoveTile = {}, onSetTiles = onSetTiles, @@ -75,7 +76,7 @@ class DragAndDropTest : SysuiTestCase() { @Test fun draggedTile_shouldDisappear() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { tiles = it.map { tileSpec -> createEditTile(tileSpec.spec) } @@ -101,7 +102,7 @@ class DragAndDropTest : SysuiTestCase() { @Test fun draggedTile_shouldChangePosition() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { tiles = it.map { tileSpec -> createEditTile(tileSpec.spec) } @@ -128,7 +129,7 @@ class DragAndDropTest : SysuiTestCase() { @Test fun draggedTileOut_shouldBeRemoved() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { tiles = it.map { tileSpec -> createEditTile(tileSpec.spec) } @@ -153,7 +154,7 @@ class DragAndDropTest : SysuiTestCase() { @Test fun draggedNewTileIn_shouldBeAdded() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { tiles = it.map { tileSpec -> createEditTile(tileSpec.spec) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt index d9c1d998798c..fac5ecb49027 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt @@ -62,6 +62,7 @@ class ResizingTest : SysuiTestCase() { listState = listState, otherTiles = listOf(), columns = 4, + largeTilesSpan = 4, modifier = Modifier.fillMaxSize(), onRemoveTile = {}, onSetTiles = {}, @@ -74,7 +75,7 @@ class ResizingTest : SysuiTestCase() { @Test fun toggleIconTile_shouldBeLarge() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { spec, toIcon -> tiles = tiles.resize(spec, toIcon) } } @@ -90,7 +91,7 @@ class ResizingTest : SysuiTestCase() { @Test fun toggleLargeTile_shouldBeIcon() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { spec, toIcon -> tiles = tiles.resize(spec, toIcon) } } @@ -106,7 +107,7 @@ class ResizingTest : SysuiTestCase() { @Test fun resizedLarge_shouldBeIcon() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { spec, toIcon -> tiles = tiles.resize(spec, toIcon) } } @@ -126,7 +127,7 @@ class ResizingTest : SysuiTestCase() { @Test fun resizedIcon_shouldBeLarge() { var tiles by mutableStateOf(TestEditTiles) - val listState = EditTileListState(tiles, 4) + val listState = EditTileListState(tiles, columns = 4, largeTilesSpan = 2) composeRule.setContent { EditTileGridUnderTest(listState) { spec, toIcon -> tiles = tiles.resize(spec, toIcon) } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepositoryKosmos.kt new file mode 100644 index 000000000000..a977121b3803 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/data/repository/LargeTileSpanRepositoryKosmos.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.qs.panels.data.repository + +import android.content.res.mainResources +import com.android.systemui.common.ui.data.repository.configurationRepository +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope + +val Kosmos.largeTileSpanRepository by + Kosmos.Fixture { + LargeTileSpanRepository(applicationCoroutineScope, mainResources, configurationRepository) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorKosmos.kt index 0c62d0e85ce1..8d4db8b74061 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorKosmos.kt @@ -20,6 +20,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.log.core.FakeLogBuffer import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository +import com.android.systemui.qs.panels.data.repository.largeTileSpanRepository import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor val Kosmos.iconTilesInteractor by @@ -28,7 +29,8 @@ val Kosmos.iconTilesInteractor by defaultLargeTilesRepository, currentTilesInteractor, qsPreferencesInteractor, + largeTileSpanRepository, FakeLogBuffer.Factory.create(), - applicationCoroutineScope + applicationCoroutineScope, ) } |