BLE Scanning: Add pending intent plumbing for SL4A + GD Cert testing
Bug: 207525224
Test: gd/cert/run --device --clean --test_config=gd/cert/gd_sl4a_device_config.json LeAdvancedScanningTest:test_scan_filter_device_public_address_with_irk_legacy_pdu_pending_intent
Tag: #stability
Change-Id: I217a355753901ca81e33cbcd5456a61120826ecd
Merged-In: I217a355753901ca81e33cbcd5456a61120826ecd
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
index 7efa9f0..50fa876 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothLeScanFacade.java
@@ -16,6 +16,7 @@
package com.googlecode.android_scripting.facade.bluetooth;
+import android.app.PendingIntent;
import android.app.Service;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.LeScanCallback;
@@ -26,6 +27,11 @@
import android.bluetooth.le.ScanFilter.Builder;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Bundle;
import android.os.ParcelUuid;
@@ -195,12 +201,12 @@
}
/**
- * Starts a ble scan
+ * Starts a ble scan with ScanCallback callbacks.
*
* @param index the id of the myScan whose ScanCallback to start
* @throws Exception
*/
- @Rpc(description = "Starts a ble advertisement scan")
+ @Rpc(description = "Starts a ble advertisement scan using scan callback")
public void bleStartBleScan(
@RpcParameter(name = "filterListIndex")
Integer filterListIndex,
@@ -234,6 +240,69 @@
}
}
+ private PendingIntent createPendingIntent() {
+ return PendingIntent
+ .getBroadcast(mService, 0,
+ new Intent(mService, ScanBroadcastReceiver.class)
+ .setAction("com.googlecode.android_scripting.ACTION_FOUND")
+ .setComponent(new ComponentName("com.googlecode.android_scripting",
+ "com.googlecode.android_scripting.facade.bluetooth.ScanBroadcastReceiver")),
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_MUTABLE);
+ }
+
+ /**
+ * Starts a ble scan with pending intent callback.
+ *
+ * @param index the id of the myScan whose ScanCallback to start
+ * @throws Exception
+ */
+ @Rpc(description = "Starts a ble advertisement scan")
+ public void bleStartBleScanPendingIntent(
+ @RpcParameter(name = "filterListIndex")
+ Integer filterListIndex,
+ @RpcParameter(name = "scanSettingsIndex")
+ Integer scanSettingsIndex
+ ) throws Exception {
+ Log.d("bluetooth_le_scan starting a background scan using pending intent");
+ ArrayList<ScanFilter> mScanFilters = new ArrayList<ScanFilter>();
+ mScanFilters.add(new ScanFilter.Builder().build());
+ ScanSettings mScanSettings = new ScanSettings.Builder().build();
+ if (mScanFilterList.get(filterListIndex) != null) {
+ mScanFilters = mScanFilterList.get(filterListIndex);
+ } else {
+ throw new IllegalArgumentException("Invalid filterListIndex input:"
+ + Integer.toString(filterListIndex));
+ }
+ if (mScanSettingsList.get(scanSettingsIndex) != null) {
+ mScanSettings = mScanSettingsList.get(scanSettingsIndex);
+ } else if (!mScanSettingsList.isEmpty()) {
+ throw new IllegalArgumentException("Invalid scanSettingsIndex input:"
+ + Integer.toString(scanSettingsIndex));
+ }
+ Log.d("Registering receiver");
+ mService.registerReceiver(new TestBroadcastReceiver() ,
+ new IntentFilter(ScanBroadcastReceiver.ACTION_FOUND_SIDESTEP));
+ Log.d("Starting Scan");
+ mScanner.startScan(mScanFilters, mScanSettings, createPendingIntent());
+ }
+
+ private class TestBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d("TEST onReceive( " + context + ", " + intent + ")");
+ ArrayList<ScanResult> results = intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT);
+ if (results != null && results.size() > 0) {
+ for (final ScanResult result : results) {
+ Log.d("onScanResult : " + result.getDevice().getName() + " " + result.getDevice()
+ .getAddress());
+ new myScanCallback(1).onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result);
+ }
+ } else {
+ Log.d("Empty results");
+ }
+ }
+ }
+
/**
* Starts a classic ble scan
*
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/ScanBroadcastReceiver.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/ScanBroadcastReceiver.java
new file mode 100644
index 0000000..ae56d32
--- /dev/null
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/ScanBroadcastReceiver.java
@@ -0,0 +1,35 @@
+package com.googlecode.android_scripting.facade.bluetooth;
+
+import android.app.Service;
+import android.bluetooth.le.BluetoothLeScanner;
+import android.bluetooth.le.ScanCallback;
+import android.bluetooth.le.ScanResult;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.googlecode.android_scripting.facade.EventFacade;
+import com.googlecode.android_scripting.facade.FacadeManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ScanBroadcastReceiver extends BroadcastReceiver {
+ private static final String TAG = "SL4A Bluetooth";
+ public static final String ACTION_FOUND_SIDESTEP = "com.googlecode.android_scripting.ACTION_FOUND_SIDE_STEP";
+
+ public ScanBroadcastReceiver() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "Received Intent data.");
+ Intent i = new Intent(ACTION_FOUND_SIDESTEP);
+ i.putParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT,
+ intent.getParcelableArrayListExtra(BluetoothLeScanner.EXTRA_LIST_SCAN_RESULT));
+ context.sendBroadcast(i);
+ }
+
+}
diff --git a/ScriptingLayerForAndroid/AndroidManifest.xml b/ScriptingLayerForAndroid/AndroidManifest.xml
index 441342c..5eedf40 100644
--- a/ScriptingLayerForAndroid/AndroidManifest.xml
+++ b/ScriptingLayerForAndroid/AndroidManifest.xml
@@ -20,6 +20,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.googlecode.android_scripting"
android:sharedUserId="android.uid.system">
+
+ <permission android:name="com.googlecode.android_scripting.ACTION_FOUND_PERMISSION" />
+
+ <protected-broadcast android:name="com.googlecode.android_scripting.ACTION_FOUND"
+ android:protectionLevel="signatureOrSystem"/>
+
<uses-permission android:name="android.permission.ACCESS_BLUETOOTH_SHARE" />
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
@@ -247,5 +253,13 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+ <receiver android:name=".facade.bluetooth.ScanBroadcastReceiver"
+ android:exported="true" >
+ <intent-filter>
+ <action
+ android:name="com.googlecode.android_scripting.ACTION_FOUND"
+ android:permission="com.googlecode.android_scripting.ACTION_FOUND_PERMISSION" />
+ </intent-filter>
+ </receiver>
</application>
</manifest>