Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +2 −2 Original line number Diff line number Diff line Loading @@ -81,7 +81,6 @@ import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.settingslib.Utils import com.android.systemui.Flags import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation Loading @@ -103,6 +102,7 @@ import com.android.systemui.statusbar.core.NewStatusBarIcons import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairosComposeWrapper import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel Loading Loading @@ -632,7 +632,7 @@ private fun BatteryIconLegacy( @OptIn(ExperimentalKairosApi::class) @Composable private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifier = Modifier) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled) { ShadeCarrierGroupKairos(viewModel, modifier) return } Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryKairosAdapterTest.kt +7 −7 Original line number Diff line number Diff line Loading @@ -22,16 +22,17 @@ import com.android.systemui.activated import com.android.systemui.kairos.ExperimentalKairosApi import com.android.systemui.kairos.launchKairosNetwork import com.android.systemui.kairos.stateOf import com.android.systemui.kosmos.testScope import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.testCarrierConfig import kotlinx.coroutines.ExperimentalCoroutinesApi import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.test.runCurrent import org.junit.runner.RunWith import org.mockito.Mockito @OptIn(ExperimentalKairosApi::class, ExperimentalCoroutinesApi::class) @OptIn(ExperimentalKairosApi::class) @SmallTest @RunWith(AndroidJUnit4::class) @android.platform.test.annotations.EnabledOnRavenwood Loading @@ -39,21 +40,21 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest : CarrierMergedConnectionRepositoryTestBase() { var job: Job? = null val kairosNetwork = testScope.backgroundScope.launchKairosNetwork() val kairosNetwork = kosmos.testScope.backgroundScope.launchKairosNetwork() override fun recreateRepo(): MobileConnectionRepositoryKairosAdapter { lateinit var adapter: MobileConnectionRepositoryKairosAdapter job?.cancel() Mockito.clearInvocations(telephonyManager) job = testScope.backgroundScope.launch { kosmos.testScope.backgroundScope.launch { kairosNetwork.activateSpec { val repo = activated { CarrierMergedConnectionRepositoryKairos( SUB_ID, logger, telephonyManager, wifiRepository, kosmos.wifiRepository.fake, isInEcmMode = stateOf(false), ) } Loading @@ -65,7 +66,6 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest : Unit } } testScope.runCurrent() // ensure the lateinit is set return adapter } } packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt +67 −117 Original line number Diff line number Diff line Loading @@ -21,26 +21,27 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.kosmos.backgroundCoroutineContext import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.log.table.logcatTableLogBuffer import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.util.mockito.whenever import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach 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 import org.mockito.Mock import org.mockito.MockitoAnnotations import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) Loading @@ -51,180 +52,143 @@ class CarrierMergedConnectionRepositoryTest : CarrierMergedConnectionRepositoryT SUB_ID, logger, telephonyManager, testScope.backgroundScope.coroutineContext, testScope.backgroundScope, wifiRepository, bgContext = kosmos.backgroundCoroutineContext, scope = kosmos.testScope.backgroundScope, kosmos.wifiRepository.fake, ) } abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() { protected lateinit var underTest: MobileConnectionRepository protected val kosmos = testKosmos().useUnconfinedTestDispatcher() protected lateinit var wifiRepository: FakeWifiRepository @Mock protected lateinit var logger: TableLogBuffer @Mock protected lateinit var telephonyManager: TelephonyManager protected lateinit var underTest: MobileConnectionRepository protected val testDispatcher = UnconfinedTestDispatcher() protected val testScope = TestScope(testDispatcher) protected val logger = logcatTableLogBuffer(kosmos, "CarrierMergedConnectionRepositoryTest") protected val telephonyManager = mock<TelephonyManager>() abstract fun recreateRepo(): MobileConnectionRepository @Before fun setUp() { MockitoAnnotations.initMocks(this) whenever(telephonyManager.subscriptionId).thenReturn(SUB_ID) whenever(telephonyManager.simOperatorName).thenReturn("") wifiRepository = FakeWifiRepository() underTest = recreateRepo() } @Test fun inactiveWifi_isDefault() = testScope.runTest { var latestConnState: DataConnectionState? = null var latestNetType: ResolvedNetworkType? = null kosmos.runTest { val latestConnState by collectLastValue(underTest.dataConnectionState) val latestNetType by collectLastValue(underTest.resolvedNetworkType) val dataJob = underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this) val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this) wifiRepository.setWifiNetwork(WifiNetworkModel.Inactive()) wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Inactive()) assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected) assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) dataJob.cancel() netJob.cancel() } @Test fun activeWifi_isDefault() = testScope.runTest { var latestConnState: DataConnectionState? = null var latestNetType: ResolvedNetworkType? = null kosmos.runTest { val latestConnState by collectLastValue(underTest.dataConnectionState) val latestNetType by collectLastValue(underTest.resolvedNetworkType) val dataJob = underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this) val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this) wifiRepository.setWifiNetwork(WifiNetworkModel.Active.of(level = 1)) wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Active.of(level = 1)) assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected) assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) dataJob.cancel() netJob.cancel() } @Test fun carrierMergedWifi_isValidAndFieldsComeFromWifiNetwork() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) assertThat(latest).isEqualTo(3) job.cancel() } @Test fun activity_comesFromWifiActivity() = testScope.runTest { var latest: DataActivityModel? = null val job = underTest.dataActivityDirection.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.dataActivityDirection) wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.setWifiNetwork( wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setWifiActivity( wifiRepository.fake.setWifiActivity( DataActivityModel(hasActivityIn = true, hasActivityOut = false) ) assertThat(latest!!.hasActivityIn).isTrue() assertThat(latest!!.hasActivityOut).isFalse() wifiRepository.setWifiActivity( wifiRepository.fake.setWifiActivity( DataActivityModel(hasActivityIn = false, hasActivityOut = true) ) assertThat(latest!!.hasActivityIn).isFalse() assertThat(latest!!.hasActivityOut).isTrue() job.cancel() } @Test fun carrierMergedWifi_wrongSubId_isDefault() = testScope.runTest { var latestLevel: Int? = null var latestType: ResolvedNetworkType? = null val levelJob = underTest.primaryLevel.onEach { latestLevel = it }.launchIn(this) val typeJob = underTest.resolvedNetworkType.onEach { latestType = it }.launchIn(this) kosmos.runTest { val latestLevel by collectLastValue(underTest.primaryLevel) val latestType by collectLastValue(underTest.resolvedNetworkType) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID + 10, level = 3) ) assertThat(latestLevel).isNotEqualTo(3) assertThat(latestType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) levelJob.cancel() typeJob.cancel() } // This scenario likely isn't possible, but write a test for it anyway @Test fun carrierMergedButNotEnabled_isDefault() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setIsWifiEnabled(false) wifiRepository.fake.setIsWifiEnabled(false) assertThat(latest).isNotEqualTo(3) job.cancel() } // This scenario likely isn't possible, but write a test for it anyway @Test fun carrierMergedButWifiNotDefault_isDefault() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setIsWifiDefault(false) wifiRepository.fake.setIsWifiDefault(false) assertThat(latest).isNotEqualTo(3) job.cancel() } @Test fun numberOfLevels_comesFromCarrierMerged() = testScope.runTest { var latest: Int? = null val job = underTest.numberOfLevels.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.numberOfLevels) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of( subscriptionId = SUB_ID, level = 1, Loading @@ -233,77 +197,63 @@ abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() { ) assertThat(latest).isEqualTo(6) job.cancel() } @Test fun dataEnabled_matchesWifiEnabled() = testScope.runTest { var latest: Boolean? = null val job = underTest.dataEnabled.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.dataEnabled) wifiRepository.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiEnabled(true) assertThat(latest).isTrue() wifiRepository.setIsWifiEnabled(false) wifiRepository.fake.setIsWifiEnabled(false) assertThat(latest).isFalse() job.cancel() } @Test fun cdmaRoaming_alwaysFalse() = testScope.runTest { var latest: Boolean? = null val job = underTest.cdmaRoaming.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.cdmaRoaming) assertThat(latest).isFalse() job.cancel() } @Test fun networkName_usesSimOperatorNameAsInitial() = testScope.runTest { kosmos.runTest { whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name") underTest = recreateRepo() var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val latest by collectLastValue(underTest.networkName) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name")) job.cancel() } @Test fun networkName_updatesOnNetworkUpdate() = testScope.runTest { kosmos.runTest { whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name") underTest = recreateRepo() wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val latest by collectLastValue(underTest.networkName) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name")) whenever(telephonyManager.simOperatorName).thenReturn("New SIM name") wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("New SIM name")) job.cancel() } @Test fun isAllowedDuringAirplaneMode_alwaysTrue() = testScope.runTest { kosmos.runTest { val latest by collectLastValue(underTest.isAllowedDuringAirplaneMode) assertThat(latest).isTrue() Loading packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java +3 −3 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import androidx.annotation.VisibleForTesting; import com.android.keyguard.CarrierTextManager; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.Flags; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Application; import com.android.systemui.dagger.qualifiers.Background; Loading @@ -55,6 +54,7 @@ import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider; import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder; Loading Loading @@ -223,7 +223,7 @@ public class ShadeCarrierGroupController { mMobileIconsViewModel = mobileUiAdapter.getMobileIconsViewModel(); if (mStatusBarPipelineFlags.useNewShadeCarrierGroupMobileIcons()) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { mobileUiAdapterKairos.get().setShadeCarrierGroupController(this); } else { mobileUiAdapter.setShadeCarrierGroupController(this); Loading Loading @@ -275,7 +275,7 @@ public class ShadeCarrierGroupController { List<IconData> iconDataList = processSubIdList(subIds); if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { for (Job job : mBindingJobs) { job.cancel(new CancellationException()); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +3 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.widget.LinearLayout; import androidx.collection.MutableIntObjectMap; import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.Flags; import com.android.systemui.demomode.DemoMode; import com.android.systemui.kairos.ExperimentalKairosApi; import com.android.systemui.kairos.KairosNetwork; Loading @@ -39,6 +38,7 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.res.R; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusIconDisplayable; import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger; import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView; Loading Loading @@ -273,7 +273,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da MobileViewLogger mobileViewLogger, int subId) { Log.d(TAG, "addModernMobileView (subId=" + subId + ")"); if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { Pair<ModernStatusBarMobileView, Job> viewAndJob = ModernStatusBarMobileView.constructAndBind( mobileContext, Loading Loading @@ -349,7 +349,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da ModernStatusBarMobileView mobileView = matchingModernMobileView( (ModernStatusBarMobileView) view); if (mobileView != null) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { Job job = mBindingJobs.remove(mobileView.getSubId()); if (job != null) { job.cancel(new CancellationException()); Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeHeader.kt +2 −2 Original line number Diff line number Diff line Loading @@ -81,7 +81,6 @@ import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.modifiers.thenIf import com.android.compose.theme.colorAttr import com.android.settingslib.Utils import com.android.systemui.Flags import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation Loading @@ -103,6 +102,7 @@ import com.android.systemui.statusbar.core.NewStatusBarIcons import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithEstimate import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairosComposeWrapper import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel Loading Loading @@ -632,7 +632,7 @@ private fun BatteryIconLegacy( @OptIn(ExperimentalKairosApi::class) @Composable private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifier = Modifier) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled) { ShadeCarrierGroupKairos(viewModel, modifier) return } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryKairosAdapterTest.kt +7 −7 Original line number Diff line number Diff line Loading @@ -22,16 +22,17 @@ import com.android.systemui.activated import com.android.systemui.kairos.ExperimentalKairosApi import com.android.systemui.kairos.launchKairosNetwork import com.android.systemui.kairos.stateOf import com.android.systemui.kosmos.testScope import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.testCarrierConfig import kotlinx.coroutines.ExperimentalCoroutinesApi import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.test.runCurrent import org.junit.runner.RunWith import org.mockito.Mockito @OptIn(ExperimentalKairosApi::class, ExperimentalCoroutinesApi::class) @OptIn(ExperimentalKairosApi::class) @SmallTest @RunWith(AndroidJUnit4::class) @android.platform.test.annotations.EnabledOnRavenwood Loading @@ -39,21 +40,21 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest : CarrierMergedConnectionRepositoryTestBase() { var job: Job? = null val kairosNetwork = testScope.backgroundScope.launchKairosNetwork() val kairosNetwork = kosmos.testScope.backgroundScope.launchKairosNetwork() override fun recreateRepo(): MobileConnectionRepositoryKairosAdapter { lateinit var adapter: MobileConnectionRepositoryKairosAdapter job?.cancel() Mockito.clearInvocations(telephonyManager) job = testScope.backgroundScope.launch { kosmos.testScope.backgroundScope.launch { kairosNetwork.activateSpec { val repo = activated { CarrierMergedConnectionRepositoryKairos( SUB_ID, logger, telephonyManager, wifiRepository, kosmos.wifiRepository.fake, isInEcmMode = stateOf(false), ) } Loading @@ -65,7 +66,6 @@ class CarrierMergedConnectionRepositoryKairosAdapterTest : Unit } } testScope.runCurrent() // ensure the lateinit is set return adapter } }
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/CarrierMergedConnectionRepositoryTest.kt +67 −117 Original line number Diff line number Diff line Loading @@ -21,26 +21,27 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.kosmos.backgroundCoroutineContext import com.android.systemui.kosmos.collectLastValue import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.log.table.logcatTableLogBuffer import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.model.ResolvedNetworkType import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.fake import com.android.systemui.statusbar.pipeline.wifi.data.repository.wifiRepository import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.util.mockito.whenever import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach 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 import org.mockito.Mock import org.mockito.MockitoAnnotations import org.mockito.kotlin.mock import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) Loading @@ -51,180 +52,143 @@ class CarrierMergedConnectionRepositoryTest : CarrierMergedConnectionRepositoryT SUB_ID, logger, telephonyManager, testScope.backgroundScope.coroutineContext, testScope.backgroundScope, wifiRepository, bgContext = kosmos.backgroundCoroutineContext, scope = kosmos.testScope.backgroundScope, kosmos.wifiRepository.fake, ) } abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() { protected lateinit var underTest: MobileConnectionRepository protected val kosmos = testKosmos().useUnconfinedTestDispatcher() protected lateinit var wifiRepository: FakeWifiRepository @Mock protected lateinit var logger: TableLogBuffer @Mock protected lateinit var telephonyManager: TelephonyManager protected lateinit var underTest: MobileConnectionRepository protected val testDispatcher = UnconfinedTestDispatcher() protected val testScope = TestScope(testDispatcher) protected val logger = logcatTableLogBuffer(kosmos, "CarrierMergedConnectionRepositoryTest") protected val telephonyManager = mock<TelephonyManager>() abstract fun recreateRepo(): MobileConnectionRepository @Before fun setUp() { MockitoAnnotations.initMocks(this) whenever(telephonyManager.subscriptionId).thenReturn(SUB_ID) whenever(telephonyManager.simOperatorName).thenReturn("") wifiRepository = FakeWifiRepository() underTest = recreateRepo() } @Test fun inactiveWifi_isDefault() = testScope.runTest { var latestConnState: DataConnectionState? = null var latestNetType: ResolvedNetworkType? = null kosmos.runTest { val latestConnState by collectLastValue(underTest.dataConnectionState) val latestNetType by collectLastValue(underTest.resolvedNetworkType) val dataJob = underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this) val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this) wifiRepository.setWifiNetwork(WifiNetworkModel.Inactive()) wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Inactive()) assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected) assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) dataJob.cancel() netJob.cancel() } @Test fun activeWifi_isDefault() = testScope.runTest { var latestConnState: DataConnectionState? = null var latestNetType: ResolvedNetworkType? = null kosmos.runTest { val latestConnState by collectLastValue(underTest.dataConnectionState) val latestNetType by collectLastValue(underTest.resolvedNetworkType) val dataJob = underTest.dataConnectionState.onEach { latestConnState = it }.launchIn(this) val netJob = underTest.resolvedNetworkType.onEach { latestNetType = it }.launchIn(this) wifiRepository.setWifiNetwork(WifiNetworkModel.Active.of(level = 1)) wifiRepository.fake.setWifiNetwork(WifiNetworkModel.Active.of(level = 1)) assertThat(latestConnState).isEqualTo(DataConnectionState.Disconnected) assertThat(latestNetType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) dataJob.cancel() netJob.cancel() } @Test fun carrierMergedWifi_isValidAndFieldsComeFromWifiNetwork() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) assertThat(latest).isEqualTo(3) job.cancel() } @Test fun activity_comesFromWifiActivity() = testScope.runTest { var latest: DataActivityModel? = null val job = underTest.dataActivityDirection.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.dataActivityDirection) wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.setWifiNetwork( wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setWifiActivity( wifiRepository.fake.setWifiActivity( DataActivityModel(hasActivityIn = true, hasActivityOut = false) ) assertThat(latest!!.hasActivityIn).isTrue() assertThat(latest!!.hasActivityOut).isFalse() wifiRepository.setWifiActivity( wifiRepository.fake.setWifiActivity( DataActivityModel(hasActivityIn = false, hasActivityOut = true) ) assertThat(latest!!.hasActivityIn).isFalse() assertThat(latest!!.hasActivityOut).isTrue() job.cancel() } @Test fun carrierMergedWifi_wrongSubId_isDefault() = testScope.runTest { var latestLevel: Int? = null var latestType: ResolvedNetworkType? = null val levelJob = underTest.primaryLevel.onEach { latestLevel = it }.launchIn(this) val typeJob = underTest.resolvedNetworkType.onEach { latestType = it }.launchIn(this) kosmos.runTest { val latestLevel by collectLastValue(underTest.primaryLevel) val latestType by collectLastValue(underTest.resolvedNetworkType) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID + 10, level = 3) ) assertThat(latestLevel).isNotEqualTo(3) assertThat(latestType).isNotEqualTo(ResolvedNetworkType.CarrierMergedNetworkType) levelJob.cancel() typeJob.cancel() } // This scenario likely isn't possible, but write a test for it anyway @Test fun carrierMergedButNotEnabled_isDefault() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setIsWifiEnabled(false) wifiRepository.fake.setIsWifiEnabled(false) assertThat(latest).isNotEqualTo(3) job.cancel() } // This scenario likely isn't possible, but write a test for it anyway @Test fun carrierMergedButWifiNotDefault_isDefault() = testScope.runTest { var latest: Int? = null val job = underTest.primaryLevel.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.primaryLevel) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) wifiRepository.setIsWifiDefault(false) wifiRepository.fake.setIsWifiDefault(false) assertThat(latest).isNotEqualTo(3) job.cancel() } @Test fun numberOfLevels_comesFromCarrierMerged() = testScope.runTest { var latest: Int? = null val job = underTest.numberOfLevels.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.numberOfLevels) wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of( subscriptionId = SUB_ID, level = 1, Loading @@ -233,77 +197,63 @@ abstract class CarrierMergedConnectionRepositoryTestBase : SysuiTestCase() { ) assertThat(latest).isEqualTo(6) job.cancel() } @Test fun dataEnabled_matchesWifiEnabled() = testScope.runTest { var latest: Boolean? = null val job = underTest.dataEnabled.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.dataEnabled) wifiRepository.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiEnabled(true) assertThat(latest).isTrue() wifiRepository.setIsWifiEnabled(false) wifiRepository.fake.setIsWifiEnabled(false) assertThat(latest).isFalse() job.cancel() } @Test fun cdmaRoaming_alwaysFalse() = testScope.runTest { var latest: Boolean? = null val job = underTest.cdmaRoaming.onEach { latest = it }.launchIn(this) kosmos.runTest { val latest by collectLastValue(underTest.cdmaRoaming) assertThat(latest).isFalse() job.cancel() } @Test fun networkName_usesSimOperatorNameAsInitial() = testScope.runTest { kosmos.runTest { whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name") underTest = recreateRepo() var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val latest by collectLastValue(underTest.networkName) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name")) job.cancel() } @Test fun networkName_updatesOnNetworkUpdate() = testScope.runTest { kosmos.runTest { whenever(telephonyManager.simOperatorName).thenReturn("Test SIM name") underTest = recreateRepo() wifiRepository.setIsWifiEnabled(true) wifiRepository.setIsWifiDefault(true) wifiRepository.fake.setIsWifiEnabled(true) wifiRepository.fake.setIsWifiDefault(true) var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val latest by collectLastValue(underTest.networkName) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("Test SIM name")) whenever(telephonyManager.simOperatorName).thenReturn("New SIM name") wifiRepository.setWifiNetwork( wifiRepository.fake.setWifiNetwork( WifiNetworkModel.CarrierMerged.of(subscriptionId = SUB_ID, level = 3) ) assertThat(latest).isEqualTo(NetworkNameModel.SimDerived("New SIM name")) job.cancel() } @Test fun isAllowedDuringAirplaneMode_alwaysTrue() = testScope.runTest { kosmos.runTest { val latest by collectLastValue(underTest.isAllowedDuringAirplaneMode) assertThat(latest).isTrue() Loading
packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java +3 −3 Original line number Diff line number Diff line Loading @@ -39,7 +39,6 @@ import androidx.annotation.VisibleForTesting; import com.android.keyguard.CarrierTextManager; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.Flags; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Application; import com.android.systemui.dagger.qualifiers.Background; Loading @@ -55,6 +54,7 @@ import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider; import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconsBinder; Loading Loading @@ -223,7 +223,7 @@ public class ShadeCarrierGroupController { mMobileIconsViewModel = mobileUiAdapter.getMobileIconsViewModel(); if (mStatusBarPipelineFlags.useNewShadeCarrierGroupMobileIcons()) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { mobileUiAdapterKairos.get().setShadeCarrierGroupController(this); } else { mobileUiAdapter.setShadeCarrierGroupController(this); Loading Loading @@ -275,7 +275,7 @@ public class ShadeCarrierGroupController { List<IconData> iconDataList = processSubIdList(subIds); if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { for (Job job : mBindingJobs) { job.cancel(new CancellationException()); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +3 −3 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.widget.LinearLayout; import androidx.collection.MutableIntObjectMap; import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.Flags; import com.android.systemui.demomode.DemoMode; import com.android.systemui.kairos.ExperimentalKairosApi; import com.android.systemui.kairos.KairosNetwork; Loading @@ -39,6 +38,7 @@ import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.res.R; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusIconDisplayable; import com.android.systemui.statusbar.pipeline.mobile.StatusBarMobileIconKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos; import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger; import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView; Loading Loading @@ -273,7 +273,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da MobileViewLogger mobileViewLogger, int subId) { Log.d(TAG, "addModernMobileView (subId=" + subId + ")"); if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { Pair<ModernStatusBarMobileView, Job> viewAndJob = ModernStatusBarMobileView.constructAndBind( mobileContext, Loading Loading @@ -349,7 +349,7 @@ public class DemoStatusIcons extends StatusIconContainer implements DemoMode, Da ModernStatusBarMobileView mobileView = matchingModernMobileView( (ModernStatusBarMobileView) view); if (mobileView != null) { if (Flags.statusBarMobileIconKairos()) { if (StatusBarMobileIconKairos.isEnabled()) { Job job = mBindingJobs.remove(mobileView.getSubId()); if (job != null) { job.cancel(new CancellationException()); Loading