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

Commit dac8d3f5 authored by Yan Yan's avatar Yan Yan
Browse files

Remove hidden API usages backed by VcnTransportInfo

VCN will be moved to a mainline module and #getWifiInfo will no longer
be accessible. Also VcnTransportInfo will be a final class. This
patch updates SystemUI to use VcnUtils to get the WifiInfo and use
a Builder to construct a VcnTransportInfo instance for testing.

Bug: 369710077

Test: atest SystemUITests:MobileConnectionsRepositoryTest &&
      atest SystemUITests:ConnectivityRepositoryImplTest
Flag: EXEMPT pure refactoring
Change-Id: I255548e1d1c26e465657d8006272a689fc8a5de4
Merged-In: I255548e1d1c26e465657d8006272a689fc8a5de4
parent bc7a8588
Loading
Loading
Loading
Loading
+13 −6
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.vcn.VcnTransportInfo
import android.net.vcn.VcnTransportInfo
import android.net.vcn.VcnUtils
import android.net.wifi.WifiInfo
import android.net.wifi.WifiInfo
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import androidx.annotation.ArrayRes
import androidx.annotation.ArrayRes
@@ -160,7 +161,9 @@ constructor(
        defaultNetworkCapabilities
        defaultNetworkCapabilities
            .map { networkCapabilities ->
            .map { networkCapabilities ->
                networkCapabilities?.run {
                networkCapabilities?.run {
                    val subId = (transportInfo as? VcnTransportInfo)?.subId
                    val subId =
                        VcnUtils.getSubIdFromVcnCaps(connectivityManager, networkCapabilities)

                    // Never return an INVALID_SUBSCRIPTION_ID (-1)
                    // Never return an INVALID_SUBSCRIPTION_ID (-1)
                    if (subId != INVALID_SUBSCRIPTION_ID) {
                    if (subId != INVALID_SUBSCRIPTION_ID) {
                        subId
                        subId
@@ -244,9 +247,9 @@ constructor(
         * info.
         * info.
         */
         */
        fun NetworkCapabilities.getMainOrUnderlyingWifiInfo(
        fun NetworkCapabilities.getMainOrUnderlyingWifiInfo(
            connectivityManager: ConnectivityManager,
            connectivityManager: ConnectivityManager
        ): WifiInfo? {
        ): WifiInfo? {
            val mainWifiInfo = this.getMainWifiInfo()
            val mainWifiInfo = this.getMainWifiInfo(connectivityManager)
            if (mainWifiInfo != null) {
            if (mainWifiInfo != null) {
                return mainWifiInfo
                return mainWifiInfo
            }
            }
@@ -260,7 +263,9 @@ constructor(
            // eventually traced to a wifi or carrier merged connection. So, check those underlying
            // eventually traced to a wifi or carrier merged connection. So, check those underlying
            // networks for possible wifi information as well. See b/225902574.
            // networks for possible wifi information as well. See b/225902574.
            return this.underlyingNetworks?.firstNotNullOfOrNull { underlyingNetwork ->
            return this.underlyingNetworks?.firstNotNullOfOrNull { underlyingNetwork ->
                connectivityManager.getNetworkCapabilities(underlyingNetwork)?.getMainWifiInfo()
                connectivityManager
                    .getNetworkCapabilities(underlyingNetwork)
                    ?.getMainWifiInfo(connectivityManager)
            }
            }
        }
        }


@@ -268,7 +273,9 @@ constructor(
         * Checks the network capabilities for wifi info, but does *not* check the underlying
         * Checks the network capabilities for wifi info, but does *not* check the underlying
         * networks. See [getMainOrUnderlyingWifiInfo].
         * networks. See [getMainOrUnderlyingWifiInfo].
         */
         */
        private fun NetworkCapabilities.getMainWifiInfo(): WifiInfo? {
        private fun NetworkCapabilities.getMainWifiInfo(
            connectivityManager: ConnectivityManager
        ): WifiInfo? {
            // Wifi info can either come from a WIFI Transport, or from a CELLULAR transport for
            // Wifi info can either come from a WIFI Transport, or from a CELLULAR transport for
            // virtual networks like VCN.
            // virtual networks like VCN.
            val canHaveWifiInfo =
            val canHaveWifiInfo =
@@ -282,7 +289,7 @@ constructor(
                // [com.android.settingslib.Utils.tryGetWifiInfoForVcn]. It's copied instead of
                // [com.android.settingslib.Utils.tryGetWifiInfoForVcn]. It's copied instead of
                // re-used because it makes the logic here clearer, and because the method will be
                // re-used because it makes the logic here clearer, and because the method will be
                // removed once this pipeline is fully launched.
                // removed once this pipeline is fully launched.
                is VcnTransportInfo -> currentTransportInfo.wifiInfo
                is VcnTransportInfo -> VcnUtils.getWifiInfoFromVcnCaps(connectivityManager, this)
                is WifiInfo -> currentTransportInfo
                is WifiInfo -> currentTransportInfo
                else -> null
                else -> null
            }
            }
+1 −1
Original line number Original line Diff line number Diff line
@@ -57,7 +57,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
    private static final int MIN_RSSI = -100;
    private static final int MIN_RSSI = -100;
    private static final int MAX_RSSI = -55;
    private static final int MAX_RSSI = -55;
    private WifiInfo mWifiInfo = mock(WifiInfo.class);
    private WifiInfo mWifiInfo = mock(WifiInfo.class);
    private VcnTransportInfo mVcnTransportInfo = mock(VcnTransportInfo.class);
    private VcnTransportInfo mVcnTransportInfo = new VcnTransportInfo.Builder().build();


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
+25 −3
Original line number Original line Diff line number Diff line
@@ -140,6 +140,7 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
    private val wifiLogBuffer = LogBuffer("wifi", maxSize = 100, logcatEchoTracker = mock())
    private val wifiLogBuffer = LogBuffer("wifi", maxSize = 100, logcatEchoTracker = mock())
    private val wifiPickerTrackerCallback =
    private val wifiPickerTrackerCallback =
        argumentCaptor<WifiPickerTracker.WifiPickerTrackerCallback>()
        argumentCaptor<WifiPickerTracker.WifiPickerTrackerCallback>()
    private val vcnTransportInfo = VcnTransportInfo.Builder().build()


    private val testDispatcher = StandardTestDispatcher()
    private val testDispatcher = StandardTestDispatcher()
    private val testScope = TestScope(testDispatcher)
    private val testScope = TestScope(testDispatcher)
@@ -987,6 +988,18 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
            assertThat(latest).isTrue()
            assertThat(latest).isTrue()
        }
        }


    private fun newWifiNetwork(wifiInfo: WifiInfo): Network {
        val network = mock<Network>()
        val capabilities =
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(wifiInfo)
            }
        whenever(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities)

        return network
    }

    /** Regression test for b/272586234. */
    /** Regression test for b/272586234. */
    @Test
    @Test
    fun hasCarrierMergedConnection_carrierMergedViaWifiWithVcnTransport_isTrue() =
    fun hasCarrierMergedConnection_carrierMergedViaWifiWithVcnTransport_isTrue() =
@@ -996,10 +1009,12 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                }
                }
            val underlyingWifi = newWifiNetwork(carrierMergedInfo)
            val caps =
            val caps =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                }
                }


            val latest by collectLastValue(underTest.hasCarrierMergedConnection)
            val latest by collectLastValue(underTest.hasCarrierMergedConnection)
@@ -1018,10 +1033,12 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                }
                }
            val underlyingWifi = newWifiNetwork(carrierMergedInfo)
            val caps =
            val caps =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                }
                }


            val latest by collectLastValue(underTest.hasCarrierMergedConnection)
            val latest by collectLastValue(underTest.hasCarrierMergedConnection)
