summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Anton Potapov <apotapov@google.com> 2023-11-06 12:46:14 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-11-06 12:46:14 +0000
commit5eb17cf2fd09edb0521f528a45a339ba3419f51f (patch)
tree796d19a9323b6ab5f0a00e185ce0487d62bb04b0
parent679317df3b3e38a356438d9fb94dbecc9f311e4b (diff)
parent0a741156b9b92751885467df5bb41be58b781712 (diff)
Merge "Add setIsAirplaneMode to AirplaneModeRepository" into main
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepository.kt15
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractor.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepository.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionsRepository.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileRepositorySwitcher.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionRepository.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepository.kt9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt9
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModelTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/AirplaneModeRepositoryImplTest.kt85
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/data/repository/FakeAirplaneModeRepository.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/domain/interactor/AirplaneModeInteractorTest.kt115
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionRepository.kt8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/FakeMobileConnectionsRepository.kt15
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepositoryTest.kt3
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepositoryTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt23
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/view/ModernStatusBarMobileViewTest.kt7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/LocationBasedMobileIconViewModelTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconViewModelTest.kt1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/ui/viewmodel/MobileIconsViewModelTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/view/ModernStatusBarWifiViewTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelIconParameterizedTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/wifi/ui/viewmodel/WifiViewModelTest.kt2
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,