Optimize the Scan for test request multiple APs

Bug: 270501425
Test: atest CtsWifiTestCases
Change-Id: Ic9b867a6301c3e235bcac2d5cad97b320fce6781
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java b/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
index cc6711f..02128ce 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/ConnectedNetworkScorerTest.java
@@ -798,7 +798,7 @@
 
             savedNetworks = mWifiManager.getPrivilegedConfiguredNetworks();
             WifiConfiguration testNetwork =
-                    TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks)
+                    TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks, 1)
                             .get(0);
             // Disconnect & disable auto-join on the saved network to prevent auto-connect from
             // interfering with the test.
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyMultiInternetWifiNetworkTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyMultiInternetWifiNetworkTest.java
index 314d097..4177068 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyMultiInternetWifiNetworkTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyMultiInternetWifiNetworkTest.java
@@ -207,7 +207,7 @@
         List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
                 () -> mWifiManager.getPrivilegedConfiguredNetworks());
         mMatchingNetworksMap =
-                TestHelper.findMatchingSavedNetworksWithBssidByBand(mWifiManager, savedNetworks);
+                TestHelper.findMatchingSavedNetworksWithBssidByBand(mWifiManager, savedNetworks, 2);
         assertWithMessage("Need at least 2 saved network bssids in different bands").that(
                 mMatchingNetworksMap.size()).isAtLeast(2);
 
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
index 8b030da..fb8c517 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest.java
@@ -171,7 +171,7 @@
         List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
                 () -> mWifiManager.getPrivilegedConfiguredNetworks());
         List<WifiConfiguration> matchingNetworksWithBssid =
-                TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks);
+                TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks, 2);
         assertWithMessage("Need at least 2 saved network bssids in range").that(
                 matchingNetworksWithBssid.size()).isAtLeast(2);
         // Pick any 2 bssid for test.
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
index 3c1401d..9373b7a 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/MultiStaConcurrencyWifiNetworkSpecifierTest.java
@@ -169,7 +169,7 @@
         List<WifiConfiguration> savedNetworks = ShellIdentityUtils.invokeWithShellPermissions(
                 () -> mWifiManager.getPrivilegedConfiguredNetworks());
         List<WifiConfiguration> matchingNetworksWithBssid =
-                TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks);
+                TestHelper.findMatchingSavedNetworksWithBssid(mWifiManager, savedNetworks, 2);
         assertWithMessage("Need at least 2 saved network bssids in range")
                 .that(matchingNetworksWithBssid.size()).isAtLeast(2);
         // Pick any 2 bssid for test.
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
index b5d8b53..104d513 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/TestHelper.java
@@ -65,6 +65,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -139,16 +140,18 @@
      * a) If there are more than 2 networks with the same SSID, but different credential type, then
      * this matching may pick the wrong one.
      *
-     * @param wifiManager WifiManager service
+     * @param wifiManager   WifiManager service
      * @param savedNetworks List of saved networks on the device.
      * @return List of WifiConfiguration with matching bssid.
      */
     public static List<WifiConfiguration> findMatchingSavedNetworksWithBssid(
-            @NonNull WifiManager wifiManager, @NonNull List<WifiConfiguration> savedNetworks) {
+            @NonNull WifiManager wifiManager, @NonNull List<WifiConfiguration> savedNetworks,
+            int numberOfApRequested) {
         if (savedNetworks.isEmpty()) return Collections.emptyList();
         List<WifiConfiguration> matchingNetworksWithBssids = new ArrayList<>();
         Map<Integer, List<WifiConfiguration>> networksMap =
-                findMatchingSavedNetworksWithBssidByBand(wifiManager, savedNetworks);
+                findMatchingSavedNetworksWithBssidByBand(wifiManager, savedNetworks,
+                        numberOfApRequested);
         for (List<WifiConfiguration> configs : networksMap.values()) {
             matchingNetworksWithBssids.addAll(configs);
         }
@@ -163,15 +166,18 @@
      * a) If there are more than 2 networks with the same SSID, but different credential type, then
      * this matching may pick the wrong one.
      *