@@ -1078,10 +1095,15 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isCarrierMerged).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                    whenever(this.isPrimary).thenReturn(true)
                }
                }

            // The Wifi network that is under the VCN network
            val physicalWifiNetwork = newWifiNetwork(carrierMergedInfo)

            val underlyingCapabilities =
            val underlyingCapabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(physicalWifiNetwork))
                }
                }
            whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
            whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
                .thenReturn(underlyingCapabilities)
                .thenReturn(underlyingCapabilities)
+75 −22
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.TelephonyNetworkSpecifier
import android.net.vcn.VcnTransportInfo
import android.net.vcn.VcnTransportInfo
import android.net.wifi.WifiInfo
import android.net.wifi.WifiInfo
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
@@ -68,6 +69,8 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    private lateinit var testScope: TestScope
    private lateinit var testScope: TestScope
    @Mock private lateinit var tunerService: TunerService
    @Mock private lateinit var tunerService: TunerService


    private val vcnTransportInfo = VcnTransportInfo.Builder().build()

    @Before
    @Before
    fun setUp() {
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        MockitoAnnotations.initMocks(this)
@@ -376,6 +379,30 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            job.cancel()
            job.cancel()
        }
        }


    private fun newWifiNetwork(wifiInfo: WifiInfo): Network {
        val network = mock<Network>()
        val capabilities =
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(wifiInfo)
            }
        whenever(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities)

        return network
    }

    private fun newCellNetwork(subId: Int): Network {
        val network = mock<Network>()
        val capabilities =
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                whenever(it.networkSpecifier).thenReturn(TelephonyNetworkSpecifier(subId))
            }
        whenever(connectivityManager.getNetworkCapabilities(network)).thenReturn(capabilities)

        return network
    }

    @Test
    @Test
    fun defaultConnections_carrierMergedViaWifiWithVcnTransport_wifiAndCarrierMergedDefault() =
    fun defaultConnections_carrierMergedViaWifiWithVcnTransport_wifiAndCarrierMergedDefault() =
        testScope.runTest {
        testScope.runTest {
@@ -384,10 +411,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {


            val carrierMergedInfo =
            val carrierMergedInfo =
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
            val underlyingWifi = newWifiNetwork(carrierMergedInfo)
            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_ETHERNET)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_ETHERNET)).thenReturn(false)
                }
                }
