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

Commit 32a65e8d authored by Olivier St-Onge's avatar Olivier St-Onge
Browse files

Do not show the satellite icon when wifi is connected

Flag: none
Bug: 329032378
Test: DeviceBasedSatelliteInteractorTest
Test: DeviceBasedSatelliteViewModelTest
Change-Id: I920b1b37be24fe77ed17e160e85ccea5ac82ebca
parent df3ce9de
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineScope
@@ -41,6 +43,7 @@ constructor(
    val repo: DeviceBasedSatelliteRepository,
    val repo: DeviceBasedSatelliteRepository,
    iconsInteractor: MobileIconsInteractor,
    iconsInteractor: MobileIconsInteractor,
    deviceProvisioningInteractor: DeviceProvisioningInteractor,
    deviceProvisioningInteractor: DeviceProvisioningInteractor,
    wifiInteractor: WifiInteractor,
    @Application scope: CoroutineScope,
    @Application scope: CoroutineScope,
) {
) {
    /** Must be observed by any UI showing Satellite iconography */
    /** Must be observed by any UI showing Satellite iconography */
@@ -73,6 +76,9 @@ constructor(


    val isDeviceProvisioned: Flow<Boolean> = deviceProvisioningInteractor.isDeviceProvisioned
    val isDeviceProvisioned: Flow<Boolean> = deviceProvisioningInteractor.isDeviceProvisioned


    val isWifiActive: Flow<Boolean> =
        wifiInteractor.wifiNetwork.map { it is WifiNetworkModel.Active }

    /** When all connections are considered OOS, satellite connectivity is potentially valid */
    /** When all connections are considered OOS, satellite connectivity is potentially valid */
    val areAllConnectionsOutOfService =
    val areAllConnectionsOutOfService =
        if (Flags.oemEnabledSatelliteFlag()) {
        if (Flags.oemEnabledSatelliteFlag()) {
+3 −2
Original line number Original line Diff line number Diff line
@@ -59,9 +59,10 @@ constructor(
                combine(
                combine(
                    interactor.isSatelliteAllowed,
                    interactor.isSatelliteAllowed,
                    interactor.isDeviceProvisioned,
                    interactor.isDeviceProvisioned,
                    interactor.isWifiActive,
                    airplaneModeRepository.isAirplaneMode
                    airplaneModeRepository.isAirplaneMode
                ) { isSatelliteAllowed, isDeviceProvisioned, isAirplaneMode ->
                ) { isSatelliteAllowed, isDeviceProvisioned, isWifiActive, isAirplaneMode ->
                    isSatelliteAllowed && isDeviceProvisioned && !isAirplaneMode
                    isSatelliteAllowed && isDeviceProvisioned && !isWifiActive && !isAirplaneMode
                }
                }
            }
            }
        }
        }
+37 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,10 @@ import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobi
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.satellite.shared.model.SatelliteConnectionState
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
@@ -53,6 +57,10 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisioningInteractor =
    private val deviceProvisioningInteractor =
        DeviceProvisioningInteractor(deviceProvisionedRepository)
        DeviceProvisioningInteractor(deviceProvisionedRepository)
    private val connectivityRepository = FakeConnectivityRepository()
    private val wifiRepository = FakeWifiRepository()
    private val wifiInteractor =
        WifiInteractorImpl(connectivityRepository, wifiRepository, testScope.backgroundScope)


    @Before
    @Before
    fun setUp() {
    fun setUp() {
@@ -61,6 +69,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                repo,
                repo,
                iconsInteractor,
                iconsInteractor,
                deviceProvisioningInteractor,
                deviceProvisioningInteractor,
                wifiInteractor,
                testScope.backgroundScope,
                testScope.backgroundScope,
            )
            )
    }
    }
@@ -103,6 +112,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                    repo,
                    repo,
                    iconsInteractor,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    deviceProvisioningInteractor,
                    wifiInteractor,
                    testScope.backgroundScope,
                    testScope.backgroundScope,
                )
                )


@@ -150,6 +160,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                    repo,
                    repo,
                    iconsInteractor,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    deviceProvisioningInteractor,
                    wifiInteractor,
                    testScope.backgroundScope,
                    testScope.backgroundScope,
                )
                )


@@ -205,6 +216,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                    repo,
                    repo,
                    iconsInteractor,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    deviceProvisioningInteractor,
                    wifiInteractor,
                    testScope.backgroundScope,
                    testScope.backgroundScope,
                )
                )


@@ -337,6 +349,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
                    repo,
                    repo,
                    iconsInteractor,
                    iconsInteractor,
                    deviceProvisioningInteractor,
                    deviceProvisioningInteractor,
                    wifiInteractor,
                    testScope.backgroundScope,
                    testScope.backgroundScope,
                )
                )


