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

Commit e4d7b622 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
parent 03aaf249
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
@@ -161,7 +162,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
@@ -245,9 +248,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
            }
            }
@@ -264,7 +267,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)
            }
            }
        }
        }


@@ -272,7 +277,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 =
@@ -286,7 +293,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
@@ -134,6 +134,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)
@@ -1018,6 +1019,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() =
@@ -1027,10 +1040,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)
@@ -1049,10 +1064,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)
@@ -1109,10 +1126,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
@@ -23,6 +23,7 @@ import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_VPN
import android.net.NetworkCapabilities.TRANSPORT_VPN
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.TelephonyNetworkSpecifier
import android.net.VpnTransportInfo
import android.net.VpnTransportInfo
import android.net.vcn.VcnTransportInfo
import android.net.vcn.VcnTransportInfo
import android.net.wifi.WifiInfo
import android.net.wifi.WifiInfo
@@ -74,6 +75,8 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    private val testScope = kosmos.testScope
    private val testScope = kosmos.testScope
    private val tunerService = mock<TunerService>()
    private val tunerService = mock<TunerService>()


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

    @Before
    @Before
    fun setUp() {
    fun setUp() {
        createAndSetRepo()
        createAndSetRepo()
@@ -343,6 +346,30 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            assertThat(latest!!.wifi.isDefault).isTrue()
            assertThat(latest!!.wifi.isDefault).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
    }

    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 {
@@ -350,10 +377,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)
                }
                }
@@ -373,10 +402,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)
                }
                }
@@ -561,10 +592,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)
@@ -645,14 +678,15 @@ 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)


            val latest by collectLastValue(underTest.vcnSubId)
            val latest by collectLastValue(underTest.vcnSubId)


            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)
@@ -663,14 +697,15 @@ 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)


            val latest by collectLastValue(underTest.vcnSubId)
            val latest by collectLastValue(underTest.vcnSubId)


            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)
@@ -703,11 +738,12 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val latest by collectLastValue(underTest.vcnSubId)
            val latest by collectLastValue(underTest.vcnSubId)


            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)
@@ -721,14 +757,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val latest by collectLastValue(underTest.vcnSubId)
            val latest by collectLastValue(underTest.vcnSubId)


            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
@@ -738,14 +775,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)


@@ -776,11 +815,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)
@@ -860,11 +900,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)
@@ -887,11 +931,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    @DisableFlags(FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS)
    @DisableFlags(FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS)
    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)
@@ -917,10 +965,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)