Merge "[Sb refactor] Fix active subId in group event flow" into tm-qpr-dev am: 63453604cc

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21035048

Change-Id: I75d6cdc28f4bc3e387868752f39126b84c14cf04
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Evan Laird
2023-01-25 16:29:08 +00:00
committed by Automerger Merge Worker
2 changed files with 86 additions and 19 deletions

View File

@@ -53,7 +53,7 @@ import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
import com.android.systemui.util.kotlin.pairwiseBy import com.android.systemui.util.kotlin.pairwise
import com.android.systemui.util.settings.GlobalSettings import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
@@ -66,10 +66,10 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
@@ -287,22 +287,13 @@ constructor(
*/ */
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
override val activeSubChangedInGroupEvent = override val activeSubChangedInGroupEvent =
flow { activeMobileDataSubscriptionId
activeMobileDataSubscriptionId.pairwiseBy { prevVal: Int, newVal: Int -> .pairwise()
if (!defaultMobileNetworkConnectivity.value.isValidated) { .mapNotNull { (prevVal: Int, newVal: Int) ->
return@pairwiseBy val prevSub = subscriptionManager.getActiveSubscriptionInfo(prevVal)?.groupUuid
} val nextSub = subscriptionManager.getActiveSubscriptionInfo(newVal)?.groupUuid
val prevSub = subscriptionManager.getActiveSubscriptionInfo(prevVal)
val nextSub = subscriptionManager.getActiveSubscriptionInfo(newVal)
if (prevSub == null || nextSub == null) { if (prevSub != null && prevSub == nextSub) Unit else null
return@pairwiseBy
}
if (prevSub.groupUuid != null && prevSub.groupUuid == nextSub.groupUuid) {
emit(Unit)
}
}
} }
.flowOn(bgDispatcher) .flowOn(bgDispatcher)

View File

@@ -22,6 +22,7 @@ import android.net.Network
import android.net.NetworkCapabilities import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.os.ParcelUuid
import android.provider.Settings import android.provider.Settings
import android.telephony.CarrierConfigManager import android.telephony.CarrierConfigManager
import android.telephony.SubscriptionInfo import android.telephony.SubscriptionInfo
@@ -50,6 +51,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import java.util.UUID
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -104,6 +106,17 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
mock<TableLogBuffer>() mock<TableLogBuffer>()
} }
// For convenience, set up the subscription info callbacks
whenever(subscriptionManager.getActiveSubscriptionInfo(anyInt())).thenAnswer { invocation ->
when (invocation.getArgument(0) as Int) {
1 -> SUB_1
2 -> SUB_2
3 -> SUB_3
4 -> SUB_4
else -> null
}
}
wifiRepository = FakeWifiRepository() wifiRepository = FakeWifiRepository()
connectionFactory = connectionFactory =
@@ -686,6 +699,38 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
job.cancel() job.cancel()
} }
@Test
fun `active data change - in same group - emits unit`() =
runBlocking(IMMEDIATE) {
var latest: Unit? = null
val job = underTest.activeSubChangedInGroupEvent.onEach { latest = it }.launchIn(this)
getTelephonyCallbackForType<ActiveDataSubscriptionIdListener>()
.onActiveDataSubscriptionIdChanged(SUB_3_ID_GROUPED)
getTelephonyCallbackForType<ActiveDataSubscriptionIdListener>()
.onActiveDataSubscriptionIdChanged(SUB_4_ID_GROUPED)
assertThat(latest).isEqualTo(Unit)
job.cancel()
}
@Test
fun `active data change - not in same group - does not emit`() =
runBlocking(IMMEDIATE) {
var latest: Unit? = null
val job = underTest.activeSubChangedInGroupEvent.onEach { latest = it }.launchIn(this)
getTelephonyCallbackForType<ActiveDataSubscriptionIdListener>()
.onActiveDataSubscriptionIdChanged(SUB_3_ID_GROUPED)
getTelephonyCallbackForType<ActiveDataSubscriptionIdListener>()
.onActiveDataSubscriptionIdChanged(SUB_1_ID)
assertThat(latest).isEqualTo(null)
job.cancel()
}
private fun createCapabilities(connected: Boolean, validated: Boolean): NetworkCapabilities = private fun createCapabilities(connected: Boolean, validated: Boolean): NetworkCapabilities =
mock<NetworkCapabilities>().also { mock<NetworkCapabilities>().also {
whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(connected) whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(connected)
@@ -719,19 +764,50 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
companion object { companion object {
private val IMMEDIATE = Dispatchers.Main.immediate private val IMMEDIATE = Dispatchers.Main.immediate
// Subscription 1
private const val SUB_1_ID = 1 private const val SUB_1_ID = 1
private val SUB_1 = private val SUB_1 =
mock<SubscriptionInfo>().also { whenever(it.subscriptionId).thenReturn(SUB_1_ID) } mock<SubscriptionInfo>().also {
whenever(it.subscriptionId).thenReturn(SUB_1_ID)
whenever(it.groupUuid).thenReturn(ParcelUuid(UUID.randomUUID()))
}
private val MODEL_1 = SubscriptionModel(subscriptionId = SUB_1_ID) private val MODEL_1 = SubscriptionModel(subscriptionId = SUB_1_ID)
// Subscription 2
private const val SUB_2_ID = 2 private const val SUB_2_ID = 2
private val SUB_2 = private val SUB_2 =
mock<SubscriptionInfo>().also { whenever(it.subscriptionId).thenReturn(SUB_2_ID) } mock<SubscriptionInfo>().also {
whenever(it.subscriptionId).thenReturn(SUB_2_ID)
whenever(it.groupUuid).thenReturn(ParcelUuid(UUID.randomUUID()))
}
private val MODEL_2 = SubscriptionModel(subscriptionId = SUB_2_ID) private val MODEL_2 = SubscriptionModel(subscriptionId = SUB_2_ID)
// Subs 3 and 4 are considered to be in the same group ------------------------------------
private val GROUP_ID_3_4 = ParcelUuid(UUID.randomUUID())
// Subscription 3
private const val SUB_3_ID_GROUPED = 3
private val SUB_3 =
mock<SubscriptionInfo>().also {
whenever(it.subscriptionId).thenReturn(SUB_3_ID_GROUPED)
whenever(it.groupUuid).thenReturn(GROUP_ID_3_4)
}
// Subscription 4
private const val SUB_4_ID_GROUPED = 4
private val SUB_4 =
mock<SubscriptionInfo>().also {
whenever(it.subscriptionId).thenReturn(SUB_4_ID_GROUPED)
whenever(it.groupUuid).thenReturn(GROUP_ID_3_4)
}
// Subs 3 and 4 are considered to be in the same group ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private const val NET_ID = 123 private const val NET_ID = 123
private val NETWORK = mock<Network>().apply { whenever(getNetId()).thenReturn(NET_ID) } private val NETWORK = mock<Network>().apply { whenever(getNetId()).thenReturn(NET_ID) }
// Carrier merged subscription
private const val SUB_CM_ID = 5 private const val SUB_CM_ID = 5
private val SUB_CM = private val SUB_CM =
mock<SubscriptionInfo>().also { whenever(it.subscriptionId).thenReturn(SUB_CM_ID) } mock<SubscriptionInfo>().also { whenever(it.subscriptionId).thenReturn(SUB_CM_ID) }