@@ -353,4 +366,28 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() {
            // THEN the value is still false, because the flag is off
            // THEN the value is still false, because the flag is off
            assertThat(latest).isFalse()
            assertThat(latest).isFalse()
        }
        }

    @Test
    fun isWifiActive_falseWhenWifiNotActive() =
        testScope.runTest {
            val latest by collectLastValue(underTest.isWifiActive)

            // WHEN wifi is not active
            wifiRepository.setWifiNetwork(WifiNetworkModel.Invalid("test"))

            // THEN the interactor returns false due to the wifi network not being active
            assertThat(latest).isFalse()
        }

    @Test
    fun isWifiActive_trueWhenWifiIsActive() =
        testScope.runTest {
            val latest by collectLastValue(underTest.isWifiActive)

            // WHEN wifi is active
            wifiRepository.setWifiNetwork(WifiNetworkModel.Active(networkId = 0, level = 1))

            // THEN the interactor returns true due to the wifi network being active
            assertThat(latest).isTrue()
        }
}
}
+48 −3
Original line number Original line Diff line number Diff line
@@ -26,6 +26,10 @@ import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobi
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.data.prod.FakeDeviceBasedSatelliteRepository
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
import com.android.systemui.statusbar.pipeline.satellite.domain.interactor.DeviceBasedSatelliteInteractor
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.data.repository.FakeDeviceProvisioningRepository
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
@@ -44,14 +48,18 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {
    private lateinit var underTest: DeviceBasedSatelliteViewModel
    private lateinit var underTest: DeviceBasedSatelliteViewModel
    private lateinit var interactor: DeviceBasedSatelliteInteractor
    private lateinit var interactor: DeviceBasedSatelliteInteractor
    private lateinit var airplaneModeRepository: FakeAirplaneModeRepository
    private lateinit var airplaneModeRepository: FakeAirplaneModeRepository

    private val repo = FakeDeviceBasedSatelliteRepository()
    private val repo = FakeDeviceBasedSatelliteRepository()
    private val testScope = TestScope()

    private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
    private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())

    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisionedRepository = FakeDeviceProvisioningRepository()
    private val deviceProvisioningInteractor =
    private val deviceProvisioningInteractor =
        DeviceProvisioningInteractor(deviceProvisionedRepository)
        DeviceProvisioningInteractor(deviceProvisionedRepository)

    private val connectivityRepository = FakeConnectivityRepository()
    private val testScope = TestScope()
    private val wifiRepository = FakeWifiRepository()
    private val wifiInteractor =
        WifiInteractorImpl(connectivityRepository, wifiRepository, testScope.backgroundScope)


    @Before
    @Before
    fun setUp() {
    fun setUp() {
@@ -63,6 +71,7 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {
                repo,
                repo,
                mobileIconsInteractor,
                mobileIconsInteractor,
                deviceProvisioningInteractor,
                deviceProvisioningInteractor,
                wifiInteractor,
                testScope.backgroundScope,
                testScope.backgroundScope,
            )
            )


@@ -253,4 +262,40 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() {
            // THEN icon is null because the device is not provisioned
            // THEN icon is null because the device is not provisioned
            assertThat(latest).isInstanceOf(Icon::class.java)
            assertThat(latest).isInstanceOf(Icon::class.java)
        }
        }

    @OptIn(ExperimentalCoroutinesApi::class)
    @Test
    fun icon_wifiIsActive() =
        testScope.runTest {
            val latest by collectLastValue(underTest.icon)

            // GIVEN satellite is allowed
            repo.isSatelliteAllowedForCurrentLocation.value = true

            // GIVEN all icons are OOS
            val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
            i1.isInService.value = false
            i1.isEmergencyOnly.value = false

            // GIVEN apm is disabled
            airplaneModeRepository.setIsAirplaneMode(false)

            // GIVEN device is provisioned
            deviceProvisionedRepository.setDeviceProvisioned(true)

            // GIVEN wifi network is active
            wifiRepository.setWifiNetwork(WifiNetworkModel.Active(networkId = 0, level = 1))

            // THEN icon is null because the device is connected to wifi
            assertThat(latest).isNull()

            // GIVEN device loses wifi connection
            wifiRepository.setWifiNetwork(WifiNetworkModel.Invalid("test"))

            // Wait for delay to be completed
            advanceTimeBy(10.seconds)

            // THEN icon is set because the device lost wifi connection
            assertThat(latest).isInstanceOf(Icon::class.java)
        }
}
}