diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java index 85ba2571c17f4..4332bd24e1d18 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java @@ -54,9 +54,8 @@ public class WifiStatusTracker { private final WifiManager mWifiManager; private final NetworkScoreManager mNetworkScoreManager; private final ConnectivityManager mConnectivityManager; - private final HandlerThread mHandlerThread; private final Handler mHandler; - private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper()); + 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]; @@ -170,15 +169,27 @@ 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; - mHandlerThread = new HandlerThread("WifiStatusTrackerHandler"); - mHandlerThread.start(); - mHandler = new Handler(mHandlerThread.getLooper()); + 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 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;