diff options
6 files changed, 68 insertions, 15 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index f4d802bf745e..88af1793d771 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -806,4 +806,15 @@ <!-- Whether the device should display hotspot UI. If true, UI will display only when tethering is available. If false, UI will never show regardless of tethering availability" --> <bool name="config_show_wifi_tethering">true</bool> + + <!-- A collection of "slots" for placing quick affordance actions on the lock screen when the + device is locked. Each item is a string consisting of two parts, separated by the ':' character. + The first part is the unique ID for the slot, it is not a human-visible name, but should still + be unique across all slots specified. The second part is the capacity and must be a positive + integer; this is how many quick affordance actions that user is allowed to add to the slot. --> + <string-array name="config_keyguardQuickAffordanceSlots" translatable="false"> + <item>bottom_start:1</item> + <item>bottom_end:1</item> + </string-array> + </resources> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt index 95f614fbf7b1..9fda98c5f7c2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt @@ -17,6 +17,8 @@ package com.android.systemui.keyguard.data.repository +import android.content.Context +import com.android.systemui.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background @@ -24,7 +26,6 @@ import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanc import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceSelectionManager import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordancePickerRepresentation import com.android.systemui.keyguard.shared.model.KeyguardSlotPickerRepresentation -import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -39,6 +40,7 @@ import kotlinx.coroutines.launch class KeyguardQuickAffordanceRepository @Inject constructor( + @Application private val appContext: Context, @Application private val scope: CoroutineScope, @Background private val backgroundDispatcher: CoroutineDispatcher, private val selectionManager: KeyguardQuickAffordanceSelectionManager, @@ -61,6 +63,30 @@ 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, + ) + } + } + /** * Returns a snapshot of the [KeyguardQuickAffordanceConfig] instances of the affordances at the * slot with the given ID. The configs are sorted in descending priority order. @@ -115,14 +141,10 @@ constructor( * each slot and select which affordance(s) is/are installed in each slot on the keyguard. */ fun getSlotPickerRepresentations(): List<KeyguardSlotPickerRepresentation> { - // TODO(b/256195304): source these from a config XML file. - return listOf( - KeyguardSlotPickerRepresentation( - id = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, - ), - KeyguardSlotPickerRepresentation( - id = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END, - ), - ) + return _slotPickerRepresentations + } + + companion object { + private const val SLOT_CONFIG_DELIMITER = ":" } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt index 5a7f2bb5cb37..dceb492af2ed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt @@ -18,13 +18,13 @@ package com.android.systemui.keyguard.data.repository import androidx.test.filters.SmallTest +import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.keyguard.data.quickaffordance.FakeKeyguardQuickAffordanceConfig import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceSelectionManager import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordancePickerRepresentation import com.android.systemui.keyguard.shared.model.KeyguardSlotPickerRepresentation -import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -53,6 +53,7 @@ class KeyguardQuickAffordanceRepositoryTest : SysuiTestCase() { config2 = FakeKeyguardQuickAffordanceConfig("built_in:2") underTest = KeyguardQuickAffordanceRepository( + appContext = context, scope = CoroutineScope(IMMEDIATE), backgroundDispatcher = IMMEDIATE, selectionManager = KeyguardQuickAffordanceSelectionManager(), @@ -119,16 +120,32 @@ class KeyguardQuickAffordanceRepositoryTest : SysuiTestCase() { @Test fun getSlotPickerRepresentations() { + 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 = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_START, - maxSelectedAffordances = 1, + id = slot1, + maxSelectedAffordances = 2, + ), + KeyguardSlotPickerRepresentation( + id = slot2, + maxSelectedAffordances = 4, ), KeyguardSlotPickerRepresentation( - id = KeyguardQuickAffordanceSlots.SLOT_ID_BOTTOM_END, - maxSelectedAffordances = 1, + id = slot3, + maxSelectedAffordances = 5, ), ) ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt index 8b6603d79244..737f24224727 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt @@ -230,6 +230,7 @@ class KeyguardQuickAffordanceInteractorParameterizedTest : SysuiTestCase() { FakeKeyguardQuickAffordanceConfig(BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER) val quickAffordanceRepository = KeyguardQuickAffordanceRepository( + appContext = context, scope = CoroutineScope(IMMEDIATE), backgroundDispatcher = IMMEDIATE, selectionManager = KeyguardQuickAffordanceSelectionManager(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt index 33645354d9f3..ffcf832b95ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt @@ -92,6 +92,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { val quickAffordanceRepository = KeyguardQuickAffordanceRepository( + appContext = context, scope = CoroutineScope(IMMEDIATE), backgroundDispatcher = IMMEDIATE, selectionManager = KeyguardQuickAffordanceSelectionManager(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt index 78148c4d3d1b..fa2ac46f46d2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt @@ -117,6 +117,7 @@ class KeyguardBottomAreaViewModelTest : SysuiTestCase() { .thenReturn(LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED) val quickAffordanceRepository = KeyguardQuickAffordanceRepository( + appContext = context, scope = CoroutineScope(IMMEDIATE), backgroundDispatcher = IMMEDIATE, selectionManager = KeyguardQuickAffordanceSelectionManager(), |