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