diff options
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, |