Revert "[Sat] Add satellite supported changed callback"
This reverts commit 025a73e22ecf122f5f521490466f369bb01c5eaa.
Reason for revert: <Likely culprit for b/343311321 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted>
Change-Id: I22547cedbc1ff721c6b0e17c2b9eb80c64cadca6
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
index 7bb65dd..9d9cc2a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt
@@ -23,7 +23,6 @@
import android.telephony.satellite.SatelliteManager
import android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS
import android.telephony.satellite.SatelliteModemStateCallback
-import android.telephony.satellite.SatelliteSupportedStateCallback
import androidx.annotation.VisibleForTesting
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
@@ -35,7 +34,6 @@
import com.android.systemui.log.core.MessagePrinter
import com.android.systemui.statusbar.pipeline.dagger.OemSatelliteInputLog
import com.android.systemui.statusbar.pipeline.satellite.data.RealDeviceBasedSatelliteRepository
-import com.android.systemui.statusbar.pipeline.satellite.data.prod.DeviceBasedSatelliteRepositoryImpl.Companion.POLLING_INTERVAL_MS
import com.android.systemui.statusbar.pipeline.satellite.data.prod.SatelliteSupport.Companion.whenSupported
import com.android.systemui.statusbar.pipeline.satellite.data.prod.SatelliteSupport.NotSupported
import com.android.systemui.statusbar.pipeline.satellite.data.prod.SatelliteSupport.Supported
@@ -162,6 +160,60 @@
@get:VisibleForTesting
val satelliteSupport: MutableStateFlow<SatelliteSupport> = MutableStateFlow(Unknown)
+ init {
+ satelliteManager = satelliteManagerOpt.getOrNull()
+
+ isSatelliteAllowedForCurrentLocation = MutableStateFlow(false)
+
+ if (satelliteManager != null) {
+ // First, check that satellite is supported on this device
+ scope.launch {
+ val waitTime = ensureMinUptime(systemClock, MIN_UPTIME)
+ if (waitTime > 0) {
+ logBuffer.i({ long1 = waitTime }) {
+ "Waiting $long1 ms before checking for satellite support"
+ }
+ delay(waitTime)
+ }
+
+ satelliteSupport.value = satelliteManager.checkSatelliteSupported()
+
+ logBuffer.i(
+ { str1 = satelliteSupport.value.toString() },
+ { "Checked for system support. support=$str1" },
+ )
+
+ // We only need to check location availability if this mode is supported
+ if (satelliteSupport.value is Supported) {
+ isSatelliteAllowedForCurrentLocation.subscriptionCount
+ .map { it > 0 }
+ .distinctUntilChanged()
+ .collectLatest { hasSubscribers ->
+ if (hasSubscribers) {
+ /*
+ * As there is no listener available for checking satellite allowed,
+ * we must poll. Defaulting to polling at most once every hour while
+ * active. Subsequent OOS events will restart the job, so a flaky
+ * connection might cause more frequent checks.
+ */
+ while (true) {
+ logBuffer.i {
+ "requestIsCommunicationAllowedForCurrentLocation"
+ }
+ checkIsSatelliteAllowed()
+ delay(POLLING_INTERVAL_MS)
+ }
+ }
+ }
+ }
+ }
+ } else {
+ logBuffer.i { "Satellite manager is null" }
+
+ satelliteSupport.value = NotSupported
+ }
+ }
+
/**
* Note that we are given an "unbound" [TelephonyManager] (meaning it was not created with a
* specific `subscriptionId`). Therefore this is the radio power state of the
@@ -215,122 +267,6 @@
}
.onStart { emit(Unit) }
- init {
- satelliteManager = satelliteManagerOpt.getOrNull()
-
- isSatelliteAllowedForCurrentLocation = MutableStateFlow(false)
-
- if (satelliteManager != null) {
- // Outer scope launch allows us to delay until MIN_UPTIME
- scope.launch {
- // First, check that satellite is supported on this device
- satelliteSupport.value = checkSatelliteSupportAfterMinUptime(satelliteManager)
- logBuffer.i(
- { str1 = satelliteSupport.value.toString() },
- { "Checked for system support. support=$str1" },
- )
-
- // Second, launch a job to poll for service availability based on location
- scope.launch { pollForAvailabilityBasedOnLocation() }
-
- // Third, register a listener to let us know if there are changes to support
- scope.launch { listenForChangesToSatelliteSupport(satelliteManager) }
- }
- } else {
- logBuffer.i { "Satellite manager is null" }
- satelliteSupport.value = NotSupported
- }
- }
-
- private suspend fun checkSatelliteSupportAfterMinUptime(
- sm: SatelliteManager
- ): SatelliteSupport {
- val waitTime = ensureMinUptime(systemClock, MIN_UPTIME)
- if (waitTime > 0) {
- logBuffer.i({ long1 = waitTime }) {
- "Waiting $long1 ms before checking for satellite support"
- }
- delay(waitTime)
- }
-
- return sm.checkSatelliteSupported()
- }
-
- /*
- * As there is no listener available for checking satellite allowed, we must poll the service.
- * Defaulting to polling at most once every 20m while active. Subsequent OOS events will restart
- * the job, so a flaky connection might cause more frequent checks.
- */
- private suspend fun pollForAvailabilityBasedOnLocation() {
- satelliteSupport
- .whenSupported(
- supported = ::isSatelliteAllowedHasListener,
- orElse = flowOf(false),
- retrySignal = telephonyProcessCrashedEvent,
- )
- .collectLatest { hasSubscribers ->
- if (hasSubscribers) {
- while (true) {
- logBuffer.i { "requestIsCommunicationAllowedForCurrentLocation" }
- checkIsSatelliteAllowed()
- delay(POLLING_INTERVAL_MS)
- }
- }
- }
- }
-
- /**
- * Register a callback with [SatelliteManager] to let us know if there is a change in satellite
- * support. This job restarts if there is a crash event detected.
- *
- * Note that the structure of this method looks similar to [whenSupported], but since we want
- * this callback registered even when it is [NotSupported], we just mimic the structure here.
- */
- private suspend fun listenForChangesToSatelliteSupport(sm: SatelliteManager) {
- telephonyProcessCrashedEvent.collectLatest {
- satelliteIsSupportedCallback.collect { supported ->
- if (supported) {
- satelliteSupport.value = Supported(sm)
- } else {
- satelliteSupport.value = NotSupported
- }
- }
- }
- }
-
- /**
- * Callback version of [checkSatelliteSupported]. This flow should be retried on the same
- * [telephonyProcessCrashedEvent] signal, but does not require a [SupportedSatelliteManager],
- * since it specifically watches for satellite support.
- */
- private val satelliteIsSupportedCallback: Flow<Boolean> =
- if (satelliteManager == null) {
- flowOf(false)
- } else {
- conflatedCallbackFlow {
- val callback = SatelliteSupportedStateCallback { supported ->
- logBuffer.i {
- "onSatelliteSupportedStateChanged: " +
- "${if (supported) "supported" else "not supported"}"
- }
- trySend(supported)
- }
- satelliteManager.registerForSupportedStateChanged(
- bgDispatcher.asExecutor(),
- callback
- )
- awaitClose { satelliteManager.unregisterForSupportedStateChanged(callback) }
- }
- }
-
- /**
- * Signal that we should start polling [checkIsSatelliteAllowed]. We only need to poll if there
- * are active listeners to [isSatelliteAllowedForCurrentLocation]
- */
- @SuppressWarnings("unused")
- private fun isSatelliteAllowedHasListener(sm: SupportedSatelliteManager): Flow<Boolean> =
- isSatelliteAllowedForCurrentLocation.subscriptionCount.map { it > 0 }.distinctUntilChanged()
-
override val connectionState =
satelliteSupport
.whenSupported(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
index b65114c..6651676 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt
@@ -34,7 +34,6 @@
import android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN
import android.telephony.satellite.SatelliteManager.SatelliteException
import android.telephony.satellite.SatelliteModemStateCallback
-import android.telephony.satellite.SatelliteSupportedStateCallback
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
@@ -327,6 +326,7 @@
@Test
fun satelliteNotSupported_listenersAreNotRegistered() =
testScope.runTest {
+ setupDefaultRepo()
// GIVEN satellite is not supported
setUpRepo(
uptime = MIN_UPTIME,
@@ -344,94 +344,6 @@
}
@Test
- fun satelliteSupported_registersCallbackForStateChanges() =
- testScope.runTest {
- // GIVEN a supported satellite manager.
- setupDefaultRepo()
- runCurrent()
-
- // THEN the repo registers for state changes of satellite support
- verify(satelliteManager, times(1)).registerForSupportedStateChanged(any(), any())
- }
-
- @Test
- fun satelliteNotSupported_registersCallbackForStateChanges() =
- testScope.runTest {
- // GIVEN satellite is not supported
- setUpRepo(
- uptime = MIN_UPTIME,
- satMan = satelliteManager,
- satelliteSupported = false,
- )
-
- runCurrent()
- // THEN the repo registers for state changes of satellite support
- verify(satelliteManager, times(1)).registerForSupportedStateChanged(any(), any())
- }
-
- @Test
- fun satelliteSupported_supportIsLost_unregistersListeners() =
- testScope.runTest {
- // GIVEN a supported satellite manager.
- setupDefaultRepo()
- runCurrent()
-
- val callback =
- withArgCaptor<SatelliteSupportedStateCallback> {
- verify(satelliteManager).registerForSupportedStateChanged(any(), capture())
- }
-
- // WHEN data is requested from the repo
- val connectionState by collectLastValue(underTest.connectionState)
- val signalStrength by collectLastValue(underTest.signalStrength)
-
- // THEN the listeners are registered
- verify(satelliteManager, times(1)).registerForModemStateChanged(any(), any())
- verify(satelliteManager, times(1)).registerForNtnSignalStrengthChanged(any(), any())
-
- // WHEN satellite support turns off
- callback.onSatelliteSupportedStateChanged(false)
- runCurrent()
-
- // THEN listeners are unregistered
- verify(satelliteManager, times(1)).unregisterForModemStateChanged(any())
- verify(satelliteManager, times(1)).unregisterForNtnSignalStrengthChanged(any())
- }
-
- @Test
- fun satelliteNotSupported_supportShowsUp_registersListeners() =
- testScope.runTest {
- // GIVEN satellite is not supported
- setUpRepo(
- uptime = MIN_UPTIME,
- satMan = satelliteManager,
- satelliteSupported = false,
- )
- runCurrent()
-
- val callback =
- withArgCaptor<SatelliteSupportedStateCallback> {
- verify(satelliteManager).registerForSupportedStateChanged(any(), capture())
- }
-
- // WHEN data is requested from the repo
- val connectionState by collectLastValue(underTest.connectionState)
- val signalStrength by collectLastValue(underTest.signalStrength)
-
- // THEN the listeners are not yet registered
- verify(satelliteManager, times(0)).registerForModemStateChanged(any(), any())
- verify(satelliteManager, times(0)).registerForNtnSignalStrengthChanged(any(), any())
-
- // WHEN satellite support turns on
- callback.onSatelliteSupportedStateChanged(true)
- runCurrent()
-
- // THEN listeners are registered
- verify(satelliteManager, times(1)).registerForModemStateChanged(any(), any())
- verify(satelliteManager, times(1)).registerForNtnSignalStrengthChanged(any(), any())
- }
-
- @Test
fun repoDoesNotCheckForSupportUntilMinUptime() =
testScope.runTest {
// GIVEN we init 100ms after sysui starts up