@@ -409,10 +438,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {


            val carrierMergedInfo =
            val carrierMergedInfo =
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
            val underlyingWifi = newWifiNetwork(carrierMergedInfo)
            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                    whenever(it.hasTransport(TRANSPORT_ETHERNET)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_ETHERNET)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(false)
                }
                }
@@ -572,10 +603,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val underlyingCarrierMergedNetwork = mock<Network>()
            val underlyingCarrierMergedNetwork = mock<Network>()
            val carrierMergedInfo =
            val carrierMergedInfo =
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
            val underlyingWifi = newWifiNetwork(carrierMergedInfo)
            val underlyingCapabilities =
            val underlyingCapabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                }
                }
            whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
            whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
                .thenReturn(underlyingCapabilities)
                .thenReturn(underlyingCapabilities)
@@ -664,7 +697,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    @Test
    @Test
    fun vcnSubId_tracksVcnTransportInfo() =
    fun vcnSubId_tracksVcnTransportInfo() =
        testScope.runTest {
        testScope.runTest {
            val vcnInfo = VcnTransportInfo(SUB_1_ID)
            val underlyingCell = newCellNetwork(SUB_1_ID)


            var latest: Int? = null
            var latest: Int? = null
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
@@ -672,7 +705,8 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(vcnInfo)
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingCell))
                }
                }


            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
@@ -684,7 +718,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    @Test
    @Test
    fun vcnSubId_filersOutInvalid() =
    fun vcnSubId_filersOutInvalid() =
        testScope.runTest {
        testScope.runTest {
            val vcnInfo = VcnTransportInfo(INVALID_SUBSCRIPTION_ID)
            val underlyingCell = newCellNetwork(INVALID_SUBSCRIPTION_ID)


            var latest: Int? = null
            var latest: Int? = null
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
@@ -692,7 +726,8 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(vcnInfo)
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingCell))
                }
                }


            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
@@ -729,11 +764,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)


            val wifiInfo = mock<WifiInfo>()
            val wifiInfo = mock<WifiInfo>()
            val vcnInfo = VcnTransportInfo(wifiInfo)
            val underlyingWifi = newWifiNetwork(wifiInfo)
            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(vcnInfo)
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                }
                }


            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
@@ -749,14 +785,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)
            val job = underTest.vcnSubId.onEach { latest = it }.launchIn(this)


            val wifiInfo = mock<WifiInfo>()
            val wifiInfo = mock<WifiInfo>()
            val wifiVcnInfo = VcnTransportInfo(wifiInfo)
            val underlyingWifi = newWifiNetwork(wifiInfo)
            val sub1VcnInfo = VcnTransportInfo(SUB_1_ID)
            val underlyingCell1 = newCellNetwork(SUB_1_ID)
            val sub2VcnInfo = VcnTransportInfo(SUB_2_ID)
            val underlyingCell2 = newCellNetwork(SUB_2_ID)


            val capabilities =
            val capabilities =
                mock<NetworkCapabilities>().also {
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(wifiVcnInfo)
                    whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                    whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
                }
                }


            // WIFI VCN info
            // WIFI VCN info
@@ -766,14 +803,16 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {


            // Cellular VCN info with subId 1
            // Cellular VCN info with subId 1
            whenever(capabilities.hasTransport(eq(TRANSPORT_CELLULAR))).thenReturn(true)
            whenever(capabilities.hasTransport(eq(TRANSPORT_CELLULAR))).thenReturn(true)
            whenever(capabilities.transportInfo).thenReturn(sub1VcnInfo)
            whenever(capabilities.transportInfo).thenReturn(vcnTransportInfo)
            whenever(capabilities.underlyingNetworks).thenReturn(listOf(underlyingCell1))


            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)


            assertThat(latest).isEqualTo(SUB_1_ID)
            assertThat(latest).isEqualTo(SUB_1_ID)


            // Cellular VCN info with subId 2
            // Cellular VCN info with subId 2
            whenever(capabilities.transportInfo).thenReturn(sub2VcnInfo)
            whenever(capabilities.transportInfo).thenReturn(vcnTransportInfo)
            whenever(capabilities.underlyingNetworks).thenReturn(listOf(underlyingCell2))


            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)
            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, capabilities)


