Fix ScanRequest parceling issue
This causes Parcel error and NPE when using the NearbyManager#startScan
API
Ignore-AOSP-First: nearby_not_in_aosp_yet
Test: -m
Fix: 232317796
Change-Id: I4f03bd7c9127056d0c63e1abd0e4d21484166fb0
diff --git a/nearby/framework/java/android/nearby/ScanRequest.java b/nearby/framework/java/android/nearby/ScanRequest.java
index cf2dd43..c717ac7 100644
--- a/nearby/framework/java/android/nearby/ScanRequest.java
+++ b/nearby/framework/java/android/nearby/ScanRequest.java
@@ -73,7 +73,8 @@
.setScanMode(in.readInt())
.setBleEnabled(in.readBoolean())
.setWorkSource(in.readTypedObject(WorkSource.CREATOR));
- for (int i = 0; i < in.readInt(); i++) {
+ final int size = in.readInt();
+ for (int i = 0; i < size; i++) {
builder.addScanFilter(ScanFilter.createFromParcel(in));
}
return builder.build();
@@ -209,8 +210,9 @@
dest.writeInt(mScanMode);
dest.writeBoolean(mBleEnabled);
dest.writeTypedObject(mWorkSource, /* parcelableFlags= */0);
- dest.writeInt(mScanFilters.size());
- for (int i = 0; i < mScanFilters.size(); ++i) {
+ final int size = mScanFilters.size();
+ dest.writeInt(size);
+ for (int i = 0; i < size; i++) {
mScanFilters.get(i).writeToParcel(dest, flags);
}
}
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
index 3a73b9f..21f3d28 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
@@ -45,6 +45,7 @@
private static final int UID = 1001;
private static final String APP_NAME = "android.nearby.tests";
+ private static final int RSSI = -40;
@Test
@SdkSuppress(minSdkVersion = 32, codeName = "T")
@@ -163,6 +164,14 @@
@Test
@SdkSuppress(minSdkVersion = 32, codeName = "T")
public void testScanFilter() {
+ ScanRequest request = new ScanRequest.Builder().setScanType(
+ SCAN_TYPE_NEARBY_PRESENCE).addScanFilter(getPresenceScanFilter()).build();
+
+ assertThat(request.getScanFilters()).isNotEmpty();
+ assertThat(request.getScanFilters().get(0).getMaxPathLoss()).isEqualTo(RSSI);
+ }
+
+ private static PresenceScanFilter getPresenceScanFilter() {
final byte[] secretId = new byte[]{1, 2, 3, 4};
final byte[] authenticityKey = new byte[]{0, 1, 1, 1};
final byte[] publicKey = new byte[]{1, 1, 2, 2};
@@ -174,19 +183,12 @@
.setIdentityType(IDENTITY_TYPE_PRIVATE)
.build();
- final int rssi = -40;
final int action = 123;
- PresenceScanFilter filter = new PresenceScanFilter.Builder()
+ return new PresenceScanFilter.Builder()
.addCredential(credential)
- .setMaxPathLoss(rssi)
+ .setMaxPathLoss(RSSI)
.addPresenceAction(action)
.build();
-
- ScanRequest request = new ScanRequest.Builder().setScanType(
- SCAN_TYPE_FAST_PAIR).addScanFilter(filter).build();
-
- assertThat(request.getScanFilters()).isNotEmpty();
- assertThat(request.getScanFilters().get(0).getMaxPathLoss()).isEqualTo(rssi);
}
private static WorkSource getWorkSource() {
diff --git a/nearby/tests/unit/src/android/nearby/ScanRequestTest.java b/nearby/tests/unit/src/android/nearby/ScanRequestTest.java
index a45d8bb..12de30e 100644
--- a/nearby/tests/unit/src/android/nearby/ScanRequestTest.java
+++ b/nearby/tests/unit/src/android/nearby/ScanRequestTest.java
@@ -16,6 +16,7 @@
package android.nearby;
+import static android.nearby.PresenceCredential.IDENTITY_TYPE_PRIVATE;
import static android.nearby.ScanRequest.SCAN_MODE_BALANCED;
import static android.nearby.ScanRequest.SCAN_MODE_LOW_POWER;
import static android.nearby.ScanRequest.SCAN_TYPE_FAST_PAIR;
@@ -39,6 +40,8 @@
@RunWith(AndroidJUnit4.class)
public class ScanRequestTest {
+ private static final int RSSI = -40;
+
private static WorkSource getWorkSource() {
final int uid = 1001;
final String appName = "android.nearby.tests";
@@ -137,6 +140,7 @@
.setScanMode(SCAN_MODE_BALANCED)
.setBleEnabled(true)
.setWorkSource(workSource)
+ .addScanFilter(getPresenceScanFilter())
.build();
// Write the scan request to parcel, then read from it.
@@ -164,4 +168,24 @@
parcel.setDataPosition(0);
return ScanRequest.CREATOR.createFromParcel(parcel);
}
+
+ private static PresenceScanFilter getPresenceScanFilter() {
+ final byte[] secretId = new byte[]{1, 2, 3, 4};
+ final byte[] authenticityKey = new byte[]{0, 1, 1, 1};
+ final byte[] publicKey = new byte[]{1, 1, 2, 2};
+ final byte[] encryptedMetadata = new byte[]{1, 2, 3, 4, 5};
+ final byte[] metadataEncryptionKeyTag = new byte[]{1, 1, 3, 4, 5};
+
+ PublicCredential credential = new PublicCredential.Builder(
+ secretId, authenticityKey, publicKey, encryptedMetadata, metadataEncryptionKeyTag)
+ .setIdentityType(IDENTITY_TYPE_PRIVATE)
+ .build();
+
+ final int action = 123;
+ return new PresenceScanFilter.Builder()
+ .addCredential(credential)
+ .setMaxPathLoss(RSSI)
+ .addPresenceAction(action)
+ .build();
+ }
}