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

Commit 34cf647d authored by Olivier St-Onge's avatar Olivier St-Onge
Browse files

Implement top app bar and reset button for Edit mode

Clicking on the reset button opens a confirmation dialog.
Additionally this change fixes:
- the icon tiles interactor ignoring size updates when using an outdated current tiles list. This happened while resetting due to the simultaneous change to both current tiles and sizes.
- the mismatch corner radius for the edit grid container

Flag: com.android.systemui.qs_ui_refactor_compose_fragment
Bug: 366257479
Test: manually
Test: SizedTilesResetInteractorTest
Test: DynamicIconTilesInteractorTest
Test: TileSpecSettingsRepositoryTest
Change-Id: Ibdbc1eecebb0043f094f40574eba01f410d86950
parent 78c59e31
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
/*
 * 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.domain.interactor

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository
import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
import com.android.systemui.qs.panels.data.repository.qsPreferencesRepository
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class DynamicIconTilesInteractorTest : SysuiTestCase() {
    private val kosmos =
        testKosmos().apply {
            defaultLargeTilesRepository =
                object : DefaultLargeTilesRepository {
                    override val defaultLargeTiles: Set<TileSpec> = setOf(largeTile)
                }
            currentTilesInteractor.setTiles(listOf(largeTile, smallTile))
        }
    private lateinit var underTest: DynamicIconTilesInteractor

    @Before
    fun setUp() {
        with(kosmos) {
            underTest = dynamicIconTilesInteractorFactory.create()
            underTest.activateIn(testScope)
        }
    }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun removingTile_updatesSharedPreferences() =
        with(kosmos) {
            testScope.runTest {
                val latest by collectLastValue(qsPreferencesRepository.largeTilesSpecs)
                runCurrent()

                // Remove the large tile from the current tiles
                currentTilesInteractor.removeTiles(listOf(largeTile))
                runCurrent()

                // Assert that it resized to small
                assertThat(latest).doesNotContain(largeTile)
            }
        }

    private companion object {
        private val largeTile = TileSpec.create("large")
        private val smallTile = TileSpec.create("small")
    }
}
+0 −17
Original line number Diff line number Diff line
@@ -96,23 +96,6 @@ class IconTilesInteractorTest : SysuiTestCase() {
            }
        }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun removingTile_updatesSharedPreferences() =
        with(kosmos) {
            testScope.runTest {
                val latest by collectLastValue(qsPreferencesRepository.largeTilesSpecs)
                runCurrent()

                // Remove the large tile from the current tiles
                currentTilesInteractor.removeTiles(listOf(largeTile))
                runCurrent()

                // Assert that it resized to small
                assertThat(latest).doesNotContain(largeTile)
            }
        }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun resizingNonCurrentTile_doesNothing() =
+82 −0
Original line number Diff line number Diff line
/*
 * 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.domain.interactor

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository
import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
import com.android.systemui.qs.pipeline.data.repository.FakeDefaultTilesRepository
import com.android.systemui.qs.pipeline.data.repository.fakeDefaultTilesRepository
import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class SizedTilesResetInteractorTest : SysuiTestCase() {
    private val kosmos =
        testKosmos().apply {
            defaultLargeTilesRepository =
                object : DefaultLargeTilesRepository {
                    override val defaultLargeTiles: Set<TileSpec> = setOf(largeTile)
                }
            fakeDefaultTilesRepository = FakeDefaultTilesRepository(listOf(smallTile, largeTile))
        }
    private val underTest = with(kosmos) { sizedTilesResetInteractor }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun changeTiles_resetsCorrectly() {
        with(kosmos) {
            testScope.runTest {
                // Change current tiles and large tiles
                currentTilesInteractor.setTiles(listOf(largeTile, newTile))
                iconTilesInteractor.setLargeTiles(setOf(newTile))
                runCurrent()

                // Assert both current tiles and large tiles changed
                assertThat(currentTilesInteractor.currentTilesSpecs)
                    .containsExactly(largeTile, newTile)
                assertThat(iconTilesInteractor.largeTilesSpecs.value).containsExactly(newTile)

                // Reset to default
                underTest.reset()
                runCurrent()

                // Assert both current tiles and large tiles are back to the initial state
                assertThat(currentTilesInteractor.currentTilesSpecs)
                    .containsExactly(largeTile, smallTile)
                assertThat(iconTilesInteractor.largeTilesSpecs.value).containsExactly(largeTile)
            }
        }
    }

    private companion object {
        private val largeTile = TileSpec.create("large")
        private val smallTile = TileSpec.create("small")
        private val newTile = TileSpec.create("newTile")
    }
}
+16 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() {
                context.resources,
                logger,
                retailModeRepository,
                userTileSpecRepositoryFactory
                userTileSpecRepositoryFactory,
            )
    }

@@ -218,6 +218,21 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() {
            assertThat(loadTilesForUser(user)).isEqualTo(startingTiles)
        }

    @Test
    fun resetsDefault() =
        testScope.runTest {
            val tiles by collectLastValue(underTest.tilesSpecs(0))

            val startingTiles = listOf(TileSpec.create("e"), TileSpec.create("f"))

            underTest.setTiles(0, startingTiles)
            runCurrent()

            underTest.resetToDefault(0)

            assertThat(tiles!!).containsExactlyElementsIn(DEFAULT_TILES.toTileSpecs())
        }

    private fun TestScope.storeTilesForUser(specs: String, forUser: Int) {
        secureSettings.putStringForUser(SETTING, specs, forUser)
        runCurrent()
+8 −0
Original line number Diff line number Diff line
@@ -3895,4 +3895,12 @@
    <string name="qs_edit_mode_category_unknown">
        Unknown
    </string>
    <!-- Title for the Reset Tiles dialog in QS Edit mode. [CHAR LIMIT=NONE] -->
    <string name="qs_edit_mode_reset_dialog_title">
        Reset tiles
    </string>
    <!-- Content of the Reset Tiles dialog in QS Edit mode. [CHAR LIMIT=NONE] -->
    <string name="qs_edit_mode_reset_dialog_content">
        Reset tiles to their original order and sizes?
    </string>
</resources>
Loading