Fix ScanResult array parceling.
readParcelableArray() wasn't working as expected so I just parceled
the array myself.
Test: adb shell am instrument -e class android.net.RecommendationRequestTest -w com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
Change-Id: I47bc31adbedea817feaa5953cb6ee48506f9c6d6
diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java
index 05ca1aa..a96f90d 100644
--- a/core/java/android/net/RecommendationRequest.java
+++ b/core/java/android/net/RecommendationRequest.java
@@ -105,7 +105,16 @@
}
protected RecommendationRequest(Parcel in) {
- mScanResults = (ScanResult[]) in.readParcelableArray(ScanResult.class.getClassLoader());
+ final int resultCount = in.readInt();
+ if (resultCount > 0) {
+ mScanResults = new ScanResult[resultCount];
+ for (int i = 0; i < resultCount; i++) {
+ mScanResults[i] = in.readParcelable(ScanResult.class.getClassLoader());
+ }
+ } else {
+ mScanResults = null;
+ }
+
mCurrentSelectedConfig = in.readParcelable(WifiConfiguration.class.getClassLoader());
mRequiredCapabilities = in.readParcelable(NetworkCapabilities.class.getClassLoader());
}
@@ -117,7 +126,14 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeParcelableArray(mScanResults, flags);
+ if (mScanResults != null) {
+ dest.writeInt(mScanResults.length);
+ for (int i = 0; i < mScanResults.length; i++) {
+ dest.writeParcelable(mScanResults[i], flags);
+ }
+ } else {
+ dest.writeInt(0);
+ }
dest.writeParcelable(mCurrentSelectedConfig, flags);
dest.writeParcelable(mRequiredCapabilities, flags);
}
diff --git a/core/tests/coretests/src/android/net/RecommendationRequestTest.java b/core/tests/coretests/src/android/net/RecommendationRequestTest.java
new file mode 100644
index 0000000..31560b0
--- /dev/null
+++ b/core/tests/coretests/src/android/net/RecommendationRequestTest.java
@@ -0,0 +1,84 @@
+package android.net;
+
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+
+public class RecommendationRequestTest extends AndroidTestCase {
+ private ScanResult[] mScanResults;
+ private WifiConfiguration mConfiguration;
+ private NetworkCapabilities mCapabilities;
+
+ @Override
+ public void setUp() throws Exception {
+ mScanResults = new ScanResult[2];
+ mScanResults[0] = new ScanResult();
+ mScanResults[1] = new ScanResult(
+ "ssid",
+ "bssid",
+ 0L /*hessid*/,
+ 1 /*anqpDominId*/,
+ "caps",
+ 2 /*level*/,
+ 3 /*frequency*/,
+ 4L /*tsf*/,
+ 5 /*distCm*/,
+ 6 /*distSdCm*/,
+ 7 /*channelWidth*/,
+ 8 /*centerFreq0*/,
+ 9 /*centerFreq1*/,
+ false /*is80211McRTTResponder*/);
+ mConfiguration = new WifiConfiguration();
+ mConfiguration.SSID = "RecommendationRequestTest";
+ mCapabilities = new NetworkCapabilities()
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED);
+ }
+
+ public void testParceling() throws Exception {
+ RecommendationRequest request = new RecommendationRequest.Builder()
+ .setCurrentRecommendedWifiConfig(mConfiguration)
+ .setScanResults(mScanResults)
+ .setNetworkCapabilities(mCapabilities)
+ .build();
+
+ RecommendationRequest parceled = passThroughParcel(request);
+ assertEquals(request.getCurrentSelectedConfig().SSID,
+ parceled.getCurrentSelectedConfig().SSID);
+ assertEquals(request.getRequiredCapabilities(), parceled.getRequiredCapabilities());
+ ScanResult[] parceledScanResults = parceled.getScanResults();
+ assertNotNull(parceledScanResults);
+ assertEquals(mScanResults.length, parceledScanResults.length);
+ for (int i = 0; i < mScanResults.length; i++) {
+ assertEquals(mScanResults[i].SSID, parceledScanResults[i].SSID);
+ }
+ }
+
+ public void testParceling_nullScanResults() throws Exception {
+ RecommendationRequest request = new RecommendationRequest.Builder()
+ .setCurrentRecommendedWifiConfig(mConfiguration)
+ .setNetworkCapabilities(mCapabilities)
+ .build();
+
+ RecommendationRequest parceled = passThroughParcel(request);
+ assertEquals(request.getCurrentSelectedConfig().SSID,
+ parceled.getCurrentSelectedConfig().SSID);
+ assertEquals(request.getRequiredCapabilities(), parceled.getRequiredCapabilities());
+ ScanResult[] parceledScanResults = parceled.getScanResults();
+ assertNull(parceledScanResults);
+ }
+
+ private RecommendationRequest passThroughParcel(RecommendationRequest request) {
+ Parcel p = Parcel.obtain();
+ RecommendationRequest output = null;
+ try {
+ request.writeToParcel(p, 0);
+ p.setDataPosition(0);
+ output = RecommendationRequest.CREATOR.createFromParcel(p);
+ } finally {
+ p.recycle();
+ }
+ assertNotNull(output);
+ return output;
+ }
+}