diff options
| author | 2023-01-20 17:35:20 -0500 | |
|---|---|---|
| committer | 2023-02-01 12:21:23 -0500 | |
| commit | fb60e153ffaba4ae1cf66e54eb62ab62b63d0ce3 (patch) | |
| tree | 740fdee1e9ddd2caac9acf38732dc6b44a1c4922 | |
| parent | e43cc99e308e6a19599c010a057336c4334120c1 (diff) | |
[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
14 files changed, 38 insertions, 172 deletions
diff --git a/data/etc/com.android.systemui.xml b/data/etc/com.android.systemui.xml index e0e13f59b706..6dcee6d8bd31 100644 --- a/data/etc/com.android.systemui.xml +++ b/data/etc/com.android.systemui.xml @@ -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"/> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index e96aead597b3..c1e0877d2fe5 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -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" /> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionsRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionsRepository.kt index e0d156aa25f3..c640baa6e12e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionsRepository.kt @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcher.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcher.kt index b93985604fb3..7038a3bb0487 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcher.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcher.kt @@ -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) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt index 108834521ebf..58cd36e59d52 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt @@ -185,8 +185,6 @@ constructor( return CacheContainer(repo, lastMobileState = null) } - override val globalMobileDataSettingChangedEvent = MutableStateFlow(Unit) - fun startProcessingCommands() { mobileDemoCommandJob = scope.launch { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt index 0f30ae249c31..dd2cc928f7ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt @@ -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, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt index 266430f13e33..1d0c9e9b8ed4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt @@ -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, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt index 39ad31f7eee8..10f48a36e7f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt @@ -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, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt index a25e52ba845f..6796a94cf6a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt @@ -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" diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionsRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionsRepository.kt index 0add905e2750..cb9eb70d61dc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionsRepository.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionsRepository.kt @@ -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 } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt index 0859d140c3b4..96cca4440769 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcherTest.kt @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt index c02a4dfd074c..24b9f7d55da5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt index b8dda780755e..77bdf9e307e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt @@ -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, @@ -362,52 +355,26 @@ 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() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt index f9567fc1eafc..b73348c18560 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt @@ -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, @@ -556,24 +551,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { } @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) { val caps = createCapabilities(connected = true, validated = false) @@ -641,7 +618,6 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { logger, mobileMappings, fakeBroadcastDispatcher, - globalSettings, context, IMMEDIATE, scope, |