Merge "Do not show satellite icon when mobile connection is emergency only" into main
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
index 6b30326..5e38715 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt
@@ -69,6 +69,9 @@
/** True if we consider this connection to be in service, i.e. can make calls */
val isInService: StateFlow<Boolean>
+ /** True if this connection is emergency only */
+ val isEmergencyOnly: StateFlow<Boolean>
+
/** Observable for the data enabled state of this connection */
val isDataEnabled: StateFlow<Boolean>
@@ -306,6 +309,8 @@
override val isInService = connectionRepository.isInService
+ override val isEmergencyOnly: StateFlow<Boolean> = connectionRepository.isEmergencyOnly
+
override val isAllowedDuringAirplaneMode = connectionRepository.isAllowedDuringAirplaneMode
/** Whether or not to show the error state of [SignalDrawable] */
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 6e1114c..3f89d04b 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
@@ -72,9 +72,16 @@
/** When all connections are considered OOS, satellite connectivity is potentially valid */
val areAllConnectionsOutOfService =
if (Flags.oemEnabledSatelliteFlag()) {
- iconsInteractor.icons.aggregateOver(selector = { intr -> intr.isInService }) {
- isInServiceList ->
- isInServiceList.all { !it }
+ iconsInteractor.icons.aggregateOver(
+ selector = { intr ->
+ combine(intr.isInService, intr.isEmergencyOnly) {
+ isInService,
+ isEmergencyOnly ->
+ !isInService && !isEmergencyOnly
+ }
+ }
+ ) { isOosAndIsNotEmergencyOnly ->
+ isOosAndIsNotEmergencyOnly.all { it }
}
} else {
flowOf(false)
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 d465b47..c07f289 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
@@ -239,7 +239,9 @@
// WHEN all of the connections are OOS
i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
i2.isInService.value = false
+ i2.isEmergencyOnly.value = false
// THEN the value is propagated to this interactor
assertThat(latest).isTrue()
@@ -256,6 +258,7 @@
// WHEN all of the connections are OOS
i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
// THEN the value is propagated to this interactor
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 cd0652e..ec6642d 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
@@ -80,6 +80,7 @@
// 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)
@@ -99,6 +100,7 @@
// GIVEN all icons are not OOS
val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
i1.isInService.value = true
+ i1.isEmergencyOnly.value = false
// GIVEN apm is disabled
airplaneModeRepository.setIsAirplaneMode(false)
@@ -108,6 +110,35 @@
}
@Test
+ fun icon_nullWhenShouldNotShow_isEmergencyOnly() =
+ 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)
+
+ // Wait for delay to be completed
+ advanceTimeBy(10.seconds)
+
+ // THEN icon is set because we don't have service
+ assertThat(latest).isInstanceOf(Icon::class.java)
+
+ // GIVEN the connection is emergency only
+ i1.isEmergencyOnly.value = true
+
+ // THEN icon is null because we have emergency connection
+ assertThat(latest).isNull()
+ }
+
+ @Test
fun icon_nullWhenShouldNotShow_apmIsEnabled() =
testScope.runTest {
val latest by collectLastValue(underTest.icon)
@@ -118,6 +149,7 @@
// GIVEN all icons are OOS
val i1 = mobileIconsInteractor.getMobileConnectionInteractorForSubId(1)
i1.isInService.value = false
+ i1.isEmergencyOnly.value = false
// GIVEN apm is enabled
airplaneModeRepository.setIsAirplaneMode(true)
@@ -138,6 +170,7 @@
// 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)
@@ -161,6 +194,7 @@
// 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)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
index c010327..11acf1c 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconInteractor.kt
@@ -60,6 +60,8 @@
override val isInService = MutableStateFlow(true)
+ override val isEmergencyOnly = MutableStateFlow(true)
+
override val isNonTerrestrial = MutableStateFlow(false)
private val _isDataEnabled = MutableStateFlow(true)