aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhaoming Yin <zhaomingyin@google.com>2023-06-08 13:44:01 -0700
committerZhaoming Yin <zhaomingyin@google.com>2023-06-08 13:44:01 -0700
commitf8e153ede200336c20d519b6746ddfadc510c9e5 (patch)
tree5f632de7650a718db937e37ddc393db87ba8930b
parentce2fd0fc57ccc2f21aae2cf0841688009340efb6 (diff)
downloadmobly-bundled-snippets-f8e153ede200336c20d519b6746ddfadc510c9e5.tar.gz
Solve permission issues when performing btDiscoverAndGetResults
-rw-r--r--src/main/AndroidManifest.xml2
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/BluetoothAdapterSnippet.java10
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/PairingBroadcastReceiver.java4
-rw-r--r--src/main/java/com/google/android/mobly/snippet/bundled/utils/Utils.java24
4 files changed, 38 insertions, 2 deletions
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 075fbe8..bcf52b2 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
+ <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
@@ -39,6 +40,7 @@
android:name="androidx.multidex.MultiDexApplication">
<meta-data
android:name="mobly-snippets"
+ android:testOnly="true"
android:value="com.google.android.mobly.snippet.bundled.AccountSnippet,
com.google.android.mobly.snippet.bundled.AudioSnippet,
com.google.android.mobly.snippet.bundled.bluetooth.BluetoothAdapterSnippet,
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/BluetoothAdapterSnippet.java b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/BluetoothAdapterSnippet.java
index c16a2b0..6a22630 100644
--- a/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/BluetoothAdapterSnippet.java
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/BluetoothAdapterSnippet.java
@@ -68,8 +68,9 @@ public class BluetoothAdapterSnippet implements Snippet {
new ConcurrentHashMap<>();
private volatile boolean mIsDiscoveryFinished = false;
- public BluetoothAdapterSnippet() {
+ public BluetoothAdapterSnippet() throws Throwable {
mContext = InstrumentationRegistry.getInstrumentation().getContext();
+ Utils.adaptShellPermissionIfRequired(mContext);
}
/**
@@ -190,6 +191,13 @@ public class BluetoothAdapterSnippet implements Snippet {
return mBluetoothAdapter.getName();
}
+ @Rpc(description = "Automatically confirm the bt pairing request.")
+ public void btConfirmPair() throws Throwable {
+ mContext.registerReceiver(
+ new PairingBroadcastReceiver(mContext), PairingBroadcastReceiver.filter);
+ }
+
+
@Rpc(description = "Returns the hardware address of the local Bluetooth adapter.")
public String btGetAddress() {
return mBluetoothAdapter.getAddress();
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/PairingBroadcastReceiver.java b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/PairingBroadcastReceiver.java
index 0cfd362..69ae433 100644
--- a/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/PairingBroadcastReceiver.java
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/PairingBroadcastReceiver.java
@@ -8,14 +8,16 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import com.google.android.mobly.snippet.util.Log;
+import com.google.android.mobly.snippet.bundled.utils.Utils;
@TargetApi(Build.VERSION_CODES.KITKAT)
public class PairingBroadcastReceiver extends BroadcastReceiver {
private final Context mContext;
public static IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
- public PairingBroadcastReceiver(Context context) {
+ public PairingBroadcastReceiver(Context context) throws Throwable {
mContext = context;
+ Utils.adaptShellPermissionIfRequired(mContext);
}
public void onReceive(Context context, Intent intent) {
diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/utils/Utils.java b/src/main/java/com/google/android/mobly/snippet/bundled/utils/Utils.java
index 376bcb5..36c9632 100644
--- a/src/main/java/com/google/android/mobly/snippet/bundled/utils/Utils.java
+++ b/src/main/java/com/google/android/mobly/snippet/bundled/utils/Utils.java
@@ -16,9 +16,14 @@
package com.google.android.mobly.snippet.bundled.utils;
+import android.app.UiAutomation;
+import android.os.Build;
+import android.content.Context;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.google.android.mobly.snippet.bundled.SmsSnippet;
import com.google.android.mobly.snippet.event.EventCache;
import com.google.android.mobly.snippet.event.SnippetEvent;
+import com.google.android.mobly.snippet.util.Log;
import com.google.common.primitives.Primitives;
import com.google.common.reflect.TypeToken;
import java.lang.reflect.InvocationTargetException;
@@ -210,4 +215,23 @@ public final class Utils {
}
return new String(hexChars);
}
+
+ public static void adaptShellPermissionIfRequired(Context context) throws Throwable {
+ if (context.getApplicationContext().getApplicationInfo().targetSdkVersion >= 29
+ && Build.VERSION.SDK_INT >= 29) {
+ Log.d("Elevating permission require to enable support for wifi operation in Android Q+");
+ UiAutomation uia = InstrumentationRegistry.getInstrumentation().getUiAutomation();
+ uia.adoptShellPermissionIdentity();
+ try {
+ Class<?> cls = Class.forName("android.app.UiAutomation");
+ Method destroyMethod = cls.getDeclaredMethod("destroy");
+ destroyMethod.invoke(uia);
+ } catch (NoSuchMethodException
+ | IllegalAccessException
+ | ClassNotFoundException
+ | InvocationTargetException e) {
+ throw new RuntimeException("Failed to cleaup Ui Automation", e);
+ }
+ }
+ }
}