summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuang Luong <qal@google.com>2022-04-06 13:31:42 -0700
committerQuang Luong <qal@google.com>2022-04-08 10:47:06 -0700
commit95666ce5d8a1eff45424cf7d61cff99e74aa2d7a (patch)
tree7a7d32f03b5afa927071787b8aa3f1a0b3bd21b5
parent60b2e3e4a4d0003b88e46c7334d1dff49a0fb2aa (diff)
downloadwifi-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
-rw-r--r--libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java9
-rw-r--r--libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/SavedNetworkTrackerTest.java39
-rw-r--r--libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java32
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