diff options
author | Zhaoming Yin <zhaomingyin@google.com> | 2023-06-08 13:44:01 -0700 |
---|---|---|
committer | Zhaoming Yin <zhaomingyin@google.com> | 2023-06-08 13:44:01 -0700 |
commit | f8e153ede200336c20d519b6746ddfadc510c9e5 (patch) | |
tree | 5f632de7650a718db937e37ddc393db87ba8930b | |
parent | ce2fd0fc57ccc2f21aae2cf0841688009340efb6 (diff) | |
download | mobly-bundled-snippets-f8e153ede200336c20d519b6746ddfadc510c9e5.tar.gz |
Solve permission issues when performing btDiscoverAndGetResults
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); + } + } + } } |