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

Commit ca0f149c authored by Matías Hernández's avatar Matías Hernández
Browse files

Update the text of the Modes Tile

Instead of a fixed title, place the mode name (or the "x modes" text) in there, and the status in the subtitle.

Fixes: 408238841
Test: atest ModesTileMapperTest + manual
Flag: android.app.modes_ui_tile_reactivates_last
Change-Id: I39c2e3f3c76e8596bc3531ae12007b886cde413e
parent 236a3c6f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.whenever

@EnableFlags(android.app.Flags.FLAG_MODES_UI)
@EnableFlags(android.app.Flags.FLAG_MODES_UI, android.app.Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWithLooper(setAsMainLooper = true)
@@ -194,7 +194,7 @@ class ModesTileTest : SysuiTestCase() {
            underTest.handleUpdateState(tileState, model)

            assertThat(tileState.state).isEqualTo(Tile.STATE_ACTIVE)
            assertThat(tileState.secondaryLabel).isEqualTo("2 modes are active")
            assertThat(tileState.label).isEqualTo("2 Modes")
        }

    @Test
@@ -212,6 +212,6 @@ class ModesTileTest : SysuiTestCase() {
            underTest.handleUpdateState(tileState, null)

            assertThat(tileState.state).isEqualTo(Tile.STATE_ACTIVE)
            assertThat(tileState.secondaryLabel).isEqualTo("2 modes are active")
            assertThat(tileState.label).isEqualTo("2 Modes")
        }
}
+67 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles.impl.modes.ui.mapper

import android.app.Flags
import android.graphics.drawable.TestStubDrawable
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -58,7 +59,8 @@ class ModesTileMapperTest : SysuiTestCase() {
        )

    @Test
    fun inactiveState() {
    @DisableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun inactiveState_legacy() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
@@ -76,7 +78,8 @@ class ModesTileMapperTest : SysuiTestCase() {
    }

    @Test
    fun activeState_oneMode() {
    @DisableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun activeState_oneMode_legacy() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
@@ -94,7 +97,8 @@ class ModesTileMapperTest : SysuiTestCase() {
    }

    @Test
    fun activeState_multipleModes() {
    @DisableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun activeState_multipleModes_legacy() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
@@ -111,6 +115,66 @@ class ModesTileMapperTest : SysuiTestCase() {
        assertThat(state.secondaryLabel).isEqualTo("3 modes are active")
    }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun inactiveState() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
                isActivated = false,
                activeModes = emptyList(),
                icon = icon,
                quickMode = TestModeBuilder.MANUAL_DND,
            )

        val state = underTest.map(config, model)

        assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.INACTIVE)
        assertThat(state.icon).isEqualTo(icon)
        assertThat(state.label).isEqualTo("Modes")
        assertThat(state.secondaryLabel).isEqualTo("")
    }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun activeState_oneMode() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
                isActivated = true,
                activeModes = listOf("DND"),
                icon = icon,
                quickMode = TestModeBuilder.MANUAL_DND,
            )

        val state = underTest.map(config, model)

        assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.ACTIVE)
        assertThat(state.icon).isEqualTo(icon)
        assertThat(state.label).isEqualTo("DND")
        assertThat(state.secondaryLabel).isEqualTo("On")
    }

    @Test
    @EnableFlags(Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
    fun activeState_multipleModes() {
        val icon = TestStubDrawable("res123").asIcon()
        val model =
            ModesTileModel(
                isActivated = true,
                activeModes = listOf("Mode 1", "Mode 2", "Mode 3"),
                icon = icon,
                quickMode = TestModeBuilder.MANUAL_DND,
            )

        val state = underTest.map(config, model)

        assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.ACTIVE)
        assertThat(state.icon).isEqualTo(icon)
        assertThat(state.label).isEqualTo("3 Modes")
        assertThat(state.secondaryLabel).isEqualTo("On")
    }

    @Test
    fun state_modelHasIconResId_includesIconResId() {
        val icon = TestStubDrawable("res123").asIcon(res = 123)
+6 −0
Original line number Diff line number Diff line
@@ -1215,6 +1215,12 @@
        }
    </string>

    <!-- Modes: title for when multiple modes are active.[CHAR LIMIT=20] -->
    <string name="zen_modes_multiple_on_title">%s Modes</string>

    <!-- Modes: subtitle for when multiple modes are active. Plural. [CHAR LIMIT=20] -->
    <string name="zen_modes_multiple_on_status">On</string>

    <!-- Zen mode: Priority only introduction message on first use -->
    <string name="zen_priority_introduction">You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify. You\'ll still hear anything you choose to play including music, videos, and games.</string>

+21 −2
Original line number Diff line number Diff line
@@ -41,7 +41,13 @@ constructor(@ShadeDisplayAware private val resources: Resources, val theme: Reso
                } else {
                    QSTileState.ActivationState.INACTIVE
                }
            secondaryLabel = getModesStatus(data, resources)
            if (android.app.Flags.modesUiTileReactivatesLast()) {
                label = getLabel(data, resources)
                secondaryLabel = getSecondaryLabel(data, resources)
            } else {
                // label is fixed, set by QSTileState.build() from uiConfig
                secondaryLabel = legacyGetModesStatus(data, resources)
            }
            contentDescription = "$label. $secondaryLabel"
            supportedActions =
                setOf(
@@ -53,7 +59,20 @@ constructor(@ShadeDisplayAware private val resources: Resources, val theme: Reso
            expandedAccessibilityClass = Button::class
        }

    private fun getModesStatus(data: ModesTileModel, resources: Resources): String {
    private fun getLabel(data: ModesTileModel, resources: Resources): String {
        return if (data.activeModes.size >= 2)
            resources.getString(R.string.zen_modes_multiple_on_title, data.activeModes.size)
        else if (data.activeModes.size == 1) data.activeModes.first()
        else resources.getString(R.string.quick_settings_modes_label)
    }

    private fun getSecondaryLabel(data: ModesTileModel, resources: Resources): String {
        return if (data.activeModes.size >= 2)
            resources.getString(R.string.zen_modes_multiple_on_status)
        else if (data.activeModes.size == 1) resources.getString(R.string.zen_mode_on) else ""
    }

    private fun legacyGetModesStatus(data: ModesTileModel, resources: Resources): String {
        val msgFormat =
            MessageFormat(resources.getString(R.string.zen_mode_active_modes), Locale.getDefault())
        val count = data.activeModes.count()