@@ -806,11 +845,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    @Test
    @Test
    fun getMainOrUnderlyingWifiInfo_vcnWithWifi_hasInfo() {
    fun getMainOrUnderlyingWifiInfo_vcnWithWifi_hasInfo() {
        val wifiInfo = mock<WifiInfo>()
        val wifiInfo = mock<WifiInfo>()
        val vcnInfo = VcnTransportInfo(wifiInfo)
        val underlyingWifi = newWifiNetwork(wifiInfo)
        val capabilities =
        val capabilities =
            mock<NetworkCapabilities>().also {
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(vcnInfo)
                whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                whenever(it.underlyingNetworks).thenReturn(listOf(underlyingWifi))
            }
            }


        val result = capabilities.getMainOrUnderlyingWifiInfo(connectivityManager)
        val result = capabilities.getMainOrUnderlyingWifiInfo(connectivityManager)
@@ -889,11 +929,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    fun getMainOrUnderlyingWifiInfo_cellular_underlyingVcnWithWifi_hasInfo() {
    fun getMainOrUnderlyingWifiInfo_cellular_underlyingVcnWithWifi_hasInfo() {
        val wifiInfo = mock<WifiInfo>()
        val wifiInfo = mock<WifiInfo>()
        val underlyingNetwork = mock<Network>()
        val underlyingNetwork = mock<Network>()
        val underlyingVcnInfo = VcnTransportInfo(wifiInfo)

        // The Wifi network that is under the VCN network
        val physicalWifiNetwork = newWifiNetwork(wifiInfo)

        val underlyingWifiCapabilities =
        val underlyingWifiCapabilities =
            mock<NetworkCapabilities>().also {
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(underlyingVcnInfo)
                whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                whenever(it.underlyingNetworks).thenReturn(listOf(physicalWifiNetwork))
            }
            }
        whenever(connectivityManager.getNetworkCapabilities(underlyingNetwork))
        whenever(connectivityManager.getNetworkCapabilities(underlyingNetwork))
            .thenReturn(underlyingWifiCapabilities)
            .thenReturn(underlyingWifiCapabilities)
@@ -915,11 +959,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    @Test
    @Test
    fun getMainOrUnderlyingWifiInfo_notCellular_underlyingVcnWithWifi_noInfo() {
    fun getMainOrUnderlyingWifiInfo_notCellular_underlyingVcnWithWifi_noInfo() {
        val underlyingNetwork = mock<Network>()
        val underlyingNetwork = mock<Network>()
        val underlyingVcnInfo = VcnTransportInfo(mock<WifiInfo>())

        // The Wifi network that is under the VCN network
        val physicalWifiNetwork = newWifiNetwork(mock<WifiInfo>())

        val underlyingWifiCapabilities =
        val underlyingWifiCapabilities =
            mock<NetworkCapabilities>().also {
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(underlyingVcnInfo)
                whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                whenever(it.underlyingNetworks).thenReturn(listOf(physicalWifiNetwork))
            }
            }
        whenever(connectivityManager.getNetworkCapabilities(underlyingNetwork))
        whenever(connectivityManager.getNetworkCapabilities(underlyingNetwork))
            .thenReturn(underlyingWifiCapabilities)
            .thenReturn(underlyingWifiCapabilities)
@@ -945,10 +993,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
        val underlyingCarrierMergedNetwork = mock<Network>()
        val underlyingCarrierMergedNetwork = mock<Network>()
        val carrierMergedInfo =
        val carrierMergedInfo =
            mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
            mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }

        // The Wifi network that is under the VCN network
        val physicalWifiNetwork = newWifiNetwork(carrierMergedInfo)

        val underlyingCapabilities =
        val underlyingCapabilities =
            mock<NetworkCapabilities>().also {
            mock<NetworkCapabilities>().also {
                whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                whenever(it.transportInfo).thenReturn(VcnTransportInfo(carrierMergedInfo))
                whenever(it.transportInfo).thenReturn(vcnTransportInfo)
                whenever(it.underlyingNetworks).thenReturn(listOf(physicalWifiNetwork))
            }
            }
        whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
        whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
            .thenReturn(underlyingCapabilities)
            .thenReturn(underlyingCapabilities)