Move scan filtering to a common utility class

This way single scans don't depend on the background scan scheduler

Bug: 27506257
Change-Id: I7130302b364cc86e3a8f1cd0a168e0068c29953b
diff --git a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
index 72ca9d8..0488e55 100644
--- a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java
@@ -607,16 +607,14 @@
             clientHandlers.clear();
         }
 
-        // TODO fix shouldReport checks
-        // currently these checks work because the shouldReport methods don't yet rely on the
-        // internal state of the scheduler.
         void reportFullScanResult(ScanResult result) {
             for (Map.Entry<Pair<ClientInfo, Integer>, ScanSettings> entry
                          : mActiveScans.entrySet()) {
                 ClientInfo ci = entry.getKey().first;
                 int handler = entry.getKey().second;
                 ScanSettings settings = entry.getValue();
-                if (mScheduler.shouldReportFullScanResultForSettings(result, settings)) {
+                if (ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
+                                result, settings)) {
                     ci.sendMessage(WifiScanner.CMD_FULL_SCAN_RESULT, 0, handler, result);
                 }
             }
@@ -629,8 +627,8 @@
                 int handler = entry.getKey().second;
                 ScanSettings settings = entry.getValue();
                 ScanData[] resultsArray = new ScanData[] {results};
-                ScanData[] resultsToDeliver =
-                    mScheduler.filterResultsForSettings(resultsArray, settings);
+                ScanData[] resultsToDeliver = ScanScheduleUtil.filterResultsForSettings(
+                        mChannelHelper, resultsArray, settings);
                 WifiScanner.ParcelableScanData parcelableScanData =
                         new WifiScanner.ParcelableScanData(resultsToDeliver);
                 logCallback("singleScanResults",  ci, handler);
diff --git a/service/java/com/android/server/wifi/scanner/BackgroundScanScheduler.java b/service/java/com/android/server/wifi/scanner/BackgroundScanScheduler.java
index 1a6569f..d7362cd 100644
--- a/service/java/com/android/server/wifi/scanner/BackgroundScanScheduler.java
+++ b/service/java/com/android/server/wifi/scanner/BackgroundScanScheduler.java
@@ -326,7 +326,8 @@
      */
     public boolean shouldReportFullScanResultForSettings(@NonNull ScanResult result,
             @NonNull ScanSettings settings) {
-        return mChannelHelper.settingsContainChannel(settings, result.frequency);
+        return ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
+                result, settings);
     }
 
     /**
@@ -335,34 +336,7 @@
      */
     public @Nullable ScanData[] filterResultsForSettings(@NonNull ScanData[] scanDatas,
             @NonNull ScanSettings settings) {
-        ArrayList<ScanData> filteredScanDatas = new ArrayList<>(scanDatas.length);
-        ArrayList<ScanResult> filteredResults = new ArrayList<>();
-        for (ScanData scanData : scanDatas) {
-            filteredResults.clear();
-            for (ScanResult scanResult : scanData.getResults()) {
-                if (mChannelHelper.settingsContainChannel(settings, scanResult.frequency)) {
-                    filteredResults.add(scanResult);
-                }
-                if (settings.numBssidsPerScan > 0
-                        && filteredResults.size() >= settings.numBssidsPerScan) {
-                    break;
-                }
-            }
-            // TODO correctly note if scan results may be incomplete
-            if (filteredResults.size() == scanData.getResults().length) {
-                filteredScanDatas.add(scanData);
-            } else if (filteredResults.size() > 0) {
-                filteredScanDatas.add(new WifiScanner.ScanData(scanData.getId(),
-                                scanData.getFlags(),
-                                filteredResults.toArray(
-                                        new ScanResult[filteredResults.size()])));
-            }
-        }
-        if (filteredScanDatas.size() == 0) {
-            return null;
-        } else {
-            return filteredScanDatas.toArray(new ScanData[filteredScanDatas.size()]);
-        }
+        return ScanScheduleUtil.filterResultsForSettings(mChannelHelper, scanDatas, settings);
     }
 
     // creates a schedule for the given buckets and requests
diff --git a/service/java/com/android/server/wifi/scanner/ScanScheduleUtil.java b/service/java/com/android/server/wifi/scanner/ScanScheduleUtil.java
index 734a190..aa0228a 100644
--- a/service/java/com/android/server/wifi/scanner/ScanScheduleUtil.java
+++ b/service/java/com/android/server/wifi/scanner/ScanScheduleUtil.java
@@ -17,9 +17,15 @@
 package com.android.server.wifi.scanner;
 
 import android.annotation.Nullable;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiScanner.ScanData;
