Merge "Sort selectable subscriptions by sim slot index" into main
This commit is contained in:
@@ -109,21 +109,21 @@ fun Context.getSelectableSubscriptionInfoList(): List<SubscriptionInfo> {
|
|||||||
// to users so they should never be returned.
|
// to users so they should never be returned.
|
||||||
SubscriptionUtil.isSubscriptionVisible(subscriptionManager, this, subInfo)
|
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
|
return visibleList
|
||||||
.filter { subInfo ->
|
.groupBy { it.groupUuid }
|
||||||
val groupUuid = subInfo.groupUuid ?: return@filter true
|
.flatMap { (groupUuid, subInfos) ->
|
||||||
groupUuidToSelectedIdMap[groupUuid] == subInfo.subscriptionId
|
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") }
|
.also { Log.d(TAG, "getSelectableSubscriptionInfoList: $it") }
|
||||||
}
|
}
|
||||||
|
@@ -66,10 +66,11 @@ class SubscriptionRepositoryTest {
|
|||||||
@Test
|
@Test
|
||||||
fun isSubscriptionEnabledFlow_enabled() = runBlocking {
|
fun isSubscriptionEnabledFlow_enabled() = runBlocking {
|
||||||
mockSubscriptionManager.stub {
|
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()
|
assertThat(isEnabled).isTrue()
|
||||||
}
|
}
|
||||||
@@ -94,21 +95,24 @@ class SubscriptionRepositoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getSelectableSubscriptionInfoList_sortedBySubId() {
|
fun getSelectableSubscriptionInfoList_sortedBySimSlotIndex() {
|
||||||
mockSubscriptionManager.stub {
|
mockSubscriptionManager.stub {
|
||||||
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_2)
|
setSimSlotIndex(SIM_SLOT_INDEX_0)
|
||||||
|
setId(SUB_ID_IN_SLOT_0)
|
||||||
}.build(),
|
}.build(),
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_1)
|
setSimSlotIndex(SIM_SLOT_INDEX_1)
|
||||||
|
setId(SUB_ID_IN_SLOT_1)
|
||||||
}.build(),
|
}.build(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val subInfos = context.getSelectableSubscriptionInfoList()
|
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
|
@Test
|
||||||
@@ -116,20 +120,21 @@ class SubscriptionRepositoryTest {
|
|||||||
mockSubscriptionManager.stub {
|
mockSubscriptionManager.stub {
|
||||||
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_1)
|
setSimSlotIndex(SubscriptionManager.INVALID_SIM_SLOT_INDEX)
|
||||||
|
setId(SUB_ID_3_NOT_IN_SLOT)
|
||||||
setGroupUuid(GROUP_UUID)
|
setGroupUuid(GROUP_UUID)
|
||||||
}.build(),
|
}.build(),
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_2)
|
setSimSlotIndex(SIM_SLOT_INDEX_0)
|
||||||
|
setId(SUB_ID_IN_SLOT_0)
|
||||||
setGroupUuid(GROUP_UUID)
|
setGroupUuid(GROUP_UUID)
|
||||||
setSimSlotIndex(SIM_SLOT_INDEX)
|
|
||||||
}.build(),
|
}.build(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
val subInfos = context.getSelectableSubscriptionInfoList()
|
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
|
@Test
|
||||||
@@ -137,11 +142,11 @@ class SubscriptionRepositoryTest {
|
|||||||
mockSubscriptionManager.stub {
|
mockSubscriptionManager.stub {
|
||||||
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
on { getAvailableSubscriptionInfoList() } doReturn listOf(
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_2)
|
setId(SUB_ID_4_NOT_IN_SLOT)
|
||||||
setGroupUuid(GROUP_UUID)
|
setGroupUuid(GROUP_UUID)
|
||||||
}.build(),
|
}.build(),
|
||||||
SubscriptionInfo.Builder().apply {
|
SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_1)
|
setId(SUB_ID_3_NOT_IN_SLOT)
|
||||||
setGroupUuid(GROUP_UUID)
|
setGroupUuid(GROUP_UUID)
|
||||||
}.build(),
|
}.build(),
|
||||||
)
|
)
|
||||||
@@ -149,16 +154,16 @@ class SubscriptionRepositoryTest {
|
|||||||
|
|
||||||
val subInfos = context.getSelectableSubscriptionInfoList()
|
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
|
@Test
|
||||||
fun phoneNumberFlow() = runBlocking {
|
fun phoneNumberFlow() = runBlocking {
|
||||||
mockSubscriptionManager.stub {
|
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 {
|
val subInfo = SubscriptionInfo.Builder().apply {
|
||||||
setId(SUB_ID_1)
|
setId(SUB_ID_IN_SLOT_1)
|
||||||
setMcc(MCC)
|
setMcc(MCC)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
@@ -168,10 +173,13 @@ class SubscriptionRepositoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
const val SUB_ID_1 = 1
|
const val SIM_SLOT_INDEX_0 = 0
|
||||||
const val SUB_ID_2 = 2
|
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()
|
val GROUP_UUID = UUID.randomUUID().toString()
|
||||||
const val SIM_SLOT_INDEX = 1
|
|
||||||
const val NUMBER_1 = "000000001"
|
const val NUMBER_1 = "000000001"
|
||||||
const val MCC = "310"
|
const val MCC = "310"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user