diff options
author | Quang Anh Luong <qal@google.com> | 2023-11-01 15:07:11 +0900 |
---|---|---|
committer | Quang Anh Luong <qal@google.com> | 2023-11-01 15:41:38 +0900 |
commit | 2778b425d02e55f14cd531bd941ac1cd29d163eb (patch) | |
tree | cb72dad457c7ddcd6b20e6d39949556e4cb2c1a4 | |
parent | 8fe66bc11f8a9b6a63ed86c2868eaf98e2d39ba3 (diff) | |
download | wifi-2778b425d02e55f14cd531bd941ac1cd29d163eb.tar.gz |
Add methods to indicate scanning status
Add onScanRequested() and onWifiEntriesChanged(int reason) callbacks to
indicate scanning state. This is useful for Settings to show the
progress bar while the device is scanning.
Bug: 308567866
Test: atest WifiTrackerLibTests
Change-Id: I9b92e52195445dea915e7c77d95f98d7ceb23465
3 files changed, 90 insertions, 21 deletions
diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java index c7f6bba1f..1e11afa2a 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java @@ -830,6 +830,7 @@ public class BaseWifiTracker { Log.v(mTag, "Issuing scan request from WifiScanner"); } wifiScanner.startScan(scanSettings, mFirstScanListener); + notifyOnScanRequested(); return; } else { Log.e(mTag, "Failed to retrieve WifiScanner!"); @@ -864,6 +865,7 @@ public class BaseWifiTracker { // Remove any pending scanLoops in case possiblyStartScanning was called more than once. removeCallbacksAndMessages(null); mWifiManager.startScan(); + notifyOnScanRequested(); postDelayed(this::scanLoop, mScanIntervalMillis); } } @@ -886,6 +888,16 @@ public class BaseWifiTracker { } /** + * Posts onScanRequested callback on the main thread. + */ + @WorkerThread + private void notifyOnScanRequested() { + if (mListener != null) { + mMainHandler.post(mListener::onScanRequested); + } + } + + /** * Base callback handling Wi-Fi state changes * * Subclasses should extend this for their own needs. @@ -896,5 +908,10 @@ public class BaseWifiTracker { */ @MainThread void onWifiStateChanged(); + + @MainThread + default void onScanRequested() { + // Do nothing. + } } } diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java index 8bec6bbfc..83bd6be28 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/WifiPickerTracker.java @@ -60,6 +60,7 @@ import android.util.SparseArray; import androidx.annotation.AnyThread; import androidx.annotation.GuardedBy; +import androidx.annotation.IntDef; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -68,6 +69,8 @@ import androidx.annotation.WorkerThread; import androidx.core.os.BuildCompat; import androidx.lifecycle.Lifecycle; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.time.Clock; import java.util.ArrayList; import java.util.Collections; @@ -344,7 +347,7 @@ public class WifiPickerTracker extends BaseWifiTracker { checkNotNull(intent, "Intent cannot be null!"); conditionallyUpdateScanResults( intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, true)); - updateWifiEntries(); + updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS); } @WorkerThread @@ -526,11 +529,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } } - /** - * Update the list returned by getWifiEntries() with the current states of the entry caches. - */ - @WorkerThread - protected void updateWifiEntries() { + protected void updateWifiEntries(@WifiEntriesChangedReason int reason) { synchronized (mLock) { mActiveWifiEntries.clear(); mActiveWifiEntries.addAll(mStandardWifiEntryCache); @@ -639,6 +638,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } Collections.sort(mWifiEntries, WifiEntry.WIFI_PICKER_COMPARATOR); if (isVerboseLoggingEnabled()) { + Log.v(TAG, "onWifiEntriesChanged: reason=" + reason); StringJoiner entryLog = new StringJoiner("\n"); int numEntries = mActiveWifiEntries.size() + mWifiEntries.size(); int index = 1; @@ -654,7 +654,16 @@ public class WifiPickerTracker extends BaseWifiTracker { Log.v(TAG, "MergedCarrierEntry: " + mMergedCarrierEntry); } } - notifyOnWifiEntriesChanged(); + notifyOnWifiEntriesChanged(reason); + } + + + /** + * Update the list returned by getWifiEntries() with the current states of the entry caches. + */ + @WorkerThread + protected void updateWifiEntries() { + updateWifiEntries(WIFI_ENTRIES_CHANGED_REASON_GENERAL); } /** @@ -693,7 +702,7 @@ public class WifiPickerTracker extends BaseWifiTracker { } } } - notifyOnWifiEntriesChanged(); + notifyOnWifiEntriesChanged(WIFI_ENTRIES_CHANGED_REASON_GENERAL); } /** @@ -1327,9 +1336,9 @@ public class WifiPickerTracker extends BaseWifiTracker { * Posts onWifiEntryChanged callback on the main thread. */ @WorkerThread - private void notifyOnWifiEntriesChanged() { + private void notifyOnWifiEntriesChanged(@WifiEntriesChangedReason int reason) { if (mListener != null) { - mMainHandler.post(mListener::onWifiEntriesChanged); + mMainHandler.post(() -> mListener.onWifiEntriesChanged(reason)); } } @@ -1353,6 +1362,17 @@ public class WifiPickerTracker extends BaseWifiTracker { } } + @Retention(RetentionPolicy.SOURCE) + @IntDef(value = { + WIFI_ENTRIES_CHANGED_REASON_GENERAL, + WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS, + }) + + public @interface WifiEntriesChangedReason {} + + public static final int WIFI_ENTRIES_CHANGED_REASON_GENERAL = 0; + public static final int WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS = 1; + /** * Listener for changes to the list of visible WifiEntries as well as the number of saved * networks and subscriptions. @@ -1367,7 +1387,20 @@ public class WifiPickerTracker extends BaseWifiTracker { * {@link #getMergedCarrierEntry()} */ @MainThread - void onWifiEntriesChanged(); + default void onWifiEntriesChanged() { + // Do nothing + } + + /** + * Called when there are changes to + * {@link #getConnectedWifiEntry()} + * {@link #getWifiEntries()} + * {@link #getMergedCarrierEntry()} + */ + @MainThread + default void onWifiEntriesChanged(@WifiEntriesChangedReason int reason) { + onWifiEntriesChanged(); + } /** * Called when there are changes to diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java index 932b3a0bb..1d95568d0 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/WifiPickerTrackerTest.java @@ -301,8 +301,10 @@ public class WifiPickerTrackerTest { mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_SCAN_RESULTS); } /** @@ -607,8 +609,10 @@ public class WifiPickerTrackerTest { when(mMockWifiInfo.getRssi()).thenReturn(-50); mNetworkCallbackCaptor.getValue().onCapabilitiesChanged( mMockNetwork, mMockNetworkCapabilities); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry); } @@ -644,9 +648,11 @@ public class WifiPickerTrackerTest { Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged); + mTestLooper.dispatchAll(); // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getWifiEntries()).isEmpty(); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isEqualTo(entry); assertThat(entry.isPrimaryNetwork()).isTrue(); @@ -682,9 +688,11 @@ public class WifiPickerTrackerTest { Intent networkStateChanged = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); networkStateChanged.putExtra(WifiManager.EXTRA_NETWORK_INFO, mockNetworkInfo); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, networkStateChanged); + mTestLooper.dispatchAll(); // Network should be returned in getConnectedWifiEntry() even though it's not L3 connected. - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); } @@ -713,8 +721,10 @@ public class WifiPickerTrackerTest { when(mMockWifiInfo.getRssi()).thenReturn(-50); mNetworkCallbackCaptor.getValue().onCapabilitiesChanged( mMockNetwork, mMockNetworkCapabilities); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo("ssid"); } @@ -740,8 +750,10 @@ public class WifiPickerTrackerTest { any(), mNetworkCallbackCaptor.capture(), any()); mNetworkCallbackCaptor.getValue().onLost(mMockNetwork); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -773,7 +785,8 @@ public class WifiPickerTrackerTest { wifiPickerTracker.onStart(); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -843,8 +856,10 @@ public class WifiPickerTrackerTest { when(mMockWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED); mBroadcastReceiverCaptor.getValue().onReceive(mMockContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); + mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNull(); } @@ -1653,7 +1668,8 @@ public class WifiPickerTrackerTest { wifiPickerTracker.onStart(); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName); } @@ -1697,7 +1713,8 @@ public class WifiPickerTrackerTest { new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); mTestLooper.dispatchAll(); - verify(mMockCallback, atLeastOnce()).onWifiEntriesChanged(); + verify(mMockCallback, atLeastOnce()) + .onWifiEntriesChanged(WifiPickerTracker.WIFI_ENTRIES_CHANGED_REASON_GENERAL); assertThat(wifiPickerTracker.getConnectedWifiEntry()).isNotNull(); assertThat(wifiPickerTracker.getConnectedWifiEntry().getTitle()).isEqualTo(friendlyName); } @@ -2256,10 +2273,12 @@ public class WifiPickerTrackerTest { mTestLooper.moveTimeForward(SCAN_INTERVAL_MILLIS); mTestLooper.dispatchAll(); verify(mMockWifiManager, never()).startScan(); + verify(mMockCallback).onScanRequested(); mScanListenerCaptor.getValue().onResults(null); mTestLooper.dispatchAll(); verify(mMockWifiManager).startScan(); + verify(mMockCallback, times(2)).onScanRequested(); } /** |