Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.settingslib.notification.modes.TestModeBuilder import com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND import com.android.settingslib.notification.modes.ZenMode import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.Icon import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope Loading Loading @@ -457,6 +458,48 @@ class ModesDialogViewModelTest : SysuiTestCase() { tiles!!.forEach { assertThat(it.onLongClickLabel).isEqualTo("Open settings") } } @Test fun tiles_doesNotShareIcons() = testScope.runTest { val tiles by collectLastValue(underTest.tiles) repository.addModes( listOf( TestModeBuilder() .setId("bedtime1") .setName("Bedtime Mode #1") .setManualInvocationAllowed(true) .setType(AutomaticZenRule.TYPE_BEDTIME) .setActive(false) .build(), TestModeBuilder() .setId("bedtime2") .setName("Bedtime Mode #2") .setManualInvocationAllowed(true) .setType(AutomaticZenRule.TYPE_BEDTIME) .setActive(false) .build(), ) ) assertThat(tiles).hasSize(3) // DND + Bedtimes assertThat(tiles!![1].text).isEqualTo("Bedtime Mode #1") assertThat(tiles!![2].text).isEqualTo("Bedtime Mode #2") val tileIcon1 = tiles!![1].icon as Icon.Loaded val tileIcon2 = tiles!![2].icon as Icon.Loaded // The cache is actually caching... val bedtimeIcon = interactor.getModeIcon(repository.getMode("bedtime1")!!) val bedtimeIcon2 = interactor.getModeIcon(repository.getMode("bedtime2")!!) assertThat(bedtimeIcon2.drawable).isSameInstanceAs(bedtimeIcon.drawable) // ... but the tiles get COPIES of the icons assertThat(tileIcon1.res).isEqualTo(bedtimeIcon.key.resId) assertThat(tileIcon2.res).isEqualTo(bedtimeIcon.key.resId) assertThat(tileIcon1.drawable).isNotSameInstanceAs(bedtimeIcon.drawable) assertThat(tileIcon2.drawable).isNotSameInstanceAs(bedtimeIcon.drawable) assertThat(tileIcon2.drawable).isNotSameInstanceAs(tileIcon1.drawable) } @Test fun onClick_togglesTileState() = testScope.runTest { Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt +22 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.provider.Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS import android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID import com.android.settingslib.notification.modes.ZenMode import com.android.settingslib.notification.modes.ZenModeDescriptions import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.asIcon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background Loading @@ -45,7 +46,7 @@ class ModesDialogViewModel @Inject constructor( val context: Context, zenModeInteractor: ZenModeInteractor, private val zenModeInteractor: ZenModeInteractor, @Background val bgDispatcher: CoroutineDispatcher, private val dialogDelegate: ModesDialogDelegate, private val dialogEventLogger: ModesDialogEventLogger, Loading Loading @@ -86,7 +87,7 @@ constructor( modesList.map { mode -> ModeTileViewModel( id = mode.id, icon = zenModeInteractor.getModeIcon(mode).drawable().asIcon(), icon = getIcon(mode), text = mode.name, subtext = getTileSubtext(mode), subtextDescription = Loading Loading @@ -124,6 +125,25 @@ constructor( } .flowOn(bgDispatcher) /** * Get the icon of the [ZenMode] from the cache, cloning the drawable to prevent state sharing * (otherwise, the modes tile will be tinted the same way as the items in the dialog). */ private suspend fun getIcon(mode: ZenMode): Icon.Loaded { val cachedIcon = zenModeInteractor.getModeIcon(mode) val iconDrawable = cachedIcon.drawable.constantState?.newDrawable(context.resources) ?: cachedIcon.drawable.mutate() return iconDrawable.asIcon( res = if (cachedIcon.key.resPackage == null) { cachedIcon.key.resId } else { null } ) } private fun openSettings(mode: ZenMode) { dialogEventLogger.logModeSettings(mode) val intent: Intent = Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModelTest.kt +43 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import com.android.settingslib.notification.modes.TestModeBuilder import com.android.settingslib.notification.modes.TestModeBuilder.MANUAL_DND import com.android.settingslib.notification.modes.ZenMode import com.android.systemui.SysuiTestCase import com.android.systemui.common.shared.model.Icon import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope Loading Loading @@ -457,6 +458,48 @@ class ModesDialogViewModelTest : SysuiTestCase() { tiles!!.forEach { assertThat(it.onLongClickLabel).isEqualTo("Open settings") } } @Test fun tiles_doesNotShareIcons() = testScope.runTest { val tiles by collectLastValue(underTest.tiles) repository.addModes( listOf( TestModeBuilder() .setId("bedtime1") .setName("Bedtime Mode #1") .setManualInvocationAllowed(true) .setType(AutomaticZenRule.TYPE_BEDTIME) .setActive(false) .build(), TestModeBuilder() .setId("bedtime2") .setName("Bedtime Mode #2") .setManualInvocationAllowed(true) .setType(AutomaticZenRule.TYPE_BEDTIME) .setActive(false) .build(), ) ) assertThat(tiles).hasSize(3) // DND + Bedtimes assertThat(tiles!![1].text).isEqualTo("Bedtime Mode #1") assertThat(tiles!![2].text).isEqualTo("Bedtime Mode #2") val tileIcon1 = tiles!![1].icon as Icon.Loaded val tileIcon2 = tiles!![2].icon as Icon.Loaded // The cache is actually caching... val bedtimeIcon = interactor.getModeIcon(repository.getMode("bedtime1")!!) val bedtimeIcon2 = interactor.getModeIcon(repository.getMode("bedtime2")!!) assertThat(bedtimeIcon2.drawable).isSameInstanceAs(bedtimeIcon.drawable) // ... but the tiles get COPIES of the icons assertThat(tileIcon1.res).isEqualTo(bedtimeIcon.key.resId) assertThat(tileIcon2.res).isEqualTo(bedtimeIcon.key.resId) assertThat(tileIcon1.drawable).isNotSameInstanceAs(bedtimeIcon.drawable) assertThat(tileIcon2.drawable).isNotSameInstanceAs(bedtimeIcon.drawable) assertThat(tileIcon2.drawable).isNotSameInstanceAs(tileIcon1.drawable) } @Test fun onClick_togglesTileState() = testScope.runTest { Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/ui/dialog/viewmodel/ModesDialogViewModel.kt +22 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.provider.Settings.ACTION_AUTOMATIC_ZEN_RULE_SETTINGS import android.provider.Settings.EXTRA_AUTOMATIC_ZEN_RULE_ID import com.android.settingslib.notification.modes.ZenMode import com.android.settingslib.notification.modes.ZenModeDescriptions import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.asIcon import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background Loading @@ -45,7 +46,7 @@ class ModesDialogViewModel @Inject constructor( val context: Context, zenModeInteractor: ZenModeInteractor, private val zenModeInteractor: ZenModeInteractor, @Background val bgDispatcher: CoroutineDispatcher, private val dialogDelegate: ModesDialogDelegate, private val dialogEventLogger: ModesDialogEventLogger, Loading Loading @@ -86,7 +87,7 @@ constructor( modesList.map { mode -> ModeTileViewModel( id = mode.id, icon = zenModeInteractor.getModeIcon(mode).drawable().asIcon(), icon = getIcon(mode), text = mode.name, subtext = getTileSubtext(mode), subtextDescription = Loading Loading @@ -124,6 +125,25 @@ constructor( } .flowOn(bgDispatcher) /** * Get the icon of the [ZenMode] from the cache, cloning the drawable to prevent state sharing * (otherwise, the modes tile will be tinted the same way as the items in the dialog). */ private suspend fun getIcon(mode: ZenMode): Icon.Loaded { val cachedIcon = zenModeInteractor.getModeIcon(mode) val iconDrawable = cachedIcon.drawable.constantState?.newDrawable(context.resources) ?: cachedIcon.drawable.mutate() return iconDrawable.asIcon( res = if (cachedIcon.key.resPackage == null) { cachedIcon.key.resId } else { null } ) } private fun openSettings(mode: ZenMode) { dialogEventLogger.logModeSettings(mode) val intent: Intent = Loading