From ec8ce02ba4f3507a65a1a6840c81ef35126f3b4a Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Mon, 20 May 2024 11:38:58 +0800 Subject: [PATCH] Sort selectable subscriptions by sim slot index To match the sorting order in SubscriptionManagerService.getAvailableSubscriptionInfoList. Fix: 340361264 Test: manual - on SIMs Test: unit test Change-Id: I06b6c61304f9e6c9515b5f989294417ac3f82a60 --- .../telephony/SubscriptionRepository.kt | 28 ++++++------ .../telephony/SubscriptionRepositoryTest.kt | 44 +++++++++++-------- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/com/android/settings/network/telephony/SubscriptionRepository.kt b/src/com/android/settings/network/telephony/SubscriptionRepository.kt index adb67e1a512..4fd28a20f93 100644 --- a/src/com/android/settings/network/telephony/SubscriptionRepository.kt +++ b/src/com/android/settings/network/telephony/SubscriptionRepository.kt @@ -109,21 +109,21 @@ fun Context.getSelectableSubscriptionInfoList(): List { // to users so they should never be returned. SubscriptionUtil.isSubscriptionVisible(subscriptionManager, this, subInfo) } - // Multiple subscriptions in a group should only have one representative. - // It should be the current active primary subscription if any, or any primary subscription. - val groupUuidToSelectedIdMap = visibleList - .groupBy { it.groupUuid } - .mapValues { (_, subInfos) -> - subInfos.filter { it.simSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX } - .ifEmpty { subInfos } - .minOf { it.subscriptionId } - } - return visibleList - .filter { subInfo -> - val groupUuid = subInfo.groupUuid ?: return@filter true - groupUuidToSelectedIdMap[groupUuid] == subInfo.subscriptionId + .groupBy { it.groupUuid } + .flatMap { (groupUuid, subInfos) -> + if (groupUuid == null) { + subInfos + } else { + // Multiple subscriptions in a group should only have one representative. + // It should be the current active primary subscription if any, or the primary + // subscription with minimum subscription id. + subInfos.filter { it.simSlotIndex != SubscriptionManager.INVALID_SIM_SLOT_INDEX } + .ifEmpty { subInfos.sortedBy { it.subscriptionId } } + .take(1) + } } - .sortedBy { it.subscriptionId } + // Matching the sorting order in SubscriptionManagerService.getAvailableSubscriptionInfoList + .sortedWith(compareBy({ it.simSlotIndex }, { it.subscriptionId })) .also { Log.d(TAG, "getSelectableSubscriptionInfoList: $it") } } diff --git a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt index ce160979837..b2ee018faf0 100644 --- a/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt +++ b/tests/spa_unit/src/com/android/settings/network/telephony/SubscriptionRepositoryTest.kt @@ -66,10 +66,11 @@ class SubscriptionRepositoryTest { @Test fun isSubscriptionEnabledFlow_enabled() = runBlocking { mockSubscriptionManager.stub { - on { isSubscriptionEnabled(SUB_ID_1) } doReturn true + on { isSubscriptionEnabled(SUB_ID_IN_SLOT_0) } doReturn true } - val isEnabled = repository.isSubscriptionEnabledFlow(SUB_ID_1).firstWithTimeoutOrNull() + val isEnabled = + repository.isSubscriptionEnabledFlow(SUB_ID_IN_SLOT_0).firstWithTimeoutOrNull() assertThat(isEnabled).isTrue() } @@ -94,21 +95,24 @@ class SubscriptionRepositoryTest { } @Test - fun getSelectableSubscriptionInfoList_sortedBySubId() { + fun getSelectableSubscriptionInfoList_sortedBySimSlotIndex() { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf( SubscriptionInfo.Builder().apply { - setId(SUB_ID_2) + setSimSlotIndex(SIM_SLOT_INDEX_0) + setId(SUB_ID_IN_SLOT_0) }.build(), SubscriptionInfo.Builder().apply { - setId(SUB_ID_1) + setSimSlotIndex(SIM_SLOT_INDEX_1) + setId(SUB_ID_IN_SLOT_1) }.build(), ) } val subInfos = context.getSelectableSubscriptionInfoList() - assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_1, SUB_ID_2).inOrder() + assertThat(subInfos.map { it.simSlotIndex }) + .containsExactly(SIM_SLOT_INDEX_0, SIM_SLOT_INDEX_1).inOrder() } @Test @@ -116,20 +120,21 @@ class SubscriptionRepositoryTest { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf( SubscriptionInfo.Builder().apply { - setId(SUB_ID_1) + setSimSlotIndex(SubscriptionManager.INVALID_SIM_SLOT_INDEX) + setId(SUB_ID_3_NOT_IN_SLOT) setGroupUuid(GROUP_UUID) }.build(), SubscriptionInfo.Builder().apply { - setId(SUB_ID_2) + setSimSlotIndex(SIM_SLOT_INDEX_0) + setId(SUB_ID_IN_SLOT_0) setGroupUuid(GROUP_UUID) - setSimSlotIndex(SIM_SLOT_INDEX) }.build(), ) } val subInfos = context.getSelectableSubscriptionInfoList() - assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_2) + assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_IN_SLOT_0) } @Test @@ -137,11 +142,11 @@ class SubscriptionRepositoryTest { mockSubscriptionManager.stub { on { getAvailableSubscriptionInfoList() } doReturn listOf( SubscriptionInfo.Builder().apply { - setId(SUB_ID_2) + setId(SUB_ID_4_NOT_IN_SLOT) setGroupUuid(GROUP_UUID) }.build(), SubscriptionInfo.Builder().apply { - setId(SUB_ID_1) + setId(SUB_ID_3_NOT_IN_SLOT) setGroupUuid(GROUP_UUID) }.build(), ) @@ -149,16 +154,16 @@ class SubscriptionRepositoryTest { val subInfos = context.getSelectableSubscriptionInfoList() - assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_1) + assertThat(subInfos.map { it.subscriptionId }).containsExactly(SUB_ID_3_NOT_IN_SLOT) } @Test fun phoneNumberFlow() = runBlocking { mockSubscriptionManager.stub { - on { getPhoneNumber(SUB_ID_1) } doReturn NUMBER_1 + on { getPhoneNumber(SUB_ID_IN_SLOT_1) } doReturn NUMBER_1 } val subInfo = SubscriptionInfo.Builder().apply { - setId(SUB_ID_1) + setId(SUB_ID_IN_SLOT_1) setMcc(MCC) }.build() @@ -168,10 +173,13 @@ class SubscriptionRepositoryTest { } private companion object { - const val SUB_ID_1 = 1 - const val SUB_ID_2 = 2 + const val SIM_SLOT_INDEX_0 = 0 + const val SUB_ID_IN_SLOT_0 = 2 + const val SIM_SLOT_INDEX_1 = 1 + const val SUB_ID_IN_SLOT_1 = 1 + const val SUB_ID_3_NOT_IN_SLOT = 3 + const val SUB_ID_4_NOT_IN_SLOT = 4 val GROUP_UUID = UUID.randomUUID().toString() - const val SIM_SLOT_INDEX = 1 const val NUMBER_1 = "000000001" const val MCC = "310" }