Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9ee1862 authored by Olivier St-Onge's avatar Olivier St-Onge Committed by Android (Google) Code Review
Browse files

Merge "Add the dual target zone to edit mode" into main

parents 5bd90039 d5ad1c0e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -230,6 +230,7 @@ class EditTileListStateTest : SysuiTestCase() {
                label = AnnotatedString("unused"),
                appName = null,
                isCurrent = true,
                isDualTarget = false,
                availableEditActions = emptySet(),
                category = TileCategory.UNKNOWN,
            )
+62 −12
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)

@@ -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)

@@ -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"
+8 −4
Original line number Diff line number Diff line
@@ -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,
@@ -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,
@@ -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,
+9 −2
Original line number Diff line number Diff line
@@ -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
@@ -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 }
@@ -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)
@@ -141,6 +147,7 @@ constructor(
                                    it.label,
                                    it.appName,
                                    current,
                                    isDualTarget,
                                    availableActions,
                                    it.category,
                                )
+3 −0
Original line number Diff line number Diff line
@@ -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,
) {
@@ -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,
        )
@@ -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