From 430271fb37c3faa0e4f58aa0876da62432ad40d4 Mon Sep 17 00:00:00 2001 From: chuanhsiao <49941275+chuanhsiao@users.noreply.github.com> Date: Thu, 22 Aug 2019 14:04:08 +0800 Subject: Create BluetoothHearingAidSnippet.java (#119) --- .../profiles/BluetoothHearingAidSnippet.java | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/profiles/BluetoothHearingAidSnippet.java (limited to 'src/main/java/com/google/android') diff --git a/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/profiles/BluetoothHearingAidSnippet.java b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/profiles/BluetoothHearingAidSnippet.java new file mode 100644 index 0000000..3a95de1 --- /dev/null +++ b/src/main/java/com/google/android/mobly/snippet/bundled/bluetooth/profiles/BluetoothHearingAidSnippet.java @@ -0,0 +1,113 @@ +package com.google.android.mobly.snippet.bundled.bluetooth.profiles; + +import android.annotation.TargetApi; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHearingAid; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.content.IntentFilter; +import android.os.Build; +import android.os.Bundle; +import androidx.test.platform.app.InstrumentationRegistry; +import com.google.android.mobly.snippet.Snippet; +import com.google.android.mobly.snippet.bundled.bluetooth.BluetoothAdapterSnippet; +import com.google.android.mobly.snippet.bundled.bluetooth.PairingBroadcastReceiver; +import com.google.android.mobly.snippet.bundled.utils.JsonSerializer; +import com.google.android.mobly.snippet.bundled.utils.Utils; +import com.google.android.mobly.snippet.rpc.Rpc; +import com.google.android.mobly.snippet.rpc.RpcMinSdk; +import java.util.ArrayList; + +public class BluetoothHearingAidSnippet implements Snippet { + private static class BluetoothHearingAidSnippetException extends Exception { + private static final long serialVersionUID = 1; + + BluetoothHearingAidSnippetException(String msg) { + super(msg); + } + } + + private static final int TIMEOUT_SEC = 60; + + private Context context; + private static boolean isHearingAidProfileReady = false; + private static BluetoothHearingAid hearingAidProfile; + private final JsonSerializer jsonSerializer = new JsonSerializer(); + + @TargetApi(Build.VERSION_CODES.Q) + public BluetoothHearingAidSnippet() { + context = InstrumentationRegistry.getInstrumentation().getContext(); + BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + bluetoothAdapter.getProfileProxy( + context, new HearingAidServiceListener(), BluetoothProfile.HEARING_AID); + Utils.waitUntil(() -> isHearingAidProfileReady, TIMEOUT_SEC); + } + + @TargetApi(Build.VERSION_CODES.Q) + private static class HearingAidServiceListener implements BluetoothProfile.ServiceListener { + public void onServiceConnected(int var1, BluetoothProfile profile) { + hearingAidProfile = (BluetoothHearingAid) profile; + isHearingAidProfileReady = true; + } + + public void onServiceDisconnected(int var1) { + isHearingAidProfileReady = false; + } + } + + @TargetApi(Build.VERSION_CODES.Q) + @RpcMinSdk(Build.VERSION_CODES.Q) + @Rpc(description = "Connects to a paired or discovered device with HA profile.") + public void btHearingAidConnect(String deviceAddress) throws Throwable { + BluetoothDevice device = BluetoothAdapterSnippet.getKnownDeviceByAddress(deviceAddress); + IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST); + context.registerReceiver(new PairingBroadcastReceiver(context), filter); + Utils.invokeByReflection(hearingAidProfile, "connect", device); + if (!Utils.waitUntil( + () -> + hearingAidProfile.getConnectionState(device) + == BluetoothHearingAid.STATE_CONNECTED, + TIMEOUT_SEC)) { + throw new BluetoothHearingAidSnippetException( + String.format( + "Failed to connect to device %s|%s with HA profile within %d sec.", + device.getName(), device.getAddress(), TIMEOUT_SEC)); + } + } + + @Rpc(description = "Disconnects a device from HA profile.") + public void btHearingAidDisconnect(String deviceAddress) throws Throwable { + BluetoothDevice device = getConnectedBluetoothDevice(deviceAddress); + Utils.invokeByReflection(hearingAidProfile, "disconnect", device); + if (!Utils.waitUntil( + () -> + hearingAidProfile.getConnectionState(device) + == BluetoothHearingAid.STATE_DISCONNECTED, + TIMEOUT_SEC)) { + throw new BluetoothHearingAidSnippetException( + String.format( + "Failed to disconnect to device %s|%s with HA profile within %d sec.", + device.getName(), device.getAddress(), TIMEOUT_SEC)); + } + } + + @Rpc(description = "Gets all the devices currently connected via HA profile.") + public ArrayList btHearingAidGetConnectedDevices() { + return jsonSerializer.serializeBluetoothDeviceList(hearingAidProfile.getConnectedDevices()); + } + + private BluetoothDevice getConnectedBluetoothDevice(String deviceAddress) + throws BluetoothHearingAidSnippetException { + for (BluetoothDevice device : hearingAidProfile.getConnectedDevices()) { + if (device.getAddress().equalsIgnoreCase(deviceAddress)) { + return device; + } + } + throw new BluetoothHearingAidSnippetException(String.format( + "No device with address %s is connected via HA Profile.", deviceAddress)); + } + + @Override + public void shutdown() {} +} -- cgit v1.2.3