Merge "Remove software pno scan support"
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 02462f6..ed1bedf 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -1336,7 +1336,6 @@
      *   -Started State
      *     -Hw Pno Scan state
      *       -Single Scan state
-     *     -Sw Pno Scan state
      *
      * These are the main state transitions:
      * 1. Start at |Default State|
@@ -1348,11 +1347,6 @@
      *        contains IE (information elements). If yes, send the results to the client, else
      *        switch to |Single Scan state| and send the result to the client when the scan result
      *        is obtained.
-     *   b.1. Switch to |Sw Pno Scan state| when the device does not supports HW PNO
-     *        (This is for older devices which do not support HW PNO and for connected PNO on
-     *         devices which support wificond based PNO)
-     *   b.2. In |Sw Pno Scan state| send the result to the client when the background scan result
-     *        is obtained
      *
      * Note: PNO scans only work for a single client today. We don't have support in HW to support
      * multiple requests at the same time, so will need non-trivial changes to support (if at all
@@ -1363,7 +1357,6 @@
         private final DefaultState mDefaultState = new DefaultState();
         private final StartedState mStartedState = new StartedState();
         private final HwPnoScanState mHwPnoScanState = new HwPnoScanState();
-        private final SwPnoScanState mSwPnoScanState = new SwPnoScanState();
         private final SingleScanState mSingleScanState = new SingleScanState();
         private InternalClientInfo mInternalClientInfo;
 
@@ -1381,7 +1374,6 @@
                 addState(mStartedState, mDefaultState);
                     addState(mHwPnoScanState, mStartedState);
                         addState(mSingleScanState, mHwPnoScanState);
-                    addState(mSwPnoScanState, mStartedState);
             // CHECKSTYLE:ON IndentationCheck
 
             setInitialState(mDefaultState);
@@ -1461,12 +1453,11 @@
                         pnoParams.setDefusable(true);
                         PnoSettings pnoSettings =
                                 pnoParams.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY);
-                        // This message is handled after the transition to SwPnoScan/HwPnoScan state
-                        deferMessage(msg);
                         if (mScannerImpl.isHwPnoSupported(pnoSettings.isConnected)) {
+                            deferMessage(msg);
                             transitionTo(mHwPnoScanState);
                         } else {
-                            transitionTo(mSwPnoScanState);
+                            replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "not supported");
                         }
                         break;
                     case WifiScanner.CMD_STOP_PNO_SCAN:
@@ -1577,68 +1568,6 @@
             }
         }
 
-        class SwPnoScanState extends State {
-            private final ArrayList<ScanResult> mSwPnoFullScanResults = new ArrayList<>();
-
-            @Override
-            public void enter() {
-                if (DBG) localLog("SwPnoScanState");
-                mSwPnoFullScanResults.clear();
-            }
-
-            @Override
-            public void exit() {
-                removeInternalClient();
-            }
-
-            @Override
-            public boolean processMessage(Message msg) {
-                ClientInfo ci = mClients.get(msg.replyTo);
-                switch (msg.what) {
-                    case WifiScanner.CMD_START_PNO_SCAN:
-                        Bundle pnoParams = (Bundle) msg.obj;
-                        if (pnoParams == null) {
-                            replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "params null");
-                            return HANDLED;
-                        }
-                        pnoParams.setDefusable(true);
-                        PnoSettings pnoSettings =
-                                pnoParams.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY);
-                        ScanSettings scanSettings =
-                                pnoParams.getParcelable(WifiScanner.PNO_PARAMS_SCAN_SETTINGS_KEY);
-                        if (addSwPnoScanRequest(ci, msg.arg2, scanSettings, pnoSettings)) {
-                            replySucceeded(msg);
-                        } else {
-                            replyFailed(msg, WifiScanner.REASON_INVALID_REQUEST, "bad request");
-                            transitionTo(mStartedState);
-                        }
-                        break;
-                    case WifiScanner.CMD_STOP_PNO_SCAN:
-                        removeSwPnoScanRequest(ci, msg.arg2);
-                        transitionTo(mStartedState);
-                        break;
-                    case WifiScanner.CMD_FULL_SCAN_RESULT:
-                        // Aggregate full scan results until we get the |CMD_SCAN_RESULT| message
-                        mSwPnoFullScanResults.add((ScanResult) msg.obj);
-                        break;
-                    case WifiScanner.CMD_SCAN_RESULT:
-                        ScanResult[] scanResults = mSwPnoFullScanResults.toArray(
-                                new ScanResult[mSwPnoFullScanResults.size()]);
-                        reportPnoNetworkFound(scanResults);
-                        mSwPnoFullScanResults.clear();
-                        break;
-                    case WifiScanner.CMD_OP_FAILED:
-                        sendPnoScanFailedToAllAndClear(
-                                WifiScanner.REASON_UNSPECIFIED, "background scan failed");
-                        transitionTo(mStartedState);
-                        break;
-                    default:
-                        return NOT_HANDLED;
-                }
-                return HANDLED;
-            }
-        }
-
         private WifiNative.PnoSettings convertSettingsToPnoNative(ScanSettings scanSettings,
                                                                   PnoSettings pnoSettings) {
             WifiNative.PnoSettings nativePnoSetting = new WifiNative.PnoSettings();
@@ -1731,34 +1660,6 @@
             }
         }
 