-     * @param wifiManager WifiManager service
+     * @param wifiManager   WifiManager service
      * @param savedNetworks List of saved networks on the device.
      * @return Map from band to the list of WifiConfiguration with matching bssid.
      */
     public static Map<Integer, List<WifiConfiguration>> findMatchingSavedNetworksWithBssidByBand(
-            @NonNull WifiManager wifiManager, @NonNull List<WifiConfiguration> savedNetworks) {
+            @NonNull WifiManager wifiManager, @NonNull List<WifiConfiguration> savedNetworks,
+            int numberOfApRequested) {
         if (savedNetworks.isEmpty()) return Collections.emptyMap();
+        Set<String> bssidSet = new HashSet<>();
         Map<Integer, List<WifiConfiguration>> matchingNetworksWithBssids = new ArrayMap<>();
         for (int i = 0; i < SCAN_RETRY_CNT_TO_FIND_MATCHING_BSSID; i++) {
+            int count = 0;
             // Trigger a scan to get fresh scan results.
             TestScanResultsCallback scanResultsCallback = new TestScanResultsCallback();
             try {
@@ -187,6 +193,9 @@
             sScanResults = wifiManager.getScanResults();
             if (sScanResults == null || sScanResults.isEmpty()) continue;
             for (ScanResult scanResult : sScanResults) {
+                if (bssidSet.contains(scanResult.BSSID)) {
+                    continue;
+                }
                 WifiConfiguration matchingNetwork = savedNetworks.stream()
                         .filter(network -> TextUtils.equals(
                                 scanResult.SSID, WifiInfo.sanitizeSsid(network.SSID)))
@@ -196,16 +205,15 @@
                     // make a copy in case we have 2 bssid's for the same network.
                     WifiConfiguration matchingNetworkCopy = new WifiConfiguration(matchingNetwork);
                     matchingNetworkCopy.BSSID = scanResult.BSSID;
-                    List<WifiConfiguration> bandConfigs = matchingNetworksWithBssids.get(
-                            scanResult.getBand());
-                    if (bandConfigs == null) {
-                        bandConfigs = new ArrayList<>();
-                        matchingNetworksWithBssids.put(scanResult.getBand(), bandConfigs);
-                    }
+                    bssidSet.add(scanResult.BSSID);
+                    List<WifiConfiguration> bandConfigs =
+                            matchingNetworksWithBssids.computeIfAbsent(
+                                    scanResult.getBand(), k -> new ArrayList<>());
                     bandConfigs.add(matchingNetworkCopy);
                 }
             }
-            if (!matchingNetworksWithBssids.isEmpty()) break;
+            if (bssidSet.size() >= numberOfApRequested
+                    && !matchingNetworksWithBssids.isEmpty()) break;
         }
         return matchingNetworksWithBssids;
     }
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
index 79d8201..9e1dddd 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSpecifierTest.java
@@ -229,7 +229,7 @@
                 .that(savedNetworks.isEmpty()).isFalse();
 
         // Pick any network in range.
-        sTestNetwork = TestHelper.findMatchingSavedNetworksWithBssid(wifiManager, savedNetworks)
+        sTestNetwork = TestHelper.findMatchingSavedNetworksWithBssid(wifiManager, savedNetworks, 2)
                 .get(0);
     }
 
diff --git a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
index 2ed8e9c..264db32 100644
--- a/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
+++ b/tests/tests/wifi/src/android/net/wifi/cts/WifiNetworkSuggestionTest.java
@@ -166,7 +166,7 @@
         // Pick any network in range.
 
         List<WifiConfiguration> networks = TestHelper.findMatchingSavedNetworksWithBssid(
-                sWifiManager, savedNetworks);
+                sWifiManager, savedNetworks, 2);
         if (!networks.isEmpty()) {
             sTestNetwork = networks.get(0);
         }