+import android.net.wifi.WifiScanner.ScanSettings;
 
 import com.android.server.wifi.WifiNative;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * A class with utilities for dealing with scan schedules.
  */
@@ -83,4 +89,48 @@
 
         return true;
     }
+
+    /**
+     * Returns true if the given scan result should be reported to a listener with the given
+     * settings.
+     */
+    public static boolean shouldReportFullScanResultForSettings(ChannelHelper channelHelper,
+            ScanResult result, ScanSettings settings) {
+        return channelHelper.settingsContainChannel(settings, result.frequency);
+    }
+
+    /**
+     * Returns a filtered version of the scan results from the chip that represents only the data
+     * requested in the settings. Will return null if the result should not be reported.
+     */
+    public static ScanData[] filterResultsForSettings(ChannelHelper channelHelper,
+            ScanData[] scanDatas, ScanSettings settings) {
+        List<ScanData> filteredScanDatas = new ArrayList<>(scanDatas.length);
+        List<ScanResult> filteredResults = new ArrayList<>();
+        for (ScanData scanData : scanDatas) {
+            filteredResults.clear();
+            for (ScanResult scanResult : scanData.getResults()) {
+                if (channelHelper.settingsContainChannel(settings, scanResult.frequency)) {
+                    filteredResults.add(scanResult);
+                }
+                if (settings.numBssidsPerScan > 0
+                        && filteredResults.size() >= settings.numBssidsPerScan) {
+                    break;
+                }
+            }
+            if (filteredResults.size() == scanData.getResults().length) {
+                filteredScanDatas.add(scanData);
+            } else if (filteredResults.size() > 0) {
+                filteredScanDatas.add(new ScanData(scanData.getId(),
+                                scanData.getFlags(),
+                                filteredResults.toArray(
+                                        new ScanResult[filteredResults.size()])));
+            }
+        }
+        if (filteredScanDatas.size() == 0) {
+            return null;
+        } else {
+            return filteredScanDatas.toArray(new ScanData[filteredScanDatas.size()]);
+        }
+    }
 }
diff --git a/service/tests/wifitests/src/com/android/server/wifi/scanner/BackgroundScanSchedulerFilterTest.java b/service/tests/wifitests/src/com/android/server/wifi/scanner/ScanScheduleUtilFilterTest.java
similarity index 62%
rename from service/tests/wifitests/src/com/android/server/wifi/scanner/BackgroundScanSchedulerFilterTest.java
rename to service/tests/wifitests/src/com/android/server/wifi/scanner/ScanScheduleUtilFilterTest.java
index 65fe7bd..fb93cee 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/scanner/BackgroundScanSchedulerFilterTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/scanner/ScanScheduleUtilFilterTest.java
@@ -26,51 +26,30 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.validateMockitoUsage;
 
 import android.net.wifi.WifiScanner;
 import android.net.wifi.WifiScanner.ScanData;
 import android.net.wifi.WifiScanner.ScanSettings;
 import android.test.suitebuilder.annotation.SmallTest;
 
-import com.android.server.wifi.WifiNative;
-
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collection;
-import java.util.Collections;
-
 /**
  * Unit tests for filtering of scan results in
- * {@link com.android.server.wifi.scanner.BackgroundScanScheduler}.
+ * {@link com.android.server.wifi.scanner.ScanScheduleUtil}.
  */
 @SmallTest