-        private boolean addSwPnoScanRequest(ClientInfo ci, int handler, ScanSettings scanSettings,
-                PnoSettings pnoSettings) {
-            if (ci == null) {
-                Log.d(TAG, "Failing scan request ClientInfo not found " + handler);
-                return false;
-            }
-            if (!mActivePnoScans.isEmpty()) {
-                loge("Failing scan request because there is already an active scan");
-                return false;
-            }
-            logScanRequest("addSwPnoScanRequest", ci, handler, null, scanSettings, pnoSettings);
-            addPnoScanRequest(ci, handler, scanSettings, pnoSettings);
-            // HW PNO is not supported, we need to revert to normal background scans and
-            // report events after each scan and we need full scan results to get the IE information
-            scanSettings.reportEvents = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN
-                    | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT;
-            addBackgroundScanRequest(scanSettings);
-            return true;
-        }
-
-        private void removeSwPnoScanRequest(ClientInfo ci, int handler) {
-            if (ci != null) {
-                Pair<PnoSettings, ScanSettings> settings = removePnoScanRequest(ci, handler);
-                logScanRequest("removeSwPnoScanRequest", ci, handler, null,
-                        settings.second, settings.first);
-            }
-        }
-
         private void reportPnoNetworkFound(ScanResult[] results) {
             WifiScanner.ParcelableScanResults parcelableScanResults =
                     new WifiScanner.ParcelableScanResults(results);
@@ -1781,15 +1682,6 @@
             mActivePnoScans.clear();
         }
 
