From e66d5ea4d9d6ae9839f42fd0ba83b070c057e16e Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Tue, 5 Oct 2021 11:53:16 -0400 Subject: [PATCH 1/3] Move interfaces out of NetworkController This CL moves some interface and class definitions out of NetworkController. AccessPointController and SignalCallback get their own files, and MobileDataIndicators and WifiIndicators both moved to the SignalCallback kt file. This doesn't simplify things just yet, but it does clean up imports and interfaces, and moving the *Indicators classes to kotlin gives us the data class niceties. Test: atest SystemUITests Bug: 197851948 Change-Id: I6eba271cdc28d81bc1d281eab2e6c230f4ad89cb --- .../qs/carrier/QSCarrierGroupController.java | 12 +- .../android/systemui/qs/tiles/CastTile.java | 9 +- .../systemui/qs/tiles/CellularTile.java | 11 +- .../systemui/qs/tiles/InternetTile.java | 17 +- .../android/systemui/qs/tiles/WifiTile.java | 11 +- .../dialog/InternetDialogController.java | 5 +- .../statusbar/OperatorNameViewController.java | 8 +- .../connectivity/AccessPointController.kt | 93 ++++++++ .../AccessPointControllerImpl.java | 18 +- .../connectivity/CallbackHandler.java | 4 - .../EthernetSignalController.java | 2 - .../connectivity/MobileSignalController.java | 3 - .../connectivity/NetworkController.java | 198 ------------------ .../connectivity/NetworkControllerImpl.java | 22 +- .../statusbar/connectivity/SignalCallback.kt | 187 +++++++++++++++++ .../connectivity/SignalController.java | 2 - .../connectivity/WifiSignalController.java | 4 - .../phone/CollapsedStatusBarFragment.java | 6 +- .../phone/StatusBarSignalPolicy.java | 17 +- .../policy/dagger/StatusBarPolicyModule.java | 3 +- .../carrier/QSCarrierGroupControllerTest.java | 12 +- .../systemui/qs/tiles/CastTileTest.java | 25 ++- .../dialog/InternetDialogControllerTest.java | 5 +- .../AccessPointControllerImplTest.kt | 4 +- .../connectivity/CallbackHandlerTest.java | 4 - .../NetworkControllerBaseTest.java | 3 - .../NetworkControllerEthernetTest.java | 2 - .../NetworkControllerWifiTest.java | 1 - .../utils/leaks/FakeNetworkController.java | 3 +- 29 files changed, 383 insertions(+), 308 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointController.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java index fec61d911577a..141c246db2609 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java @@ -19,6 +19,7 @@ package com.android.systemui.qs.carrier; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; import android.annotation.MainThread; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.os.Handler; @@ -42,8 +43,10 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.connectivity.IconState; +import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.util.CarrierConfigTracker; import java.util.function.Consumer; @@ -81,10 +84,9 @@ public class QSCarrierGroupController { private final SlotIndexResolver mSlotIndexResolver; - private final NetworkController.SignalCallback mSignalCallback = - new NetworkController.SignalCallback() { + private final SignalCallback mSignalCallback = new SignalCallback() { @Override - public void setMobileDataIndicators(MobileDataIndicators indicators) { + public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { if (mProviderModel) { return; } @@ -109,7 +111,7 @@ public class QSCarrierGroupController { } @Override - public void setCallIndicator(NetworkController.IconState statusIcon, int subId) { + public void setCallIndicator(@NonNull IconState statusIcon, int subId) { if (!mProviderModel) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 9de6ceb2de4b7..0427e38aa8115 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import static android.media.MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY; +import android.annotation.NonNull; import android.app.Dialog; import android.content.Context; import android.content.Intent; @@ -52,7 +53,8 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; +import com.android.systemui.statusbar.connectivity.WifiIndicators; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.CastController.CastDevice; @@ -273,10 +275,9 @@ public class CastTile extends QSTileImpl { return mWifiConnected || mHotspotConnected; } - private final NetworkController.SignalCallback mSignalCallback = - new NetworkController.SignalCallback() { + private final SignalCallback mSignalCallback = new SignalCallback() { @Override - public void setWifiIndicators(WifiIndicators indicators) { + public void setWifiIndicators(@NonNull WifiIndicators indicators) { // statusIcon.visible has the connected status information boolean enabledAndConnected = indicators.enabled && (indicators.qsIcon == null ? false : indicators.qsIcon.visible); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 35dadd45eb3e6..e5601f29af0bd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import static com.android.systemui.Prefs.Key.QS_HAS_TURNED_OFF_MOBILE_DATA; +import android.annotation.NonNull; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; @@ -56,10 +57,10 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.SignalTileView; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.statusbar.connectivity.IconState; +import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.phone.SystemUIDialog; import javax.inject.Inject; @@ -269,7 +270,7 @@ public class CellularTile extends QSTileImpl { private final CallbackInfo mInfo = new CallbackInfo(); @Override - public void setMobileDataIndicators(MobileDataIndicators indicators) { + public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { if (indicators.qsIcon == null) { // Not data sim, don't display. return; @@ -291,7 +292,7 @@ public class CellularTile extends QSTileImpl { } @Override - public void setIsAirplaneMode(IconState icon) { + public void setIsAirplaneMode(@NonNull IconState icon) { mInfo.airplaneModeEnabled = icon.visible; refreshState(mInfo); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index 23b2a7642e364..cd81b4a11703b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -52,13 +53,13 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; +import com.android.systemui.statusbar.connectivity.AccessPointController; +import com.android.systemui.statusbar.connectivity.IconState; +import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.WifiIcons; +import com.android.systemui.statusbar.connectivity.WifiIndicators; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -250,7 +251,7 @@ public class InternetTile extends QSTileImpl { @Override - public void setWifiIndicators(WifiIndicators indicators) { + public void setWifiIndicators(@NonNull WifiIndicators indicators) { if (DEBUG) { Log.d(TAG, "setWifiIndicators: " + indicators); } @@ -271,7 +272,7 @@ public class InternetTile extends QSTileImpl { } @Override - public void setMobileDataIndicators(MobileDataIndicators indicators) { + public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { if (DEBUG) { Log.d(TAG, "setMobileDataIndicators: " + indicators); } @@ -293,7 +294,7 @@ public class InternetTile extends QSTileImpl { } @Override - public void setEthernetIndicators(IconState icon) { + public void setEthernetIndicators(@NonNull IconState icon) { if (DEBUG) { Log.d(TAG, "setEthernetIndicators: " + "icon = " + (icon == null ? "" : icon.toString())); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index e6e7e21263bb8..e79ca0c932127 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -52,11 +53,11 @@ import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSIconViewImpl; import com.android.systemui.qs.tileimpl.QSTileImpl; +import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.WifiIcons; +import com.android.systemui.statusbar.connectivity.WifiIndicators; import com.android.wifitrackerlib.WifiEntry; import java.util.List; @@ -310,7 +311,7 @@ public class WifiTile extends QSTileImpl { final CallbackInfo mInfo = new CallbackInfo(); @Override - public void setWifiIndicators(WifiIndicators indicators) { + public void setWifiIndicators(@NonNull WifiIndicators indicators) { if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + indicators.enabled); if (indicators.qsIcon == null) { return; @@ -332,7 +333,7 @@ public class WifiTile extends QSTileImpl { } protected class WifiDetailAdapter implements DetailAdapter, - NetworkController.AccessPointController.AccessPointCallback, QSDetailItems.Callback { + AccessPointController.AccessPointCallback, QSDetailItems.Callback { private QSDetailItems mItems; private WifiEntry[] mAccessPoints; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index 5673136e18282..1c8bd784a00de 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -76,8 +76,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController; +import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.toast.SystemUIToast; @@ -100,7 +99,7 @@ import java.util.stream.Stream; import javax.inject.Inject; public class InternetDialogController implements WifiEntry.DisconnectCallback, - NetworkController.AccessPointController.AccessPointCallback { + AccessPointController.AccessPointCallback { private static final String TAG = "InternetDialogController"; private static final String ACTION_NETWORK_PROVIDER_SETTINGS = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java index bcba5cc09c5d3..8a4c4b5ac5c6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameViewController.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar; +import android.annotation.NonNull; import android.os.Bundle; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; @@ -26,7 +27,9 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.demomode.DemoModeCommandReceiver; import com.android.systemui.plugins.DarkIconDispatcher; +import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.NetworkController; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.ViewController; @@ -135,10 +138,9 @@ public class OperatorNameViewController extends ViewController (area, darkIntensity, tint) -> mView.setTextColor(DarkIconDispatcher.getTint(area, mView, tint)); - private final NetworkController.SignalCallback mSignalCallback = - new NetworkController.SignalCallback() { + private final SignalCallback mSignalCallback = new SignalCallback() { @Override - public void setIsAirplaneMode(NetworkController.IconState icon) { + public void setIsAirplaneMode(@NonNull IconState icon) { update(); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointController.kt new file mode 100644 index 0000000000000..490994d805fe2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointController.kt @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.connectivity + +import android.content.Intent +import android.os.UserManager +import android.provider.Settings + +import com.android.wifitrackerlib.MergedCarrierEntry +import com.android.wifitrackerlib.WifiEntry + +/** + * Tracks changes in access points. Allows listening for changes, scanning for new APs, + * and connecting to new ones. + */ +interface AccessPointController { + fun addAccessPointCallback(callback: AccessPointCallback) + fun removeAccessPointCallback(callback: AccessPointCallback) + + /** + * Request an updated list of available access points + * + * This method will trigger a call to [AccessPointCallback.onAccessPointsChanged] + */ + fun scanForAccessPoints() + + /** + * Gets the current [MergedCarrierEntry]. If null, this call generates a call to + * [AccessPointCallback.onAccessPointsChanged] + * + * @return the current [MergedCarrierEntry], if one exists + */ + fun getMergedCarrierEntry(): MergedCarrierEntry? + + /** @return the appropriate icon id for the given [WifiEntry]'s level */ + fun getIcon(ap: WifiEntry): Int + + /** + * Connects to a [WifiEntry] if it's saved or does not require security. + * + * If the entry is not saved and requires security, will trigger + * [AccessPointCallback.onSettingsActivityTriggered]. + * + * @param ap + * @return `true` if [AccessPointCallback.onSettingsActivityTriggered] is triggered + */ + fun connect(ap: WifiEntry?): Boolean + + /** + * `true` if the current user does not have the [UserManager.DISALLOW_CONFIG_WIFI] restriction + */ + fun canConfigWifi(): Boolean + + /** + * `true` if the current user does not have the [UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS] + * restriction set + */ + fun canConfigMobileData(): Boolean + + interface AccessPointCallback { + /** + * Called whenever [scanForAccessPoints] is called, or [getMergedCarrierEntry] is called + * with a null entry + * + * @param accessPoints the list of available access points, including the current connected + * one if it exists + */ + fun onAccessPointsChanged(accessPoints: List<@JvmSuppressWildcards WifiEntry>) + + /** + * Called whenever [connecting][connect] to an unknown access point which has security. + * Implementers should launch the intent in the appropriate context + * + * @param settingsIntent an intent for [Settings.ACTION_WIFI_SETTINGS] with + * "wifi_start_connect_ssid" set as an extra + */ + fun onSettingsActivityTriggered(settingsIntent: Intent?) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java index a23d73d7ed843..893b836dedfc0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImpl.java @@ -56,9 +56,9 @@ import java.util.concurrent.Executor; import javax.inject.Inject; /** */ -public class AccessPointControllerImpl - implements NetworkController.AccessPointController, - WifiPickerTracker.WifiPickerTrackerCallback, LifecycleOwner { +public class AccessPointControllerImpl implements AccessPointController, + WifiPickerTracker.WifiPickerTrackerCallback, + LifecycleOwner { private static final String TAG = "AccessPointController"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -117,13 +117,11 @@ public class AccessPointControllerImpl super.finalize(); } - /** */ public boolean canConfigWifi() { return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, new UserHandle(mCurrentUser)); } - /** */ public boolean canConfigMobileData() { return !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, UserHandle.of(mCurrentUser)) && mUserTracker.getUserInfo().isAdmin(); @@ -156,7 +154,7 @@ public class AccessPointControllerImpl @Override public void scanForAccessPoints() { if (mWifiPickerTracker == null) { - fireAcccessPointsCallback(Collections.emptyList()); + fireAccessPointsCallback(Collections.emptyList()); return; } List entries = mWifiPickerTracker.getWifiEntries(); @@ -164,13 +162,13 @@ public class AccessPointControllerImpl if (connectedEntry != null) { entries.add(0, connectedEntry); } - fireAcccessPointsCallback(entries); + fireAccessPointsCallback(entries); } @Override public MergedCarrierEntry getMergedCarrierEntry() { if (mWifiPickerTracker == null) { - fireAcccessPointsCallback(Collections.emptyList()); + fireAccessPointsCallback(Collections.emptyList()); return null; } return mWifiPickerTracker.getMergedCarrierEntry(); @@ -190,7 +188,7 @@ public class AccessPointControllerImpl * @param ap * @return {@code true} if {@link AccessPointCallback#onSettingsActivityTriggered} is triggered */ - public boolean connect(WifiEntry ap) { + public boolean connect(@Nullable WifiEntry ap) { if (ap == null) return false; if (DEBUG) { if (ap.getWifiConfiguration() != null) { @@ -222,7 +220,7 @@ public class AccessPointControllerImpl } } - private void fireAcccessPointsCallback(List aps) { + private void fireAccessPointsCallback(List aps) { for (AccessPointCallback callback : mCallbacks) { callback.onAccessPointsChanged(aps); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/CallbackHandler.java index 052a789200e66..6914ae67f4bac 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/CallbackHandler.java @@ -23,10 +23,6 @@ import android.telephony.SubscriptionInfo; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.connectivity.NetworkController.EmergencyListener; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; import java.io.PrintWriter; import java.text.SimpleDateFormat; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java index c9d40adde6444..6cc55673a4ea3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java @@ -21,8 +21,6 @@ import android.net.NetworkCapabilities; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.IconGroup; import com.android.settingslib.SignalIcon.State; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; import java.util.BitSet; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java index 20ef4eec0b971..a3844954587b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java @@ -58,9 +58,6 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.SignalStrengthUtil; import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; import com.android.systemui.util.CarrierConfigTracker; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkController.java index 143309658779e..f960eb7b6e9b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkController.java @@ -16,19 +16,10 @@ package com.android.systemui.statusbar.connectivity; -import android.content.Context; -import android.content.Intent; -import android.telephony.SubscriptionInfo; - import com.android.settingslib.net.DataUsageController; import com.android.systemui.demomode.DemoMode; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; import com.android.systemui.statusbar.policy.CallbackController; import com.android.systemui.statusbar.policy.DataSaverController; -import com.android.wifitrackerlib.MergedCarrierEntry; -import com.android.wifitrackerlib.WifiEntry; - -import java.util.List; /** */ public interface NetworkController extends CallbackController, DemoMode { @@ -62,197 +53,8 @@ public interface NetworkController extends CallbackController, D /** */ boolean isRadioOn(); - /** - * Wrapper class for all the WiFi signals used for WiFi indicators. - */ - final class WifiIndicators { - public boolean enabled; - public IconState statusIcon; - public IconState qsIcon; - public boolean activityIn; - public boolean activityOut; - public String description; - public boolean isTransient; - public String statusLabel; - - public WifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description, - boolean isTransient, String statusLabel) { - this.enabled = enabled; - this.statusIcon = statusIcon; - this.qsIcon = qsIcon; - this.activityIn = activityIn; - this.activityOut = activityOut; - this.description = description; - this.isTransient = isTransient; - this.statusLabel = statusLabel; - } - - @Override - public String toString() { - return new StringBuilder("WifiIndicators[") - .append("enabled=").append(enabled) - .append(",statusIcon=").append(statusIcon == null ? "" : statusIcon.toString()) - .append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString()) - .append(",activityIn=").append(activityIn) - .append(",activityOut=").append(activityOut) - .append(",qsDescription=").append(description) - .append(",isTransient=").append(isTransient) - .append(",statusLabel=").append(statusLabel) - .append(']').toString(); - } - } - - /** - * Wrapper class for all the mobile signals used for mobile data indicators. - */ - final class MobileDataIndicators { - public IconState statusIcon; - public IconState qsIcon; - public int statusType; - public int qsType; - public boolean activityIn; - public boolean activityOut; - public CharSequence typeContentDescription; - public CharSequence typeContentDescriptionHtml; - public CharSequence qsDescription; - public int subId; - public boolean roaming; - public boolean showTriangle; - - public MobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, - CharSequence qsDescription, int subId, boolean roaming, - boolean showTriangle) { - this.statusIcon = statusIcon; - this.qsIcon = qsIcon; - this.statusType = statusType; - this.qsType = qsType; - this.activityIn = activityIn; - this.activityOut = activityOut; - this.typeContentDescription = typeContentDescription; - this.typeContentDescriptionHtml = typeContentDescriptionHtml; - this.qsDescription = qsDescription; - this.subId = subId; - this.roaming = roaming; - this.showTriangle = showTriangle; - } - - @Override - public String toString() { - return new StringBuilder("MobileDataIndicators[") - .append("statusIcon=").append(statusIcon == null ? "" : statusIcon.toString()) - .append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString()) - .append(",statusType=").append(statusType) - .append(",qsType=").append(qsType) - .append(",activityIn=").append(activityIn) - .append(",activityOut=").append(activityOut) - .append(",typeContentDescription=").append(typeContentDescription) - .append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml) - .append(",description=").append(qsDescription) - .append(",subId=").append(subId) - .append(",roaming=").append(roaming) - .append(",showTriangle=").append(showTriangle) - .append(']').toString(); - } - } - - /** */ - interface SignalCallback { - /** - * Callback for listeners to be able to update the state of any UI tracking connectivity of - * WiFi networks. - */ - default void setWifiIndicators(WifiIndicators wifiIndicators) {} - - /** - * Callback for listeners to be able to update the state of any UI tracking connectivity - * of Mobile networks. - */ - default void setMobileDataIndicators(MobileDataIndicators mobileDataIndicators) {} - - /** */ - default void setSubs(List subs) {} - - /** */ - default void setNoSims(boolean show, boolean simDetected) {} - - /** */ - default void setEthernetIndicators(IconState icon) {} - - /** */ - default void setIsAirplaneMode(IconState icon) {} - - /** */ - default void setMobileDataEnabled(boolean enabled) {} - - /** - * Callback for listeners to be able to update the connectivity status - * @param noDefaultNetwork whether there is any default network. - * @param noValidatedNetwork whether there is any validated network. - * @param noNetworksAvailable whether there is any WiFi networks available. - */ - default void setConnectivityStatus(boolean noDefaultNetwork, boolean noValidatedNetwork, - boolean noNetworksAvailable) {} - - /** - * Callback for listeners to be able to update the call indicator - * @param statusIcon the icon for the call indicator - * @param subId subscription ID for which to update the UI - */ - default void setCallIndicator(IconState statusIcon, int subId) {} - } - /** */ interface EmergencyListener { void setEmergencyCallsOnly(boolean emergencyOnly); } - - /** */ - class IconState { - public final boolean visible; - public final int icon; - public final String contentDescription; - - public IconState(boolean visible, int icon, String contentDescription) { - this.visible = visible; - this.icon = icon; - this.contentDescription = contentDescription; - } - - public IconState(boolean visible, int icon, int contentDescription, - Context context) { - this(visible, icon, context.getString(contentDescription)); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - return builder.append("[visible=").append(visible).append(',') - .append("icon=").append(icon).append(',') - .append("contentDescription=").append(contentDescription).append(']') - .toString(); - } - } - - /** - * Tracks changes in access points. Allows listening for changes, scanning for new APs, - * and connecting to new ones. - */ - interface AccessPointController { - void addAccessPointCallback(AccessPointCallback callback); - void removeAccessPointCallback(AccessPointCallback callback); - void scanForAccessPoints(); - MergedCarrierEntry getMergedCarrierEntry(); - int getIcon(WifiEntry ap); - boolean connect(WifiEntry ap); - boolean canConfigWifi(); - boolean canConfigMobileData(); - - interface AccessPointCallback { - void onAccessPointsChanged(List accessPoints); - void onSettingsActivityTriggered(Intent settingsIntent); - } - } } 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 daae43f69d3bc..e55aae4ebe7ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -721,8 +721,11 @@ public class NetworkControllerImpl extends BroadcastReceiver @Override public void addCallback(@NonNull SignalCallback cb) { cb.setSubs(mCurrentSubscriptions); - cb.setIsAirplaneMode(new IconState(mAirplaneMode, - TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext)); + cb.setIsAirplaneMode( + new IconState( + mAirplaneMode, + TelephonyIcons.FLIGHT_MODE_ICON, + mContext.getString(R.string.accessibility_airplane_mode))); cb.setNoSims(mHasNoSubs, mSimDetected); if (mProviderModelSetting) { cb.setConnectivityStatus(mNoDefaultNetwork, !mInetCondition, mNoNetworksAvailable); @@ -1056,8 +1059,11 @@ public class NetworkControllerImpl extends BroadcastReceiver * notifyAllListeners. */ private void notifyListeners() { - mCallbackHandler.setIsAirplaneMode(new IconState(mAirplaneMode, - TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, mContext)); + mCallbackHandler.setIsAirplaneMode( + new IconState( + mAirplaneMode, + TelephonyIcons.FLIGHT_MODE_ICON, + mContext.getString(R.string.accessibility_airplane_mode))); mCallbackHandler.setNoSims(mHasNoSubs, mSimDetected); } @@ -1241,9 +1247,11 @@ public class NetworkControllerImpl extends BroadcastReceiver String airplane = args.getString("airplane"); if (airplane != null) { boolean show = airplane.equals("show"); - mCallbackHandler.setIsAirplaneMode(new IconState(show, - TelephonyIcons.FLIGHT_MODE_ICON, R.string.accessibility_airplane_mode, - mContext)); + mCallbackHandler.setIsAirplaneMode( + new IconState( + show, + TelephonyIcons.FLIGHT_MODE_ICON, + mContext.getString(R.string.accessibility_airplane_mode))); } String fully = args.getString("fully"); if (fully != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt new file mode 100644 index 0000000000000..599beecb0e003 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.connectivity + +import android.telephony.SubscriptionInfo + +/** + * SignalCallback contains all of the connectivity updates from [NetworkController]. Implement this + * interface to be able to draw iconography for Wi-Fi, mobile data, ethernet, call strength + * indicators, etc. + */ +interface SignalCallback { + /** + * Called when the Wi-Fi iconography has been updated. Implement this method to draw Wi-Fi icons + * + * @param wifiIndicators a box type containing enough information to properly draw a Wi-Fi icon + */ + @JvmDefault + fun setWifiIndicators(wifiIndicators: WifiIndicators) {} + + /** + * Called when the mobile iconography has been updated. Implement this method to draw mobile + * indicators + * + * @param mobileDataIndicators a box type containing enough information to properly draw + * mobile data icons + * + * NOTE: phones can have multiple subscriptions, so this [mobileDataIndicators] object should be + * indexed based on its [subId][MobileDataIndicators.subId] + */ + @JvmDefault + fun setMobileDataIndicators(mobileDataIndicators: MobileDataIndicators) {} + + /** + * Called when the list of mobile data subscriptions has changed. Use this method as a chance + * to remove views that are no longer needed, or to make room for new icons to come in + * + * @param subs a [SubscriptionInfo] for each subscription that we know about + */ + @JvmDefault + fun setSubs(subs: List<@JvmSuppressWildcards SubscriptionInfo>) {} + + /** + * Called when: + * 1. The number of [MobileSignalController]s goes to 0 while mobile data is enabled + * OR + * 2. The presence of any SIM changes + * + * @param show whether or not to show a "no sim" view + * @param simDetected whether any SIM is detected or not + */ + @JvmDefault + fun setNoSims(show: Boolean, simDetected: Boolean) {} + + /** + * Called when there is any update to the ethernet iconography. Implement this method to set an + * ethernet icon + * + * @param icon an [IconState] for the current ethernet status + */ + @JvmDefault + fun setEthernetIndicators(icon: IconState) {} + + /** + * Called whenever airplane mode changes + * + * @param icon an [IconState] for the current airplane mode status + */ + @JvmDefault + fun setIsAirplaneMode(icon: IconState) {} + + /** + * Called whenever the mobile data feature enabled state changes + * + * @param enabled the current mobile data feature ennabled state + */ + @JvmDefault + fun setMobileDataEnabled(enabled: Boolean) {} + + /** + * Callback for listeners to be able to update the connectivity status + * @param noDefaultNetwork whether there is any default network. + * @param noValidatedNetwork whether there is any validated network. + * @param noNetworksAvailable whether there is any WiFi networks available. + */ + @JvmDefault + fun setConnectivityStatus( + noDefaultNetwork: Boolean, + noValidatedNetwork: Boolean, + noNetworksAvailable: Boolean + ) { } + + /** + * Callback for listeners to be able to update the call indicator + * @param statusIcon the icon for the call indicator + * @param subId subscription ID for which to update the UI + */ + @JvmDefault + fun setCallIndicator(statusIcon: IconState, subId: Int) {} +} + +/** Box type for [SignalCallback.setWifiIndicators] */ +data class WifiIndicators( + @JvmField val enabled: Boolean, + @JvmField val statusIcon: IconState?, + @JvmField val qsIcon: IconState?, + @JvmField val activityIn: Boolean, + @JvmField val activityOut: Boolean, + @JvmField val description: String?, + @JvmField val isTransient: Boolean, + @JvmField val statusLabel: String? +) { + override fun toString(): String { + return StringBuilder("WifiIndicators[") + .append("enabled=").append(enabled) + .append(",statusIcon=").append(statusIcon?.toString() ?: "") + .append(",qsIcon=").append(qsIcon?.toString() ?: "") + .append(",activityIn=").append(activityIn) + .append(",activityOut=").append(activityOut) + .append(",qsDescription=").append(description) + .append(",isTransient=").append(isTransient) + .append(",statusLabel=").append(statusLabel) + .append(']').toString() + } +} + +/** Box type for [SignalCallback.setMobileDataIndicators] */ +data class MobileDataIndicators( + @JvmField val statusIcon: IconState?, + @JvmField val qsIcon: IconState?, + @JvmField val statusType: Int, + @JvmField val qsType: Int, + @JvmField val activityIn: Boolean, + @JvmField val activityOut: Boolean, + @JvmField val typeContentDescription: CharSequence?, + @JvmField val typeContentDescriptionHtml: CharSequence?, + @JvmField val qsDescription: CharSequence?, + @JvmField val subId: Int, + @JvmField val roaming: Boolean, + @JvmField val showTriangle: Boolean +) { + override fun toString(): String { + return java.lang.StringBuilder("MobileDataIndicators[") + .append("statusIcon=").append(statusIcon?.toString() ?: "") + .append(",qsIcon=").append(qsIcon?.toString() ?: "") + .append(",statusType=").append(statusType) + .append(",qsType=").append(qsType) + .append(",activityIn=").append(activityIn) + .append(",activityOut=").append(activityOut) + .append(",typeContentDescription=").append(typeContentDescription) + .append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml) + .append(",description=").append(qsDescription) + .append(",subId=").append(subId) + .append(",roaming=").append(roaming) + .append(",showTriangle=").append(showTriangle) + .append(']').toString() + } +} + +/** Box for an icon with its visibility and content description */ +data class IconState( + @JvmField val visible: Boolean, + @JvmField val icon: Int, + @JvmField val contentDescription: String +) { + override fun toString(): String { + val builder = java.lang.StringBuilder() + return builder.append("[visible=").append(visible).append(',') + .append("icon=").append(icon).append(',') + .append("contentDescription=").append(contentDescription).append(']') + .toString() + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java index d23dba579be61..56910c0eb7735 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java @@ -23,8 +23,6 @@ import android.util.Log; import com.android.settingslib.SignalIcon.IconGroup; import com.android.settingslib.SignalIcon.State; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; import java.io.PrintWriter; import java.util.BitSet; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java index 3622a66767a3a..3e703eda5f550 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -37,10 +37,6 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.wifi.WifiStatusTracker; import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; import java.io.PrintWriter; import java.util.Objects; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java index d5912e0ddbe78..678f3ca5480e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java @@ -26,6 +26,7 @@ import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedul import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.SHOWING_PERSISTENT_DOT; import android.animation.ValueAnimator; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Fragment; import android.os.Bundle; @@ -46,8 +47,9 @@ import com.android.systemui.statusbar.DisableFlagsLogger.DisableState; import com.android.systemui.statusbar.OperatorNameView; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; @@ -107,7 +109,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private SignalCallback mSignalCallback = new SignalCallback() { @Override - public void setIsAirplaneMode(NetworkController.IconState icon) { + public void setIsAirplaneMode(@NonNull IconState icon) { mCommandQueue.recomputeDisableFlags(getContext().getDisplayId(), true /* animate */); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index fbd9ef7e37074..9c69f51332a69 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.annotation.NonNull; import android.content.Context; import android.os.Handler; import android.telephony.SubscriptionInfo; @@ -26,11 +27,11 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.statusbar.connectivity.IconState; +import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; -import com.android.systemui.statusbar.connectivity.NetworkControllerImpl; +import com.android.systemui.statusbar.connectivity.SignalCallback; +import com.android.systemui.statusbar.connectivity.WifiIndicators; import com.android.systemui.statusbar.policy.SecurityController; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -44,7 +45,7 @@ import javax.inject.Inject; /** Controls the signal policies for icons shown in the StatusBar. **/ @SysUISingleton -public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallback, +public class StatusBarSignalPolicy implements SignalCallback, SecurityController.SecurityControllerCallback, Tunable { private static final String TAG = "StatusBarSignalPolicy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -169,7 +170,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setWifiIndicators(WifiIndicators indicators) { + public void setWifiIndicators(@NonNull WifiIndicators indicators) { if (DEBUG) { Log.d(TAG, "setWifiIndicators: " + indicators); } @@ -219,7 +220,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setCallIndicator(IconState statusIcon, int subId) { + public void setCallIndicator(@NonNull IconState statusIcon, int subId) { if (DEBUG) { Log.d(TAG, "setCallIndicator: " + "statusIcon = " + statusIcon + "," @@ -247,7 +248,7 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setMobileDataIndicators(MobileDataIndicators indicators) { + public void setMobileDataIndicators(@NonNull MobileDataIndicators indicators) { if (DEBUG) { Log.d(TAG, "setMobileDataIndicators: " + indicators); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java index 92908790770a1..b6a96a7e49b93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java @@ -23,6 +23,7 @@ import com.android.internal.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.connectivity.AccessPointControllerImpl; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkControllerImpl; @@ -135,7 +136,7 @@ public interface StatusBarPolicyModule { /** */ @Binds - NetworkController.AccessPointController provideAccessPointController( + AccessPointController provideAccessPointController( AccessPointControllerImpl accessPointControllerImpl); /** */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java index 8ae7100e2e60f..bd794d6813ec2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java @@ -39,8 +39,10 @@ import androidx.test.filters.SmallTest; import com.android.keyguard.CarrierTextManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.statusbar.connectivity.IconState; +import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.util.CarrierConfigTracker; import com.android.systemui.utils.leaks.LeakCheckedTest; import com.android.systemui.utils.os.FakeHandler; @@ -57,7 +59,7 @@ import org.mockito.MockitoAnnotations; public class QSCarrierGroupControllerTest extends LeakCheckedTest { private QSCarrierGroupController mQSCarrierGroupController; - private NetworkController.SignalCallback mSignalCallback; + private SignalCallback mSignalCallback; private CarrierTextManager.CarrierTextCallback mCallback; @Mock private QSCarrierGroup mQSCarrierGroup; @@ -94,7 +96,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { when(mNetworkController.hasVoiceCallingFeature()).thenReturn(true); doAnswer(invocation -> mSignalCallback = invocation.getArgument(0)) .when(mNetworkController) - .addCallback(any(NetworkController.SignalCallback.class)); + .addCallback(any(SignalCallback.class)); when(mCarrierTextControllerBuilder.setShowAirplaneMode(anyBoolean())) .thenReturn(mCarrierTextControllerBuilder); @@ -230,8 +232,8 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { mSlotIndexResolver.overrideInvalid = true; MobileDataIndicators indicators = new MobileDataIndicators( - mock(NetworkController.IconState.class), - mock(NetworkController.IconState.class), + mock(IconState.class), + mock(IconState.class), 0, 0, true, true, "", "", "", 0, true, true); mSignalCallback.setMobileDataIndicators(indicators); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java index f0bd06571eb98..5a49337fe640e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java @@ -43,8 +43,10 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.statusbar.connectivity.IconState; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; +import com.android.systemui.statusbar.connectivity.SignalCallback; +import com.android.systemui.statusbar.connectivity.WifiIndicators; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.CastController.CastDevice; import com.android.systemui.statusbar.policy.HotspotController; @@ -77,7 +79,7 @@ public class CastTileTest extends SysuiTestCase { @Mock private QSTileHost mHost; @Mock - NetworkController.SignalCallback mSignalCallback; + SignalCallback mSignalCallback; @Mock private MetricsLogger mMetricsLogger; @Mock @@ -122,8 +124,8 @@ public class CastTileTest extends SysuiTestCase { mTestableLooper.processAllMessages(); mCastTile.handleSetListening(true); - ArgumentCaptor signalCallbackArgumentCaptor = - ArgumentCaptor.forClass(NetworkController.SignalCallback.class); + ArgumentCaptor signalCallbackArgumentCaptor = + ArgumentCaptor.forClass(SignalCallback.class); verify(mNetworkController).observe(any(LifecycleOwner.class), signalCallbackArgumentCaptor.capture()); mSignalCallback = signalCallbackArgumentCaptor.getValue(); @@ -139,10 +141,9 @@ public class CastTileTest extends SysuiTestCase { // All these tests for enabled/disabled wifi have hotspot not enabled @Test public void testStateUnavailable_wifiDisabled() { - NetworkController.IconState qsIcon = - new NetworkController.IconState(false, 0, ""); + IconState qsIcon = new IconState(false, 0, ""); WifiIndicators indicators = new WifiIndicators( - false, mock(NetworkController.IconState.class), + false, mock(IconState.class), qsIcon, false,false, "", false, ""); mSignalCallback.setWifiIndicators(indicators); @@ -153,10 +154,9 @@ public class CastTileTest extends SysuiTestCase { @Test public void testStateUnavailable_wifiNotConnected() { - NetworkController.IconState qsIcon = - new NetworkController.IconState(false, 0, ""); + IconState qsIcon = new IconState(false, 0, ""); WifiIndicators indicators = new WifiIndicators( - true, mock(NetworkController.IconState.class), + true, mock(IconState.class), qsIcon, false,false, "", false, ""); mSignalCallback.setWifiIndicators(indicators); @@ -166,10 +166,9 @@ public class CastTileTest extends SysuiTestCase { } private void enableWifiAndProcessMessages() { - NetworkController.IconState qsIcon = - new NetworkController.IconState(true, 0, ""); + IconState qsIcon = new IconState(true, 0, ""); WifiIndicators indicators = new WifiIndicators( - true, mock(NetworkController.IconState.class), + true, mock(IconState.class), qsIcon, false,false, "", false, ""); mSignalCallback.setWifiIndicators(indicators); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index eb03b5ff2a6c0..ca8903bfe0097 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -49,8 +49,7 @@ import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.AccessPointController; +import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.LocationController; import com.android.systemui.toast.SystemUIToast; @@ -104,7 +103,7 @@ public class InternetDialogControllerTest extends SysuiTestCase { @Mock private KeyguardStateController mKeyguardStateController; @Mock - private NetworkController.AccessPointController mAccessPointController; + private AccessPointController mAccessPointController; @Mock private WifiEntry mConnectedEntry; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt index 7896a26badbe1..c57b64db2c5ce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/AccessPointControllerImplTest.kt @@ -56,9 +56,9 @@ class AccessPointControllerImplTest : SysuiTestCase() { @Mock private lateinit var wifiPickerTracker: WifiPickerTracker @Mock - private lateinit var callback: NetworkController.AccessPointController.AccessPointCallback + private lateinit var callback: AccessPointController.AccessPointCallback @Mock - private lateinit var otherCallback: NetworkController.AccessPointController.AccessPointCallback + private lateinit var otherCallback: AccessPointController.AccessPointCallback @Mock private lateinit var wifiEntryConnected: WifiEntry @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java index 11a53c55c0248..2d29c80a15ac6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java @@ -29,10 +29,6 @@ import androidx.test.runner.AndroidJUnit4; import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.connectivity.NetworkController.EmergencyListener; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; import com.android.systemui.tests.R; import org.junit.Before; 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 b23d07a314b43..47a11fcdcee47 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,9 +72,6 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; -import com.android.systemui.statusbar.connectivity.NetworkController.MobileDataIndicators; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.telephony.TelephonyListenerManager; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java index 675d755ad3e35..f6f939ad2e129 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java @@ -23,8 +23,6 @@ import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; -import com.android.systemui.statusbar.connectivity.NetworkController.IconState; - import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java index ffeaf207942b5..a39971d273036 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java @@ -36,7 +36,6 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import com.android.settingslib.mobile.TelephonyIcons; -import com.android.systemui.statusbar.connectivity.NetworkController.WifiIndicators; import org.junit.Before; import org.junit.Test; diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java index 8ea9da6f4d0e4..33ef9cf7a9c52 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeNetworkController.java @@ -18,8 +18,9 @@ import android.os.Bundle; import android.testing.LeakCheck; import com.android.settingslib.net.DataUsageController; +import com.android.systemui.statusbar.connectivity.AccessPointController; import com.android.systemui.statusbar.connectivity.NetworkController; -import com.android.systemui.statusbar.connectivity.NetworkController.SignalCallback; +import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.policy.DataSaverController; public class FakeNetworkController extends BaseLeakChecker From 1bb401dd889f91631c49ecdb102c61fcb5d450f6 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Thu, 7 Oct 2021 11:37:27 -0400 Subject: [PATCH 2/3] Re-internalize MobileState and State from SettingsLib ConnectivityState (nee State) lived in SettingsLib because of the fact that MobileMappings needed the MobileIconGroup class, which lived inside of SignalIcon.java. The whole thing is a bit messy, but this CL moves the state objects back into the connectivity package where they belong. Also move MobileState and WifiState into their own kotlin classes. Bug: 197851948 Test: atest SystemUITests Change-Id: I2997c66dbffb5e44b8f53b9020cdeb8b614cea3b --- .../com/android/settingslib/SignalIcon.java | 199 +----------------- .../connectivity/ConnectivityState.kt | 104 +++++++++ .../EthernetSignalController.java | 7 +- .../connectivity/MobileSignalController.java | 1 - .../statusbar/connectivity/MobileState.kt | 132 ++++++++++++ .../connectivity/NetworkControllerImpl.java | 2 +- .../connectivity/SignalController.java | 7 +- .../connectivity/WifiSignalController.java | 52 +---- .../statusbar/connectivity/WifiState.kt | 78 +++++++ .../connectivity}/MobileStateTest.java | 14 +- 10 files changed, 332 insertions(+), 264 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityState.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileState.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiState.kt rename packages/{SettingsLib/tests/robotests/src/com/android/settingslib => SystemUI/tests/src/com/android/systemui/statusbar/connectivity}/MobileStateTest.java (90%) diff --git a/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java b/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java index 794b0eb665199..280e40726c031 100644 --- a/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java +++ b/packages/SettingsLib/src/com/android/settingslib/SignalIcon.java @@ -15,13 +15,8 @@ */ package com.android.settingslib; -import com.android.settingslib.mobile.TelephonyIcons; - -import java.text.SimpleDateFormat; -import java.util.Objects; - /** - * Icons and states for SysUI and Settings. + * Icons for SysUI and Settings. */ public class SignalIcon { @@ -70,92 +65,6 @@ public class SignalIcon { } } - /** - * Holds states for SysUI. - */ - public static class State { - // No locale as it's only used for logging purposes - private static SimpleDateFormat sSDF = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); - public boolean connected; - public boolean enabled; - public boolean activityIn; - public boolean activityOut; - public int level; - public IconGroup iconGroup; - public int inetCondition; - public int rssi; // Only for logging. - - // Not used for comparison, just used for logging. - public long time; - - /** - * Generates a copy of the source state. - */ - public void copyFrom(State state) { - connected = state.connected; - enabled = state.enabled; - level = state.level; - iconGroup = state.iconGroup; - inetCondition = state.inetCondition; - activityIn = state.activityIn; - activityOut = state.activityOut; - rssi = state.rssi; - time = state.time; - } - - @Override - public String toString() { - if (time != 0) { - StringBuilder builder = new StringBuilder(); - toString(builder); - return builder.toString(); - } else { - return "Empty " + getClass().getSimpleName(); - } - } - - protected void toString(StringBuilder builder) { - builder.append("connected=").append(connected).append(',') - .append("enabled=").append(enabled).append(',') - .append("level=").append(level).append(',') - .append("inetCondition=").append(inetCondition).append(',') - .append("iconGroup=").append(iconGroup).append(',') - .append("activityIn=").append(activityIn).append(',') - .append("activityOut=").append(activityOut).append(',') - .append("rssi=").append(rssi).append(',') - .append("lastModified=").append(sSDF.format(time)); - } - - @Override - public boolean equals(Object o) { - if (!o.getClass().equals(getClass())) { - return false; - } - State other = (State) o; - return other.connected == connected - && other.enabled == enabled - && other.level == level - && other.inetCondition == inetCondition - && other.iconGroup == iconGroup - && other.activityIn == activityIn - && other.activityOut == activityOut - && other.rssi == rssi; - } - - @Override - public int hashCode() { - return Objects.hash( - connected, - enabled, - level, - inetCondition, - iconGroup, - activityIn, - activityOut, - rssi); - } - } - /** * Holds icons for a given MobileState. */ @@ -189,110 +98,4 @@ public class SignalIcon { this.dataType = dataType; } } - - /** - * Holds mobile states for SysUI. - */ - public static class MobileState extends State { - public String networkName; - public String networkNameData; - public boolean dataSim; - public boolean dataConnected; - public boolean isEmergency; - public boolean airplaneMode; - public boolean carrierNetworkChangeMode; - public boolean isDefault; - public boolean userSetup; - public boolean roaming; - public boolean defaultDataOff; // Tracks the on/off state of the defaultDataSubscription - - @Override - public void copyFrom(State s) { - super.copyFrom(s); - MobileState state = (MobileState) s; - dataSim = state.dataSim; - networkName = state.networkName; - networkNameData = state.networkNameData; - dataConnected = state.dataConnected; - isDefault = state.isDefault; - isEmergency = state.isEmergency; - airplaneMode = state.airplaneMode; - carrierNetworkChangeMode = state.carrierNetworkChangeMode; - userSetup = state.userSetup; - roaming = state.roaming; - defaultDataOff = state.defaultDataOff; - } - - /** @return true if this state is disabled or not default data */ - public boolean isDataDisabledOrNotDefault() { - return (iconGroup == TelephonyIcons.DATA_DISABLED - || (iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) && userSetup; - } - - /** @return if this state is considered to have inbound activity */ - public boolean hasActivityIn() { - return dataConnected && !carrierNetworkChangeMode && activityIn; - } - - /** @return if this state is considered to have outbound activity */ - public boolean hasActivityOut() { - return dataConnected && !carrierNetworkChangeMode && activityOut; - } - - /** @return true if this state should show a RAT icon in quick settings */ - public boolean showQuickSettingsRatIcon() { - return dataConnected || isDataDisabledOrNotDefault(); - } - - @Override - protected void toString(StringBuilder builder) { - super.toString(builder); - builder.append(','); - builder.append("dataSim=").append(dataSim).append(','); - builder.append("networkName=").append(networkName).append(','); - builder.append("networkNameData=").append(networkNameData).append(','); - builder.append("dataConnected=").append(dataConnected).append(','); - builder.append("roaming=").append(roaming).append(','); - builder.append("isDefault=").append(isDefault).append(','); - builder.append("isEmergency=").append(isEmergency).append(','); - builder.append("airplaneMode=").append(airplaneMode).append(','); - builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) - .append(','); - builder.append("userSetup=").append(userSetup).append(','); - builder.append("defaultDataOff=").append(defaultDataOff).append(','); - builder.append("showQuickSettingsRatIcon=").append(showQuickSettingsRatIcon()); - } - - @Override - public boolean equals(Object o) { - return super.equals(o) - && Objects.equals(((MobileState) o).networkName, networkName) - && Objects.equals(((MobileState) o).networkNameData, networkNameData) - && ((MobileState) o).dataSim == dataSim - && ((MobileState) o).dataConnected == dataConnected - && ((MobileState) o).isEmergency == isEmergency - && ((MobileState) o).airplaneMode == airplaneMode - && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode - && ((MobileState) o).userSetup == userSetup - && ((MobileState) o).isDefault == isDefault - && ((MobileState) o).roaming == roaming - && ((MobileState) o).defaultDataOff == defaultDataOff; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), - networkName, - networkNameData, - dataSim, - dataConnected, - isEmergency, - airplaneMode, - carrierNetworkChangeMode, - userSetup, - isDefault, - roaming, - defaultDataOff); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityState.kt new file mode 100644 index 0000000000000..9c3c10c9219ba --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/ConnectivityState.kt @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.connectivity + +import android.annotation.SuppressLint +import com.android.settingslib.SignalIcon.IconGroup +import java.text.SimpleDateFormat + +/** + * Base type for various connectivity states, for use with [SignalController] and its subtypes + */ +open class ConnectivityState { + @JvmField var connected = false + @JvmField var enabled = false + @JvmField var activityIn = false + @JvmField var activityOut = false + @JvmField var level = 0 + @JvmField var iconGroup: IconGroup? = null + @JvmField var inetCondition = 0 + // Only for logging. + @JvmField var rssi = 0 + // Not used for comparison, just used for logging. + @JvmField var time: Long = 0 + + override fun toString(): String { + return if (time != 0L) { + val builder = StringBuilder() + toString(builder) + builder.toString() + } else { + "Empty " + javaClass.simpleName + } + } + + protected open fun copyFrom(other: ConnectivityState) { + connected = other.connected + enabled = other.enabled + activityIn = other.activityIn + activityOut = other.activityOut + level = other.level + iconGroup = other.iconGroup + inetCondition = other.inetCondition + rssi = other.rssi + time = other.time + } + + protected open fun toString(builder: StringBuilder) { + builder.append("connected=$connected,") + .append("enabled=$enabled,") + .append("level=$level,") + .append("inetCondition=$inetCondition,") + .append("iconGroup=$iconGroup,") + .append("activityIn=$activityIn,") + .append("activityOut=$activityOut,") + .append("rssi=$rssi,") + .append("lastModified=${sSDF.format(time)}") + } + + override fun equals(other: Any?): Boolean { + if (other == null) return false + if (other.javaClass != javaClass) return false + + val o = other as ConnectivityState + return o.connected == connected && + o.enabled == enabled && + o.level == level && + o.inetCondition == inetCondition && + o.iconGroup === iconGroup && + o.activityIn == activityIn && + o.activityOut == activityOut && + o.rssi == rssi + } + + override fun hashCode(): Int { + var result = connected.hashCode() + result = 31 * result + enabled.hashCode() + result = 31 * result + activityIn.hashCode() + result = 31 * result + activityOut.hashCode() + result = 31 * result + level + result = 31 * result + (iconGroup?.hashCode() ?: 0) + result = 31 * result + inetCondition + result = 31 * result + rssi + result = 31 * result + time.hashCode() + return result + } +} + +// No locale as it's only used for logging purposes +@SuppressLint("SimpleDateFormat") +private val sSDF = SimpleDateFormat("MM-dd HH:mm:ss.SSS") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java index 6cc55673a4ea3..acd97795c1280 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/EthernetSignalController.java @@ -20,13 +20,12 @@ import android.net.NetworkCapabilities; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.IconGroup; -import com.android.settingslib.SignalIcon.State; import java.util.BitSet; /** */ public class EthernetSignalController extends - SignalController { + SignalController { public EthernetSignalController(Context context, CallbackHandler callbackHandler, NetworkControllerImpl networkController) { @@ -66,7 +65,7 @@ public class EthernetSignalController extends } @Override - public State cleanState() { - return new State(); + public ConnectivityState cleanState() { + return new ConnectivityState(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java index a3844954587b1..ddb3efe66a800 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java @@ -47,7 +47,6 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.MobileIconGroup; -import com.android.settingslib.SignalIcon.MobileState; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.MobileMappings.Config; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileState.kt new file mode 100644 index 0000000000000..e8d053010e7fc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileState.kt @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.connectivity + +import com.android.settingslib.mobile.TelephonyIcons +import java.lang.IllegalArgumentException + +/** + * Box for all policy-related state used in [MobileSignalController] + */ +internal class MobileState( + @JvmField var networkName: String? = null, + @JvmField var networkNameData: String? = null, + @JvmField var dataSim: Boolean = false, + @JvmField var dataConnected: Boolean = false, + @JvmField var isEmergency: Boolean = false, + @JvmField var airplaneMode: Boolean = false, + @JvmField var carrierNetworkChangeMode: Boolean = false, + @JvmField var isDefault: Boolean = false, + @JvmField var userSetup: Boolean = false, + @JvmField var roaming: Boolean = false, + // Tracks the on/off state of the defaultDataSubscription + @JvmField var defaultDataOff: Boolean = false +) : ConnectivityState() { + + /** @return true if this state is disabled or not default data */ + val isDataDisabledOrNotDefault: Boolean + get() = (iconGroup === TelephonyIcons.DATA_DISABLED + || iconGroup === TelephonyIcons.NOT_DEFAULT_DATA) && userSetup + + /** @return if this state is considered to have inbound activity */ + fun hasActivityIn(): Boolean { + return dataConnected && !carrierNetworkChangeMode && activityIn + } + + /** @return if this state is considered to have outbound activity */ + fun hasActivityOut(): Boolean { + return dataConnected && !carrierNetworkChangeMode && activityOut + } + + /** @return true if this state should show a RAT icon in quick settings */ + fun showQuickSettingsRatIcon(): Boolean { + return dataConnected || isDataDisabledOrNotDefault + } + + override fun copyFrom(other: ConnectivityState) { + val o = other as? MobileState ?: throw IllegalArgumentException( + "MobileState can only update from another MobileState") + + super.copyFrom(o) + networkName = o.networkName + networkNameData = o.networkNameData + dataSim = o.dataSim + dataConnected = o.dataConnected + isEmergency = o.isEmergency + airplaneMode = o.airplaneMode + carrierNetworkChangeMode = o.carrierNetworkChangeMode + isDefault = o.isDefault + userSetup = o.userSetup + roaming = o.roaming + defaultDataOff = o.defaultDataOff + } + + override fun toString(builder: StringBuilder) { + builder.append("connected=$connected,") + .append(',') + .append("dataSim=$dataSim,") + .append("networkName=$networkName,") + .append("networkNameData=$networkNameData,") + .append("dataConnected=$dataConnected,") + .append("roaming=$roaming,") + .append("isDefault=$isDefault,") + .append("isEmergency=$isEmergency,") + .append("airplaneMode=$airplaneMode,") + .append("carrierNetworkChangeMode=$carrierNetworkChangeMode,") + .append("userSetup=$userSetup,") + .append("defaultDataOff=$defaultDataOff,") + .append("showQuickSettingsRatIcon=${showQuickSettingsRatIcon()}") + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + if (!super.equals(other)) return false + + other as MobileState + + if (networkName != other.networkName) return false + if (networkNameData != other.networkNameData) return false + if (dataSim != other.dataSim) return false + if (dataConnected != other.dataConnected) return false + if (isEmergency != other.isEmergency) return false + if (airplaneMode != other.airplaneMode) return false + if (carrierNetworkChangeMode != other.carrierNetworkChangeMode) return false + if (isDefault != other.isDefault) return false + if (userSetup != other.userSetup) return false + if (roaming != other.roaming) return false + if (defaultDataOff != other.defaultDataOff) return false + + return true + } + + override fun hashCode(): Int { + var result = super.hashCode() + result = 31 * result + (networkName?.hashCode() ?: 0) + result = 31 * result + (networkNameData?.hashCode() ?: 0) + result = 31 * result + dataSim.hashCode() + result = 31 * result + dataConnected.hashCode() + result = 31 * result + isEmergency.hashCode() + result = 31 * result + airplaneMode.hashCode() + result = 31 * result + carrierNetworkChangeMode.hashCode() + result = 31 * result + isDefault.hashCode() + result = 31 * result + userSetup.hashCode() + result = 31 * result + roaming.hashCode() + result = 31 * result + defaultDataOff.hashCode() + return result + } +} 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 e55aae4ebe7ab..3f5ef4806a1e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -1212,7 +1212,7 @@ public class NetworkControllerImpl extends BroadcastReceiver } private boolean mDemoInetCondition; - private WifiSignalController.WifiState mDemoWifiState; + private WifiState mDemoWifiState; @Override public void onDemoModeStarted() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java index 56910c0eb7735..cd2006899cfc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalController.java @@ -22,7 +22,6 @@ import android.content.Context; import android.util.Log; import com.android.settingslib.SignalIcon.IconGroup; -import com.android.settingslib.SignalIcon.State; import java.io.PrintWriter; import java.util.BitSet; @@ -34,7 +33,7 @@ import java.util.BitSet; * @param State of the SysUI controller. * @param Icon groups of the SysUI controller for a given State. */ -public abstract class SignalController { +public abstract class SignalController { // Save the previous SignalController.States of all SignalControllers for dumps. static final boolean RECORD_HISTORY = true; // If RECORD_HISTORY how many to save, must be a power of 2. @@ -56,7 +55,7 @@ public abstract class SignalController { private final CallbackHandler mCallbackHandler; // Save the previous HISTORY_SIZE states for logging. - private final State[] mHistory; + private final ConnectivityState[] mHistory; // Where to copy the next state into. private int mHistoryIndex; @@ -70,7 +69,7 @@ public abstract class SignalController { mCurrentState = cleanState(); mLastState = cleanState(); if (RECORD_HISTORY) { - mHistory = new State[HISTORY_SIZE]; + mHistory = new ConnectivityState[HISTORY_SIZE]; for (int i = 0; i < HISTORY_SIZE; i++) { mHistory[i] = cleanState(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java index 3e703eda5f550..103ca0ebc6ca3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -26,12 +26,10 @@ import android.net.NetworkCapabilities; import android.net.NetworkScoreManager; import android.net.wifi.WifiManager; import android.text.Html; -import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.SignalIcon.IconGroup; import com.android.settingslib.SignalIcon.MobileIconGroup; -import com.android.settingslib.SignalIcon.State; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.wifi.WifiStatusTracker; @@ -39,11 +37,9 @@ import com.android.systemui.R; import com.android.systemui.flags.FeatureFlags; import java.io.PrintWriter; -import java.util.Objects; /** */ -public class WifiSignalController extends - SignalController { +public class WifiSignalController extends SignalController { private final boolean mHasMobileDataFeature; private final WifiStatusTracker mWifiTracker; private final IconGroup mUnmergedWifiIconGroup = WifiIcons.UNMERGED_WIFI; @@ -268,50 +264,4 @@ public class WifiSignalController extends setActivity(state); } } - - static class WifiState extends State { - public String ssid; - public boolean isTransient; - public boolean isDefault; - public String statusLabel; - public boolean isCarrierMerged; - public int subId; - - @Override - public void copyFrom(State s) { - super.copyFrom(s); - WifiState state = (WifiState) s; - ssid = state.ssid; - isTransient = state.isTransient; - isDefault = state.isDefault; - statusLabel = state.statusLabel; - isCarrierMerged = state.isCarrierMerged; - subId = state.subId; - } - - @Override - protected void toString(StringBuilder builder) { - super.toString(builder); - builder.append(",ssid=").append(ssid) - .append(",isTransient=").append(isTransient) - .append(",isDefault=").append(isDefault) - .append(",statusLabel=").append(statusLabel) - .append(",isCarrierMerged=").append(isCarrierMerged) - .append(",subId=").append(subId); - } - - @Override - public boolean equals(Object o) { - if (!super.equals(o)) { - return false; - } - WifiState other = (WifiState) o; - return Objects.equals(other.ssid, ssid) - && other.isTransient == isTransient - && other.isDefault == isDefault - && TextUtils.equals(other.statusLabel, statusLabel) - && other.isCarrierMerged == isCarrierMerged - && other.subId == subId; - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiState.kt new file mode 100644 index 0000000000000..ac15f78191f68 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiState.kt @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.connectivity + +import java.lang.StringBuilder + +internal class WifiState( + @JvmField var ssid: String? = null, + @JvmField var isTransient: Boolean = false, + @JvmField var isDefault: Boolean = false, + @JvmField var statusLabel: String? = null, + @JvmField var isCarrierMerged: Boolean = false, + @JvmField var subId: Int = 0 +) : ConnectivityState() { + + public override fun copyFrom(s: ConnectivityState) { + super.copyFrom(s) + val state = s as WifiState + ssid = state.ssid + isTransient = state.isTransient + isDefault = state.isDefault + statusLabel = state.statusLabel + isCarrierMerged = state.isCarrierMerged + subId = state.subId + } + + override fun toString(builder: StringBuilder) { + super.toString(builder) + builder.append(",ssid=").append(ssid) + .append(",isTransient=").append(isTransient) + .append(",isDefault=").append(isDefault) + .append(",statusLabel=").append(statusLabel) + .append(",isCarrierMerged=").append(isCarrierMerged) + .append(",subId=").append(subId) + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + if (!super.equals(other)) return false + + other as WifiState + + if (ssid != other.ssid) return false + if (isTransient != other.isTransient) return false + if (isDefault != other.isDefault) return false + if (statusLabel != other.statusLabel) return false + if (isCarrierMerged != other.isCarrierMerged) return false + if (subId != other.subId) return false + + return true + } + + override fun hashCode(): Int { + var result = super.hashCode() + result = 31 * result + (ssid?.hashCode() ?: 0) + result = 31 * result + isTransient.hashCode() + result = 31 * result + isDefault.hashCode() + result = 31 * result + (statusLabel?.hashCode() ?: 0) + result = 31 * result + isCarrierMerged.hashCode() + result = 31 * result + subId + return result + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/MobileStateTest.java similarity index 90% rename from packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java rename to packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/MobileStateTest.java index 92a32bce17992..7ddfde370afa0 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/MobileStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/MobileStateTest.java @@ -14,22 +14,26 @@ * limitations under the License. */ -package com.android.settingslib; +package com.android.systemui.statusbar.connectivity; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; + import com.android.settingslib.mobile.TelephonyIcons; +import com.android.systemui.SysuiTestCase; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -@RunWith(RobolectricTestRunner.class) -public class MobileStateTest { +@SmallTest +@RunWith(AndroidTestingRunner.class) +public class MobileStateTest extends SysuiTestCase { - private SignalIcon.MobileState mState = new SignalIcon.MobileState(); + private final MobileState mState = new MobileState(); @Before public void setUp() { From b8f0bd20fd0aa6dee44ea49da3bb8fb8045b6714 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Tue, 12 Oct 2021 15:08:33 -0400 Subject: [PATCH 3/3] Remove instance fields from MobileSignalController MobileSignalController (MSC) was storing a few fields as instance members on itself, and thus would lose that historical information and make it so logs could not give the full picture of what the state was in the past This change makes a couple of changes to make things simpler: 1. Move all telephony data onto the MobileState object, making it so the full decision-making state object is stored at every historical level 2. Attach MobileState and MobileStatus directly so MobileState reads its fields directly from the update 3. Log only the used fields from ServiceState and SignalStrength Things are in a much better state here, but the next step should be to formalize the difference between the fields that get set directly from MobileStatus, and the ones that are updated in MSC#updateTelephony Test: atest SystemUITests Bug: 197851948 Change-Id: Ia35a13ee36b8e41b9ca86506de56f98de4891006 --- .../connectivity/MobileSignalController.java | 105 ++++++--------- .../statusbar/connectivity/MobileState.kt | 125 +++++++++++++++--- 2 files changed, 150 insertions(+), 80 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java index ddb3efe66a800..9ae7ea2bdded9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/MobileSignalController.java @@ -33,7 +33,6 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.telephony.ims.ImsException; import android.telephony.ims.ImsMmTelManager; @@ -47,7 +46,6 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.AccessibilityContentDescriptions; import com.android.settingslib.SignalIcon.MobileIconGroup; -import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.MobileMappings.Config; import com.android.settingslib.mobile.MobileStatusTracker; @@ -89,15 +87,6 @@ public class MobileSignalController extends SignalController mNetworkToIconLookup; - // Since some pieces of the phone state are interdependent we store it locally, - // this could potentially become part of MobileState for simplification/complication - // of code. - private int mDataState = TelephonyManager.DATA_DISCONNECTED; - private TelephonyDisplayInfo mTelephonyDisplayInfo = - new TelephonyDisplayInfo(TelephonyManager.NETWORK_TYPE_UNKNOWN, - TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE); - private ServiceState mServiceState; - private SignalStrength mSignalStrength; private int mLastLevel; private MobileIconGroup mDefaultIcons; private Config mConfig; @@ -464,16 +453,8 @@ public class MobileSignalController extends SignalController