diff options
| author | 2024-02-13 12:14:57 -0500 | |
|---|---|---|
| committer | 2024-02-20 13:36:55 -0500 | |
| commit | db72b29d6075dbb0aed87d2d0c1b735c86008118 (patch) | |
| tree | 749d620bb48dc3c3a05b0db2618ad031a12ee89c | |
| parent | 1684475d241c50522aa5e837368c4e9e05a5e94c (diff) | |
Prevent no tiles in QS
In some cases, normal operation can lead to no tiles in QS (for example,
when restoring from a non-AOSP device that uses different specs for
tiles). Unfortunately, as the tiles use unknown names, we are not able
to restore the correct tiles.
If after processing the tiles in CurrentTilesInteractor, we end
up with no tiles, we revert to the default.
Note that this should only happen when things directly try to set the
list of tiles. A user manually adding/removing tiles will never
encounter this scenario,
Test: atest NoEmptyTilesTest
Test: manual, set tiles to unknown names
Fixes: 324575996
Flag: ACONFIG com.android.systemui.qs_new_pipeline NEXTFOOD
Change-Id: Ie16a2fc9a57680c1860953e6b82b265e269047a1
13 files changed, 338 insertions, 9 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesResourceRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesResourceRepositoryTest.kt new file mode 100644 index 000000000000..62c91633ea81 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesResourceRepositoryTest.kt @@ -0,0 +1,45 @@ +/* + * 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.pipeline.data.repository + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.res.R +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class MinimumTilesResourceRepositoryTest : SysuiTestCase() { + + val testableResources = context.orCreateTestableResources + + @Test + fun minimumQSTiles_followsConfig() { + val minTwo = 2 + testableResources.addOverride(R.integer.quick_settings_min_num_tiles, minTwo) + val underTest = MinimumTilesResourceRepository(context.resources) + assertThat(underTest.minNumberOfTiles).isEqualTo(minTwo) + + val minSix = 6 + testableResources.addOverride(R.integer.quick_settings_min_num_tiles, minSix) + val otherUnderTest = MinimumTilesResourceRepository(context.resources) + assertThat(otherUnderTest.minNumberOfTiles).isEqualTo(minSix) + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt index 3418977c3211..37d472169ae5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt @@ -20,11 +20,11 @@ import android.platform.test.annotations.EnabledOnRavenwood import android.provider.Settings import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger +import com.android.systemui.res.R import com.android.systemui.retail.data.repository.FakeRetailModeRepository import com.android.systemui.util.settings.FakeSettings import com.google.common.truth.Truth.assertThat @@ -187,6 +187,22 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() { assertThat(loadTilesForUser(0)).isEqualTo(DEFAULT_TILES) } + @Test + fun prependDefault() = + testScope.runTest { + val tiles by collectLastValue(underTest.tilesSpecs(0)) + + val startingTiles = listOf(TileSpec.create("e"), TileSpec.create("f")) + + underTest.setTiles(0, startingTiles) + runCurrent() + + underTest.prependDefault(0) + + assertThat(tiles!!) + .containsExactlyElementsIn(DEFAULT_TILES.toTileSpecs() + startingTiles) + } + private fun TestScope.storeTilesForUser(specs: String, forUser: Int) { secureSettings.putStringForUser(SETTING, specs, forUser) runCurrent() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt index 1e2784a622b1..634c5fa74295 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorImplTest.kt @@ -40,6 +40,7 @@ import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepositor import com.android.systemui.qs.pipeline.data.repository.FakeCustomTileAddedRepository import com.android.systemui.qs.pipeline.data.repository.FakeInstalledTilesComponentRepository import com.android.systemui.qs.pipeline.data.repository.FakeTileSpecRepository +import com.android.systemui.qs.pipeline.data.repository.MinimumTilesFixedRepository import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository import com.android.systemui.qs.pipeline.domain.model.TileModel import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository @@ -82,6 +83,7 @@ class CurrentTilesInteractorImplTest : SysuiTestCase() { FakeCustomTileAddedRepository() private val pipelineFlags = QSPipelineFlagsRepository() private val tileLifecycleManagerFactory = TLMFactory() + private val minimumTilesRepository = MinimumTilesFixedRepository() @Mock private lateinit var customTileStatePersister: CustomTileStatePersister @@ -114,6 +116,7 @@ class CurrentTilesInteractorImplTest : SysuiTestCase() { tileSpecRepository = tileSpecRepository, installedTilesComponentRepository = installedTilesPackageRepository, userRepository = userRepository, + minimumTilesRepository = minimumTilesRepository, customTileStatePersister = customTileStatePersister, tileFactory = tileFactory, newQSTileFactory = { newQSTileFactory }, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/NoLowNumberOfTilesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/NoLowNumberOfTilesTest.kt new file mode 100644 index 000000000000..90c83047e72f --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/NoLowNumberOfTilesTest.kt @@ -0,0 +1,147 @@ +/* + * 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.pipeline.domain.interactor + +import android.content.ComponentName +import android.content.pm.UserInfo +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.MediumTest +import com.android.systemui.Flags +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.qs.FakeQSFactory +import com.android.systemui.qs.pipeline.data.model.RestoreData +import com.android.systemui.qs.pipeline.data.repository.FakeDefaultTilesRepository +import com.android.systemui.qs.pipeline.data.repository.MinimumTilesFixedRepository +import com.android.systemui.qs.pipeline.data.repository.fakeDefaultTilesRepository +import com.android.systemui.qs.pipeline.data.repository.fakeMinimumTilesRepository +import com.android.systemui.qs.pipeline.data.repository.fakeRestoreRepository +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.qs.qsTileFactory +import com.android.systemui.settings.fakeUserTracker +import com.android.systemui.settings.userTracker +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 + +/** + * This integration test is for testing the solution to b/324575996. In particular, when restoring + * from a device that uses different specs for tiles, we may end up with empty (or mostly empty) QS. + * In that case, we want to prepend the default tiles instead. + */ +@OptIn(ExperimentalCoroutinesApi::class) +@MediumTest +@RunWith(AndroidJUnit4::class) +class NoLowNumberOfTilesTest : SysuiTestCase() { + + private val USER_0_INFO = + UserInfo( + 0, + "zero", + "", + UserInfo.FLAG_ADMIN or UserInfo.FLAG_FULL, + ) + + private val defaultTiles = + listOf( + TileSpec.create("internet"), + TileSpec.create("bt"), + ) + + private val kosmos = + Kosmos().apply { + fakeMinimumTilesRepository = MinimumTilesFixedRepository(minNumberOfTiles = 2) + fakeUserTracker.set(listOf(USER_0_INFO), 0) + qsTileFactory = FakeQSFactory(::tileCreator) + fakeDefaultTilesRepository = FakeDefaultTilesRepository(defaultTiles) + } + + private val currentUser: Int + get() = kosmos.userTracker.userId + + private val goodTile = TileSpec.create("correct") + + private val restoredTiles = + listOf( + TileSpec.create("OEM:internet"), + TileSpec.create("OEM:bt"), + TileSpec.create("OEM:dnd"), + // This is not an installed component so a tile won't be created + TileSpec.create(ComponentName.unflattenFromString("oem/.tile")!!), + TileSpec.create("OEM:flashlight"), + goodTile, + ) + + @Before + fun setUp() { + mSetFlagsRule.enableFlags(Flags.FLAG_QS_NEW_PIPELINE) + + with(kosmos) { + restoreReconciliationInteractor.start() + autoAddInteractor.init(kosmos.currentTilesInteractor) + } + } + + @Test + fun noLessThanTwoTilesAfterOEMRestore_prependedDefault() = + with(kosmos) { + testScope.runTest { + val tiles by collectLastValue(currentTilesInteractor.currentTiles) + runCurrent() + + assertThat(tiles!!).isNotEmpty() + + val restoreData = RestoreData(restoredTiles, emptySet(), currentUser) + fakeRestoreRepository.onDataRestored(restoreData) + runCurrent() + + assertThat(tiles!!.map { it.spec }).isEqualTo(defaultTiles + listOf(goodTile)) + } + } + + @Test + fun noEmptyTilesAfterSettingTilesToUnknownNames() = + with(kosmos) { + testScope.runTest { + val tiles by collectLastValue(currentTilesInteractor.currentTiles) + runCurrent() + + assertThat(tiles!!).isNotEmpty() + + val badTiles = listOf(TileSpec.create("OEM:unknown_tile")) + currentTilesInteractor.setTiles(badTiles) + runCurrent() + + assertThat(tiles!!.map { it.spec }).isEqualTo(defaultTiles) + } + } + + private fun tileCreator(spec: String): QSTile? { + return if (spec.contains("OEM")) { + null // We don't know how to create OEM spec tiles + } else { + FakeQSTile(currentUser) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt index 4bad45f19673..16aa99e22ae2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/dagger/QSPipelineModule.kt @@ -25,6 +25,8 @@ import com.android.systemui.qs.pipeline.data.repository.DefaultTilesQSHostReposi import com.android.systemui.qs.pipeline.data.repository.DefaultTilesRepository import com.android.systemui.qs.pipeline.data.repository.InstalledTilesComponentRepository import com.android.systemui.qs.pipeline.data.repository.InstalledTilesComponentRepositoryImpl +import com.android.systemui.qs.pipeline.data.repository.MinimumTilesRepository +import com.android.systemui.qs.pipeline.data.repository.MinimumTilesResourceRepository import com.android.systemui.qs.pipeline.data.repository.QSSettingsRestoredBroadcastRepository import com.android.systemui.qs.pipeline.data.repository.QSSettingsRestoredRepository import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository @@ -81,6 +83,11 @@ abstract class QSPipelineModule { impl: QSSettingsRestoredBroadcastRepository ): QSSettingsRestoredRepository + @Binds + abstract fun provideMinimumTilesRepository( + impl: MinimumTilesResourceRepository + ): MinimumTilesRepository + companion object { /** * Provides a logging buffer for all logs related to the new Quick Settings pipeline to log diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesRepository.kt new file mode 100644 index 000000000000..3a005c0ebfed --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/MinimumTilesRepository.kt @@ -0,0 +1,45 @@ +/* + * 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.pipeline.data.repository + +import android.content.res.Resources +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.res.R +import javax.inject.Inject + +/** + * Provides the minimum number of tiles required in QS. The default number of tiles should be at + * least this many. + */ +interface MinimumTilesRepository { + val minNumberOfTiles: Int +} + +/** + * Minimum number of tiles using the corresponding resource. The value will be read once upon + * creation, as it's not expected to change. + */ +@SysUISingleton +class MinimumTilesResourceRepository @Inject constructor(@Main resources: Resources) : + MinimumTilesRepository { + override val minNumberOfTiles: Int = + resources.getInteger(R.integer.quick_settings_min_num_tiles) +} + +/** Provides a fixed minimum number of tiles. */ +class MinimumTilesFixedRepository(override val minNumberOfTiles: Int = 0) : MinimumTilesRepository diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt index 00ea0b5c5ed3..214e9f097642 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt @@ -19,12 +19,12 @@ package com.android.systemui.qs.pipeline.data.repository import android.annotation.UserIdInt import android.content.res.Resources import android.util.SparseArray -import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.qs.pipeline.data.model.RestoreData import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.pipeline.shared.logging.QSPipelineLogger +import com.android.systemui.res.R import com.android.systemui.retail.data.repository.RetailModeRepository import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -68,6 +68,9 @@ interface TileSpecRepository { suspend fun reconcileRestore(restoreData: RestoreData, currentAutoAdded: Set<TileSpec>) + /** Prepend the default list of tiles to the current set of tiles */ + suspend fun prependDefault(@UserIdInt userId: Int) + companion object { /** Position to indicate the end of the list */ const val POSITION_AT_END = -1 @@ -152,6 +155,12 @@ constructor( ?.reconcileRestore(restoreData, currentAutoAdded) } + override suspend fun prependDefault( + userId: Int, + ) { + userTileRepositories.get(userId)?.prependDefault() + } + companion object { private const val DELIMITER = TilesSettingConverter.DELIMITER } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt index 152fd0f83811..8ad5cb2c0a34 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt @@ -50,9 +50,8 @@ constructor( private val defaultTiles: List<TileSpec> get() = defaultTilesRepository.defaultTiles - private val changeEvents = MutableSharedFlow<ChangeAction>( - extraBufferCapacity = CHANGES_BUFFER_SIZE - ) + private val changeEvents = + MutableSharedFlow<ChangeAction>(extraBufferCapacity = CHANGES_BUFFER_SIZE) private lateinit var _tiles: StateFlow<List<TileSpec>> @@ -163,6 +162,10 @@ constructor( changeEvents.emit(RestoreTiles(restoreData, currentAutoAdded)) } + suspend fun prependDefault() { + changeEvents.emit(PrependDefault(defaultTiles)) + } + sealed interface ChangeAction { fun apply(currentTiles: List<TileSpec>): List<TileSpec> } @@ -199,6 +202,12 @@ constructor( } } + private data class PrependDefault(val defaultTiles: List<TileSpec>) : ChangeAction { + override fun apply(currentTiles: List<TileSpec>): List<TileSpec> { + return defaultTiles + currentTiles + } + } + private data class RestoreTiles( val restoreData: RestoreData, val currentAutoAdded: Set<TileSpec>, diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt index 957cb1eb95d1..61896f0a3816 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt @@ -35,6 +35,7 @@ import com.android.systemui.qs.external.TileLifecycleManager import com.android.systemui.qs.external.TileServiceKey import com.android.systemui.qs.pipeline.data.repository.CustomTileAddedRepository import com.android.systemui.qs.pipeline.data.repository.InstalledTilesComponentRepository +import com.android.systemui.qs.pipeline.data.repository.MinimumTilesRepository import com.android.systemui.qs.pipeline.data.repository.TileSpecRepository import com.android.systemui.qs.pipeline.domain.model.TileModel import com.android.systemui.qs.pipeline.shared.QSPipelineFlagsRepository @@ -131,6 +132,7 @@ constructor( private val tileSpecRepository: TileSpecRepository, private val installedTilesComponentRepository: InstalledTilesComponentRepository, private val userRepository: UserRepository, + private val minimumTilesRepository: MinimumTilesRepository, private val customTileStatePersister: CustomTileStatePersister, private val newQSTileFactory: Lazy<NewQSTileFactory>, private val tileFactory: QSFactory, @@ -255,17 +257,23 @@ constructor( val resolvedSpecs = newTileMap.keys.toList() specsToTiles.clear() specsToTiles.putAll(newTileMap) - _currentSpecsAndTiles.value = + val newResolvedTiles = newTileMap .filter { it.value is TileOrNotInstalled.Tile } .map { TileModel(it.key, (it.value as TileOrNotInstalled.Tile).tile) } + + _currentSpecsAndTiles.value = newResolvedTiles logger.logTilesNotInstalled( newTileMap.filter { it.value is TileOrNotInstalled.NotInstalled }.keys, newUser ) - if (resolvedSpecs != newTileList) { + if (newResolvedTiles.size < minimumTilesRepository.minNumberOfTiles) { + // We ended up with not enough tiles (some may be not installed). + // Prepend the default set of tiles + launch { tileSpecRepository.prependDefault(currentUser.value) } + } else if (resolvedSpecs != newTileList) { // There were some tiles that couldn't be created. Change the value in // the // repository diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeDefaultTilesRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeDefaultTilesRepository.kt new file mode 100644 index 000000000000..ced29cc9eb47 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeDefaultTilesRepository.kt @@ -0,0 +1,22 @@ +/* + * 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.pipeline.data.repository + +import com.android.systemui.qs.pipeline.shared.TileSpec + +class FakeDefaultTilesRepository(override val defaultTiles: List<TileSpec> = emptyList()) : + DefaultTilesRepository diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt index ae4cf3afe671..a9cce6912f15 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt @@ -23,7 +23,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -class FakeTileSpecRepository : TileSpecRepository { +class FakeTileSpecRepository( + private val defaultTilesRepository: DefaultTilesRepository = FakeDefaultTilesRepository() +) : TileSpecRepository { private val tilesPerUser = mutableMapOf<Int, MutableStateFlow<List<TileSpec>>>() @@ -67,4 +69,8 @@ class FakeTileSpecRepository : TileSpecRepository { value = UserTileSpecRepository.reconcileTiles(value, currentAutoAdded, restoreData) } } + + override suspend fun prependDefault(userId: Int) { + with(getFlow(userId)) { value = defaultTilesRepository.defaultTiles + value } + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/QSPipelineRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/QSPipelineRepositoryKosmos.kt index 009148266143..604c16fd9e74 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/QSPipelineRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/QSPipelineRepositoryKosmos.kt @@ -18,7 +18,17 @@ package com.android.systemui.qs.pipeline.data.repository import com.android.systemui.kosmos.Kosmos -val Kosmos.fakeTileSpecRepository by Kosmos.Fixture { FakeTileSpecRepository() } +/** This fake uses 0 as the minimum number of tiles. That means that no tiles is a valid state. */ +var Kosmos.fakeMinimumTilesRepository by Kosmos.Fixture { MinimumTilesFixedRepository(0) } +val Kosmos.minimumTilesRepository: MinimumTilesRepository by + Kosmos.Fixture { fakeMinimumTilesRepository } + +var Kosmos.fakeDefaultTilesRepository by Kosmos.Fixture { FakeDefaultTilesRepository() } +val Kosmos.defaultTilesRepository: DefaultTilesRepository by + Kosmos.Fixture { fakeDefaultTilesRepository } + +val Kosmos.fakeTileSpecRepository by + Kosmos.Fixture { FakeTileSpecRepository(defaultTilesRepository) } var Kosmos.tileSpecRepository: TileSpecRepository by Kosmos.Fixture { fakeTileSpecRepository } val Kosmos.fakeAutoAddRepository by Kosmos.Fixture { FakeAutoAddRepository() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt index 67df563ec5b0..9ef44c4b9085 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractorKosmos.kt @@ -24,6 +24,7 @@ import com.android.systemui.qs.external.tileLifecycleManagerFactory import com.android.systemui.qs.newQSTileFactory import com.android.systemui.qs.pipeline.data.repository.customTileAddedRepository import com.android.systemui.qs.pipeline.data.repository.installedTilesRepository +import com.android.systemui.qs.pipeline.data.repository.minimumTilesRepository import com.android.systemui.qs.pipeline.data.repository.tileSpecRepository import com.android.systemui.qs.pipeline.shared.logging.qsLogger import com.android.systemui.qs.pipeline.shared.pipelineFlagsRepository @@ -37,6 +38,7 @@ val Kosmos.currentTilesInteractor: CurrentTilesInteractor by tileSpecRepository, installedTilesRepository, userRepository, + minimumTilesRepository, customTileStatePersister, { newQSTileFactory }, qsTileFactory, |