-        private void addBackgroundScanRequest(ScanSettings settings) {
-            if (DBG) localLog("Starting background scan");
-            if (mInternalClientInfo != null) {
-                mInternalClientInfo.sendRequestToClientHandler(
-                        WifiScanner.CMD_START_BACKGROUND_SCAN, settings,
-                        WifiStateMachine.WIFI_WORK_SOURCE);
-            }
-        }
-
         private void addSingleScanRequest(ScanSettings settings) {
             if (DBG) localLog("Starting single scan");
             if (mInternalClientInfo != null) {
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index 3532a3b..4ffc66d 100644
--- a/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -1721,21 +1721,6 @@
         return Pair.create(requestSettings, nativeSettings);
     }
 
-    private Pair<WifiScanner.ScanSettings, WifiNative.ScanSettings> createScanSettingsForSwPno()
-            throws Exception {
-        Pair<WifiScanner.ScanSettings, WifiNative.ScanSettings> settingsPair =
-                createScanSettingsForHwPno();
-
-        WifiScanner.ScanSettings requestSettings = settingsPair.first;
-        WifiNative.ScanSettings nativeSettings = settingsPair.second;
-        // reportEvents field is overridden for SW PNO
-        for (int i = 0; i < nativeSettings.buckets.length; i++) {
-            nativeSettings.buckets[i].report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN
-                    | WifiScanner.REPORT_EVENT_FULL_SCAN_RESULT;
-        }
-        return Pair.create(requestSettings, nativeSettings);
-    }
-
     private Pair<WifiScanner.PnoSettings, WifiNative.PnoSettings> createPnoSettings(
             ScanResults results)
             throws Exception {
diff --git a/tests/wifitests/src/com/android/server/wifi/scanner/WificondPnoScannerTest.java b/tests/wifitests/src/com/android/server/wifi/scanner/WificondPnoScannerTest.java
index f312b48..3f53ce1 100644
--- a/tests/wifitests/src/com/android/server/wifi/scanner/WificondPnoScannerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/scanner/WificondPnoScannerTest.java
@@ -295,35 +295,12 @@
         order.verify(mWifiNative, never()).stopPnoScan();
     }
 
-    private void doSuccessfulSwPnoScanTest(boolean isConnectedPno) {
-        WifiNative.PnoEventHandler pnoEventHandler = mock(WifiNative.PnoEventHandler.class);
-        WifiNative.PnoSettings pnoSettings = createDummyPnoSettings(isConnectedPno);
-        WifiNative.ScanEventHandler scanEventHandler = mock(WifiNative.ScanEventHandler.class);
-        WifiNative.ScanSettings scanSettings = createDummyScanSettings();
-        ScanResults scanResults = createDummyScanResults(false);
-
-        InOrder order = inOrder(scanEventHandler, mWifiNative);
-
-        // Start PNO scan
-        startSuccessfulPnoScan(scanSettings, pnoSettings, scanEventHandler, pnoEventHandler);
-
-        expectSuccessfulSwPnoScan(order, scanEventHandler, scanResults);
-
-        verifyNoMoreInteractions(pnoEventHandler);
-    }
-
     private void createScannerWithHwPnoScanSupport() {
         mResources.setBoolean(R.bool.config_wifi_background_scan_support, true);
         mScanner = new WificondScannerImpl(mContext, mWifiNative, mWifiMonitor,
                 mLooper.getLooper(), mClock);
     }
 
-    private void createScannerWithSwPnoScanSupport() {
-        mResources.setBoolean(R.bool.config_wifi_background_scan_support, false);
-        mScanner = new WificondScannerImpl(mContext, mWifiNative, mWifiMonitor,
-                mLooper.getLooper(), mClock);
-    }
-
     private WifiNative.PnoNetwork createDummyPnoNetwork(String ssid) {
         WifiNative.PnoNetwork pnoNetwork = new WifiNative.PnoNetwork();
         pnoNetwork.ssid = ssid;
@@ -363,14 +340,7 @@
         when(mWifiNative.startPnoScan(any(WifiNative.PnoSettings.class))).thenReturn(true);
         when(mWifiNative.stopPnoScan()).thenReturn(true);
 
-        if (mScanner.isHwPnoSupported(pnoSettings.isConnected)) {
-            // This should happen only for HW PNO scan
-            assertTrue(mScanner.setHwPnoList(pnoSettings, pnoEventHandler));
-        } else {
-            // This should happen only for SW PNO scan
-            assertTrue(mScanner.startBatchedScan(scanSettings, scanEventHandler));
-
-        }
+        assertTrue(mScanner.setHwPnoList(pnoSettings, pnoEventHandler));
     }
 
     private Set<Integer> expectedBandScanFreqs(int band) {
@@ -433,33 +403,4 @@
         assertScanDataEquals(scanResults.getScanData(), mScanner.getLatestSingleScanResults());
     }
 
-    /**
-     * Verify that the SW PNO scan was successfully started. This could either be disconnected
-     * or connected PNO.
-     * This is basically ensuring that the background scan runs successfully and returns the
-     * expected result.
-     */
-    private void expectSuccessfulSwPnoScan(InOrder order,
-            WifiNative.ScanEventHandler eventHandler, ScanResults scanResults) {
-
-        // Verify scan started
-        order.verify(mWifiNative).scan(any(), any(Set.class));
-
-        // Make sure that HW PNO scan was not started
-        verify(mWifiNative, never()).startPnoScan(any(WifiNative.PnoSettings.class));
-
-        // Setup scan results
-        when(mWifiNative.getScanResults()).thenReturn(scanResults.getScanDetailArrayList());
-        when(mWifiNative.getPnoScanResults()).thenReturn(scanResults.getScanDetailArrayList());
-
-        // Notify scan has finished
-        mWifiMonitor.sendMessage(mWifiNative.getInterfaceName(), WifiMonitor.SCAN_RESULTS_EVENT);
-        assertEquals("dispatch message after results event", 1, mLooper.dispatchAll());
-
-        // Verify background scan results delivered
-        order.verify(eventHandler).onScanStatus(WifiNative.WIFI_SCAN_RESULTS_AVAILABLE);
-        WifiScanner.ScanData[] scanData = mScanner.getLatestBatchedScanResults(true);
-        WifiScanner.ScanData lastScanData = scanData[scanData.length - 1];
-        assertScanDataEquals(scanResults.getScanData(), lastScanData);
-    }
 }