[Sb refactor] Implement DataEnabledChangedListener
This CL changes the behavior of checking for mobile data enabled. The old pipeline would await telephony callbacks and then poll for `TelephonyManager.isDataConnectionAllowed`. Problem is that there was a race condition with watching the settings and polling this field, so it was often wrong on the first read. This change implements the newer TelephonyCallback.DataEnabledChangedListener, which can supplant the old polling method and simplify our repositories. Bug: 238425913 Bug: 260112365 Test: MobileConnectionRepositoryTest Change-Id: Ied9eea844501cd03100d85286993f85df671b37d
This commit is contained in:
@@ -49,6 +49,7 @@
|
||||
<permission name="android.permission.READ_FRAME_BUFFER"/>
|
||||
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
|
||||
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
|
||||
<permission name="android.permission.READ_PRECISE_PHONE_STATE"/>
|
||||
<permission name="android.permission.REAL_GET_TASKS"/>
|
||||
<permission name="android.permission.REQUEST_NETWORK_SCORES"/>
|
||||
<permission name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE"/>
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.READ_PRECISE_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package com.android.systemui.statusbar.pipeline.mobile.data.repository
|
||||
|
||||
import android.provider.Settings
|
||||
import android.telephony.CarrierConfigManager
|
||||
import android.telephony.SubscriptionManager
|
||||
import com.android.settingslib.SignalIcon.MobileIconGroup
|
||||
@@ -53,9 +52,6 @@ interface MobileConnectionsRepository {
|
||||
/** Get or create a repository for the line of service for the given subscription ID */
|
||||
fun getRepoForSubId(subId: Int): MobileConnectionRepository
|
||||
|
||||
/** Observe changes to the [Settings.Global.MOBILE_DATA] setting */
|
||||
val globalMobileDataSettingChangedEvent: Flow<Unit>
|
||||
|
||||
/**
|
||||
* [Config] is an object that tracks relevant configuration flags for a given subscription ID.
|
||||
* In the case of [MobileMappings], it's hard-coded to check the default data subscription's
|
||||
|
||||
@@ -156,9 +156,6 @@ constructor(
|
||||
realRepository.defaultMobileNetworkConnectivity.value
|
||||
)
|
||||
|
||||
override val globalMobileDataSettingChangedEvent: Flow<Unit> =
|
||||
activeRepo.flatMapLatest { it.globalMobileDataSettingChangedEvent }
|
||||
|
||||
override fun getRepoForSubId(subId: Int): MobileConnectionRepository {
|
||||
if (isDemoMode.value) {
|
||||
return demoMobileConnectionsRepository.getRepoForSubId(subId)
|
||||
|
||||
@@ -185,8 +185,6 @@ constructor(
|
||||
return CacheContainer(repo, lastMobileState = null)
|
||||
}
|
||||
|
||||
override val globalMobileDataSettingChangedEvent = MutableStateFlow(Unit)
|
||||
|
||||
fun startProcessingCommands() {
|
||||
mobileDemoCommandJob =
|
||||
scope.launch {
|
||||
|
||||
@@ -26,7 +26,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConn
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
@@ -50,7 +49,6 @@ class FullMobileConnectionRepository(
|
||||
override val tableLogBuffer: TableLogBuffer,
|
||||
private val defaultNetworkName: NetworkNameModel,
|
||||
private val networkNameSeparator: String,
|
||||
private val globalMobileDataSettingChangedEvent: Flow<Unit>,
|
||||
@Application scope: CoroutineScope,
|
||||
private val mobileRepoFactory: MobileConnectionRepositoryImpl.Factory,
|
||||
private val carrierMergedRepoFactory: CarrierMergedConnectionRepository.Factory,
|
||||
@@ -84,7 +82,6 @@ class FullMobileConnectionRepository(
|
||||
tableLogBuffer,
|
||||
defaultNetworkName,
|
||||
networkNameSeparator,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -150,7 +147,6 @@ class FullMobileConnectionRepository(
|
||||
startingIsCarrierMerged: Boolean,
|
||||
defaultNetworkName: NetworkNameModel,
|
||||
networkNameSeparator: String,
|
||||
globalMobileDataSettingChangedEvent: Flow<Unit>,
|
||||
): FullMobileConnectionRepository {
|
||||
val mobileLogger =
|
||||
logFactory.getOrCreate(tableBufferLogName(subId), MOBILE_CONNECTION_BUFFER_SIZE)
|
||||
@@ -161,7 +157,6 @@ class FullMobileConnectionRepository(
|
||||
mobileLogger,
|
||||
defaultNetworkName,
|
||||
networkNameSeparator,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
scope,
|
||||
mobileRepoFactory,
|
||||
carrierMergedRepoFactory,
|
||||
|
||||
@@ -18,8 +18,6 @@ package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
|
||||
|
||||
import android.content.Context
|
||||
import android.content.IntentFilter
|
||||
import android.database.ContentObserver
|
||||
import android.provider.Settings.Global
|
||||
import android.telephony.CellSignalStrength
|
||||
import android.telephony.CellSignalStrengthCdma
|
||||
import android.telephony.ServiceState
|
||||
@@ -53,7 +51,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConn
|
||||
import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
|
||||
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||
import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel
|
||||
import com.android.systemui.util.settings.GlobalSettings
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -62,9 +59,11 @@ import kotlinx.coroutines.asExecutor
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.mapLatest
|
||||
import kotlinx.coroutines.flow.merge
|
||||
@@ -83,10 +82,8 @@ class MobileConnectionRepositoryImpl(
|
||||
defaultNetworkName: NetworkNameModel,
|
||||
networkNameSeparator: String,
|
||||
private val telephonyManager: TelephonyManager,
|
||||
private val globalSettings: GlobalSettings,
|
||||
systemUiCarrierConfig: SystemUiCarrierConfig,
|
||||
broadcastDispatcher: BroadcastDispatcher,
|
||||
globalMobileDataSettingChangedEvent: Flow<Unit>,
|
||||
mobileMappingsProxy: MobileMappingsProxy,
|
||||
bgDispatcher: CoroutineDispatcher,
|
||||
logger: ConnectivityPipelineLogger,
|
||||
@@ -117,7 +114,8 @@ class MobileConnectionRepositoryImpl(
|
||||
TelephonyCallback.DataConnectionStateListener,
|
||||
TelephonyCallback.DataActivityListener,
|
||||
TelephonyCallback.CarrierNetworkListener,
|
||||
TelephonyCallback.DisplayInfoListener {
|
||||
TelephonyCallback.DisplayInfoListener,
|
||||
TelephonyCallback.DataEnabledListener {
|
||||
override fun onServiceStateChanged(serviceState: ServiceState) {
|
||||
logger.logOnServiceStateChanged(serviceState, subId)
|
||||
state =
|
||||
@@ -206,6 +204,12 @@ class MobileConnectionRepositoryImpl(
|
||||
state = state.copy(resolvedNetworkType = networkType)
|
||||
trySend(state)
|
||||
}
|
||||
|
||||
override fun onDataEnabledChanged(enabled: Boolean, reason: Int) {
|
||||
logger.logOnDataEnabledChanged(enabled, subId)
|
||||
_dataEnabled.value = enabled
|
||||
trySend(state)
|
||||
}
|
||||
}
|
||||
telephonyManager.registerTelephonyCallback(bgDispatcher.asExecutor(), callback)
|
||||
awaitClose { telephonyManager.unregisterTelephonyCallback(callback) }
|
||||
@@ -230,24 +234,6 @@ class MobileConnectionRepositoryImpl(
|
||||
}
|
||||
.stateIn(scope, SharingStarted.WhileSubscribed(), DEFAULT_NUM_LEVELS)
|
||||
|
||||
/** Produces whenever the mobile data setting changes for this subId */
|
||||
private val localMobileDataSettingChangedEvent: Flow<Unit> = conflatedCallbackFlow {
|
||||
val observer =
|
||||
object : ContentObserver(null) {
|
||||
override fun onChange(selfChange: Boolean) {
|
||||
trySend(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
globalSettings.registerContentObserver(
|
||||
globalSettings.getUriFor("${Global.MOBILE_DATA}$subId"),
|
||||
/* notifyForDescendants */ true,
|
||||
observer
|
||||
)
|
||||
|
||||
awaitClose { context.contentResolver.unregisterContentObserver(observer) }
|
||||
}
|
||||
|
||||
/**
|
||||
* There are a few cases where we will need to poll [TelephonyManager] so we can update some
|
||||
* internal state where callbacks aren't provided. Any of those events should be merged into
|
||||
@@ -256,8 +242,6 @@ class MobileConnectionRepositoryImpl(
|
||||
private val telephonyPollingEvent: Flow<Unit> =
|
||||
merge(
|
||||
telephonyCallbackEvent,
|
||||
localMobileDataSettingChangedEvent,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
|
||||
override val cdmaRoaming: StateFlow<Boolean> =
|
||||
@@ -284,21 +268,19 @@ class MobileConnectionRepositoryImpl(
|
||||
)
|
||||
.stateIn(scope, SharingStarted.WhileSubscribed(), defaultNetworkName)
|
||||
|
||||
override val dataEnabled: StateFlow<Boolean> = run {
|
||||
val initial = dataConnectionAllowed()
|
||||
telephonyPollingEvent
|
||||
.mapLatest { dataConnectionAllowed() }
|
||||
.distinctUntilChanged()
|
||||
private val _dataEnabled = MutableStateFlow(telephonyManager.isDataConnectionAllowed)
|
||||
override val dataEnabled =
|
||||
connectionInfo
|
||||
// _dataEnabled is updated in connectionInfo's callback, so we need to make sure that
|
||||
// this flow declares a dependency on that callback
|
||||
.flatMapLatest { _dataEnabled }
|
||||
.logDiffsForTable(
|
||||
mobileLogger,
|
||||
columnPrefix = "",
|
||||
columnName = "dataEnabled",
|
||||
initialValue = initial,
|
||||
initialValue = _dataEnabled.value
|
||||
)
|
||||
.stateIn(scope, SharingStarted.WhileSubscribed(), initial)
|
||||
}
|
||||
|
||||
private fun dataConnectionAllowed(): Boolean = telephonyManager.isDataConnectionAllowed
|
||||
.stateIn(scope, SharingStarted.WhileSubscribed(), _dataEnabled.value)
|
||||
|
||||
class Factory
|
||||
@Inject
|
||||
@@ -307,7 +289,6 @@ class MobileConnectionRepositoryImpl(
|
||||
private val context: Context,
|
||||
private val telephonyManager: TelephonyManager,
|
||||
private val logger: ConnectivityPipelineLogger,
|
||||
private val globalSettings: GlobalSettings,
|
||||
private val carrierConfigRepository: CarrierConfigRepository,
|
||||
private val mobileMappingsProxy: MobileMappingsProxy,
|
||||
@Background private val bgDispatcher: CoroutineDispatcher,
|
||||
@@ -318,7 +299,6 @@ class MobileConnectionRepositoryImpl(
|
||||
mobileLogger: TableLogBuffer,
|
||||
defaultNetworkName: NetworkNameModel,
|
||||
networkNameSeparator: String,
|
||||
globalMobileDataSettingChangedEvent: Flow<Unit>,
|
||||
): MobileConnectionRepository {
|
||||
return MobileConnectionRepositoryImpl(
|
||||
context,
|
||||
@@ -326,10 +306,8 @@ class MobileConnectionRepositoryImpl(
|
||||
defaultNetworkName,
|
||||
networkNameSeparator,
|
||||
telephonyManager.createForSubscriptionId(subId),
|
||||
globalSettings,
|
||||
carrierConfigRepository.getOrCreateConfigForSubId(subId),
|
||||
broadcastDispatcher,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
mobileMappingsProxy,
|
||||
bgDispatcher,
|
||||
logger,
|
||||
|
||||
@@ -19,14 +19,12 @@ package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.IntentFilter
|
||||
import android.database.ContentObserver
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.ConnectivityManager.NetworkCallback
|
||||
import android.net.Network
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
|
||||
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
|
||||
import android.provider.Settings.Global.MOBILE_DATA
|
||||
import android.telephony.CarrierConfigManager
|
||||
import android.telephony.SubscriptionInfo
|
||||
import android.telephony.SubscriptionManager
|
||||
@@ -54,7 +52,6 @@ import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
|
||||
import com.android.systemui.statusbar.pipeline.wifi.data.model.WifiNetworkModel
|
||||
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
|
||||
import com.android.systemui.util.kotlin.pairwise
|
||||
import com.android.systemui.util.settings.GlobalSettings
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -87,7 +84,6 @@ constructor(
|
||||
private val logger: ConnectivityPipelineLogger,
|
||||
mobileMappingsProxy: MobileMappingsProxy,
|
||||
broadcastDispatcher: BroadcastDispatcher,
|
||||
private val globalSettings: GlobalSettings,
|
||||
private val context: Context,
|
||||
@Background private val bgDispatcher: CoroutineDispatcher,
|
||||
@Application private val scope: CoroutineScope,
|
||||
@@ -222,29 +218,6 @@ constructor(
|
||||
?: createRepositoryForSubId(subId).also { subIdRepositoryCache[subId] = it }
|
||||
}
|
||||
|
||||
/**
|
||||
* In single-SIM devices, the [MOBILE_DATA] setting is phone-wide. For multi-SIM, the individual
|
||||
* connection repositories also observe the URI for [MOBILE_DATA] + subId.
|
||||
*/
|
||||
override val globalMobileDataSettingChangedEvent: Flow<Unit> =
|
||||
conflatedCallbackFlow {
|
||||
val observer =
|
||||
object : ContentObserver(null) {
|
||||
override fun onChange(selfChange: Boolean) {
|
||||
trySend(Unit)
|
||||
}
|
||||
}
|
||||
|
||||
globalSettings.registerContentObserver(
|
||||
globalSettings.getUriFor(MOBILE_DATA),
|
||||
true,
|
||||
observer
|
||||
)
|
||||
|
||||
awaitClose { context.contentResolver.unregisterContentObserver(observer) }
|
||||
}
|
||||
.logInputChange(logger, "globalMobileDataSettingChangedEvent")
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
override val defaultMobileNetworkConnectivity: StateFlow<MobileConnectivityModel> =
|
||||
conflatedCallbackFlow {
|
||||
@@ -315,7 +288,6 @@ constructor(
|
||||
isCarrierMerged(subId),
|
||||
defaultNetworkName,
|
||||
networkNameSeparator,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -240,6 +240,18 @@ constructor(
|
||||
)
|
||||
}
|
||||
|
||||
fun logOnDataEnabledChanged(enabled: Boolean, subId: Int) {
|
||||
buffer.log(
|
||||
SB_LOGGING_TAG,
|
||||
LogLevel.INFO,
|
||||
{
|
||||
int1 = subId
|
||||
bool1 = enabled
|
||||
},
|
||||
{ "onDataEnabledChanged: subId=$int1 enabled=$bool1" },
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val SB_LOGGING_TAG = "SbConnectivity"
|
||||
|
||||
|
||||
@@ -71,9 +71,6 @@ class FakeMobileConnectionsRepository(
|
||||
?: FakeMobileConnectionRepository(subId, tableLogBuffer).also { subIdRepos[subId] = it }
|
||||
}
|
||||
|
||||
private val _globalMobileDataSettingChangedEvent = MutableStateFlow(Unit)
|
||||
override val globalMobileDataSettingChangedEvent = _globalMobileDataSettingChangedEvent
|
||||
|
||||
override val defaultDataSubRatConfig = MutableStateFlow(MobileMappings.Config())
|
||||
|
||||
private val _defaultMobileIconMapping = MutableStateFlow(TEST_MAPPING)
|
||||
@@ -94,10 +91,6 @@ class FakeMobileConnectionsRepository(
|
||||
_mobileConnectivity.value = model
|
||||
}
|
||||
|
||||
suspend fun triggerGlobalMobileDataSettingChangedEvent() {
|
||||
_globalMobileDataSettingChangedEvent.emit(Unit)
|
||||
}
|
||||
|
||||
fun setActiveMobileDataSubscriptionId(subId: Int) {
|
||||
_activeMobileDataSubscriptionId.value = subId
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@ import com.android.systemui.util.mockito.any
|
||||
import com.android.systemui.util.mockito.kotlinArgumentCaptor
|
||||
import com.android.systemui.util.mockito.mock
|
||||
import com.android.systemui.util.mockito.whenever
|
||||
import com.android.systemui.util.settings.FakeSettings
|
||||
import com.android.systemui.util.time.FakeSystemClock
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -85,7 +84,6 @@ class MobileRepositorySwitcherTest : SysuiTestCase() {
|
||||
@Mock private lateinit var demoModeController: DemoModeController
|
||||
@Mock private lateinit var dumpManager: DumpManager
|
||||
|
||||
private val globalSettings = FakeSettings()
|
||||
private val fakeNetworkEventsFlow = MutableStateFlow<FakeNetworkEventModel?>(null)
|
||||
private val mobileMappings = FakeMobileMappingsProxy()
|
||||
|
||||
@@ -118,7 +116,6 @@ class MobileRepositorySwitcherTest : SysuiTestCase() {
|
||||
logger,
|
||||
mobileMappings,
|
||||
fakeBroadcastDispatcher,
|
||||
globalSettings,
|
||||
context,
|
||||
IMMEDIATE,
|
||||
scope,
|
||||
|
||||
@@ -23,9 +23,7 @@ import com.android.systemui.log.table.TableLogBufferFactory
|
||||
import com.android.systemui.statusbar.pipeline.mobile.data.model.MobileConnectionModel
|
||||
import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
|
||||
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionRepository
|
||||
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
|
||||
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
|
||||
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
|
||||
import com.android.systemui.util.mockito.any
|
||||
import com.android.systemui.util.mockito.eq
|
||||
import com.android.systemui.util.mockito.mock
|
||||
@@ -33,7 +31,6 @@ import com.android.systemui.util.mockito.whenever
|
||||
import com.android.systemui.util.time.FakeSystemClock
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.test.TestScope
|
||||
@@ -57,22 +54,15 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
|
||||
private val testDispatcher = UnconfinedTestDispatcher()
|
||||
private val testScope = TestScope(testDispatcher)
|
||||
private val mobileMappings = FakeMobileMappingsProxy()
|
||||
private val tableLogBuffer = mock<TableLogBuffer>()
|
||||
private val mobileFactory = mock<MobileConnectionRepositoryImpl.Factory>()
|
||||
private val carrierMergedFactory = mock<CarrierMergedConnectionRepository.Factory>()
|
||||
|
||||
private lateinit var connectionsRepo: FakeMobileConnectionsRepository
|
||||
private val globalMobileDataSettingChangedEvent: Flow<Unit>
|
||||
get() = connectionsRepo.globalMobileDataSettingChangedEvent
|
||||
|
||||
private lateinit var mobileRepo: FakeMobileConnectionRepository
|
||||
private lateinit var carrierMergedRepo: FakeMobileConnectionRepository
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
connectionsRepo = FakeMobileConnectionsRepository(mobileMappings, tableLogBuffer)
|
||||
|
||||
mobileRepo = FakeMobileConnectionRepository(SUB_ID, tableLogBuffer)
|
||||
carrierMergedRepo = FakeMobileConnectionRepository(SUB_ID, tableLogBuffer)
|
||||
|
||||
@@ -82,7 +72,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
any(),
|
||||
eq(DEFAULT_NAME),
|
||||
eq(SEP),
|
||||
eq(globalMobileDataSettingChangedEvent),
|
||||
)
|
||||
)
|
||||
.thenReturn(mobileRepo)
|
||||
@@ -109,7 +98,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
tableLogBuffer,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent
|
||||
)
|
||||
}
|
||||
|
||||
@@ -310,7 +298,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
startingIsCarrierMerged = false,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
|
||||
val connection1Repeat =
|
||||
@@ -319,7 +306,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
startingIsCarrierMerged = false,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
|
||||
assertThat(connection1.tableLogBuffer)
|
||||
@@ -345,7 +331,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
startingIsCarrierMerged = false,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
|
||||
// WHEN a connection with the same sub ID but carrierMerged = true is created
|
||||
@@ -355,7 +340,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
startingIsCarrierMerged = true,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
)
|
||||
|
||||
// THEN the same table is re-used
|
||||
@@ -374,7 +358,6 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
tableLogBuffer,
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
globalMobileDataSettingChangedEvent,
|
||||
testScope.backgroundScope,
|
||||
mobileFactory,
|
||||
carrierMergedFactory,
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
package com.android.systemui.statusbar.pipeline.mobile.data.repository.prod
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.UserHandle
|
||||
import android.provider.Settings
|
||||
import android.telephony.CarrierConfigManager.KEY_INFLATE_SIGNAL_STRENGTH_BOOL
|
||||
import android.telephony.CellSignalStrengthCdma
|
||||
import android.telephony.NetworkRegistrationInfo
|
||||
@@ -74,7 +72,6 @@ import com.android.systemui.util.mockito.any
|
||||
import com.android.systemui.util.mockito.argumentCaptor
|
||||
import com.android.systemui.util.mockito.mock
|
||||
import com.android.systemui.util.mockito.whenever
|
||||
import com.android.systemui.util.settings.FakeSettings
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -103,7 +100,6 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
|
||||
private val scope = CoroutineScope(IMMEDIATE)
|
||||
private val mobileMappings = FakeMobileMappingsProxy()
|
||||
private val globalSettings = FakeSettings()
|
||||
private val systemUiCarrierConfig =
|
||||
SystemUiCarrierConfig(
|
||||
SUB_1_ID,
|
||||
@@ -113,7 +109,6 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
@Before
|
||||
fun setUp() {
|
||||
MockitoAnnotations.initMocks(this)
|
||||
globalSettings.userId = UserHandle.USER_ALL
|
||||
whenever(telephonyManager.subscriptionId).thenReturn(SUB_1_ID)
|
||||
|
||||
connectionsRepo = FakeMobileConnectionsRepository(mobileMappings, tableLogger)
|
||||
@@ -125,10 +120,8 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
DEFAULT_NAME,
|
||||
SEP,
|
||||
telephonyManager,
|
||||
globalSettings,
|
||||
systemUiCarrierConfig,
|
||||
fakeBroadcastDispatcher,
|
||||
connectionsRepo.globalMobileDataSettingChangedEvent,
|
||||
mobileMappings,
|
||||
IMMEDIATE,
|
||||
logger,
|
||||
@@ -361,53 +354,27 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
|
||||
|
||||
@Test
|
||||
fun dataEnabled_initial_false() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(true)
|
||||
|
||||
assertThat(underTest.dataEnabled.value).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dataEnabled_isEnabled_true() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(true)
|
||||
val job = underTest.dataEnabled.launchIn(this)
|
||||
|
||||
assertThat(underTest.dataEnabled.value).isTrue()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun dataEnabled_isDisabled() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(false)
|
||||
val job = underTest.dataEnabled.launchIn(this)
|
||||
|
||||
assertThat(underTest.dataEnabled.value).isFalse()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isDataConnectionAllowed_subIdSettingUpdate_valueUpdated() =
|
||||
fun `is data enabled - tracks telephony callback`() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
val subIdSettingName = "${Settings.Global.MOBILE_DATA}$SUB_1_ID"
|
||||
|
||||
var latest: Boolean? = null
|
||||
val job = underTest.dataEnabled.onEach { latest = it }.launchIn(this)
|
||||
|
||||
// We don't read the setting directly, we query telephony when changes happen
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(false)
|
||||
globalSettings.putInt(subIdSettingName, 0)
|
||||
assertThat(latest).isFalse()
|
||||
assertThat(underTest.dataEnabled.value).isFalse()
|
||||
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(true)
|
||||
globalSettings.putInt(subIdSettingName, 1)
|
||||
val callback = getTelephonyCallbackForType<TelephonyCallback.DataEnabledListener>()
|
||||
|
||||
callback.onDataEnabledChanged(true, 1)
|
||||
assertThat(latest).isTrue()
|
||||
|
||||
whenever(telephonyManager.isDataConnectionAllowed).thenReturn(false)
|
||||
globalSettings.putInt(subIdSettingName, 0)
|
||||
callback.onDataEnabledChanged(false, 1)
|
||||
assertThat(latest).isFalse()
|
||||
|
||||
job.cancel()
|
||||
|
||||
@@ -23,7 +23,6 @@ import android.net.NetworkCapabilities
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
|
||||
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
|
||||
import android.os.ParcelUuid
|
||||
import android.provider.Settings
|
||||
import android.telephony.CarrierConfigManager
|
||||
import android.telephony.SubscriptionInfo
|
||||
import android.telephony.SubscriptionManager
|
||||
@@ -50,7 +49,6 @@ import com.android.systemui.util.mockito.argumentCaptor
|
||||
import com.android.systemui.util.mockito.eq
|
||||
import com.android.systemui.util.mockito.mock
|
||||
import com.android.systemui.util.mockito.whenever
|
||||
import com.android.systemui.util.settings.FakeSettings
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import java.util.UUID
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -91,7 +89,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
|
||||
private val mobileMappings = FakeMobileMappingsProxy()
|
||||
|
||||
private val scope = CoroutineScope(IMMEDIATE)
|
||||
private val globalSettings = FakeSettings()
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
@@ -136,7 +133,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
|
||||
context = context,
|
||||
telephonyManager = telephonyManager,
|
||||
bgDispatcher = IMMEDIATE,
|
||||
globalSettings = globalSettings,
|
||||
logger = logger,
|
||||
mobileMappingsProxy = mobileMappings,
|
||||
scope = scope,
|
||||
@@ -163,7 +159,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
|
||||
logger,
|
||||
mobileMappings,
|
||||
fakeBroadcastDispatcher,
|
||||
globalSettings,
|
||||
context,
|
||||
IMMEDIATE,
|
||||
scope,
|
||||
@@ -555,24 +550,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun globalMobileDataSettingsChangedEvent_producesOnSettingChange() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
var produced = false
|
||||
val job =
|
||||
underTest.globalMobileDataSettingChangedEvent
|
||||
.onEach { produced = true }
|
||||
.launchIn(this)
|
||||
|
||||
assertThat(produced).isFalse()
|
||||
|
||||
globalSettings.putInt(Settings.Global.MOBILE_DATA, 0)
|
||||
|
||||
assertThat(produced).isTrue()
|
||||
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun mobileConnectivity_isConnected_isNotValidated() =
|
||||
runBlocking(IMMEDIATE) {
|
||||
@@ -641,7 +618,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
|
||||
logger,
|
||||
mobileMappings,
|
||||
fakeBroadcastDispatcher,
|
||||
globalSettings,
|
||||
context,
|
||||
IMMEDIATE,
|
||||
scope,
|
||||
|
||||
Reference in New Issue
Block a user