Fix the "Use this SIM" switch does not disable during phone calls am: 4f454b43c6
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/27105181 Change-Id: I2be1b144aa7d1d120692ccfece3c921e488fc308 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -33,6 +33,7 @@ import kotlinx.coroutines.flow.Flow
|
|||||||
import kotlinx.coroutines.flow.callbackFlow
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
import kotlinx.coroutines.flow.flowOf
|
import kotlinx.coroutines.flow.flowOf
|
||||||
import java.util.concurrent.Executor
|
import java.util.concurrent.Executor
|
||||||
|
import kotlinx.coroutines.flow.flowOn
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A repository class for interacting with the SatelliteManager API.
|
* A repository class for interacting with the SatelliteManager API.
|
||||||
@@ -112,13 +113,13 @@ class SatelliteRepository(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a Flow that emits the enabled state of the satellite modem. Updates are triggered
|
* Provides a Flow that emits the session state of the satellite modem. Updates are triggered
|
||||||
* when the modem state changes.
|
* when the modem state changes.
|
||||||
*
|
*
|
||||||
* @param defaultDispatcher The CoroutineDispatcher to use (Defaults to `Dispatchers.Default`).
|
* @param defaultDispatcher The CoroutineDispatcher to use (Defaults to `Dispatchers.Default`).
|
||||||
* @return A Flow emitting `true` when the modem is enabled and `false` otherwise.
|
* @return A Flow emitting `true` when the session is started and `false` otherwise.
|
||||||
*/
|
*/
|
||||||
fun getIsModemEnabledFlow(
|
fun getIsSessionStartedFlow(
|
||||||
defaultDispatcher: CoroutineDispatcher = Dispatchers.Default,
|
defaultDispatcher: CoroutineDispatcher = Dispatchers.Default,
|
||||||
): Flow<Boolean> {
|
): Flow<Boolean> {
|
||||||
val satelliteManager: SatelliteManager? =
|
val satelliteManager: SatelliteManager? =
|
||||||
@@ -130,42 +131,27 @@ class SatelliteRepository(
|
|||||||
|
|
||||||
return callbackFlow {
|
return callbackFlow {
|
||||||
val callback = SatelliteModemStateCallback { state ->
|
val callback = SatelliteModemStateCallback { state ->
|
||||||
val isEnabled = convertSatelliteModemStateToEnabledState(state)
|
val isSessionStarted = isSatelliteSessionStarted(state)
|
||||||
Log.i(TAG, "Satellite modem state changed: state=$state, isEnabled=$isEnabled")
|
Log.i(TAG, "Satellite modem state changed: state=$state"
|
||||||
trySend(isEnabled)
|
+ ", isSessionStarted=$isSessionStarted")
|
||||||
|
trySend(isSessionStarted)
|
||||||
}
|
}
|
||||||
|
|
||||||
val result = satelliteManager.registerForModemStateChanged(
|
val registerResult = satelliteManager.registerForModemStateChanged(
|
||||||
defaultDispatcher.asExecutor(),
|
defaultDispatcher.asExecutor(),
|
||||||
callback
|
callback
|
||||||
)
|
)
|
||||||
Log.i(TAG, "Call registerForModemStateChanged: result=$result")
|
|
||||||
|
if (registerResult != SatelliteManager.SATELLITE_RESULT_SUCCESS) {
|
||||||
|
// If the registration failed (e.g., device doesn't support satellite),
|
||||||
|
// SatelliteManager will not emit the current state by callback.
|
||||||
|
// We send `false` value by ourself to make sure the flow has initial value.
|
||||||
|
Log.w(TAG, "Failed to register for satellite modem state change: $registerResult")
|
||||||
|
trySend(false)
|
||||||
|
}
|
||||||
|
|
||||||
awaitClose { satelliteManager.unregisterForModemStateChanged(callback) }
|
awaitClose { satelliteManager.unregisterForModemStateChanged(callback) }
|
||||||
}
|
}.flowOn(Dispatchers.Default)
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts a [SatelliteManager.SatelliteModemState] to a boolean representing whether the modem
|
|
||||||
* is enabled.
|
|
||||||
*
|
|
||||||
* @param state The SatelliteModemState provided by the SatelliteManager.
|
|
||||||
* @return `true` if the modem is enabled, `false` otherwise.
|
|
||||||
*/
|
|
||||||
@VisibleForTesting
|
|
||||||
fun convertSatelliteModemStateToEnabledState(
|
|
||||||
@SatelliteManager.SatelliteModemState state: Int,
|
|
||||||
): Boolean {
|
|
||||||
// Mapping table based on logic from b/315928920#comment24
|
|
||||||
return when (state) {
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_IDLE,
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_LISTENING,
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING,
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_RETRYING,
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED,
|
|
||||||
SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED -> true
|
|
||||||
else -> false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -59,7 +59,7 @@ class MobileNetworkSwitchController @JvmOverloads constructor(
|
|||||||
val changeable by remember {
|
val changeable by remember {
|
||||||
combine(
|
combine(
|
||||||
context.callStateFlow(subId).map { it == TelephonyManager.CALL_STATE_IDLE },
|
context.callStateFlow(subId).map { it == TelephonyManager.CALL_STATE_IDLE },
|
||||||
satelliteRepository.getIsModemEnabledFlow()
|
satelliteRepository.getIsSessionStartedFlow()
|
||||||
) { isCallStateIdle, isSatelliteModemEnabled ->
|
) { isCallStateIdle, isSatelliteModemEnabled ->
|
||||||
isCallStateIdle && !isSatelliteModemEnabled
|
isCallStateIdle && !isSatelliteModemEnabled
|
||||||
}
|
}
|
||||||
|
@@ -120,7 +120,7 @@ class SatelliteRepositoryTest {
|
|||||||
@Test
|
@Test
|
||||||
fun requestIsSessionStarted_registerFailed() = runBlocking {
|
fun requestIsSessionStarted_registerFailed() = runBlocking {
|
||||||
`when`(mockSatelliteManager.registerForModemStateChanged(any(), any())
|
`when`(mockSatelliteManager.registerForModemStateChanged(any(), any())
|
||||||
).thenAnswer { invocation ->
|
).thenAnswer {
|
||||||
SatelliteManager.SATELLITE_RESULT_ERROR
|
SatelliteManager.SATELLITE_RESULT_ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ class SatelliteRepositoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getIsModemEnabledFlow_isSatelliteEnabledState() = runBlocking {
|
fun getIsSessionStartedFlow_isSatelliteEnabledState() = runBlocking {
|
||||||
`when`(
|
`when`(
|
||||||
mockSatelliteManager.registerForModemStateChanged(
|
mockSatelliteManager.registerForModemStateChanged(
|
||||||
any(),
|
any(),
|
||||||
@@ -199,13 +199,13 @@ class SatelliteRepositoryTest {
|
|||||||
SatelliteManager.SATELLITE_RESULT_SUCCESS
|
SatelliteManager.SATELLITE_RESULT_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
val flow = repository.getIsModemEnabledFlow()
|
val flow = repository.getIsSessionStartedFlow()
|
||||||
|
|
||||||
assertThat(flow.first()).isTrue()
|
assertThat(flow.first()).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getIsModemEnabledFlow_isSatelliteDisabledState() = runBlocking {
|
fun getIsSessionStartedFlow_isSatelliteDisabledState() = runBlocking {
|
||||||
`when`(
|
`when`(
|
||||||
mockSatelliteManager.registerForModemStateChanged(
|
mockSatelliteManager.registerForModemStateChanged(
|
||||||
any(),
|
any(),
|
||||||
@@ -217,16 +217,28 @@ class SatelliteRepositoryTest {
|
|||||||
SatelliteManager.SATELLITE_RESULT_SUCCESS
|
SatelliteManager.SATELLITE_RESULT_SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
val flow = repository.getIsModemEnabledFlow()
|
val flow = repository.getIsSessionStartedFlow()
|
||||||
|
|
||||||
assertThat(flow.first()).isFalse()
|
assertThat(flow.first()).isFalse()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getIsModemEnabledFlow_nullSatelliteManager() = runBlocking {
|
fun getIsSessionStartedFlow_nullSatelliteManager() = runBlocking {
|
||||||
`when`(spyContext.getSystemService(SatelliteManager::class.java)).thenReturn(null)
|
`when`(spyContext.getSystemService(SatelliteManager::class.java)).thenReturn(null)
|
||||||
|
|
||||||
val flow = repository.getIsModemEnabledFlow()
|
val flow = repository.getIsSessionStartedFlow()
|
||||||
|
assertThat(flow.first()).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getIsSessionStartedFlow_registerFailed() = runBlocking {
|
||||||
|
`when`(mockSatelliteManager.registerForModemStateChanged(any(), any())
|
||||||
|
).thenAnswer {
|
||||||
|
SatelliteManager.SATELLITE_RESULT_ERROR
|
||||||
|
}
|
||||||
|
|
||||||
|
val flow = repository.getIsSessionStartedFlow()
|
||||||
|
|
||||||
assertThat(flow.first()).isFalse()
|
assertThat(flow.first()).isFalse()
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user