Merge "Use ParceledListSlice to avoid binder alloc error" into main
diff --git a/framework/java/android/net/wifi/BaseWifiService.java b/framework/java/android/net/wifi/BaseWifiService.java
index 8a1dad8..77c44d4 100644
--- a/framework/java/android/net/wifi/BaseWifiService.java
+++ b/framework/java/android/net/wifi/BaseWifiService.java
@@ -247,7 +247,7 @@
     }
 
     @Override
-    public List<ScanResult> getScanResults(String callingPackage, String callingFeatureId) {
+    public ParceledListSlice getScanResults(String callingPackage, String callingFeatureId) {
         throw new UnsupportedOperationException();
     }
 
diff --git a/framework/java/android/net/wifi/IWifiManager.aidl b/framework/java/android/net/wifi/IWifiManager.aidl
index bbe6672..df118c2 100644
--- a/framework/java/android/net/wifi/IWifiManager.aidl
+++ b/framework/java/android/net/wifi/IWifiManager.aidl
@@ -156,7 +156,7 @@
 
     boolean startScan(String packageName, String featureId);
 
-    List<ScanResult> getScanResults(String callingPackage, String callingFeatureId);
+    ParceledListSlice getScanResults(String callingPackage, String callingFeatureId);
 
     void getChannelData(in IListListener listener, String packageName, in Bundle extras);
 
diff --git a/framework/java/android/net/wifi/WifiManager.java b/framework/java/android/net/wifi/WifiManager.java
index eba361b..aa6ff1f 100644
--- a/framework/java/android/net/wifi/WifiManager.java
+++ b/framework/java/android/net/wifi/WifiManager.java
@@ -4532,8 +4532,12 @@
     @RequiresPermission(allOf = {ACCESS_WIFI_STATE, ACCESS_FINE_LOCATION})
     public List<ScanResult> getScanResults() {
         try {
-            return mService.getScanResults(mContext.getOpPackageName(),
-                    mContext.getAttributionTag());
+            ParceledListSlice<ScanResult> parceledList = mService
+                    .getScanResults(mContext.getOpPackageName(), mContext.getAttributionTag());
+            if (parceledList == null) {
+                return Collections.emptyList();
+            }
+            return parceledList.getList();
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -7423,7 +7427,7 @@
      * <li> This API will cause reconnect if the current active connection is marked metered.</li>
      *
      * @param networkId the ID of the network as returned by {@link #addNetwork} or {@link
-     *        getConfiguredNetworks}.
+     *        #getConfiguredNetworks()}.
      * @param listener for callbacks on success or failure. Can be null.
      * @throws IllegalStateException if the WifiManager instance needs to be
      * initialized again
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 4dc51d7..3a329f8 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -4525,7 +4525,8 @@
      * @return the list of results
      */
     @Override
-    public List<ScanResult> getScanResults(String callingPackage, String callingFeatureId) {
+    @Nullable public ParceledListSlice<ScanResult> getScanResults(String callingPackage,
+            String callingFeatureId) {
         enforceAccessPermission();
         int uid = Binder.getCallingUid();
         long ident = Binder.clearCallingIdentity();
@@ -4541,11 +4542,11 @@
             if (scanResults.size() > 200) {
                 Log.i(TAG, "too many scan results, may break binder transaction");
             }
-            return scanResults;
+            return new ParceledListSlice<>(scanResults);
         } catch (SecurityException e) {
             Log.w(TAG, "Permission violation - getScanResults not allowed for uid="
                     + uid + ", packageName=" + callingPackage + ", reason=" + e);
-            return new ArrayList<>();
+            return null;
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java
index 4aae821..68532c6 100644
--- a/service/java/com/android/server/wifi/WifiShellCommand.java
+++ b/service/java/com/android/server/wifi/WifiShellCommand.java
@@ -965,7 +965,7 @@
                     return 0;
                 case "list-scan-results":
                     List<ScanResult> scanResults =
-                            mWifiService.getScanResults(SHELL_PACKAGE_NAME, null);
+                            mScanRequestProxy.getScanResults();
                     if (scanResults.isEmpty()) {
                         pw.println("No scan results");
                     } else {
@@ -2535,7 +2535,7 @@
         // So, find scan result with the best rssi level to set in the request.
         if (bssid == null && !nullBssid && !noSsid) {
             ScanResult matchingScanResult =
-                    mWifiService.getScanResults(SHELL_PACKAGE_NAME, null)
+                    mScanRequestProxy.getScanResults()
                             .stream()
                             .filter(s -> s.SSID.equals(ssid))
                             .max(Comparator.comparingInt(s -> s.level))
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index d62124a..9409866 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -3344,7 +3344,7 @@
         String featureId = "test.com.featureId";
         mLooper.startAutoDispatch();
         List<ScanResult> retrievedScanResultList = mWifiServiceImpl.getScanResults(packageName,
-                featureId);
+                featureId).getList();
         mLooper.stopAutoDispatchAndIgnoreExceptions();
         verify(mScanRequestProxy).getScanResults();
 
@@ -3370,7 +3370,7 @@
         String featureId = "test.com.featureId";
         mLooper.startAutoDispatch();
         List<ScanResult> retrievedScanResultList = mWifiServiceImpl.getScanResults(packageName,
-                featureId);
+                featureId).getList();
         mLooper.stopAutoDispatchAndIgnoreExceptions();
         verify(mScanRequestProxy, never()).getScanResults();
 
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java
index ba30af7..3486fb0 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiShellCommandTest.java
@@ -74,6 +74,7 @@
 import org.mockito.MockitoAnnotations;
 
 import java.io.FileDescriptor;
+import java.util.ArrayList;
 import java.util.Arrays;
 
 /**
@@ -131,6 +132,7 @@
         when(mWifiInjector.getWifiDiagnostics()).thenReturn(mWifiDiagnostics);
         when(mWifiInjector.getDeviceConfigFacade()).thenReturn(mDeviceConfig);
         when(mContext.getSystemService(WifiScanner.class)).thenReturn(mWifiScanner);
+        when(mScanRequestProxy.getScanResults()).thenReturn(new ArrayList<>());
 
         mWifiShellCommand = new WifiShellCommand(mWifiInjector, mWifiService, mContext,
                 mWifiGlobals, mWifiThreadRunner);
@@ -908,12 +910,12 @@
                                 .setSsid(testSsid)
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
 
         // OWE
         mWifiShellCommand.exec(
                 new Binder(), new FileDescriptor(), new FileDescriptor(), new FileDescriptor(),
-                new String[]{"add-request", testSsid, "owe", testPassphrase});
+                new String[]{"add-request", testSsid, "owe"});
         verify(mConnectivityManager).requestNetwork(eq(
                 new NetworkRequest.Builder()
                         .addTransportType(TRANSPORT_WIFI)
@@ -923,7 +925,7 @@
                                 .setIsEnhancedOpen(true)
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
 
         // WPA2
         mWifiShellCommand.exec(
@@ -938,7 +940,7 @@
                                 .setWpa2Passphrase(testPassphrase)
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
 
         // WPA3
         mWifiShellCommand.exec(
@@ -953,7 +955,7 @@
                                 .setWpa3Passphrase(testPassphrase)
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
 
         // Test bssid flag
         mWifiShellCommand.exec(
@@ -968,7 +970,7 @@
                                 .setBssid(MacAddress.fromString(testBssid))
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
 
         // Test glob flag
         mWifiShellCommand.exec(
@@ -983,7 +985,7 @@
                                         testSsid, PatternMatcher.PATTERN_ADVANCED_GLOB))
                                 .build())
                         .build()),
-                (ConnectivityManager.NetworkCallback) any());
+                any(ConnectivityManager.NetworkCallback.class));
     }
 
     @Test