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

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

Merge "Implement resizable tiles in edit mode" into main

parents 63ac5f02 5accf687
Loading
Loading
Loading
Loading
+78 −0
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.settings.userFileManager
import com.android.systemui.settings.userFileManager
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.data.repository.fakeUserRepository
@@ -39,6 +40,70 @@ class QSPreferencesRepositoryTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val kosmos = testKosmos()
    private val underTest = with(kosmos) { qsPreferencesRepository }
    private val underTest = with(kosmos) { qsPreferencesRepository }


    @Test
    fun largeTilesSpecs_updatesFromSharedPreferences() =
        with(kosmos) {
            testScope.runTest {
                val latest by collectLastValue(underTest.largeTilesSpecs)
                assertThat(latest).isEqualTo(defaultLargeTilesRepository.defaultLargeTiles)

                val newSet = setOf("tileA", "tileB")
                setLargeTilesSpecsInSharedPreferences(newSet)
                assertThat(latest).isEqualTo(newSet.toTileSpecs())
            }
        }

    @Test
    fun largeTilesSpecs_updatesFromUserChange() =
        with(kosmos) {
            testScope.runTest {
                fakeUserRepository.setUserInfos(USERS)
                val latest by collectLastValue(underTest.largeTilesSpecs)

                fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
                val newSet = setOf("tileA", "tileB")
                setLargeTilesSpecsInSharedPreferences(newSet)

                fakeUserRepository.setSelectedUserInfo(ANOTHER_USER)
                setLargeTilesSpecsInSharedPreferences(emptySet())

                fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
                assertThat(latest).isEqualTo(newSet.toTileSpecs())
            }
        }

    @Test
    fun setLargeTilesSpecs_inSharedPreferences() {
        val setA = setOf("tileA", "tileB")
        underTest.setLargeTilesSpecs(setA.toTileSpecs())
        assertThat(getLargeTilesSpecsFromSharedPreferences()).isEqualTo(setA)

        val setB = setOf("tileA", "tileB")
        underTest.setLargeTilesSpecs(setB.toTileSpecs())
        assertThat(getLargeTilesSpecsFromSharedPreferences()).isEqualTo(setB)
    }

    @Test
    fun setLargeTilesSpecs_forDifferentUser() =
        with(kosmos) {
            testScope.runTest {
                fakeUserRepository.setUserInfos(USERS)

                fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
                val setA = setOf("tileA", "tileB")
                underTest.setLargeTilesSpecs(setA.toTileSpecs())
                assertThat(getLargeTilesSpecsFromSharedPreferences()).isEqualTo(setA)

                fakeUserRepository.setSelectedUserInfo(ANOTHER_USER)
                val setB = setOf("tileA", "tileB")
                underTest.setLargeTilesSpecs(setB.toTileSpecs())
                assertThat(getLargeTilesSpecsFromSharedPreferences()).isEqualTo(setB)

                fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
                assertThat(getLargeTilesSpecsFromSharedPreferences()).isEqualTo(setA)
            }
        }

    @Test
    @Test
    fun showLabels_updatesFromSharedPreferences() =
    fun showLabels_updatesFromSharedPreferences() =
        with(kosmos) {
        with(kosmos) {
@@ -109,6 +174,14 @@ class QSPreferencesRepositoryTest : SysuiTestCase() {
            )
            )
        }
        }


    private fun setLargeTilesSpecsInSharedPreferences(specs: Set<String>) {
        getSharedPreferences().edit().putStringSet(LARGE_TILES_SPECS_KEY, specs).apply()
    }

    private fun getLargeTilesSpecsFromSharedPreferences(): Set<String> {
        return getSharedPreferences().getStringSet(LARGE_TILES_SPECS_KEY, emptySet())!!
    }

    private fun setShowLabelsInSharedPreferences(value: Boolean) {
    private fun setShowLabelsInSharedPreferences(value: Boolean) {
        getSharedPreferences().edit().putBoolean(ICON_LABELS_KEY, value).apply()
        getSharedPreferences().edit().putBoolean(ICON_LABELS_KEY, value).apply()
    }
    }
