diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-11-16 18:51:03 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-11-16 18:51:03 +0000 |
commit | 406f51ec2b29048f2cf36e4778b1bb1b79e14be1 (patch) | |
tree | 854e10ea6c9e53135affec56acffc33dfc73dedf | |
parent | 201e57d24136d7ec066038376b406b0da41a1bc6 (diff) | |
parent | 9b1453c3369467030e9e4fb51630ed84a26ffb25 (diff) | |
download | ThemePicker-android-14.0.0_r20.tar.gz |
Merge cherrypicks of ['googleplex-android-review.googlesource.com/25103646', 'googleplex-android-review.googlesource.com/25116006', 'googleplex-android-review.googlesource.com/25107911'] into udc-qpr1-release.android-14.0.0_r27android-14.0.0_r26android-14.0.0_r25android-14.0.0_r24android-14.0.0_r23android-14.0.0_r22android-14.0.0_r21android-14.0.0_r20android-14.0.0_r19android14-qpr1-s2-releaseandroid14-qpr1-release
Change-Id: I21bd56b8eb169b6faa0c6aa9c17e35bfbaffeab2
5 files changed, 61 insertions, 69 deletions
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt index 497456f6..a1fc0144 100644 --- a/src/com/android/customization/module/ThemePickerInjector.kt +++ b/src/com/android/customization/module/ThemePickerInjector.kt @@ -15,6 +15,7 @@ */ package com.android.customization.module +import android.app.Activity import android.app.UiModeManager import android.app.WallpaperManager import android.content.Context @@ -111,7 +112,7 @@ internal constructor( private var clockPickerInteractor: ClockPickerInteractor? = null private var clockSectionViewModel: ClockSectionViewModel? = null private var clockCarouselViewModelFactory: ClockCarouselViewModel.Factory? = null - private var clockViewFactories: MutableMap<Int, ClockViewFactory> = HashMap() + private var clockViewFactory: ClockViewFactory? = null private var clockPickerSnapshotRestorer: ClockPickerSnapshotRestorer? = null private var notificationsInteractor: NotificationsInteractor? = null private var notificationSectionViewModelFactory: NotificationSectionViewModel.Factory? = null @@ -267,7 +268,12 @@ internal constructor( val client = getKeyguardQuickAffordancePickerProviderClient(context) val appContext = context.applicationContext return KeyguardQuickAffordancePickerInteractor( - KeyguardQuickAffordancePickerRepository(client, bgDispatcher), + KeyguardQuickAffordancePickerRepository( + client, + getApplicationCoroutineScope(), + getFlags(), + appContext + ), client ) { getKeyguardQuickAffordanceSnapshotRestorer(appContext) @@ -383,8 +389,7 @@ internal constructor( } override fun getClockViewFactory(activity: ComponentActivity): ClockViewFactory { - val activityHashCode = activity.hashCode() - return clockViewFactories[activityHashCode] + return clockViewFactory ?: ClockViewFactory( activity.applicationContext, ScreenSizeCalculator.getInstance() @@ -393,13 +398,13 @@ internal constructor( getClockRegistry(activity.applicationContext), ) .also { - clockViewFactories[activityHashCode] = it + clockViewFactory = it activity.lifecycle.addObserver( object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - clockViewFactories[activityHashCode]?.onDestroy() - clockViewFactories.remove(activityHashCode) + if ((owner as Activity).isChangingConfigurations()) return + clockViewFactory?.onDestroy() } } ) diff --git a/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt b/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt index b17af80d..80c7b4e7 100644 --- a/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt +++ b/src/com/android/customization/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepository.kt @@ -17,15 +17,17 @@ package com.android.customization.picker.quickaffordance.data.repository +import android.content.Context import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerAffordanceModel as AffordanceModel import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel as SelectionModel import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSlotModel as SlotModel import com.android.systemui.shared.customization.data.content.CustomizationProviderClient as Client -import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract -import kotlinx.coroutines.CoroutineDispatcher +import com.android.wallpaper.config.BaseFlags +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.map -import kotlinx.coroutines.withContext +import kotlinx.coroutines.flow.shareIn /** * Abstracts access to application state related to functionality for selecting, picking, or setting @@ -33,11 +35,14 @@ import kotlinx.coroutines.withContext */ class KeyguardQuickAffordancePickerRepository( private val client: Client, - private val backgroundDispatcher: CoroutineDispatcher, + private val scope: CoroutineScope, + private val flags: BaseFlags, + private val context: Context ) { /** Whether the feature is enabled. */ - val isFeatureEnabled: Flow<Boolean> = - client.observeFlags().map { flags -> flags.isFeatureEnabled() } + fun isFeatureEnabled(): Boolean { + return flags.isQuickAffordancesEnabled(context) + } /** List of slots available on the device. */ val slots: Flow<List<SlotModel>> = @@ -45,27 +50,17 @@ class KeyguardQuickAffordancePickerRepository( /** List of all available quick affordances. */ val affordances: Flow<List<AffordanceModel>> = - client.observeAffordances().map { affordances -> - affordances.map { affordance -> affordance.toModel() } - } + client + .observeAffordances() + .map { affordances -> affordances.map { affordance -> affordance.toModel() } } + .shareIn(scope, replay = 1, started = SharingStarted.Lazily) /** List of slot-affordance pairs, modeling what the user has currently chosen for each slot. */ val selections: Flow<List<SelectionModel>> = - client.observeSelections().map { selections -> - selections.map { selection -> selection.toModel() } - } - - suspend fun isFeatureEnabled(): Boolean { - return withContext(backgroundDispatcher) { client.queryFlags().isFeatureEnabled() } - } - - private fun List<Client.Flag>.isFeatureEnabled(): Boolean { - return find { flag -> - flag.name == - Contract.FlagsTable.FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED - } - ?.value == true - } + client + .observeSelections() + .map { selections -> selections.map { selection -> selection.toModel() } } + .shareIn(scope, replay = 1, started = SharingStarted.Lazily) private fun Client.Slot.toModel(): SlotModel { return SlotModel( diff --git a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt index 35dbadd5..5f9d7fb0 100644 --- a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt +++ b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/data/repository/KeyguardQuickAffordancePickerRepositoryTest.kt @@ -17,19 +17,20 @@ package com.android.customization.model.picker.quickaffordance.data.repository +import android.content.Context +import androidx.test.core.app.ApplicationProvider import androidx.test.filters.SmallTest import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository -import com.android.systemui.shared.customization.data.content.CustomizationProviderContract +import com.android.systemui.shared.customization.data.content.CustomizationProviderClient import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient +import com.android.wallpaper.config.BaseFlags import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before @@ -57,7 +58,16 @@ class KeyguardQuickAffordancePickerRepositoryTest { underTest = KeyguardQuickAffordancePickerRepository( client = client, - backgroundDispatcher = coroutineDispatcher, + scope = testScope.backgroundScope, + flags = + object : BaseFlags() { + override fun getCachedFlags( + context: Context + ): List<CustomizationProviderClient.Flag> { + return runBlocking { client.queryFlags() } + } + }, + context = ApplicationProvider.getApplicationContext() ) } @@ -66,35 +76,9 @@ class KeyguardQuickAffordancePickerRepositoryTest { Dispatchers.resetMain() } + // We need at least one test to prevent Studio errors @Test - fun `isFeatureEnabled - enabled`() = - testScope.runTest { - client.setFlag( - CustomizationProviderContract.FlagsTable - .FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED, - true, - ) - val values = mutableListOf<Boolean>() - val job = launch { underTest.isFeatureEnabled.toList(values) } - - assertThat(values.last()).isTrue() - - job.cancel() - } - - @Test - fun `isFeatureEnabled - not enabled`() = - testScope.runTest { - client.setFlag( - CustomizationProviderContract.FlagsTable - .FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED, - false, - ) - val values = mutableListOf<Boolean>() - val job = launch { underTest.isFeatureEnabled.toList(values) } - - assertThat(values.last()).isFalse() - - job.cancel() - } + fun creationSucceeds() { + assertThat(underTest).isNotNull() + } } diff --git a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt index efe9f64d..ac60282f 100644 --- a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt +++ b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/domain/interactor/KeyguardQuickAffordancePickerInteractorTest.kt @@ -17,6 +17,7 @@ package com.android.customization.model.picker.quickaffordance.domain.interactor +import androidx.test.core.app.ApplicationProvider import androidx.test.filters.SmallTest import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor @@ -24,6 +25,7 @@ import com.android.customization.picker.quickaffordance.domain.interactor.Keygua import com.android.customization.picker.quickaffordance.shared.model.KeyguardQuickAffordancePickerSelectionModel import com.android.systemui.shared.customization.data.content.FakeCustomizationProviderClient import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots +import com.android.wallpaper.config.BaseFlags import com.android.wallpaper.testing.FakeSnapshotStore import com.android.wallpaper.testing.collectLastValue import com.google.common.truth.Truth.assertThat @@ -57,12 +59,15 @@ class KeyguardQuickAffordancePickerInteractorTest { testScope = TestScope(testDispatcher) Dispatchers.setMain(testDispatcher) client = FakeCustomizationProviderClient() + val testFlags = object : BaseFlags() {} underTest = KeyguardQuickAffordancePickerInteractor( repository = KeyguardQuickAffordancePickerRepository( client = client, - backgroundDispatcher = testDispatcher, + scope = testScope.backgroundScope, + flags = testFlags, + context = ApplicationProvider.getApplicationContext(), ), client = client, snapshotRestorer = { diff --git a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt index f71bfc7d..93a84e6f 100644 --- a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt +++ b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt @@ -74,7 +74,8 @@ class KeyguardQuickAffordancePickerViewModelTest { @Before fun setUp() { - InjectorProvider.setInjector(TestInjector()) + val injector = TestInjector() + InjectorProvider.setInjector(injector) context = ApplicationProvider.getApplicationContext() val testDispatcher = StandardTestDispatcher() testScope = TestScope(testDispatcher) @@ -86,7 +87,9 @@ class KeyguardQuickAffordancePickerViewModelTest { repository = KeyguardQuickAffordancePickerRepository( client = client, - backgroundDispatcher = testDispatcher, + scope = testScope.backgroundScope, + flags = injector.getFlags(), + context = context, ), client = client, snapshotRestorer = { |