diff options
author | 2024-10-09 18:37:02 +0000 | |
---|---|---|
committer | 2024-10-09 18:37:02 +0000 | |
commit | 1ebfc0d8523251ebc65d28a85b50f275da23b5d8 (patch) | |
tree | 258f0d0b45c915c6e48329c38d0c9a5960b5e8ff | |
parent | 7123b68d49bf6a19acd2b272b917eb395070b4e7 (diff) | |
parent | 726283a339e4810e211371c3072e8e66ad77f660 (diff) |
Merge "Modes Tile: load default drawable in mapper" into main
7 files changed, 78 insertions, 43 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractorTest.kt index de3dc5730421..1d80826d0b45 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractorTest.kt @@ -28,6 +28,7 @@ import com.android.internal.R import com.android.settingslib.notification.modes.TestModeBuilder import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestableContext +import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.asIcon import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues @@ -144,13 +145,13 @@ class ModesTileDataInteractorTest : SysuiTestCase() { // Tile starts with the generic Modes icon. runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) // Add an inactive mode -> Still modes icon zenModeRepository.addMode(id = "Mode", active = false) runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) // Add an active mode with a default icon: icon should be the mode icon, and the @@ -158,7 +159,7 @@ class ModesTileDataInteractorTest : SysuiTestCase() { zenModeRepository.addMode( id = "Bedtime with default icon", type = AutomaticZenRule.TYPE_BEDTIME, - active = true + active = true, ) runCurrent() assertThat(tileData?.icon).isEqualTo(BEDTIME_ICON) @@ -189,7 +190,7 @@ class ModesTileDataInteractorTest : SysuiTestCase() { // Deactivate remaining mode: back to the default modes icon zenModeRepository.deactivateMode("Driving with custom icon") runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) } @@ -204,18 +205,18 @@ class ModesTileDataInteractorTest : SysuiTestCase() { ) runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) // Activate a Mode -> Icon doesn't change. zenModeRepository.addMode(id = "Mode", active = true) runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) zenModeRepository.deactivateMode(id = "Mode") runCurrent() - assertThat(tileData?.icon).isEqualTo(MODES_ICON) + assertThat(tileData?.icon).isEqualTo(MODES_RESOURCE_ICON) assertThat(tileData?.iconResId).isEqualTo(MODES_DRAWABLE_ID) } @@ -263,7 +264,7 @@ class ModesTileDataInteractorTest : SysuiTestCase() { val BEDTIME_DRAWABLE = TestStubDrawable("bedtime") val CUSTOM_DRAWABLE = TestStubDrawable("custom") - val MODES_ICON = MODES_DRAWABLE.asIcon() + val MODES_RESOURCE_ICON = Icon.Resource(MODES_DRAWABLE_ID, null) val BEDTIME_ICON = BEDTIME_DRAWABLE.asIcon() val CUSTOM_ICON = CUSTOM_DRAWABLE.asIcon() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapperTest.kt index c3d45dbbd09a..a58cb9ce25b3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapperTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapperTest.kt @@ -22,7 +22,9 @@ import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.asIcon +import com.android.systemui.qs.tiles.ModesTile import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel import com.android.systemui.qs.tiles.viewmodel.QSTileConfigTestBuilder import com.android.systemui.qs.tiles.viewmodel.QSTileState @@ -51,6 +53,11 @@ class ModesTileMapperTest : SysuiTestCase() { .apply { addOverride(R.drawable.qs_dnd_icon_on, TestStubDrawable()) addOverride(R.drawable.qs_dnd_icon_off, TestStubDrawable()) + addOverride( + ModesTile.ICON_RES_ID, + TestStubDrawable(ModesTile.ICON_RES_ID.toString()), + ) + addOverride(123, TestStubDrawable("123")) } .resources, context.theme, @@ -59,12 +66,7 @@ class ModesTileMapperTest : SysuiTestCase() { @Test fun inactiveState() { val icon = TestStubDrawable("res123").asIcon() - val model = - ModesTileModel( - isActivated = false, - activeModes = emptyList(), - icon = icon, - ) + val model = ModesTileModel(isActivated = false, activeModes = emptyList(), icon = icon) val state = underTest.map(config, model) @@ -76,12 +78,7 @@ class ModesTileMapperTest : SysuiTestCase() { @Test fun activeState_oneMode() { val icon = TestStubDrawable("res123").asIcon() - val model = - ModesTileModel( - isActivated = true, - activeModes = listOf("DND"), - icon = icon, - ) + val model = ModesTileModel(isActivated = true, activeModes = listOf("DND"), icon = icon) val state = underTest.map(config, model) @@ -108,19 +105,36 @@ class ModesTileMapperTest : SysuiTestCase() { } @Test - fun state_modelHasIconResId_includesIconResId() { - val icon = TestStubDrawable("res123").asIcon() + fun resourceIconModel_whenResIdsIdentical_mapsToLoadedIconWithInputResId() { + val icon = Icon.Resource(123, null) val model = ModesTileModel( isActivated = false, activeModes = emptyList(), icon = icon, - iconResId = 123 + iconResId = 123, ) val state = underTest.map(config, model) - assertThat(state.icon()).isEqualTo(icon) + assertThat(state.icon()).isEqualTo(TestStubDrawable("123").asIcon()) + assertThat(state.iconRes).isEqualTo(123) + } + + @Test + fun resourceIconModel_whenResIdsNonIdentical_mapsToLoadedIconWithIconResourceId() { + val icon = Icon.Resource(123, null) + val model = + ModesTileModel( + isActivated = false, + activeModes = emptyList(), + icon = icon, + iconResId = 321, // Note: NOT 123. This will be ignored. + ) + + val state = underTest.map(config, model) + + assertThat(state.icon()).isEqualTo(TestStubDrawable("123").asIcon()) assertThat(state.iconRes).isEqualTo(123) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileIcon.kt b/packages/SystemUI/src/com/android/systemui/qs/QSTileIcon.kt index ef7e7eb59898..62694ceffda8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileIcon.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileIcon.kt @@ -22,13 +22,18 @@ import com.android.systemui.qs.tileimpl.QSTileImpl /** * Creates a [QSTile.Icon] from an [Icon]. - * * [Icon.Loaded] -> [QSTileImpl.DrawableIcon] + * * [Icon.Loaded] && [resId] null -> [QSTileImpl.DrawableIcon] + * * [Icon.Loaded] && [resId] available -> [QSTileImpl.DrawableIconWithRes] * * [Icon.Resource] -> [QSTileImpl.ResourceIcon] */ -fun Icon.asQSTileIcon(): QSTile.Icon { +fun Icon.asQSTileIcon(resId: Int?): QSTile.Icon { return when (this) { is Icon.Loaded -> { - QSTileImpl.DrawableIcon(this.drawable) + if (resId != null) { + QSTileImpl.DrawableIconWithRes(this.drawable, resId) + } else { + QSTileImpl.DrawableIcon(this.drawable) + } } is Icon.Resource -> { QSTileImpl.ResourceIcon.get(this.res) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt index cf2db6c66ce7..3bbe624595d9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt @@ -121,7 +121,7 @@ constructor( state?.apply { this.state = tileState.activationState.legacyState val tileStateIcon = tileState.icon() - icon = tileStateIcon?.asQSTileIcon() ?: ResourceIcon.get(ICON_RES_ID) + icon = tileStateIcon?.asQSTileIcon(tileState.iconRes) ?: ResourceIcon.get(ICON_RES_ID) label = tileLabel secondaryLabel = tileState.secondaryLabel contentDescription = tileState.contentDescription diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt index 5d44ead7c21a..40591bf56e0a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/interactor/ModesTileDataInteractor.kt @@ -76,14 +76,14 @@ constructor( } else { return ModesTileModel( isActivated = activeModes.isAnyActive(), - icon = context.getDrawable(ModesTile.ICON_RES_ID)!!.asIcon(), + icon = Icon.Resource(ModesTile.ICON_RES_ID, null), iconResId = ModesTile.ICON_RES_ID, activeModes = activeModes.modeNames, ) } } - private data class TileIcon(val icon: Icon.Loaded, val resId: Int?) + private data class TileIcon(val icon: Icon, val resId: Int?) private fun getTileIcon(activeMode: ZenModeInfo?): TileIcon { return if (activeMode != null) { @@ -94,7 +94,7 @@ constructor( TileIcon(activeMode.icon.drawable.asIcon(), null) } } else { - TileIcon(context.getDrawable(ModesTile.ICON_RES_ID)!!.asIcon(), ModesTile.ICON_RES_ID) + TileIcon(Icon.Resource(ModesTile.ICON_RES_ID, null), ModesTile.ICON_RES_ID) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/model/ModesTileModel.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/model/ModesTileModel.kt index db4812342050..9c31e322dfd2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/model/ModesTileModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/domain/model/ModesTileModel.kt @@ -21,12 +21,12 @@ import com.android.systemui.common.shared.model.Icon data class ModesTileModel( val isActivated: Boolean, val activeModes: List<String>, - val icon: Icon.Loaded, + val icon: Icon, /** * Resource id corresponding to [icon]. Will only be present if it's know to correspond to a * resource with a known id in SystemUI (such as resources from `android.R`, * `com.android.internal.R`, or `com.android.systemui.res` itself). */ - val iconResId: Int? = null + val iconResId: Int? = null, ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapper.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapper.kt index 69da3134314b..801a0ce4b744 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapper.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/modes/ui/ModesTileMapper.kt @@ -18,7 +18,9 @@ package com.android.systemui.qs.tiles.impl.modes.ui import android.content.res.Resources import android.icu.text.MessageFormat +import android.util.Log import android.widget.Button +import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel @@ -30,14 +32,30 @@ import javax.inject.Inject class ModesTileMapper @Inject -constructor( - @Main private val resources: Resources, - val theme: Resources.Theme, -) : QSTileDataToStateMapper<ModesTileModel> { +constructor(@Main private val resources: Resources, val theme: Resources.Theme) : + QSTileDataToStateMapper<ModesTileModel> { override fun map(config: QSTileConfig, data: ModesTileModel): QSTileState = QSTileState.build(resources, theme, config.uiConfig) { - iconRes = data.iconResId - icon = { data.icon } + val loadedIcon: Icon.Loaded = + when (val dataIcon = data.icon) { + is Icon.Resource -> { + if (iconRes != dataIcon.res) { + Log.wtf( + "ModesTileMapper", + "Icon.Resource.res & iconResId are not identical", + ) + } + iconRes = dataIcon.res + Icon.Loaded(resources.getDrawable(dataIcon.res, theme), null) + } + is Icon.Loaded -> { + iconRes = data.iconResId + dataIcon + } + } + + icon = { loadedIcon } + activationState = if (data.isActivated) { QSTileState.ActivationState.ACTIVE @@ -47,10 +65,7 @@ constructor( secondaryLabel = getModesStatus(data, resources) contentDescription = "$label. $secondaryLabel" supportedActions = - setOf( - QSTileState.UserAction.CLICK, - QSTileState.UserAction.LONG_CLICK, - ) + setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.LONG_CLICK) sideViewIcon = QSTileState.SideViewIcon.Chevron expandedAccessibilityClass = Button::class } |