Merge "Fixes RTL bug in quick affordance slot tabs." into udc-dev

This commit is contained in:
Ale Nijamkin
2023-04-07 00:18:29 +00:00
committed by Android (Google) Code Review
2 changed files with 61 additions and 25 deletions

View File

@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.data.repository
import android.content.Context
import android.os.UserHandle
import android.util.LayoutDirection
import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
@@ -113,30 +114,6 @@ constructor(
initialValue = emptyMap(),
)
private val _slotPickerRepresentations: List<KeyguardSlotPickerRepresentation> by lazy {
fun parseSlot(unparsedSlot: String): Pair<String, Int> {
val split = unparsedSlot.split(SLOT_CONFIG_DELIMITER)
check(split.size == 2)
val slotId = split[0]
val slotCapacity = split[1].toInt()
return slotId to slotCapacity
}
val unparsedSlots =
appContext.resources.getStringArray(R.array.config_keyguardQuickAffordanceSlots)
val seenSlotIds = mutableSetOf<String>()
unparsedSlots.mapNotNull { unparsedSlot ->
val (slotId, slotCapacity) = parseSlot(unparsedSlot)
check(!seenSlotIds.contains(slotId)) { "Duplicate slot \"$slotId\"!" }
seenSlotIds.add(slotId)
KeyguardSlotPickerRepresentation(
id = slotId,
maxSelectedAffordances = slotCapacity,
)
}
}
init {
legacySettingSyncer.startSyncing()
dumpManager.registerDumpable("KeyguardQuickAffordances", Dumpster())
@@ -211,7 +188,30 @@ constructor(
* each slot and select which affordance(s) is/are installed in each slot on the keyguard.
*/
fun getSlotPickerRepresentations(): List<KeyguardSlotPickerRepresentation> {
return _slotPickerRepresentations
fun parseSlot(unparsedSlot: String): Pair<String, Int> {
val split = unparsedSlot.split(SLOT_CONFIG_DELIMITER)
check(split.size == 2)
val slotId = split[0]
val slotCapacity = split[1].toInt()
return slotId to slotCapacity
}
val unparsedSlots =
appContext.resources.getStringArray(R.array.config_keyguardQuickAffordanceSlots)
if (appContext.resources.configuration.layoutDirection == LayoutDirection.RTL) {
unparsedSlots.reverse()
}
val seenSlotIds = mutableSetOf<String>()
return unparsedSlots.mapNotNull { unparsedSlot ->
val (slotId, slotCapacity) = parseSlot(unparsedSlot)
check(!seenSlotIds.contains(slotId)) { "Duplicate slot \"$slotId\"!" }
seenSlotIds.add(slotId)
KeyguardSlotPickerRepresentation(
id = slotId,
maxSelectedAffordances = slotCapacity,
)
}
}
private inner class Dumpster : Dumpable {

View File

@@ -41,6 +41,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import java.util.Locale
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
@@ -67,6 +68,7 @@ class KeyguardQuickAffordanceRepositoryTest : SysuiTestCase() {
@Before
fun setUp() {
context.resources.configuration.setLayoutDirection(Locale.US)
config1 = FakeKeyguardQuickAffordanceConfig(FakeCustomizationProviderClient.AFFORDANCE_1)
config2 = FakeKeyguardQuickAffordanceConfig(FakeCustomizationProviderClient.AFFORDANCE_2)
val testDispatcher = StandardTestDispatcher()
@@ -221,6 +223,40 @@ class KeyguardQuickAffordanceRepositoryTest : SysuiTestCase() {
)
}
@Test
fun getSlotPickerRepresentations_rightToLeft_slotsReversed() {
context.resources.configuration.setLayoutDirection(Locale("he", "IL"))
val slot1 = "slot1"
val slot2 = "slot2"
val slot3 = "slot3"
context.orCreateTestableResources.addOverride(
R.array.config_keyguardQuickAffordanceSlots,
arrayOf(
"$slot1:2",
"$slot2:4",
"$slot3:5",
),
)
assertThat(underTest.getSlotPickerRepresentations())
.isEqualTo(
listOf(
KeyguardSlotPickerRepresentation(
id = slot3,
maxSelectedAffordances = 5,
),
KeyguardSlotPickerRepresentation(
id = slot2,
maxSelectedAffordances = 4,
),
KeyguardSlotPickerRepresentation(
id = slot1,
maxSelectedAffordances = 2,
),
)
)
}
@Test
fun `selections for secondary user`() =
testScope.runTest {