Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,7 @@ class EditTileListStateTest : SysuiTestCase() { label = AnnotatedString("unused"), appName = null, isCurrent = true, isDualTarget = false, availableEditActions = emptySet(), category = TileCategory.UNKNOWN, ) Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt +62 −12 Original line number Diff line number Diff line Loading @@ -30,9 +30,10 @@ import com.android.systemui.common.shared.model.Text import com.android.systemui.common.ui.compose.toAnnotatedString import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.FakeQSFactory import com.android.systemui.qs.FakeQSTile import com.android.systemui.qs.QSEditEvent Loading Loading @@ -64,7 +65,6 @@ import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading @@ -80,7 +80,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { mSetFlagsRule.setFlagsParameterization(flags) } private val kosmos = testKosmos() private val kosmos = testKosmos().useUnconfinedTestDispatcher() // Only have some configurations so we can test the effect of missing configurations. // As the configurations are injected by dagger, we'll have all the existing configurations Loading Loading @@ -514,7 +514,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) currentTilesInteractor.setTiles(currentTiles) underTest.startEditing() runCurrent() // Move flashlight tile to index 3 underTest.addTile(TileSpec.create("flashlight"), 3) Loading @@ -539,7 +538,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) currentTilesInteractor.setTiles(currentTiles) underTest.startEditing() runCurrent() // Move alarm tile to index 0 underTest.addTile(TileSpec.create("alarm"), 0) Loading Loading @@ -588,7 +586,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val internetTile = TileSpec.create("internet") val customTile = TileSpec.create(component2) currentTilesInteractor.setTiles(listOf(flashlightTile)) runCurrent() underTest.addTile(airplaneTile) underTest.addTile(internetTile, position = 0) Loading Loading @@ -620,7 +617,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val airplaneTile = TileSpec.create("airplane") val internetTile = TileSpec.create("internet") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() underTest.addTile(flashlightTile) // adding at the end, should use correct position underTest.addTile(internetTile, 0) Loading @@ -647,7 +643,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val airplaneTile = TileSpec.create("airplane") val internetTile = TileSpec.create("internet") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() underTest.removeTile(airplaneTile) Loading @@ -668,19 +663,15 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val alarmTile = TileSpec.create("alarm") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() // 0. Move flashlightTile to position 2 underTest.setTiles(listOf(airplaneTile, internetTile, flashlightTile)) runCurrent() // 1. Add alarm tile at position 1 underTest.setTiles(listOf(airplaneTile, alarmTile, internetTile, flashlightTile)) runCurrent() // 2. Remove internetTile underTest.setTiles(listOf(airplaneTile, alarmTile, flashlightTile)) runCurrent() assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3) Loading @@ -700,6 +691,65 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } } @Test fun currentTiles_checksForDualTarget() = with(kosmos) { testScope.runTest { val tiles by collectLastValue(underTest.tiles) val currentTiles = mutableListOf( TileSpec.create("flashlight"), TileSpec.create("airplane"), TileSpec.create("internet"), TileSpec.create("alarm"), ) currentTilesInteractor.setTiles(currentTiles) val tile = currentTilesInteractor.currentTiles.value.find { it.spec.spec == "flashlight" } (tile!!.tile as FakeQSTile).changeState( QSTile.State().apply { handlesSecondaryClick = true } ) underTest.startEditing() assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }) .containsExactly("flashlight") } } @Test fun removeTile_noLongerDualTarget() = with(kosmos) { testScope.runTest { val tiles by collectLastValue(underTest.tiles) val currentTiles = mutableListOf( TileSpec.create("flashlight"), TileSpec.create("airplane"), TileSpec.create("internet"), TileSpec.create("alarm"), ) currentTilesInteractor.setTiles(currentTiles) val tile = currentTilesInteractor.currentTiles.value.find { it.spec.spec == "flashlight" } (tile!!.tile as FakeQSTile).changeState( QSTile.State().apply { handlesSecondaryClick = true } ) underTest.startEditing() assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }) .containsExactly("flashlight") underTest.removeTile(TileSpec.create("flashlight")) assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }).isEmpty() } } companion object { private val drawable1 = TestStubDrawable("drawable1") private val appName1 = "App1" Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +8 −4 Original line number Diff line number Diff line Loading @@ -1002,7 +1002,7 @@ fun EditTile( colors: TileColors = EditModeTileDefaults.editTileColors(), ) { val iconSizeDiff = CommonTileDefaults.IconSize - CommonTileDefaults.LargeTileIconSize val alpha by animateFloatAsState(if (tileState == TileState.GreyedOut) .4f else 1f) val containerAlpha by animateFloatAsState(if (tileState == TileState.GreyedOut) .4f else 1f) Row( horizontalArrangement = spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically, Loading Loading @@ -1036,10 +1036,14 @@ fun EditTile( } } .largeTilePadding() .graphicsLayer { this.alpha = alpha }, .graphicsLayer { this.alpha = containerAlpha }, ) { // Icon Box(Modifier.size(ToggleTargetSize)) { Box( Modifier.size(ToggleTargetSize).thenIf(tile.isDualTarget) { Modifier.drawBehind { drawCircle(colors.iconBackground, alpha = progress()) } } ) { SmallTileContent( iconProvider = { tile.icon }, color = colors.icon, Loading Loading @@ -1082,7 +1086,7 @@ private object EditModeTileDefaults { fun editTileColors(): TileColors = TileColors( background = LocalAndroidColorScheme.current.surfaceEffect1, iconBackground = Color.Transparent, iconBackground = LocalAndroidColorScheme.current.surfaceEffect2, label = MaterialTheme.colorScheme.onSurface, secondaryLabel = MaterialTheme.colorScheme.onSurface, icon = MaterialTheme.colorScheme.onSurface, Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt +9 −2 Original line number Diff line number Diff line Loading @@ -101,8 +101,8 @@ constructor( * cannot be created), and they won't be able to be added. */ val tiles: Flow<List<EditTileViewModel>> = isEditing.flatMapLatest { if (it) { isEditing.flatMapLatest { isEditing -> if (isEditing) { val editTilesData = editTilesListInteractor.getTilesToEdit() // Query only the non current platform tiles, as any current tile is clearly // available Loading @@ -115,6 +115,11 @@ constructor( currentTilesInteractor.currentTiles .map { tiles -> val currentSpecs = tiles.map { it.spec } val dualTargetSpecs = tiles .filter { it.tile.state.handlesSecondaryClick } .map { it.spec } .toSet() val canRemoveTiles = currentSpecs.size > minTilesInteractor.minNumberOfTiles val allTiles = editTilesData.stockTiles + editTilesData.customTiles val allTilesMap = allTiles.associateBy { it.tileSpec } Loading @@ -125,6 +130,7 @@ constructor( .filterNot { it.tileSpec in unavailable } .map { val current = it.tileSpec in currentSpecs val isDualTarget = current && it.tileSpec in dualTargetSpecs val availableActions = buildSet { if (current) { add(AvailableEditActions.MOVE) Loading @@ -141,6 +147,7 @@ constructor( it.label, it.appName, current, isDualTarget, availableActions, it.category, ) Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditTileViewModel.kt +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ data class UnloadedEditTileViewModel( val label: Text, val appName: Text?, val isCurrent: Boolean, val isDualTarget: Boolean, val availableEditActions: Set<AvailableEditActions>, val category: TileCategory, ) { Loading @@ -48,6 +49,7 @@ data class UnloadedEditTileViewModel( label = label.toAnnotatedString(context) ?: AnnotatedString(tileSpec.spec), appName = appName?.toAnnotatedString(context), isCurrent = isCurrent, isDualTarget = isDualTarget, availableEditActions = availableEditActions, category = category, ) Loading @@ -61,6 +63,7 @@ data class EditTileViewModel( val label: AnnotatedString, val appName: AnnotatedString?, val isCurrent: Boolean, val isDualTarget: Boolean, val availableEditActions: Set<AvailableEditActions>, override val category: TileCategory, ) : CategoryAndName { Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/compose/EditTileListStateTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -230,6 +230,7 @@ class EditTileListStateTest : SysuiTestCase() { label = AnnotatedString("unused"), appName = null, isCurrent = true, isDualTarget = false, availableEditActions = emptySet(), category = TileCategory.UNKNOWN, ) Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModelTest.kt +62 −12 Original line number Diff line number Diff line Loading @@ -30,9 +30,10 @@ import com.android.systemui.common.shared.model.Text import com.android.systemui.common.ui.compose.toAnnotatedString import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runCurrent import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.FakeQSFactory import com.android.systemui.qs.FakeQSTile import com.android.systemui.qs.QSEditEvent Loading Loading @@ -64,7 +65,6 @@ import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading @@ -80,7 +80,7 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { mSetFlagsRule.setFlagsParameterization(flags) } private val kosmos = testKosmos() private val kosmos = testKosmos().useUnconfinedTestDispatcher() // Only have some configurations so we can test the effect of missing configurations. // As the configurations are injected by dagger, we'll have all the existing configurations Loading Loading @@ -514,7 +514,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) currentTilesInteractor.setTiles(currentTiles) underTest.startEditing() runCurrent() // Move flashlight tile to index 3 underTest.addTile(TileSpec.create("flashlight"), 3) Loading @@ -539,7 +538,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { ) currentTilesInteractor.setTiles(currentTiles) underTest.startEditing() runCurrent() // Move alarm tile to index 0 underTest.addTile(TileSpec.create("alarm"), 0) Loading Loading @@ -588,7 +586,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val internetTile = TileSpec.create("internet") val customTile = TileSpec.create(component2) currentTilesInteractor.setTiles(listOf(flashlightTile)) runCurrent() underTest.addTile(airplaneTile) underTest.addTile(internetTile, position = 0) Loading Loading @@ -620,7 +617,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val airplaneTile = TileSpec.create("airplane") val internetTile = TileSpec.create("internet") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() underTest.addTile(flashlightTile) // adding at the end, should use correct position underTest.addTile(internetTile, 0) Loading @@ -647,7 +643,6 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val airplaneTile = TileSpec.create("airplane") val internetTile = TileSpec.create("internet") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() underTest.removeTile(airplaneTile) Loading @@ -668,19 +663,15 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { val alarmTile = TileSpec.create("alarm") currentTilesInteractor.setTiles(listOf(flashlightTile, airplaneTile, internetTile)) runCurrent() // 0. Move flashlightTile to position 2 underTest.setTiles(listOf(airplaneTile, internetTile, flashlightTile)) runCurrent() // 1. Add alarm tile at position 1 underTest.setTiles(listOf(airplaneTile, alarmTile, internetTile, flashlightTile)) runCurrent() // 2. Remove internetTile underTest.setTiles(listOf(airplaneTile, alarmTile, flashlightTile)) runCurrent() assertThat(uiEventLoggerFake.numLogs()).isEqualTo(3) Loading @@ -700,6 +691,65 @@ class EditModeViewModelTest(flags: FlagsParameterization) : SysuiTestCase() { } } @Test fun currentTiles_checksForDualTarget() = with(kosmos) { testScope.runTest { val tiles by collectLastValue(underTest.tiles) val currentTiles = mutableListOf( TileSpec.create("flashlight"), TileSpec.create("airplane"), TileSpec.create("internet"), TileSpec.create("alarm"), ) currentTilesInteractor.setTiles(currentTiles) val tile = currentTilesInteractor.currentTiles.value.find { it.spec.spec == "flashlight" } (tile!!.tile as FakeQSTile).changeState( QSTile.State().apply { handlesSecondaryClick = true } ) underTest.startEditing() assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }) .containsExactly("flashlight") } } @Test fun removeTile_noLongerDualTarget() = with(kosmos) { testScope.runTest { val tiles by collectLastValue(underTest.tiles) val currentTiles = mutableListOf( TileSpec.create("flashlight"), TileSpec.create("airplane"), TileSpec.create("internet"), TileSpec.create("alarm"), ) currentTilesInteractor.setTiles(currentTiles) val tile = currentTilesInteractor.currentTiles.value.find { it.spec.spec == "flashlight" } (tile!!.tile as FakeQSTile).changeState( QSTile.State().apply { handlesSecondaryClick = true } ) underTest.startEditing() assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }) .containsExactly("flashlight") underTest.removeTile(TileSpec.create("flashlight")) assertThat(tiles!!.filter { it.isDualTarget }.map { it.tileSpec.spec }).isEmpty() } } companion object { private val drawable1 = TestStubDrawable("drawable1") private val appName1 = "App1" Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +8 −4 Original line number Diff line number Diff line Loading @@ -1002,7 +1002,7 @@ fun EditTile( colors: TileColors = EditModeTileDefaults.editTileColors(), ) { val iconSizeDiff = CommonTileDefaults.IconSize - CommonTileDefaults.LargeTileIconSize val alpha by animateFloatAsState(if (tileState == TileState.GreyedOut) .4f else 1f) val containerAlpha by animateFloatAsState(if (tileState == TileState.GreyedOut) .4f else 1f) Row( horizontalArrangement = spacedBy(6.dp), verticalAlignment = Alignment.CenterVertically, Loading Loading @@ -1036,10 +1036,14 @@ fun EditTile( } } .largeTilePadding() .graphicsLayer { this.alpha = alpha }, .graphicsLayer { this.alpha = containerAlpha }, ) { // Icon Box(Modifier.size(ToggleTargetSize)) { Box( Modifier.size(ToggleTargetSize).thenIf(tile.isDualTarget) { Modifier.drawBehind { drawCircle(colors.iconBackground, alpha = progress()) } } ) { SmallTileContent( iconProvider = { tile.icon }, color = colors.icon, Loading Loading @@ -1082,7 +1086,7 @@ private object EditModeTileDefaults { fun editTileColors(): TileColors = TileColors( background = LocalAndroidColorScheme.current.surfaceEffect1, iconBackground = Color.Transparent, iconBackground = LocalAndroidColorScheme.current.surfaceEffect2, label = MaterialTheme.colorScheme.onSurface, secondaryLabel = MaterialTheme.colorScheme.onSurface, icon = MaterialTheme.colorScheme.onSurface, Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt +9 −2 Original line number Diff line number Diff line Loading @@ -101,8 +101,8 @@ constructor( * cannot be created), and they won't be able to be added. */ val tiles: Flow<List<EditTileViewModel>> = isEditing.flatMapLatest { if (it) { isEditing.flatMapLatest { isEditing -> if (isEditing) { val editTilesData = editTilesListInteractor.getTilesToEdit() // Query only the non current platform tiles, as any current tile is clearly // available Loading @@ -115,6 +115,11 @@ constructor( currentTilesInteractor.currentTiles .map { tiles -> val currentSpecs = tiles.map { it.spec } val dualTargetSpecs = tiles .filter { it.tile.state.handlesSecondaryClick } .map { it.spec } .toSet() val canRemoveTiles = currentSpecs.size > minTilesInteractor.minNumberOfTiles val allTiles = editTilesData.stockTiles + editTilesData.customTiles val allTilesMap = allTiles.associateBy { it.tileSpec } Loading @@ -125,6 +130,7 @@ constructor( .filterNot { it.tileSpec in unavailable } .map { val current = it.tileSpec in currentSpecs val isDualTarget = current && it.tileSpec in dualTargetSpecs val availableActions = buildSet { if (current) { add(AvailableEditActions.MOVE) Loading @@ -141,6 +147,7 @@ constructor( it.label, it.appName, current, isDualTarget, availableActions, it.category, ) Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditTileViewModel.kt +3 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ data class UnloadedEditTileViewModel( val label: Text, val appName: Text?, val isCurrent: Boolean, val isDualTarget: Boolean, val availableEditActions: Set<AvailableEditActions>, val category: TileCategory, ) { Loading @@ -48,6 +49,7 @@ data class UnloadedEditTileViewModel( label = label.toAnnotatedString(context) ?: AnnotatedString(tileSpec.spec), appName = appName?.toAnnotatedString(context), isCurrent = isCurrent, isDualTarget = isDualTarget, availableEditActions = availableEditActions, category = category, ) Loading @@ -61,6 +63,7 @@ data class EditTileViewModel( val label: AnnotatedString, val appName: AnnotatedString?, val isCurrent: Boolean, val isDualTarget: Boolean, val availableEditActions: Set<AvailableEditActions>, override val category: TileCategory, ) : CategoryAndName { Loading