diff options
| author | 2023-11-06 12:46:14 +0000 | |
|---|---|---|
| committer | 2023-11-06 12:46:14 +0000 | |
| commit | 5eb17cf2fd09edb0521f528a45a339ba3419f51f (patch) | |
| tree | 796d19a9323b6ab5f0a00e185ce0487d62bb04b0 | |
| parent | 679317df3b3e38a356438d9fb94dbecc9f311e4b (diff) | |
| parent | 0a741156b9b92751885467df5bb41be58b781712 (diff) | |
Merge "Add setIsAirplaneMode to AirplaneModeRepository" into main
32 files changed, 273 insertions, 99 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepository.kt index 8862c77c9c4a..a983ce25f669 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepository.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.airplane.data.repository +import android.net.ConnectivityManager import android.os.Handler import android.provider.Settings.Global import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow @@ -28,13 +29,14 @@ import com.android.systemui.qs.SettingObserver import com.android.systemui.statusbar.pipeline.dagger.AirplaneTableLog import com.android.systemui.util.settings.GlobalSettings import javax.inject.Inject +import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.withContext /** * Provides data related to airplane mode. @@ -48,15 +50,19 @@ import kotlinx.coroutines.flow.stateIn interface AirplaneModeRepository { /** Observable for whether the device is currently in airplane mode. */ val isAirplaneMode: StateFlow<Boolean> + + /** Sets airplane mode state. */ + suspend fun setIsAirplaneMode(isEnabled: Boolean) } @SysUISingleton @Suppress("EXPERIMENTAL_IS_NOT_ENABLED") -@OptIn(ExperimentalCoroutinesApi::class) class AirplaneModeRepositoryImpl @Inject constructor( - @Background private val bgHandler: Handler, + private val connectivityManager: ConnectivityManager, + @Background private val bgHandler: Handler?, + @Background private val backgroundContext: CoroutineContext, private val globalSettings: GlobalSettings, @AirplaneTableLog logger: TableLogBuffer, @Application scope: CoroutineScope, @@ -89,4 +95,7 @@ constructor( // initialValue here is irrelevant. initialValue = false, ) + + override suspend fun setIsAirplaneMode(isEnabled: Boolean) = + withContext(backgroundContext) { connectivityManager.setAirplaneMode(isEnabled) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt index 3e9b2c2ae809..c6c88230586f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.pipeline.airplane.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository +import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository import javax.inject.Inject @@ -34,8 +35,9 @@ import kotlinx.coroutines.flow.map class AirplaneModeInteractor @Inject constructor( - airplaneModeRepository: AirplaneModeRepository, + private val airplaneModeRepository: AirplaneModeRepository, connectivityRepository: ConnectivityRepository, + private val mobileConnectionsRepository: MobileConnectionsRepository, ) { /** True if the device is currently in airplane mode. */ val isAirplaneMode: Flow<Boolean> = airplaneModeRepository.isAirplaneMode @@ -43,4 +45,18 @@ constructor( /** True if we're configured to force-hide the airplane mode icon and false otherwise. */ val isForceHidden: Flow<Boolean> = connectivityRepository.forceHiddenSlots.map { it.contains(ConnectivitySlot.AIRPLANE) } + + /** Sets airplane mode state returning the result of the operation. */ + suspend fun setIsAirplaneMode(isInAirplaneMode: Boolean): SetResult = + if (mobileConnectionsRepository.isInEcmMode()) { + SetResult.BLOCKED_BY_ECM + } else { + airplaneModeRepository.setIsAirplaneMode(isInAirplaneMode) + SetResult.SUCCESS + } + + enum class SetResult { + SUCCESS, + BLOCKED_BY_ECM, + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt index 679426db99c0..bc38b538f8c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt @@ -137,6 +137,13 @@ interface MobileConnectionRepository { */ val hasPrioritizedNetworkCapabilities: StateFlow<Boolean> + /** + * True if this connection is in emergency callback mode. + * + * @see [TelephonyManager.getEmergencyCallbackMode] + */ + suspend fun isInEcmMode(): Boolean + companion object { /** The default number of levels to use for [numberOfLevels]. */ const val DEFAULT_NUM_LEVELS = 4 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 cf1c97c7271f..13c99647f00b 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 @@ -98,4 +98,10 @@ interface MobileConnectionsRepository { * [android.telephony.TelephonyManager.SIM_STATE_PERM_DISABLED] */ val isAnySimSecure: Flow<Boolean> + + /** + * Checks if any subscription has [android.telephony.TelephonyManager.getEmergencyCallbackMode] + * == true + */ + suspend fun isInEcmMode(): Boolean } 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 22916315d274..87dd17ec4865 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 @@ -187,4 +187,11 @@ constructor( } return realRepository.getRepoForSubId(subId) } + + override suspend fun isInEcmMode(): Boolean = + if (isDemoMode.value) { + demoMobileConnectionsRepository.isInEcmMode() + } else { + realRepository.isInEcmMode() + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt index caa9d1a8f0c3..b2a773375cd5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt @@ -193,6 +193,8 @@ class DemoMobileConnectionRepository( override val hasPrioritizedNetworkCapabilities = MutableStateFlow(false) + override suspend fun isInEcmMode(): Boolean = false + /** * Process a new demo mobile event. Note that [resolvedNetworkType] must be passed in separately * from the event, due to the requirement to reverse the mobile mappings lookup in the top-level 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 205dc1cd66cf..2ecd435177ee 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 @@ -222,6 +222,8 @@ constructor( subscriptionInfoCache.clear() } + override suspend fun isInEcmMode(): Boolean = false + private fun processMobileEvent(event: FakeNetworkEventModel) { when (event) { is Mobile -> { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt index 27edd1ec0caa..e5a5695d3655 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt @@ -22,6 +22,7 @@ import android.telephony.TelephonyManager import android.util.Log import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel @@ -31,6 +32,7 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConn import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import javax.inject.Inject +import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -40,6 +42,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.withContext /** * A repository implementation for a carrier merged (aka VCN) network. A carrier merged network is @@ -55,6 +58,7 @@ class CarrierMergedConnectionRepository( override val subId: Int, override val tableLogBuffer: TableLogBuffer, private val telephonyManager: TelephonyManager, + private val bgContext: CoroutineContext, @Application private val scope: CoroutineScope, val wifiRepository: WifiRepository, ) : MobileConnectionRepository { @@ -183,6 +187,9 @@ class CarrierMergedConnectionRepository( override val dataEnabled: StateFlow<Boolean> = wifiRepository.isWifiEnabled + override suspend fun isInEcmMode(): Boolean = + withContext(bgContext) { telephonyManager.emergencyCallbackMode } + companion object { // Carrier merged is never roaming private const val ROAMING = false @@ -193,6 +200,7 @@ class CarrierMergedConnectionRepository( @Inject constructor( private val telephonyManager: TelephonyManager, + @Background private val bgContext: CoroutineContext, @Application private val scope: CoroutineScope, private val wifiRepository: WifiRepository, ) { @@ -204,6 +212,7 @@ class CarrierMergedConnectionRepository( subId, mobileLogger, telephonyManager.createForSubscriptionId(subId), + bgContext, scope, wifiRepository, ) 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 6b6192186e0f..425da5fc30ba 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 @@ -318,6 +318,8 @@ class FullMobileConnectionRepository( activeRepo.value.hasPrioritizedNetworkCapabilities.value, ) + override suspend fun isInEcmMode(): Boolean = activeRepo.value.isInEcmMode() + class Factory @Inject constructor( 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 760dd7eba3cf..125fd9be15c7 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 @@ -83,6 +83,7 @@ import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.scan import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.withContext /** * A repository implementation for a typical mobile connection (as opposed to a carrier merged @@ -101,7 +102,7 @@ class MobileConnectionRepositoryImpl( systemUiCarrierConfig: SystemUiCarrierConfig, broadcastDispatcher: BroadcastDispatcher, private val mobileMappingsProxy: MobileMappingsProxy, - bgDispatcher: CoroutineDispatcher, + private val bgDispatcher: CoroutineDispatcher, logger: MobileInputLogger, override val tableLogBuffer: TableLogBuffer, scope: CoroutineScope, @@ -377,6 +378,9 @@ class MobileConnectionRepositoryImpl( .stateIn(scope, SharingStarted.WhileSubscribed(), initial) } + override suspend fun isInEcmMode(): Boolean = + withContext(bgDispatcher) { telephonyManager.emergencyCallbackMode } + /** Typical mobile connections aren't available during airplane mode. */ override val isAllowedDuringAirplaneMode = MutableStateFlow(false).asStateFlow() 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 2caf33bd92cf..cf7bf86504fb 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 @@ -342,6 +342,15 @@ constructor( } .flowOn(bgDispatcher) + override suspend fun isInEcmMode(): Boolean { + if (telephonyManager.emergencyCallbackMode) { + return true + } + return with(subscriptions.value) { + any { getOrCreateRepoForSubId(it.subscriptionId).isInEcmMode() } + } + } + private fun isValidSubId(subId: Int): Boolean = checkSub(subId, subscriptions.value) @VisibleForTesting fun getSubIdRepoCache() = subIdRepositoryCache diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt index 10c7c439e5f4..a9f82392c7e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.scene.shared.model.SceneModel import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy @@ -62,6 +63,7 @@ class QuickSettingsSceneViewModelTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ), constants = mock(), flags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 9c0456cfdb4c..3feb5bfd088a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -44,6 +44,7 @@ import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy @@ -151,6 +152,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ), constants = mock(), flags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt index 02d15de4d953..77ddf15c41ad 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt @@ -13,6 +13,7 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy @@ -46,6 +47,7 @@ class ShadeHeaderViewModelTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ), constants = mock(), flags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt index 3064f4b2b355..589f9aeba19f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt @@ -28,6 +28,7 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy @@ -68,6 +69,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ), constants = mock(), flags, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepositoryImplTest.kt index 8ecf6f82806a..917e5b85d852 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepositoryImplTest.kt @@ -16,99 +16,112 @@ package com.android.systemui.statusbar.pipeline.airplane.data.repository -import android.os.Handler -import android.os.Looper +import android.net.ConnectivityManager import android.provider.Settings.Global +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.util.mockito.eq +import com.android.systemui.util.mockito.whenever import com.android.systemui.util.settings.FakeGlobalSettings import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.yield -import org.junit.After +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test +import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations -@Suppress("EXPERIMENTAL_IS_NOT_ENABLED") @OptIn(ExperimentalCoroutinesApi::class) @SmallTest +@RunWith(AndroidJUnit4::class) class AirplaneModeRepositoryImplTest : SysuiTestCase() { - private lateinit var underTest: AirplaneModeRepositoryImpl + private lateinit var underTest: AirplaneModeRepository @Mock private lateinit var logger: TableLogBuffer - private lateinit var bgHandler: Handler - private lateinit var scope: CoroutineScope + @Mock private lateinit var telephonyManager: TelephonyManager + @Mock private lateinit var subscriptionManager: SubscriptionManager + @Mock private lateinit var connectivityManager: ConnectivityManager + + private val testContext = StandardTestDispatcher() + private val scope = TestScope(testContext) + private lateinit var settings: FakeGlobalSettings @Before fun setUp() { MockitoAnnotations.initMocks(this) - bgHandler = Handler(Looper.getMainLooper()) - scope = CoroutineScope(IMMEDIATE) + settings = FakeGlobalSettings() + whenever(telephonyManager.emergencyCallbackMode).thenReturn(false) + whenever(subscriptionManager.activeSubscriptionIdList).thenReturn(intArrayOf()) + underTest = AirplaneModeRepositoryImpl( - bgHandler, + connectivityManager, + null, + scope.backgroundScope.coroutineContext, settings, logger, - scope, + scope.backgroundScope, ) } - @After - fun tearDown() { - scope.cancel() - } - @Test fun isAirplaneMode_initiallyGetsSettingsValue() = - runBlocking(IMMEDIATE) { + scope.runTest { settings.putInt(Global.AIRPLANE_MODE_ON, 1) underTest = AirplaneModeRepositoryImpl( - bgHandler, + connectivityManager, + null, + scope.backgroundScope.coroutineContext, settings, logger, - scope, + scope.backgroundScope, ) - val job = underTest.isAirplaneMode.launchIn(this) - + underTest.isAirplaneMode.launchIn(backgroundScope) + runCurrent() assertThat(underTest.isAirplaneMode.value).isTrue() - - job.cancel() } @Test fun isAirplaneMode_settingUpdated_valueUpdated() = - runBlocking(IMMEDIATE) { - val job = underTest.isAirplaneMode.launchIn(this) + scope.runTest { + underTest.isAirplaneMode.launchIn(backgroundScope) settings.putInt(Global.AIRPLANE_MODE_ON, 0) - yield() + runCurrent() assertThat(underTest.isAirplaneMode.value).isFalse() settings.putInt(Global.AIRPLANE_MODE_ON, 1) - yield() + runCurrent() assertThat(underTest.isAirplaneMode.value).isTrue() settings.putInt(Global.AIRPLANE_MODE_ON, 0) - yield() + runCurrent() assertThat(underTest.isAirplaneMode.value).isFalse() + } - job.cancel() + @Test + fun setIsAirplaneMode() = + scope.runTest { + underTest.setIsAirplaneMode(true) + runCurrent() + + verify(connectivityManager).setAirplaneMode(eq(true)) } } - -private val IMMEDIATE = Dispatchers.Main.immediate diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt index 63bbdfca0071..638925d0a705 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt @@ -20,10 +20,11 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow class FakeAirplaneModeRepository : AirplaneModeRepository { + private val _isAirplaneMode = MutableStateFlow(false) override val isAirplaneMode: StateFlow<Boolean> = _isAirplaneMode - fun setIsAirplaneMode(isAirplaneMode: Boolean) { - _isAirplaneMode.value = isAirplaneMode + override suspend fun setIsAirplaneMode(isEnabled: Boolean) { + _isAirplaneMode.value = isEnabled } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractorTest.kt index 33a80e1a3dd6..db3e533e5cd5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractorTest.kt @@ -16,84 +16,99 @@ package com.android.systemui.statusbar.pipeline.airplane.domain.interactor +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository +import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository +import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.yield -import org.junit.Before +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest import org.junit.Test +import org.junit.runner.RunWith -@SmallTest @OptIn(ExperimentalCoroutinesApi::class) -@Suppress("EXPERIMENTAL_IS_NOT_ENABLED") +@SmallTest +@RunWith(AndroidJUnit4::class) class AirplaneModeInteractorTest : SysuiTestCase() { - private lateinit var underTest: AirplaneModeInteractor + private val mobileConnectionsRepository = + FakeMobileConnectionsRepository(FakeMobileMappingsProxy(), mock<TableLogBuffer> {}) + private val airplaneModeRepository = FakeAirplaneModeRepository() + private val connectivityRepository = FakeConnectivityRepository() - private lateinit var airplaneModeRepository: FakeAirplaneModeRepository - private lateinit var connectivityRepository: FakeConnectivityRepository - - @Before - fun setUp() { - airplaneModeRepository = FakeAirplaneModeRepository() - connectivityRepository = FakeConnectivityRepository() - underTest = AirplaneModeInteractor(airplaneModeRepository, connectivityRepository) - } + private val underTest = + AirplaneModeInteractor( + airplaneModeRepository, + connectivityRepository, + mobileConnectionsRepository + ) @Test - fun isAirplaneMode_matchesRepo() = - runBlocking(IMMEDIATE) { - var latest: Boolean? = null - val job = underTest.isAirplaneMode.onEach { latest = it }.launchIn(this) + fun isAirplaneMode_matchesRepo() = runTest { + var latest: Boolean? = null + underTest.isAirplaneMode.onEach { latest = it }.launchIn(backgroundScope) - airplaneModeRepository.setIsAirplaneMode(true) - yield() - assertThat(latest).isTrue() + airplaneModeRepository.setIsAirplaneMode(true) + runCurrent() + assertThat(latest).isTrue() - airplaneModeRepository.setIsAirplaneMode(false) - yield() - assertThat(latest).isFalse() + airplaneModeRepository.setIsAirplaneMode(false) + runCurrent() + assertThat(latest).isFalse() - airplaneModeRepository.setIsAirplaneMode(true) - yield() - assertThat(latest).isTrue() - - job.cancel() - } + airplaneModeRepository.setIsAirplaneMode(true) + runCurrent() + assertThat(latest).isTrue() + } @Test - fun isForceHidden_repoHasWifiHidden_outputsTrue() = - runBlocking(IMMEDIATE) { - connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.AIRPLANE)) + fun isForceHidden_repoHasWifiHidden_outputsTrue() = runTest { + connectivityRepository.setForceHiddenIcons(setOf(ConnectivitySlot.AIRPLANE)) + + var latest: Boolean? = null + underTest.isForceHidden.onEach { latest = it }.launchIn(backgroundScope) + runCurrent() + + assertThat(latest).isTrue() + } - var latest: Boolean? = null - val job = underTest.isForceHidden.onEach { latest = it }.launchIn(this) + @Test + fun isForceHidden_repoDoesNotHaveWifiHidden_outputsFalse() = runTest { + connectivityRepository.setForceHiddenIcons(setOf()) - assertThat(latest).isTrue() + var latest: Boolean? = null + underTest.isForceHidden.onEach { latest = it }.launchIn(backgroundScope) + runCurrent() - job.cancel() - } + assertThat(latest).isFalse() + } @Test - fun isForceHidden_repoDoesNotHaveWifiHidden_outputsFalse() = - runBlocking(IMMEDIATE) { - connectivityRepository.setForceHiddenIcons(setOf()) + fun testSetAirplaneMode_inEcmMode_Blocked() = runTest { + mobileConnectionsRepository.setIsInEcmState(true) + + assertThat(underTest.setIsAirplaneMode(true)) + .isEqualTo(AirplaneModeInteractor.SetResult.BLOCKED_BY_ECM) + assertThat(airplaneModeRepository.isAirplaneMode.value).isFalse() + } - var latest: Boolean? = null - val job = underTest.isForceHidden.onEach { latest = it }.launchIn(this) + @Test + fun testSetAirplaneMode_notInEcmMode_Success() = runTest { + mobileConnectionsRepository.setIsInEcmState(false) - assertThat(latest).isFalse() + underTest.setIsAirplaneMode(true) - job.cancel() - } + assertThat(underTest.setIsAirplaneMode(true)) + .isEqualTo(AirplaneModeInteractor.SetResult.SUCCESS) + assertThat(airplaneModeRepository.isAirplaneMode.value).isTrue() + } } - -private val IMMEDIATE = Dispatchers.Main.immediate diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt index ab888f7c133e..1c9f52366fe0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt @@ -21,6 +21,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.google.common.truth.Truth.assertThat @@ -53,7 +54,12 @@ class AirplaneModeViewModelImplTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) airplaneModeRepository = FakeAirplaneModeRepository() connectivityRepository = FakeConnectivityRepository() - interactor = AirplaneModeInteractor(airplaneModeRepository, connectivityRepository) + interactor = + AirplaneModeInteractor( + airplaneModeRepository, + connectivityRepository, + FakeMobileConnectionsRepository(), + ) scope = CoroutineScope(IMMEDIATE) underTest = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt index 610fede3dfea..a9c8ec7dcb7d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt @@ -62,6 +62,10 @@ class FakeMobileConnectionRepository( override val hasPrioritizedNetworkCapabilities = MutableStateFlow(false) + private var isInEcmMode: Boolean = false + + override suspend fun isInEcmMode(): Boolean = isInEcmMode + fun setDataEnabled(enabled: Boolean) { _dataEnabled.value = enabled } @@ -88,6 +92,10 @@ class FakeMobileConnectionRepository( resolvedNetworkType.value = ResolvedNetworkType.DefaultNetworkType(key) } + fun setIsInEcmMode(isInEcmMode: Boolean) { + this.isInEcmMode = isInEcmMode + } + companion object { const val DEFAULT_NETWORK_NAME = "default name" } 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 b54fbd3c31b1..74b2723e870e 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 @@ -24,15 +24,18 @@ import com.android.settingslib.mobile.MobileMappings import com.android.settingslib.mobile.TelephonyIcons import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel +import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy +import com.android.systemui.util.mockito.mock import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow // TODO(b/261632894): remove this in favor of the real impl or DemoMobileConnectionsRepository class FakeMobileConnectionsRepository( - mobileMappings: MobileMappingsProxy, - val tableLogBuffer: TableLogBuffer, + mobileMappings: MobileMappingsProxy = FakeMobileMappingsProxy(), + val tableLogBuffer: TableLogBuffer = mock<TableLogBuffer> {}, ) : MobileConnectionsRepository { + val GSM_KEY = mobileMappings.toIconKey(GSM) val LTE_KEY = mobileMappings.toIconKey(LTE) val UMTS_KEY = mobileMappings.toIconKey(UMTS) @@ -92,6 +95,8 @@ class FakeMobileConnectionsRepository( override val isAnySimSecure = MutableStateFlow(false) + private var isInEcmMode: Boolean = false + fun setSubscriptions(subs: List<SubscriptionModel>) { _subscriptions.value = subs } @@ -111,6 +116,12 @@ class FakeMobileConnectionsRepository( connections.forEach { entry -> subIdRepos[entry.key] = entry.value } } + fun setIsInEcmState(isInEcmState: Boolean) { + this.isInEcmMode = isInEcmState + } + + override suspend fun isInEcmMode(): Boolean = isInEcmMode + companion object { val DEFAULT_ICON = TelephonyIcons.G diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepositoryTest.kt index d918fa8193bb..03814bdfa430 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepositoryTest.kt @@ -538,6 +538,9 @@ class DemoMobileConnectionsRepositoryTest : SysuiTestCase() { job.cancel() } + @Test + fun demoIsNotInEcmState() = testScope.runTest { assertThat(underTest.isInEcmMode()).isFalse() } + private fun TestScope.startCollection(conn: DemoMobileConnectionRepository): Job { val job = launch { launch { conn.cdmaLevel.collect {} } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt index a251c2850d41..265440154d77 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt @@ -69,6 +69,7 @@ class CarrierMergedConnectionRepositoryTest : SysuiTestCase() { SUB_ID, logger, telephonyManager, + testScope.backgroundScope.coroutineContext, testScope.backgroundScope, wifiRepository, ) 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 787a26614909..e91b0c1a9a6d 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 @@ -717,6 +717,7 @@ class FullMobileConnectionRepositoryTest : SysuiTestCase() { SUB_ID, tableLogBuffer, telephonyManager, + testScope.backgroundScope.coroutineContext, testScope.backgroundScope, wifiRepository, ) 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 936c58ecaffb..ac75d4f189cc 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 @@ -123,7 +123,7 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { // Set up so the individual connection repositories whenever(telephonyManager.createForSubscriptionId(anyInt())).thenAnswer { invocation -> telephonyManager.also { - whenever(telephonyManager.subscriptionId).thenReturn(invocation.getArgument(0)) + whenever(it.subscriptionId).thenReturn(invocation.getArgument(0)) } } @@ -192,6 +192,7 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { carrierMergedFactory = CarrierMergedConnectionRepository.Factory( telephonyManager, + testScope.backgroundScope.coroutineContext, testScope.backgroundScope, wifiRepository, ) @@ -1177,6 +1178,26 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() { assertThat(latest).isFalse() } + @Test + fun noSubscriptionsInEcmMode_notInEcmMode() = + testScope.runTest { + whenever(telephonyManager.emergencyCallbackMode).thenReturn(false) + + runCurrent() + + assertThat(underTest.isInEcmMode()).isFalse() + } + + @Test + fun someSubscriptionsInEcmMode_inEcmMode() = + testScope.runTest { + whenever(telephonyManager.emergencyCallbackMode).thenReturn(true) + + runCurrent() + + assertThat(underTest.isInEcmMode()).isTrue() + } + private fun TestScope.getDefaultNetworkCallback(): ConnectivityManager.NetworkCallback { runCurrent() val callbackCaptor = argumentCaptor<ConnectivityManager.NetworkCallback>() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileViewTest.kt index 3936bedc1059..42cb66063266 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileViewTest.kt @@ -33,6 +33,7 @@ import com.android.systemui.res.R import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconInteractor import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel @@ -45,6 +46,7 @@ import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -86,6 +88,7 @@ class ModernStatusBarMobileViewTest : SysuiTestCase() { AirplaneModeInteractor( airplaneModeRepository, FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ) interactor = FakeMobileIconInteractor(tableLogBuffer) @@ -198,7 +201,7 @@ class ModernStatusBarMobileViewTest : SysuiTestCase() { } @Test - fun isIconVisible_notAirplaneMode_outputsTrue() { + fun isIconVisible_notAirplaneMode_outputsTrue() = runTest { airplaneModeRepository.setIsAirplaneMode(false) val view = @@ -217,7 +220,7 @@ class ModernStatusBarMobileViewTest : SysuiTestCase() { } @Test - fun isIconVisible_airplaneMode_outputsTrue() { + fun isIconVisible_airplaneMode_outputsTrue() = runTest { airplaneModeRepository.setIsAirplaneMode(true) val view = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt index 6a69d1fea993..52fc2589a3f9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt @@ -91,6 +91,7 @@ class LocationBasedMobileIconViewModelTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ) connectionsRepository = FakeMobileConnectionsRepository(FakeMobileMappingsProxy(), tableLogBuffer) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt index b39fc5b8fe21..b0305a1b2056 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt @@ -113,6 +113,7 @@ class MobileIconViewModelTest : SysuiTestCase() { AirplaneModeInteractor( airplaneModeRepository, connectivityRepository, + FakeMobileConnectionsRepository(), ) iconsInteractor = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModelTest.kt index f029152da0fc..1f27a289e52c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModelTest.kt @@ -28,6 +28,7 @@ import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.model.NetworkTypeIconModel import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger @@ -75,6 +76,7 @@ class MobileIconsViewModelTest : SysuiTestCase() { AirplaneModeInteractor( FakeAirplaneModeRepository(), FakeConnectivityRepository(), + FakeMobileConnectionsRepository(), ) underTest = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt index d75a45247cbf..80b10c06d696 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt @@ -36,6 +36,7 @@ import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirp import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository @@ -90,6 +91,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() { AirplaneModeInteractor( airplaneModeRepository, connectivityRepository, + FakeMobileConnectionsRepository(), ), tableLogBuffer, scope, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt index 1d1b84c04d71..489319e4352f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt @@ -31,6 +31,7 @@ import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirp import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository @@ -90,6 +91,7 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase AirplaneModeInteractor( airplaneModeRepository, connectivityRepository, + FakeMobileConnectionsRepository(), ), tableLogBuffer, scope, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt index 2d1a27f1b133..791a028eef4e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirp import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl +import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel @@ -82,6 +83,7 @@ class WifiViewModelTest : SysuiTestCase() { AirplaneModeInteractor( airplaneModeRepository, connectivityRepository, + FakeMobileConnectionsRepository(), ), tableLogBuffer, testScope.backgroundScope, |