diff options
author | Quang Luong <qal@google.com> | 2022-04-06 13:31:42 -0700 |
---|---|---|
committer | Quang Luong <qal@google.com> | 2022-04-08 10:47:06 -0700 |
commit | 95666ce5d8a1eff45424cf7d61cff99e74aa2d7a (patch) | |
tree | 7a7d32f03b5afa927071787b8aa3f1a0b3bd21b5 | |
parent | 60b2e3e4a4d0003b88e46c7334d1dff49a0fb2aa (diff) | |
download | wifi-95666ce5d8a1eff45424cf7d61cff99e74aa2d7a.tar.gz |
[WifiTracker] Cache wifi state in worker thread
BaseWifiTracker.getWifiState() is called from the UI thread, but this
calls the blocking API WifiManager.getWifiState(). To avoid blocking on
the UI thread, we should cache the extra value from WIFI_STATE_CHANGED
broadcast to return immediately in BaseWifiTracker.getWifiState().
Since WIFI_STATE_CHANGED is a sticky broadcast, we can rely on the first
broadcast to populate the initial value after onStart().
Bug: 228077953
Test: manually build and verify wifi toggle in the Internet Settings and
Internet Panel works
Change-Id: I8a0491d04da2f37a55056f00906d5b4d7dddb12d
3 files changed, 17 insertions, 63 deletions
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java index 33a0eb82f..a116878fe 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java @@ -83,7 +83,7 @@ public class BaseWifiTracker implements LifecycleObserver { return BaseWifiTracker.sVerboseLogging; } - private boolean mIsStarted; + private int mWifiState = WifiManager.WIFI_STATE_DISABLED; // Registered on the worker thread private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @@ -97,7 +97,9 @@ public class BaseWifiTracker implements LifecycleObserver { } if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { - if (mWifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { + mWifiState = intent.getIntExtra( + WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED); + if (mWifiState == WifiManager.WIFI_STATE_ENABLED) { mScanner.start(); } else { mScanner.stop(); @@ -323,7 +325,6 @@ public class BaseWifiTracker implements LifecycleObserver { mContext.unregisterReceiver(mBroadcastReceiver); mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); mConnectivityManager.unregisterNetworkCallback(mDefaultNetworkCallback); - mIsStarted = false; }); } @@ -338,7 +339,7 @@ public class BaseWifiTracker implements LifecycleObserver { */ @AnyThread public int getWifiState() { - return mWifiManager.getWifiState(); + return mWifiState; } /** diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java index b3f230162..1c9ab0fe2 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java @@ -111,52 +111,29 @@ public class SavedNetworkTrackerTest { } /** - * Tests that the wifi state is set correctly after onStart, even if no broadcast was received. - */ - @Test - public void testOnStart_setsWifiState() { - final SavedNetworkTracker savedNetworkTracker = createTestSavedNetworkTracker(); - - // Set the wifi state to disabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); - savedNetworkTracker.onStart(); - mTestLooper.dispatchAll(); - - assertThat(savedNetworkTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_DISABLED); - - // Change the wifi state to enabled - savedNetworkTracker.onStop(); - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED); - savedNetworkTracker.onStart(); - mTestLooper.dispatchAll(); - - assertThat(savedNetworkTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); - } - - /** * Tests that receiving a wifi state change broadcast updates getWifiState(). */ @Test public void testWifiStateChangeBroadcast_updatesWifiState() { - final SavedNetworkTracker wifiPickerTracker = createTestSavedNetworkTracker(); - wifiPickerTracker.onStart(); + final SavedNetworkTracker savedNetworkTracker = createTestSavedNetworkTracker(); + savedNetworkTracker.onStart(); mTestLooper.dispatchAll(); verify(mMockContext).registerReceiver(mBroadcastReceiverCaptor.capture(), any(), any(), any()); // Set the wifi state to disabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, - new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION) + .putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED)); - assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_DISABLED); + assertThat(savedNetworkTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_DISABLED); // Change the wifi state to enabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, - new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION) + .putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED)); - assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); + assertThat(savedNetworkTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); } /** diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java index f7068327a..176452e5f 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java @@ -170,19 +170,18 @@ public class WifiPickerTrackerTest { any(), any(), any()); // Set the wifi state to disabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, - new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION) + .putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED)); assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_DISABLED); // Change the wifi state to enabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, - new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION) + .putExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_ENABLED)); assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); - } /** @@ -223,29 +222,6 @@ public class WifiPickerTrackerTest { } /** - * Tests that the wifi state is set correctly after onStart, even if no broadcast was received. - */ - @Test - public void testOnStart_setsWifiState() { - final WifiPickerTracker wifiPickerTracker = createTestWifiPickerTracker(); - - // Set the wifi state to disabled - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); - wifiPickerTracker.onStart(); - mTestLooper.dispatchAll(); - - assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_DISABLED); - - // Change the wifi state to enabled - wifiPickerTracker.onStop(); - when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_ENABLED); - wifiPickerTracker.onStart(); - mTestLooper.dispatchAll(); - - assertThat(wifiPickerTracker.getWifiState()).isEqualTo(WifiManager.WIFI_STATE_ENABLED); - } - - /** * Tests that receiving a scan results available broadcast notifies the listener. */ @Test |