Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69837f95 authored by Evan Laird's avatar Evan Laird Committed by Automerger Merge Worker
Browse files

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

parents 32507238 63453604
Loading
Loading
Loading
Loading
+8 −17
Original line number Original line Diff line number Diff line
@@ -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) {
                        return@pairwiseBy
                    }


                    if (prevSub.groupUuid != null && prevSub.groupUuid == nextSub.groupUuid) {
                if (prevSub != null && prevSub == nextSub) Unit else null
                        emit(Unit)
                    }
                }
            }
            }
            .flowOn(bgDispatcher)
            .flowOn(bgDispatcher)


+78 −2
Original line number Original line Diff line number Diff line
@@ -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) }