From ab60cb6a6d94db74f7ba2bd3d86ec565a2f98b95 Mon Sep 17 00:00:00 2001 From: Jeremy Joslin Date: Fri, 16 Dec 2016 17:48:13 -0800 Subject: [PATCH] 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: I83939d17769930b707b8bc579542c74a05e31d19 Merged-In: I47bc31adbedea817feaa5953cb6ee48506f9c6d6 --- .../android/net/RecommendationRequest.java | 20 ++++- .../net/RecommendationRequestTest.java | 84 +++++++++++++++++++ 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 core/tests/coretests/src/android/net/RecommendationRequestTest.java diff --git a/core/java/android/net/RecommendationRequest.java b/core/java/android/net/RecommendationRequest.java index 05ca1aa437f95..a96f90d57746f 100644 --- a/core/java/android/net/RecommendationRequest.java +++ b/core/java/android/net/RecommendationRequest.java @@ -105,7 +105,16 @@ public final class RecommendationRequest implements Parcelable { } 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 @@ public final class RecommendationRequest implements Parcelable { @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 0000000000000..31560b0ac8c31 --- /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; + } +}