diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java index 1343895ed93dd..4332bd24e1d18 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java @@ -30,6 +30,7 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; import android.os.Handler; +import android.os.HandlerThread; import android.os.Looper; import android.provider.Settings; @@ -53,20 +54,14 @@ public class WifiStatusTracker { private final WifiManager mWifiManager; private final NetworkScoreManager mNetworkScoreManager; private final ConnectivityManager mConnectivityManager; - private final Handler mHandler = new Handler(Looper.getMainLooper()); + private final Handler mHandler; + private final Handler mMainThreadHandler; private final Set mNetworks = new HashSet<>(); // Save the previous HISTORY_SIZE states for logging. private final String[] mHistory = new String[HISTORY_SIZE]; // Where to copy the next state into. private int mHistoryIndex; - private final WifiNetworkScoreCache.CacheListener mCacheListener = - new WifiNetworkScoreCache.CacheListener(mHandler) { - @Override - public void networkCacheUpdated(List updatedNetworks) { - updateStatusLabel(); - mCallback.run(); - } - }; + private final WifiNetworkScoreCache.CacheListener mCacheListener; private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder() .clearCapabilities() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) @@ -113,7 +108,7 @@ public class WifiStatusTracker { } updateWifiInfo(wifiInfo); updateStatusLabel(); - mCallback.run(); + mMainThreadHandler.post(() -> postResults()); } @Override @@ -128,7 +123,7 @@ public class WifiStatusTracker { mNetworks.remove(network.getNetId()); updateWifiInfo(null); updateStatusLabel(); - mCallback.run(); + mMainThreadHandler.post(() -> postResults()); } } }; @@ -143,7 +138,7 @@ public class WifiStatusTracker { mDefaultNetwork = network; mDefaultNetworkCapabilities = nc; updateStatusLabel(); - mCallback.run(); + mMainThreadHandler.post(() -> postResults()); } @Override public void onLost(Network network) { @@ -151,7 +146,7 @@ public class WifiStatusTracker { mDefaultNetwork = null; mDefaultNetworkCapabilities = null; updateStatusLabel(); - mCallback.run(); + mMainThreadHandler.post(() -> postResults()); } }; private Network mDefaultNetwork = null; @@ -174,12 +169,35 @@ public class WifiStatusTracker { public WifiStatusTracker(Context context, WifiManager wifiManager, NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager, Runnable callback) { + this(context, wifiManager, networkScoreManager, connectivityManager, callback, null, null); + } + + public WifiStatusTracker(Context context, WifiManager wifiManager, + NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager, + Runnable callback, Handler foregroundHandler, Handler backgroundHandler) { mContext = context; mWifiManager = wifiManager; mWifiNetworkScoreCache = new WifiNetworkScoreCache(context); mNetworkScoreManager = networkScoreManager; mConnectivityManager = connectivityManager; mCallback = callback; + if (backgroundHandler == null) { + HandlerThread handlerThread = new HandlerThread("WifiStatusTrackerHandler"); + handlerThread.start(); + mHandler = new Handler(handlerThread.getLooper()); + } else { + mHandler = backgroundHandler; + } + mMainThreadHandler = foregroundHandler == null + ? new Handler(Looper.getMainLooper()) : foregroundHandler; + mCacheListener = + new WifiNetworkScoreCache.CacheListener(mHandler) { + @Override + public void networkCacheUpdated(List updatedNetworks) { + updateStatusLabel(); + mMainThreadHandler.post(() -> postResults()); + } + }; } public void setListening(boolean listening) { @@ -332,7 +350,7 @@ public class WifiStatusTracker { /** Refresh the status label on Locale changed. */ public void refreshLocale() { updateStatusLabel(); - mCallback.run(); + mMainThreadHandler.post(() -> postResults()); } private String getValidSsid(WifiInfo info) { @@ -348,6 +366,10 @@ public class WifiStatusTracker { mHistoryIndex = (mHistoryIndex + 1) % HISTORY_SIZE; } + private void postResults() { + mCallback.run(); + } + /** Dump function. */ public void dump(PrintWriter pw) { pw.println(" - WiFi Network History ------"); 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 300c3a2205995..4c11307543e59 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/NetworkControllerImpl.java @@ -251,10 +251,10 @@ public class NetworkControllerImpl extends BroadcastReceiver broadcastDispatcher, demoModeController, carrierConfigTracker, + handler, featureFlags, dumpManager); mReceiverHandler.post(mRegisterListeners); - mMainHandler = handler; mInternetDialogFactory = internetDialogFactory; } @@ -274,12 +274,14 @@ public class NetworkControllerImpl extends BroadcastReceiver BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, CarrierConfigTracker carrierConfigTracker, + @Main Handler handler, FeatureFlags featureFlags, DumpManager dumpManager ) { mContext = context; mTelephonyListenerManager = telephonyListenerManager; mConfig = config; + mMainHandler = handler; mReceiverHandler = new Handler(bgLooper); mBgLooper = bgLooper; mBgExecutor = bgExecutor; @@ -315,7 +317,8 @@ public class NetworkControllerImpl extends BroadcastReceiver } }); mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature, - mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager); + mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager, + mMainHandler, mReceiverHandler); mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this); 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 2b924a420306e..b80df4ab394af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -25,6 +25,7 @@ import android.net.ConnectivityManager; import android.net.NetworkCapabilities; import android.net.NetworkScoreManager; import android.net.wifi.WifiManager; +import android.os.Handler; import android.text.Html; import com.android.internal.annotations.VisibleForTesting; @@ -34,6 +35,8 @@ import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.wifi.WifiStatusTracker; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.util.Assert; import java.io.PrintWriter; @@ -53,12 +56,14 @@ public class WifiSignalController extends SignalController NetworkControllerImpl networkController, WifiManager wifiManager, ConnectivityManager connectivityManager, - NetworkScoreManager networkScoreManager) { + NetworkScoreManager networkScoreManager, + @Main Handler handler, + @Background Handler backgroundHandler) { super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI, callbackHandler, networkController); mWifiManager = wifiManager; mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager, - connectivityManager, this::handleStatusUpdated); + connectivityManager, this::handleStatusUpdated, handler, backgroundHandler); mWifiTracker.setListening(true); mHasMobileDataFeature = hasMobileDataFeature; if (wifiManager != null) { 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 eef9dd46509f2..ca8a20acaa830 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 @@ -125,6 +125,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected DemoModeController mDemoModeController; protected CarrierConfigTracker mCarrierConfigTracker; protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); + protected Handler mMainHandler; protected FeatureFlags mFeatureFlags; protected int mSubId; @@ -174,9 +175,15 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockNsm = mock(NetworkScoreManager.class); mMockSubDefaults = mock(SubscriptionDefaults.class); mCarrierConfigTracker = mock(CarrierConfigTracker.class); + mMainHandler = mock(Handler.class); mNetCapabilities = new NetworkCapabilities(); when(mMockTm.isDataCapable()).thenReturn(true); when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm); + + doAnswer(invocation -> { + ((Runnable) invocation.getArgument(0)).run(); + return null; + }).when(mMainHandler).post(any()); doAnswer(invocation -> { int rssi = invocation.getArgument(0); if (rssi < -88) return 0; @@ -231,6 +238,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockBd, mDemoModeController, mCarrierConfigTracker, + mMainHandler, mFeatureFlags, mock(DumpManager.class) ); @@ -291,24 +299,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mNetworkController.doUpdateMobileControllers(); } - protected NetworkControllerImpl setUpNoMobileData() { - when(mMockTm.isDataCapable()).thenReturn(false); - NetworkControllerImpl networkControllerNoMobile = - new NetworkControllerImpl(mContext, mMockCm, mMockTm, mTelephonyListenerManager, - mMockWm, mMockNsm, mMockSm, - mConfig, TestableLooper.get(this).getLooper(), mFakeExecutor, - mCallbackHandler, - mock(AccessPointControllerImpl.class), - mock(DataUsageController.class), mMockSubDefaults, - mock(DeviceProvisionedController.class), mMockBd, mDemoModeController, - mCarrierConfigTracker, mFeatureFlags, - mock(DumpManager.class)); - - setupNetworkController(); - - return networkControllerNoMobile; - } - // 2 Bars 3G GSM. public void setupDefaultSignal() { setIsGsm(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java index 138881ab1b665..ccfa1b31b7990 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.net.NetworkCapabilities; +import android.os.Handler; import android.os.Looper; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; @@ -130,8 +131,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest { mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, mDemoModeController, - mock(CarrierConfigTracker.class), mFeatureFlags, - mock(DumpManager.class)); + mock(CarrierConfigTracker.class), new Handler(TestableLooper.get(this).getLooper()), + mFeatureFlags, mock(DumpManager.class)); setupNetworkController(); setupDefaultSignal(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java index 6262a9b628f5d..b84750aa7ea53 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerSignalTest.java @@ -84,6 +84,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockBd, mDemoModeController, mCarrierConfigTracker, + mMainHandler, mFeatureFlags, mock(DumpManager.class) ); @@ -117,6 +118,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { mMockBd, mDemoModeController, mCarrierConfigTracker, + mMainHandler, mFeatureFlags, mock(DumpManager.class) ); @@ -136,7 +138,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { Looper.getMainLooper(), mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, - mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags, + mDemoModeController, mock(CarrierConfigTracker.class), + mMainHandler, mFeatureFlags, mock(DumpManager.class)); setupNetworkController(); @@ -157,8 +160,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { Looper.getMainLooper(), mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, - mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags, - mock(DumpManager.class)); + mDemoModeController, mock(CarrierConfigTracker.class), + mMainHandler, mFeatureFlags, mock(DumpManager.class)); mNetworkController.registerListeners(); // Wait for the main looper to execute the previous command @@ -226,8 +229,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { Looper.getMainLooper(), mFakeExecutor, mCallbackHandler, mock(AccessPointControllerImpl.class), mock(DataUsageController.class), mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd, - mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags, - mock(DumpManager.class)); + mDemoModeController, mock(CarrierConfigTracker.class), + mMainHandler, mFeatureFlags, mock(DumpManager.class)); setupNetworkController(); // No Subscriptions. 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 b7b3088a9e268..3f71491592477 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 @@ -31,10 +31,11 @@ import android.net.vcn.VcnTransportInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.telephony.CellSignalStrength; -import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; +import androidx.test.filters.SmallTest; + import com.android.settingslib.mobile.TelephonyIcons; import org.junit.Before;