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

Commit ad61ddae authored by Behnam Heydarshahi's avatar Behnam Heydarshahi
Browse files

Flashlight tile percentage follows locale

Bug: 430076046
Flag: com.android.systemui.flashlight_strength
Test: atest FlashlightMapperTest
Change-Id: I114cbc2f637ca844768d11710343b8fd52fb4e5e
parent 51b138a7
Loading
Loading
Loading
Loading
+30 −5
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.qs.tiles.impl.flashlight.ui.mapper
package com.android.systemui.qs.tiles.impl.flashlight.ui.mapper


import android.content.res.Configuration
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.EnableFlags
import android.widget.Button
import android.widget.Button
@@ -31,6 +32,7 @@ import com.android.systemui.qs.tiles.impl.flashlight.qsFlashlightTileConfig
import com.android.systemui.res.R
import com.android.systemui.res.R
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import java.util.Locale
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertEquals
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
@@ -251,6 +253,9 @@ class FlashlightTileMapperTest : SysuiTestCase() {
    @Test
    @Test
    fun availableLevelEnabled_whenDataInCorrectRange() =
    fun availableLevelEnabled_whenDataInCorrectRange() =
        kosmos.runTest {
        kosmos.runTest {
            context.orCreateTestableResources.overrideConfiguration(
                Configuration(context.resources.configuration).apply { setLocale(Locale.US) }
            )
            val actual =
            val actual =
                underTest.map(
                underTest.map(
                    qsTileConfig,
                    qsTileConfig,
@@ -261,11 +266,31 @@ class FlashlightTileMapperTest : SysuiTestCase() {
                .isEqualTo(
                .isEqualTo(
                    createFlashlightState(
                    createFlashlightState(
                        activationState = QSTileState.ActivationState.ACTIVE,
                        activationState = QSTileState.ActivationState.ACTIVE,
                        secondaryLabel =
                        secondaryLabel = "47%",
                            context.getString(
                        toggleable = true,
                                R.string.quick_settings_flashlight_tile_level_percentage,
                    )
                                46, // 21/45 = 0.46
                )
                            ),
        }

    @EnableFlags(com.android.systemui.Flags.FLAG_FLASHLIGHT_STRENGTH)
    @Test
    fun availableLevelEnabled_whenDataInCorrectRange_withFrenchLocale() =
        kosmos.runTest {
            context.orCreateTestableResources.overrideConfiguration(
                Configuration(context.resources.configuration).apply { setLocale(Locale.FRANCE) }
            )

            val actual =
                underTest.map(
                    qsTileConfig,
                    FlashlightModel.Available.Level(true, DEFAULT_LEVEL, MAX_LEVEL),
                )

            assertThat(actual)
                .isEqualTo(
                    createFlashlightState(
                        activationState = QSTileState.ActivationState.ACTIVE,
                        secondaryLabel = "47 %", // extra NBSP
                        toggleable = true,
                        toggleable = true,
                    )
                    )
                )
                )
+0 −2
Original line number Original line Diff line number Diff line
@@ -945,8 +945,6 @@
    <string name="quick_settings_close_user_panel">Close</string>
    <string name="quick_settings_close_user_panel">Close</string>
    <!-- QuickSettings: Control panel: Label for connected device. [CHAR LIMIT=NONE] -->
    <!-- QuickSettings: Control panel: Label for connected device. [CHAR LIMIT=NONE] -->
    <string name="quick_settings_connected">Connected</string>
    <string name="quick_settings_connected">Connected</string>
    <!-- QuickSettings: Control panel: Label for connected device, showing remote device battery level. [CHAR LIMIT=NONE] -->
    <string name="quick_settings_connected_battery_level">Connected, battery <xliff:g id="battery_level_as_percentage">%1$s</xliff:g></string>
    <!-- QuickSettings: Control panel: Label for connecting device. [CHAR LIMIT=NONE] -->
    <!-- QuickSettings: Control panel: Label for connecting device. [CHAR LIMIT=NONE] -->
    <string name="quick_settings_connecting">Connecting...</string>
    <string name="quick_settings_connecting">Connecting...</string>
    <!-- QuickSettings: Tethering. [CHAR LIMIT=NONE] -->
    <!-- QuickSettings: Tethering. [CHAR LIMIT=NONE] -->
+10 −6
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.systemui.qs.tiles.base.shared.model.QSTileState
import com.android.systemui.qs.tiles.base.ui.model.QSTileDataToStateMapper
import com.android.systemui.qs.tiles.base.ui.model.QSTileDataToStateMapper
import com.android.systemui.res.R
import com.android.systemui.res.R
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.shade.ShadeDisplayAware
import java.text.NumberFormat
import javax.inject.Inject
import javax.inject.Inject


/** Maps [FlashlightModel] to [QSTileState]. */
/** Maps [FlashlightModel] to [QSTileState]. */
@@ -109,7 +110,7 @@ constructor(
    }
    }


    private fun QSTileState.Builder.buildLevelState(data: FlashlightModel.Available.Level) {
    private fun QSTileState.Builder.buildLevelState(data: FlashlightModel.Available.Level) {
        val percentage = getValidPercentage(data)
        val percentage = calculatePercentage(data)
        if (percentage == null) {
        if (percentage == null) {
            activationState = QSTileState.ActivationState.UNAVAILABLE
            activationState = QSTileState.ActivationState.UNAVAILABLE
            icon =
            icon =
@@ -128,8 +129,12 @@ constructor(
                    null,
                    null,
                    R.drawable.qs_flashlight_icon_on,
                    R.drawable.qs_flashlight_icon_on,
                )
                )
            secondaryLabel =

                res.getString(R.string.quick_settings_flashlight_tile_level_percentage, percentage)
            val percentInstance =
                res.configuration.locales.get(0)?.let { NumberFormat.getPercentInstance(it) }
                    ?: NumberFormat.getPercentInstance()

            secondaryLabel = percentInstance.format(percentage)
            supportedActions =
            supportedActions =
                setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.TOGGLE_CLICK)
                setOf(QSTileState.UserAction.CLICK, QSTileState.UserAction.TOGGLE_CLICK)
            expandedAccessibilityClass = Button::class
            expandedAccessibilityClass = Button::class
@@ -165,7 +170,7 @@ constructor(
        expandedAccessibilityClass = Switch::class
        expandedAccessibilityClass = Switch::class
    }
    }


    private fun getValidPercentage(data: FlashlightModel.Available.Level): Int? {
    private fun calculatePercentage(data: FlashlightModel.Available.Level): Float? {
        if (data.level < BASE_LEVEL || data.level > data.max) {
        if (data.level < BASE_LEVEL || data.level > data.max) {
            logger.wtf(
            logger.wtf(
                "FlashlightMapper: invalid Level data. level:${data.level}, max:${data.max}."
                "FlashlightMapper: invalid Level data. level:${data.level}, max:${data.max}."
@@ -173,8 +178,7 @@ constructor(
            return null
            return null
        }
        }


        val percentage = ((data.level / data.max.toFloat()) * 100).toInt()
        return data.level.toFloat() / data.max
        return percentage
    }
    }


    private companion object {
    private companion object {