Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66125dac authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

Make ZenModeInteractor#getModeIcon return an Icon with a drawable copy

Instead of having to make a copy and converting it in every place where it is used.

Bug: 388472403
Flag: EXEMPT minor refactor
Test: existing tests pass
Change-Id: Iaffaf744749aec77b384db69b592ceab005eeef5
parent 50f7d197
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ class QSTileViewModelImplTest : SysuiTestCase() {
                .isEqualTo(
                    "test_spec:\n" +
                        "    QSTileState(" +
                        "icon=Resource(res=0, contentDescription=Resource(res=0)), " +
                        "icon=Resource(resId=0, contentDescription=Resource(res=0)), " +
                        "label=test_data, " +
                        "activationState=INACTIVE, " +
                        "secondaryLabel=null, " +
+47 −13
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ 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.ContentDescription
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
import com.android.systemui.flags.andSceneContainer
@@ -173,9 +173,12 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            // Add an active mode with a default icon: icon should be the mode icon, and the
            // iconResId is also populated, because we know it's a system icon.
            zenModeRepository.addMode(
                id = "Bedtime with default icon",
                type = AutomaticZenRule.TYPE_BEDTIME,
                active = true,
                TestModeBuilder()
                    .setId("Bedtime with default icon")
                    .setName(BEDTIME_NAME)
                    .setType(AutomaticZenRule.TYPE_BEDTIME)
                    .setActive(true)
                    .build()
            )
            runCurrent()
            assertThat(tileData?.icon).isEqualTo(BEDTIME_ICON)
@@ -186,6 +189,7 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            zenModeRepository.addMode(
                TestModeBuilder()
                    .setId("Driving with custom icon")
                    .setName(CUSTOM_NAME)
                    .setType(AutomaticZenRule.TYPE_DRIVING)
                    .setPackage(CUSTOM_PACKAGE)
                    .setIconResId(CUSTOM_DRAWABLE_ID)
@@ -197,11 +201,9 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            assertThat(tileData?.icon!!.resId).isEqualTo(BEDTIME_DRAWABLE_ID)

            // Deactivate more important mode: icon should be the less important, still active mode
            // And because it's a package-provided icon, iconResId is not populated.
            zenModeRepository.deactivateMode("Bedtime with default icon")
            runCurrent()
            assertThat(tileData?.icon).isEqualTo(CUSTOM_ICON)
            assertThat(tileData?.icon!!.resId).isNull()

            // Deactivate remaining mode: back to the default modes icon
            zenModeRepository.deactivateMode("Driving with custom icon")
@@ -230,6 +232,7 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            zenModeRepository.addMode(
                TestModeBuilder()
                    .setId("Manual Mode 1")
                    .setName(BEDTIME_NAME)
                    .setManualInvocationAllowed(true)
                    .setPackage("android")
                    .setIconResId(BEDTIME_DRAWABLE_ID)
@@ -238,6 +241,7 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            zenModeRepository.addMode(
                TestModeBuilder()
                    .setId("Manual Mode 2")
                    .setName(THEATER_NAME)
                    .setManualInvocationAllowed(true)
                    .setPackage("android")
                    .setIconResId(THEATER_DRAWABLE_ID)
@@ -261,9 +265,12 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(

            // With an active mode -> the icon of the active mode, regardless of past activations
            zenModeRepository.addMode(
                id = "Active automatic mode",
                type = AutomaticZenRule.TYPE_BEDTIME,
                active = true,
                TestModeBuilder()
                    .setId("Active automatic mode")
                    .setName(BEDTIME_NAME)
                    .setType(AutomaticZenRule.TYPE_BEDTIME)
                    .setActive(true)
                    .build()
            )
            runCurrent()
            assertThat(tileData?.icon).isEqualTo(BEDTIME_ICON)
@@ -283,6 +290,7 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
            zenModeRepository.addMode(
                TestModeBuilder()
                    .setId("mode1")
                    .setName(BEDTIME_NAME)
                    .setManualInvocationAllowed(true)
                    .setPackage("android")
                    .setIconResId(BEDTIME_DRAWABLE_ID)
@@ -424,9 +432,35 @@ class ModesTileDataInteractorTest(flags: FlagsParameterization) : SysuiTestCase(
        val THEATER_DRAWABLE = TestStubDrawable("theater")
        val CUSTOM_DRAWABLE = TestStubDrawable("custom")

        val MODES_ICON = Icon.Loaded(MODES_DRAWABLE, null, MODES_DRAWABLE_ID)
        val BEDTIME_ICON = Icon.Loaded(BEDTIME_DRAWABLE, null, BEDTIME_DRAWABLE_ID)
        val THEATER_ICON = Icon.Loaded(THEATER_DRAWABLE, null, THEATER_DRAWABLE_ID)
        val CUSTOM_ICON = CUSTOM_DRAWABLE.asIcon()
        // The names are used for the icon's content description
        const val BEDTIME_NAME = "Bedtime"
        const val THEATER_NAME = "Theater"
        const val CUSTOM_NAME = "Custom"

        val MODES_ICON =
            Icon.Loaded(
                drawable = MODES_DRAWABLE,
                contentDescription = null,
                resId = MODES_DRAWABLE_ID,
            )
        val BEDTIME_ICON =
            Icon.Loaded(
                drawable = BEDTIME_DRAWABLE,
                contentDescription = ContentDescription.Loaded(BEDTIME_NAME),
                resId = BEDTIME_DRAWABLE_ID,
            )
        val THEATER_ICON =
            Icon.Loaded(
                drawable = THEATER_DRAWABLE,
                contentDescription = ContentDescription.Loaded(THEATER_NAME),
                resId = THEATER_DRAWABLE_ID,
            )
        val CUSTOM_ICON =
            Icon.Loaded(
                drawable = CUSTOM_DRAWABLE,
                contentDescription = ContentDescription.Loaded(CUSTOM_NAME),
                packageName = CUSTOM_PACKAGE,
                resId = CUSTOM_DRAWABLE_ID,
            )
    }
}
+3 −3
Original line number Diff line number Diff line
@@ -367,17 +367,17 @@ class ZenModeInteractorTest : SysuiTestCase() {

            zenModeRepository.activateMode("Other")
            assertThat(mainActiveMode?.name).isEqualTo("Mode Other")
            assertThat(mainActiveMode?.icon?.key?.resId)
            assertThat(mainActiveMode?.icon?.resId)
                .isEqualTo(R.drawable.ic_zen_mode_type_other)

            zenModeRepository.activateMode("Bedtime")
            assertThat(mainActiveMode?.name).isEqualTo("Mode Bedtime")
            assertThat(mainActiveMode?.icon?.key?.resId)
            assertThat(mainActiveMode?.icon?.resId)
                .isEqualTo(R.drawable.ic_zen_mode_type_bedtime)

            zenModeRepository.deactivateMode("Other")
            assertThat(mainActiveMode?.name).isEqualTo("Mode Bedtime")
            assertThat(mainActiveMode?.icon?.key?.resId)
            assertThat(mainActiveMode?.icon?.resId)
                .isEqualTo(R.drawable.ic_zen_mode_type_bedtime)

            zenModeRepository.deactivateMode("Bedtime")
+0 −43
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ 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
@@ -458,48 +457,6 @@ 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.resId).isEqualTo(bedtimeIcon.key.resId)
            assertThat(tileIcon2.resId).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 {
+2 −2
Original line number Diff line number Diff line
@@ -207,8 +207,8 @@ class ZenModeIconViewModelTest : SysuiTestCase() {

            assertThat(loadedIcon.contentDescription)
                .isEqualTo(ContentDescription.Loaded(lowPriModeName))
            // Resource ID should be null, but the drawable should be present.
            assertThat(loadedIcon.resId).isNull()
            assertThat(loadedIcon.resId).isEqualTo(CUSTOM_ICON_RES_ID)
            assertThat(loadedIcon.packageName).isEqualTo(CUSTOM_PACKAGE_NAME)
            assertThat(loadedIcon.drawable).isEqualTo(CUSTOM_DRAWABLE)
        }

Loading