diff options
author | Roshan Pius <rpius@google.com> | 2017-06-21 18:57:33 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-06-21 18:57:33 +0000 |
commit | 4ab2a8ac0bd91f40c1175f89aee9074e619c1da8 (patch) | |
tree | 575e041bd60979b98e28e16ad70163dc4e882e27 /service | |
parent | 4856e98ed4d75bf8bb6b1bee7376d6966cf5351a (diff) | |
parent | cebe986861bc1405afd7f333dbc6996107deb14b (diff) |
WifiScanningService: Cache only results of full single scans am: 23216ca333 am: a2f60dca3a
am: cebe986861
Change-Id: I99b51435731977c0a80d6e2204cbdcdf210d8ec8
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java | 43 | ||||
-rw-r--r-- | service/java/com/android/server/wifi/scanner/WificondScannerImpl.java | 13 |
2 files changed, 48 insertions, 8 deletions
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java index 08c9e1359..af874b9e2 100644 --- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java +++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java @@ -438,6 +438,15 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { * executed after transitioning back to IdleState. */ class WifiSingleScanStateMachine extends StateMachine implements WifiNative.ScanEventHandler { + /** + * Maximum age of results that we return from our cache via + * {@link WifiScanner#getScanResults()}. + * This is currently set to 3 minutes to restore parity with the wpa_supplicant's scan + * result cache expiration policy. (See b/62253332 for details) + */ + @VisibleForTesting + public static final int CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS = 180 * 1000; + private final DefaultState mDefaultState = new DefaultState(); private final DriverStartedState mDriverStartedState = new DriverStartedState(); private final IdleState mIdleState = new IdleState(); @@ -447,7 +456,8 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { private RequestList<ScanSettings> mActiveScans = new RequestList<>(); private RequestList<ScanSettings> mPendingScans = new RequestList<>(); - private ScanResult[] mCachedScanResults = new ScanResult[0]; + // Scan results cached from the last full single scan request. + private final List<ScanResult> mCachedScanResults = new ArrayList<>(); WifiSingleScanStateMachine(Looper looper) { super("WifiSingleScanStateMachine", looper); @@ -534,13 +544,30 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { if (DBG) localLog("ignored full scan result event"); return HANDLED; case WifiScanner.CMD_GET_SINGLE_SCAN_RESULTS: - msg.obj = new WifiScanner.ParcelableScanResults(mCachedScanResults.clone()); + msg.obj = new WifiScanner.ParcelableScanResults( + filterCachedScanResultsByAge()); replySucceeded(msg); return HANDLED; default: return NOT_HANDLED; } + } + /** + * Filter out any scan results that are older than + * {@link #CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS}. + * + * @return Filtered list of scan results. + */ + private ScanResult[] filterCachedScanResultsByAge() { + // Using ScanResult.timestamp here to ensure that we use the same fields as + // WificondScannerImpl for filtering stale results. + long currentTimeInMillis = mClock.getElapsedSinceBootMillis(); + return mCachedScanResults.stream() + .filter(scanResult + -> ((currentTimeInMillis - (scanResult.timestamp / 1000)) + < CACHED_SCAN_RESULTS_MAX_AGE_IN_MILLIS)) + .toArray(ScanResult[]::new); } } @@ -553,7 +580,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { @Override public void exit() { // clear scan results when scan mode is not active - mCachedScanResults = new ScanResult[0]; + mCachedScanResults.clear(); mWifiMetrics.incrementScanReturnEntry( WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED, @@ -879,13 +906,15 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { entry.reportEvent(WifiScanner.CMD_SCAN_RESULT, 0, parcelableAllResults); } - // Cache the results here so that apps can retrieve them. - mCachedScanResults = results.getResults(); - sendScanResultBroadcast(true); + if (results.isAllChannelsScanned()) { + mCachedScanResults.clear(); + mCachedScanResults.addAll(Arrays.asList(results.getResults())); + sendScanResultBroadcast(true); + } } List<ScanResult> getCachedScanResultsAsList() { - return Arrays.asList(mCachedScanResults); + return mCachedScanResults; } } diff --git a/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java b/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java index 4aa9bc972..fd7fddb73 100644 --- a/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java +++ b/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java @@ -579,6 +579,17 @@ public class WificondScannerImpl extends WifiScannerImpl implements Handler.Call } } + /** + * Check if the provided channel collection contains all the channels. + */ + private static boolean isAllChannelsScanned(ChannelCollection channelCollection) { + // TODO(b/62253332): Get rid of this hack. + // We're treating 2g + 5g and 2g + 5g + dfs as all channels scanned to work around + // the lack of a proper cache. + return (channelCollection.containsBand(WifiScanner.WIFI_BAND_24_GHZ) + && channelCollection.containsBand(WifiScanner.WIFI_BAND_5_GHZ)); + } + private void pollLatestScanData() { synchronized (mSettingsLock) { if (mLastScanSettings == null) { @@ -665,7 +676,7 @@ public class WificondScannerImpl extends WifiScannerImpl implements Handler.Call } Collections.sort(singleScanResults, SCAN_RESULT_SORT_COMPARATOR); mLatestSingleScanResult = new WifiScanner.ScanData(mLastScanSettings.scanId, 0, 0, - mLastScanSettings.singleScanFreqs.isAllChannels(), + isAllChannelsScanned(mLastScanSettings.singleScanFreqs), singleScanResults.toArray(new ScanResult[singleScanResults.size()])); mLastScanSettings.singleScanEventHandler .onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE); |