@@ -117,8 +190,13 @@ class QSPreferencesRepositoryTest : SysuiTestCase() {
        return getSharedPreferences().getBoolean(ICON_LABELS_KEY, defaultValue)
        return getSharedPreferences().getBoolean(ICON_LABELS_KEY, defaultValue)
    }
    }


    private fun Set<String>.toTileSpecs(): Set<TileSpec> {
        return map { TileSpec.create(it) }.toSet()
    }

    companion object {
    companion object {
        private const val ICON_LABELS_KEY = "show_icon_labels"
        private const val ICON_LABELS_KEY = "show_icon_labels"
        private const val LARGE_TILES_SPECS_KEY = "large_tiles_specs"
        private const val PRIMARY_USER_ID = 0
        private const val PRIMARY_USER_ID = 0
        private val PRIMARY_USER = UserInfo(PRIMARY_USER_ID, "user 0", UserInfo.FLAG_MAIN)
        private val PRIMARY_USER = UserInfo(PRIMARY_USER_ID, "user 0", UserInfo.FLAG_MAIN)
        private const val ANOTHER_USER_ID = 1
        private const val ANOTHER_USER_ID = 1
+11 −16
Original line number Original line Diff line number Diff line
@@ -20,9 +20,9 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.panels.data.repository.IconTilesRepository
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.gridLayoutTypeRepository
import com.android.systemui.qs.panels.data.repository.gridLayoutTypeRepository
import com.android.systemui.qs.panels.data.repository.iconTilesRepository
import com.android.systemui.qs.panels.shared.model.InfiniteGridLayoutType
import com.android.systemui.qs.panels.shared.model.InfiniteGridLayoutType
import com.android.systemui.qs.panels.shared.model.PartitionedGridLayoutType
import com.android.systemui.qs.panels.shared.model.PartitionedGridLayoutType
import com.android.systemui.qs.pipeline.data.repository.tileSpecRepository
import com.android.systemui.qs.pipeline.data.repository.tileSpecRepository
@@ -42,22 +42,17 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class GridConsistencyInteractorTest : SysuiTestCase() {
class GridConsistencyInteractorTest : SysuiTestCase() {


    private val iconOnlyTiles =
        setOf(
            TileSpec.create("smallA"),
            TileSpec.create("smallB"),
            TileSpec.create("smallC"),
            TileSpec.create("smallD"),
            TileSpec.create("smallE"),
        )

    private val kosmos =
    private val kosmos =
        testKosmos().apply {
        testKosmos().apply {
            iconTilesRepository =
            defaultLargeTilesRepository =
                object : IconTilesRepository {
                object : DefaultLargeTilesRepository {
                    override fun isIconTile(spec: TileSpec): Boolean {
                    override val defaultLargeTiles =
                        return iconOnlyTiles.contains(spec)
                        setOf(
                    }
                            TileSpec.create("largeA"),
                            TileSpec.create("largeB"),
                            TileSpec.create("largeC"),
                            TileSpec.create("largeD"),
                        )
                }
                }
        }
        }


+86 −0
Original line number Original line 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.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.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 IconTilesInteractorTest : SysuiTestCase() {
    private val kosmos =
        testKosmos().apply {
            defaultLargeTilesRepository =
                object : DefaultLargeTilesRepository {
                    override val defaultLargeTiles: Set<TileSpec> = setOf(TileSpec.create("large"))
                }
        }
    private val underTest = with(kosmos) { iconTilesInteractor }

    @Test
    fun isIconTile_returnsCorrectValue() {
        assertThat(underTest.isIconTile(TileSpec.create("large"))).isFalse()
        assertThat(underTest.isIconTile(TileSpec.create("small"))).isTrue()
    }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun isIconTile_updatesFromSharedPreferences() =
        with(kosmos) {
            testScope.runTest {
                // Assert that new tile defaults to icon
                assertThat(underTest.isIconTile(TileSpec.create("newTile"))).isTrue()

                qsPreferencesRepository.setLargeTilesSpecs(setOf(TileSpec.create("newTile")))
                runCurrent()

                // Assert that the new tile was added to the large tiles set
                assertThat(underTest.isIconTile(TileSpec.create("newTile"))).isFalse()
            }
        }

    @Test
    fun resize_updatesSharedPreferences() =
        with(kosmos) {
            testScope.runTest {
                val latest by collectLastValue(qsPreferencesRepository.largeTilesSpecs)
                val spec = TileSpec.create("large")

                // Assert that the tile is added to the large tiles after resizing
                underTest.resize(spec, toIcon = false)
                assertThat(latest).contains(spec)

                // Assert that the tile is removed from the large tiles after resizing
                underTest.resize(spec, toIcon = true)
                assertThat(latest).doesNotContain(spec)
            }
        }
}
+11 −15
Original line number Original line Diff line number Diff line
@@ -20,8 +20,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.panels.data.repository.IconTilesRepository
import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository
import com.android.systemui.qs.panels.data.repository.iconTilesRepository
import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.qs.pipeline.shared.TileSpec
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
@@ -33,21 +33,17 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@RunWith(AndroidJUnit4::class)
class InfiniteGridConsistencyInteractorTest : SysuiTestCase() {
class InfiniteGridConsistencyInteractorTest : SysuiTestCase() {


    private val iconOnlyTiles =
        setOf(
            TileSpec.create("smallA"),
            TileSpec.create("smallB"),
            TileSpec.create("smallC"),
            TileSpec.create("smallD"),
            TileSpec.create("smallE"),
        )
    private val kosmos =
    private val kosmos =
        testKosmos().apply {
        testKosmos().apply {
            iconTilesRepository =
            defaultLargeTilesRepository =
                object : IconTilesRepository {
                object : DefaultLargeTilesRepository {
                    override fun isIconTile(spec: TileSpec): Boolean {
                    override val defaultLargeTiles: Set<TileSpec> =
                        return iconOnlyTiles.contains(spec)
                        setOf(
                    }
                            TileSpec.create("largeA"),
                            TileSpec.create("largeB"),
                            TileSpec.create("largeC"),
                            TileSpec.create("largeD"),
                        )
                }
                }
        }
        }
    private val underTest = with(kosmos) { infiniteGridConsistencyInteractor }
    private val underTest = with(kosmos) { infiniteGridConsistencyInteractor }
+5 −7
Original line number Original line Diff line number Diff line
@@ -20,8 +20,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.testScope
import com.android.systemui.qs.panels.data.repository.IconTilesRepository
import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository
import com.android.systemui.qs.panels.data.repository.iconTilesRepository
import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository
import com.android.systemui.qs.panels.ui.viewmodel.MockTileViewModel
import com.android.systemui.qs.panels.ui.viewmodel.MockTileViewModel
import com.android.systemui.qs.panels.ui.viewmodel.fixedColumnsSizeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.fixedColumnsSizeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel
import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel
@@ -37,11 +37,9 @@ import org.junit.runner.RunWith
class InfiniteGridLayoutTest : SysuiTestCase() {
class InfiniteGridLayoutTest : SysuiTestCase() {
    private val kosmos =
    private val kosmos =
        testKosmos().apply {
        testKosmos().apply {
            iconTilesRepository =
            defaultLargeTilesRepository =
                object : IconTilesRepository {
                object : DefaultLargeTilesRepository {
                    override fun isIconTile(spec: TileSpec): Boolean {
                    override val defaultLargeTiles: Set<TileSpec> = setOf(TileSpec.create("large"))
                        return spec.spec.startsWith("small")
                    }
                }
                }
        }
        }


Loading