diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java index 37d83f8ee741c..336356eae3641 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -78,6 +78,7 @@ import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.DataSaverControllerImpl; @@ -192,6 +193,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private final Executor mBgExecutor; // Handler that all callbacks are made on. private final CallbackHandler mCallbackHandler; + private final StatusBarPipelineFlags mStatusBarPipelineFlags; private int mEmergencySource; private boolean mIsEmergency; @@ -242,6 +244,7 @@ public class NetworkControllerImpl extends BroadcastReceiver TelephonyListenerManager telephonyListenerManager, @Nullable WifiManager wifiManager, AccessPointControllerImpl accessPointController, + StatusBarPipelineFlags statusBarPipelineFlags, DemoModeController demoModeController, CarrierConfigTracker carrierConfigTracker, WifiStatusTrackerFactory trackerFactory, @@ -260,6 +263,7 @@ public class NetworkControllerImpl extends BroadcastReceiver bgExecutor, callbackHandler, accessPointController, + statusBarPipelineFlags, new DataUsageController(context), new SubscriptionDefaults(), deviceProvisionedController, @@ -287,6 +291,7 @@ public class NetworkControllerImpl extends BroadcastReceiver Executor bgExecutor, CallbackHandler callbackHandler, AccessPointControllerImpl accessPointController, + StatusBarPipelineFlags statusBarPipelineFlags, DataUsageController dataUsageController, SubscriptionDefaults defaultsHandler, DeviceProvisionedController deviceProvisionedController, @@ -308,6 +313,7 @@ public class NetworkControllerImpl extends BroadcastReceiver mBgLooper = bgLooper; mBgExecutor = bgExecutor; mCallbackHandler = callbackHandler; + mStatusBarPipelineFlags = statusBarPipelineFlags; mDataSaverController = new DataSaverControllerImpl(context); mBroadcastDispatcher = broadcastDispatcher; mMobileFactory = mobileFactory; @@ -1333,7 +1339,7 @@ public class NetworkControllerImpl extends BroadcastReceiver mWifiSignalController.notifyListeners(); } String sims = args.getString("sims"); - if (sims != null) { + if (sims != null && !mStatusBarPipelineFlags.useNewMobileIcons()) { int num = MathUtils.constrain(Integer.parseInt(sims), 1, 8); List subs = new ArrayList<>(); if (num != mMobileSignalControllers.size()) { @@ -1356,7 +1362,7 @@ public class NetworkControllerImpl extends BroadcastReceiver mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected); } String mobile = args.getString("mobile"); - if (mobile != null) { + if (mobile != null && !mStatusBarPipelineFlags.useNewMobileIcons()) { boolean show = mobile.equals("show"); String datatype = args.getString("datatype"); String slotString = args.getString("slot"); @@ -1441,7 +1447,7 @@ public class NetworkControllerImpl extends BroadcastReceiver controller.notifyListeners(); } String carrierNetworkChange = args.getString("carriernetworkchange"); - if (carrierNetworkChange != null) { + if (carrierNetworkChange != null && !mStatusBarPipelineFlags.useNewMobileIcons()) { boolean show = carrierNetworkChange.equals("show"); for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController controller = mMobileSignalControllers.valueAt(i); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt index fb67f1a1bf503..e7afc50dbc2cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.dagger +import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBufferFactory @@ -29,6 +30,7 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupR import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepositoryImpl import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorImpl +import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxyImpl import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository @@ -40,6 +42,8 @@ import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiIntera import dagger.Binds import dagger.Module import dagger.Provides +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap @Module abstract class StatusBarPipelineModule { @@ -52,8 +56,7 @@ abstract class StatusBarPipelineModule { @Binds abstract fun connectivityRepository(impl: ConnectivityRepositoryImpl): ConnectivityRepository - @Binds - abstract fun wifiRepository(impl: WifiRepositoryImpl): WifiRepository + @Binds abstract fun wifiRepository(impl: WifiRepositoryImpl): WifiRepository @Binds abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor @@ -63,15 +66,18 @@ abstract class StatusBarPipelineModule { impl: MobileConnectionsRepositoryImpl ): MobileConnectionsRepository - @Binds - abstract fun userSetupRepository(impl: UserSetupRepositoryImpl): UserSetupRepository + @Binds abstract fun userSetupRepository(impl: UserSetupRepositoryImpl): UserSetupRepository - @Binds - abstract fun mobileMappingsProxy(impl: MobileMappingsProxyImpl): MobileMappingsProxy + @Binds abstract fun mobileMappingsProxy(impl: MobileMappingsProxyImpl): MobileMappingsProxy @Binds abstract fun mobileIconsInteractor(impl: MobileIconsInteractorImpl): MobileIconsInteractor + @Binds + @IntoMap + @ClassKey(MobileUiAdapter::class) + abstract fun bindFeature(impl: MobileUiAdapter): CoreStartable + @Module companion object { @JvmStatic diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/DataConnectionState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/DataConnectionState.kt index da87f7306e601..5479b92edd222 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/DataConnectionState.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/DataConnectionState.kt @@ -20,6 +20,7 @@ import android.telephony.TelephonyManager.DATA_CONNECTED import android.telephony.TelephonyManager.DATA_CONNECTING import android.telephony.TelephonyManager.DATA_DISCONNECTED import android.telephony.TelephonyManager.DATA_DISCONNECTING +import android.telephony.TelephonyManager.DATA_UNKNOWN import android.telephony.TelephonyManager.DataState /** Internal enum representation of the telephony data connection states */ @@ -28,6 +29,7 @@ enum class DataConnectionState(@DataState val dataState: Int) { Connecting(DATA_CONNECTING), Disconnected(DATA_DISCONNECTED), Disconnecting(DATA_DISCONNECTING), + Unknown(DATA_UNKNOWN), } fun @receiver:DataState Int.toDataConnectionType(): DataConnectionState = @@ -36,5 +38,6 @@ fun @receiver:DataState Int.toDataConnectionType(): DataConnectionState = DATA_CONNECTING -> DataConnectionState.Connecting DATA_DISCONNECTED -> DataConnectionState.Disconnected DATA_DISCONNECTING -> DataConnectionState.Disconnecting - else -> throw IllegalArgumentException("unknown data state received") + DATA_UNKNOWN -> DataConnectionState.Unknown + else -> throw IllegalArgumentException("unknown data state received $this") } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt index c7e0ce173ece1..d9487bf922609 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.pipeline.mobile.ui +import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.statusbar.phone.StatusBarIconController @@ -29,9 +30,10 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.mapLatest -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch /** * This class is intended to provide a context to collect on the @@ -50,9 +52,9 @@ constructor( interactor: MobileIconsInteractor, private val iconController: StatusBarIconController, private val iconsViewModelFactory: MobileIconsViewModel.Factory, - @Application scope: CoroutineScope, + @Application private val scope: CoroutineScope, private val statusBarPipelineFlags: StatusBarPipelineFlags, -) { +) : CoreStartable { private val mobileSubIds: Flow> = interactor.filteredSubscriptions.mapLatest { infos -> infos.map { subscriptionInfo -> subscriptionInfo.subscriptionId } @@ -66,18 +68,19 @@ constructor( * NOTE: this should go away as the view presenter learns more about this data pipeline */ private val mobileSubIdsState: StateFlow> = - mobileSubIds - .onEach { - // Only notify the icon controller if we want to *render* the new icons. - // Note that this flow may still run if - // [statusBarPipelineFlags.runNewMobileIconsBackend] is true because we may want to - // get the logging data without rendering. - if (statusBarPipelineFlags.useNewMobileIcons()) { - // Notify the icon controller here so that it knows to add icons - iconController.setNewMobileIconSubIds(it) - } + mobileSubIds.stateIn(scope, SharingStarted.WhileSubscribed(), listOf()) + + override fun start() { + // Only notify the icon controller if we want to *render* the new icons. + // Note that this flow may still run if + // [statusBarPipelineFlags.runNewMobileIconsBackend] is true because we may want to + // get the logging data without rendering. + if (statusBarPipelineFlags.useNewMobileIcons()) { + scope.launch { + mobileSubIds.collectLatest { iconController.setNewMobileIconSubIds(it) } } - .stateIn(scope, SharingStarted.WhileSubscribed(), listOf()) + } + } /** * Create a MobileIconsViewModel for a given [IconManager], and bind it to to the manager's diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index faf4592d26e35..5431eba8441c8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -72,6 +72,7 @@ import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; @@ -245,6 +246,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mMockProvisionController, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index ca75a40300cbd..9441d49d454aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -49,6 +49,7 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.DataUsageController; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.CarrierConfigTracker; @@ -150,6 +151,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index 84c242cda4590..4c1f0a8a10660 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -44,6 +44,7 @@ import com.android.settingslib.net.DataUsageController; import com.android.systemui.R; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.log.LogBuffer; +import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.util.CarrierConfigTracker; @@ -78,6 +79,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mMockProvisionController, @@ -115,6 +117,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mMockProvisionController, @@ -150,6 +153,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), @@ -188,6 +192,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), @@ -274,6 +279,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), + mock(StatusBarPipelineFlags.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepositoryTest.kt index 5ce51bb62c78e..aa7ab0df2ea3d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/MobileConnectionRepositoryTest.kt @@ -31,6 +31,7 @@ import android.telephony.TelephonyManager.DATA_CONNECTED import android.telephony.TelephonyManager.DATA_CONNECTING import android.telephony.TelephonyManager.DATA_DISCONNECTED import android.telephony.TelephonyManager.DATA_DISCONNECTING +import android.telephony.TelephonyManager.DATA_UNKNOWN import android.telephony.TelephonyManager.NETWORK_TYPE_LTE import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN import androidx.test.filters.SmallTest @@ -220,6 +221,21 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { job.cancel() } + @Test + fun testFlowForSubId_dataConnectionState_unknown() = + runBlocking(IMMEDIATE) { + var latest: MobileSubscriptionModel? = null + val job = underTest.subscriptionModelFlow.onEach { latest = it }.launchIn(this) + + val callback = + getTelephonyCallbackForType() + callback.onDataConnectionStateChanged(DATA_UNKNOWN, 200 /* unused */) + + assertThat(latest?.dataConnectionState).isEqualTo(DataConnectionState.Unknown) + + job.cancel() + } + @Test fun testFlowForSubId_dataActivity() = runBlocking(IMMEDIATE) {