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

Commit e7f8a0fe authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB] Always check underlying wifi networks regardless of transport type.

If a user has VPN over W+ (aka VPN over carrier merged), then the main
network capability transports are WIFI|VPN, but we still need to fetch
the underlying network info to correctly show W+ in the status bar and
quick settings tile.

Previously, we only checked underlying network info if the transports
had CELLULAR. This CL removes that condition.

Bug: 352162710
Flag: com.android.systemui.status_bar_always_check_underlying_networks
Test: atest ConnectivityRepositoryImplTest
Change-Id: If02befcd57ff0f43ab215950e8833ca6faa0795a
parent ed48a531
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -379,6 +379,17 @@ flag {
    }
}

flag {
    name: "status_bar_always_check_underlying_networks"
    namespace: "systemui"
    description: "For status bar connectivity UI, always check underlying networks for wifi and "
        "carrier merged information, regardless of the sepcified transport type"
    bug: "352162710"
    metadata {
      purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "status_bar_stop_updating_window_height"
    namespace: "systemui"
+5 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import androidx.annotation.ArrayRes
import androidx.annotation.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.Flags
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -252,7 +253,10 @@ constructor(
            }
            // Only CELLULAR networks may have underlying wifi information that's relevant to SysUI,
            // so skip the underlying network check if it's not CELLULAR.
            if (!this.hasTransport(TRANSPORT_CELLULAR)) {
            if (
                !this.hasTransport(TRANSPORT_CELLULAR) &&
                    !Flags.statusBarAlwaysCheckUnderlyingNetworks()
            ) {
                return mainWifiInfo
            }

+53 −1
Original line number Diff line number Diff line
@@ -21,12 +21,17 @@ import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_VPN
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.VpnTransportInfo
import android.net.vcn.VcnTransportInfo
import android.net.wifi.WifiInfo
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.shared.ConnectivityInputLogger
@@ -404,6 +409,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            job.cancel()
        }

    /** VCN over W+ (aka VCN over carrier merged). See b/352162710#comment27 scenario #1. */
    @Test
    fun defaultConnections_carrierMergedViaMobileWithVcnTransport_mobileCarrierMergedWifiDefault() =
        testScope.runTest {
@@ -429,6 +435,45 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            job.cancel()
        }

    /** VPN over W+ (aka VPN over carrier merged). See b/352162710#comment27 scenario #2. */
    @Test
    @EnableFlags(FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS)
    fun defaultConnections_vpnOverCarrierMerged_carrierMergedDefault() =
        testScope.runTest {
            var latest: DefaultConnectionModel? = null
            val job = underTest.defaultConnections.onEach { latest = it }.launchIn(this)

            // Underlying carrier merged network
            val underlyingCarrierMergedNetwork = mock<Network>()
            val carrierMergedInfo =
                mock<WifiInfo>().apply { whenever(this.isCarrierMerged).thenReturn(true) }
            val underlyingCapabilities =
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(carrierMergedInfo)
                }
            whenever(connectivityManager.getNetworkCapabilities(underlyingCarrierMergedNetwork))
                .thenReturn(underlyingCapabilities)

            val mainCapabilities =
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_ETHERNET)).thenReturn(false)
                    // Transports are WIFI|VPN, *not* CELLULAR.
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(false)
                    whenever(it.hasTransport(TRANSPORT_WIFI)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_VPN)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(VpnTransportInfo(0, null, false, false))
                    whenever(it.underlyingNetworks)
                        .thenReturn(listOf(underlyingCarrierMergedNetwork))
                }

            getDefaultNetworkCallback().onCapabilitiesChanged(NETWORK, mainCapabilities)

            assertThat(latest!!.carrierMerged.isDefault).isTrue()

            job.cancel()
        }

    @Test
    fun defaultConnections_notCarrierMergedViaWifi_carrierMergedNotDefault() =
        testScope.runTest {
@@ -564,7 +609,11 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            job.cancel()
        }

    /** Test for b/225902574. */
    /**
     * Test for b/225902574: VPN over VCN over W+ (aka VPN over VCN over carrier merged).
     *
     * Also see b/352162710#comment27 scenario #3 and b/352162710#comment30.
     */
    @Test
    fun defaultConnections_cellular_underlyingCarrierMergedViaMobileWithVcnTransport_allDefault() =
        testScope.runTest {
@@ -587,6 +636,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
            val mainCapabilities =
                mock<NetworkCapabilities>().also {
                    whenever(it.hasTransport(TRANSPORT_CELLULAR)).thenReturn(true)
                    whenever(it.hasTransport(TRANSPORT_VPN)).thenReturn(true)
                    whenever(it.transportInfo).thenReturn(null)
                    whenever(it.underlyingNetworks)
                        .thenReturn(listOf(underlyingCarrierMergedNetwork))
@@ -862,6 +912,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS)
    fun getMainOrUnderlyingWifiInfo_notCellular_underlyingWifi_noInfo() {
        val underlyingNetwork = mock<Network>()
        val underlyingWifiInfo = mock<WifiInfo>()
@@ -916,6 +967,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
    }

    @Test
    @DisableFlags(FLAG_STATUS_BAR_ALWAYS_CHECK_UNDERLYING_NETWORKS)
    fun getMainOrUnderlyingWifiInfo_notCellular_underlyingVcnWithWifi_noInfo() {
        val underlyingNetwork = mock<Network>()
        val underlyingVcnInfo = VcnTransportInfo(mock<WifiInfo>())