From a0ef0b81a9e00b179c938dbebada8b09932d9c2b Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Fri, 12 Apr 2024 08:14:13 -0400 Subject: Do not show the satellite icon when wifi is connected Flag: none Bug: 329032378 Test: DeviceBasedSatelliteInteractorTest Test: DeviceBasedSatelliteViewModelTest (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:32a65e8d97c35a06d29be57f3d2b86aef659765b) Merged-In: I920b1b37be24fe77ed17e160e85ccea5ac82ebca Change-Id: I920b1b37be24fe77ed17e160e85ccea5ac82ebca --- .../interactor/DeviceBasedSatelliteInteractor.kt | 6 +++ .../ui/viewmodel/DeviceBasedSatelliteViewModel.kt | 5 ++- .../DeviceBasedSatelliteInteractorTest.kt | 37 ++++++++++++++++ .../viewmodel/DeviceBasedSatelliteViewModelTest.kt | 51 ++++++++++++++++++++-- 4 files changed, 94 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt index 08ed0305bd13..054116dbdfc2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractor.kt @@ -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.satellite.data.DeviceBasedSatelliteRepository 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 javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -41,6 +43,7 @@ constructor( val repo: DeviceBasedSatelliteRepository, iconsInteractor: MobileIconsInteractor, deviceProvisioningInteractor: DeviceProvisioningInteractor, + wifiInteractor: WifiInteractor, @Application scope: CoroutineScope, ) { /** Must be observed by any UI showing Satellite iconography */ @@ -73,6 +76,9 @@ constructor( val isDeviceProvisioned: Flow = deviceProvisioningInteractor.isDeviceProvisioned + val isWifiActive: Flow = + wifiInteractor.wifiNetwork.map { it is WifiNetworkModel.Active } + /** When all connections are considered OOS, satellite connectivity is potentially valid */ val areAllConnectionsOutOfService = if (Flags.oemEnabledSatelliteFlag()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt index 40641bed0602..a0291b81c9a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModel.kt @@ -59,9 +59,10 @@ constructor( combine( interactor.isSatelliteAllowed, interactor.isDeviceProvisioned, + interactor.isWifiActive, airplaneModeRepository.isAirplaneMode - ) { isSatelliteAllowed, isDeviceProvisioned, isAirplaneMode -> - isSatelliteAllowed && isDeviceProvisioned && !isAirplaneMode + ) { isSatelliteAllowed, isDeviceProvisioned, isWifiActive, isAirplaneMode -> + isSatelliteAllowed && isDeviceProvisioned && !isWifiActive && !isAirplaneMode } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt index 42bbe3e6fa1d..c4ab943c09df 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/domain/interactor/DeviceBasedSatelliteInteractorTest.kt @@ -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.satellite.data.prod.FakeDeviceBasedSatelliteRepository 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.domain.interactor.DeviceProvisioningInteractor import com.android.systemui.util.mockito.mock @@ -53,6 +57,10 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { private val deviceProvisionedRepository = FakeDeviceProvisioningRepository() private val deviceProvisioningInteractor = DeviceProvisioningInteractor(deviceProvisionedRepository) + private val connectivityRepository = FakeConnectivityRepository() + private val wifiRepository = FakeWifiRepository() + private val wifiInteractor = + WifiInteractorImpl(connectivityRepository, wifiRepository, testScope.backgroundScope) @Before fun setUp() { @@ -61,6 +69,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { repo, iconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) } @@ -103,6 +112,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { repo, iconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) @@ -150,6 +160,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { repo, iconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) @@ -205,6 +216,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { repo, iconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) @@ -337,6 +349,7 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { repo, iconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) @@ -353,4 +366,28 @@ class DeviceBasedSatelliteInteractorTest : SysuiTestCase() { // THEN the value is still false, because the flag is off 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() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt index 1d6cd3774449..64f19b6c60ad 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/ui/viewmodel/DeviceBasedSatelliteViewModelTest.kt @@ -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.satellite.data.prod.FakeDeviceBasedSatelliteRepository 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.domain.interactor.DeviceProvisioningInteractor import com.android.systemui.util.mockito.mock @@ -44,14 +48,18 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() { private lateinit var underTest: DeviceBasedSatelliteViewModel private lateinit var interactor: DeviceBasedSatelliteInteractor private lateinit var airplaneModeRepository: FakeAirplaneModeRepository - private val repo = FakeDeviceBasedSatelliteRepository() + private val testScope = TestScope() + private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock()) + private val deviceProvisionedRepository = FakeDeviceProvisioningRepository() private val deviceProvisioningInteractor = DeviceProvisioningInteractor(deviceProvisionedRepository) - - private val testScope = TestScope() + private val connectivityRepository = FakeConnectivityRepository() + private val wifiRepository = FakeWifiRepository() + private val wifiInteractor = + WifiInteractorImpl(connectivityRepository, wifiRepository, testScope.backgroundScope) @Before fun setUp() { @@ -63,6 +71,7 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() { repo, mobileIconsInteractor, deviceProvisioningInteractor, + wifiInteractor, testScope.backgroundScope, ) @@ -253,4 +262,40 @@ class DeviceBasedSatelliteViewModelTest : SysuiTestCase() { // THEN icon is null because the device is not provisioned 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) + } } -- cgit v1.2.3-59-g8ed1b