-public class BackgroundScanSchedulerFilterTest {
+public class ScanScheduleUtilFilterTest {
 
-    private static final int DEFAULT_MAX_BUCKETS = 8;
-    private static final int DEFAULT_MAX_CHANNELS = 8;
-    private static final int DEFAULT_MAX_BATCH = 10;
-
-    private WifiNative mWifiNative;
-    private BackgroundScanScheduler mScheduler;
+    private ChannelHelper mChannelHelper;
 
     @Before
     public void setUp() throws Exception {
-        ChannelHelper channelHelper = new PresetKnownBandsChannelHelper(
+        mChannelHelper = new PresetKnownBandsChannelHelper(
                 new int[]{2400, 2450},
                 new int[]{5150, 5175},
                 new int[]{5600, 5650});
-        mScheduler = new BackgroundScanScheduler(channelHelper);
-        mScheduler.setMaxBuckets(DEFAULT_MAX_BUCKETS);
-        mScheduler.setMaxChannels(DEFAULT_MAX_CHANNELS);
-        mScheduler.setMaxBatch(DEFAULT_MAX_BATCH);
-    }
-
-    @After
-    public void cleanup() {
-        validateMockitoUsage();
     }
 
     @Test
@@ -79,11 +58,9 @@
                 WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        assertTrue(mScheduler.shouldReportFullScanResultForSettings(
-                createScanResult(2400), settings));
+        assertTrue(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
+                        createScanResult(2400), settings));
     }
 
     @Test
@@ -92,10 +69,8 @@
                 WifiScanner.WIFI_BAND_24_GHZ, 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        assertFalse(mScheduler.shouldReportFullScanResultForSettings(
+        assertFalse(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
                 createScanResult(5150), settings));
     }
 
@@ -105,10 +80,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        assertTrue(mScheduler.shouldReportFullScanResultForSettings(
+        assertTrue(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
                 createScanResult(2400), settings));
     }
 
@@ -118,10 +91,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        assertFalse(mScheduler.shouldReportFullScanResultForSettings(
+        assertFalse(ScanScheduleUtil.shouldReportFullScanResultForSettings(mChannelHelper,
                 createScanResult(5175), settings));
     }
 
@@ -131,10 +102,9 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(new ScanData[0], settings);
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
+                new ScanData[0], settings);
         assertScanDataFreqsEquals(null, results);
     }
 
@@ -144,10 +114,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
                 createScanDatas(new int[][]{ { 2450 } }), settings);
         assertScanDataFreqsEquals(null, results);
     }
@@ -158,10 +126,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
                 createScanDatas(new int[][]{ { 2400 } }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400 } }, results);
@@ -173,10 +139,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
                 createScanDatas(new int[][]{ { 2400, 2450, 5150, 5175 } }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 } }, results);
@@ -188,10 +152,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
                 createScanDatas(new int[][]{ { 2450 }, { 2450, 5175 } }), settings);
         assertScanDataFreqsEquals(null, results);
     }
@@ -202,10 +164,8 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
                 createScanDatas(new int[][]{ { 2400 }, {2400, 5150} }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400 }, {2400, 5150} }, results);
@@ -217,11 +177,10 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
-                new int[][]{ { 2400, 2450, 5150, 5175 }, { 2400, 2450, 5175 } }), settings);
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
+                createScanDatas(new int[][]{ { 2400, 2450, 5150, 5175 }, { 2400, 2450, 5175 } }),
+                settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400, 5150 }, { 2400 } }, results);
     }
@@ -232,13 +191,12 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
-                new int[][]{ { 2400, 2450, 5150, 5175, 2400 },
-                             { 2400, 2450, 5175 },
-                             { 5175, 5175, 5150 } }), settings);
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
+                createScanDatas(new int[][]{
+                        { 2400, 2450, 5150, 5175, 2400 },
+                        { 2400, 2450, 5175 },
+                        { 5175, 5175, 5150 } }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 2400 }, { 5150 } }, results);
     }
@@ -249,13 +207,12 @@
                 channelsToSpec(2400, 5150), 30000, 0, 20,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
-                new int[][]{ { 2400, 2450, 5150, 5175, 2400 },
-                             { 5175 },
-                             { 5175, 5175, 5150 } }), settings);
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
+                createScanDatas(new int[][]{
+                        { 2400, 2450, 5150, 5175, 2400 },
+                        { 5175 },
+                        { 5175, 5175, 5150 } }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150 } }, results);
     }
@@ -266,20 +223,19 @@
                 channelsToSpec(2400, 5150), 30000, 0, 3,
                 WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT
         );
-        Collection<ScanSettings> requests = Collections.singleton(settings);
-        mScheduler.updateSchedule(requests);
 
-        ScanData[] results = mScheduler.filterResultsForSettings(createScanDatas(
-                        new int[][]{ { 2400, 2450, 5150, 5175, 2400, 2400},
-                                     { 5175 },
-                                     { 5175, 5175, 5150, 2400, 2400, 5150 } }), settings);
+        ScanData[] results = ScanScheduleUtil.filterResultsForSettings(mChannelHelper,
+                createScanDatas(new int[][]{
+                        { 2400, 2450, 5150, 5175, 2400, 2400},
+                        { 5175 },
+                        { 5175, 5175, 5150, 2400, 2400, 5150 } }), settings);
 
         assertScanDataFreqsEquals(new int[][]{ { 2400, 5150, 2400 }, { 5150, 2400, 2400 } },
                 results);
     }
 
 
-    public static void assertScanDataFreqsEquals(int[][] expected, ScanData[] results) {
+    private static void assertScanDataFreqsEquals(int[][] expected, ScanData[] results) {
         if (expected == null) {
             assertNull(results);
         } else {