Merge "Enable HID Device Profile Service (2/2)"

This commit is contained in:
Treehugger Robot
2017-10-27 21:06:44 +00:00
committed by Gerrit Code Review
5 changed files with 97 additions and 48 deletions

View File

@@ -31,7 +31,14 @@ import java.util.Arrays;
import java.util.List;
/**
* @hide
* Provides the public APIs to control the Bluetooth HID Device
* profile.
*
* BluetoothHidDevice is a proxy object for controlling the Bluetooth HID
* Device Service via IPC. Use {@link BluetoothAdapter#getProfileProxy} to get
* the BluetoothHidDevice proxy object.
*
* {@hide}
*/
public final class BluetoothHidDevice implements BluetoothProfile {
@@ -62,7 +69,9 @@ public final class BluetoothHidDevice implements BluetoothProfile {
/**
* Constants representing device subclass.
*
* @see #registerApp(String, String, String, byte, byte[], BluetoothHidDeviceCallback)
* @see #registerApp
* (BluetoothHidDeviceAppQosSettings, BluetoothHidDeviceAppQosSettings,
* BluetoothHidDeviceAppQosSettings, BluetoothHidDeviceCallback)
*/
public static final byte SUBCLASS1_NONE = (byte) 0x00;
public static final byte SUBCLASS1_KEYBOARD = (byte) 0x40;
@@ -80,9 +89,9 @@ public final class BluetoothHidDevice implements BluetoothProfile {
/**
* Constants representing report types.
*
* @see BluetoothHidDeviceCallback#onGetReport(byte, byte, int)
* @see BluetoothHidDeviceCallback#onSetReport(byte, byte, byte[])
* @see BluetoothHidDeviceCallback#onIntrData(byte, byte[])
* @see BluetoothHidDeviceCallback#onGetReport(BluetoothDevice, byte, byte, int)
* @see BluetoothHidDeviceCallback#onSetReport(BluetoothDevice, byte, byte, byte[])
* @see BluetoothHidDeviceCallback#onIntrData(BluetoothDevice, byte, byte[])
*/
public static final byte REPORT_TYPE_INPUT = (byte) 1;
public static final byte REPORT_TYPE_OUTPUT = (byte) 2;
@@ -91,7 +100,7 @@ public final class BluetoothHidDevice implements BluetoothProfile {
/**
* Constants representing error response for Set Report.
*
* @see BluetoothHidDeviceCallback#onSetReport(byte, byte, byte[])
* @see BluetoothHidDeviceCallback#onSetReport(BluetoothDevice, byte, byte, byte[])
*/
public static final byte ERROR_RSP_SUCCESS = (byte) 0;
public static final byte ERROR_RSP_NOT_READY = (byte) 1;
@@ -104,7 +113,7 @@ public final class BluetoothHidDevice implements BluetoothProfile {
* Constants representing protocol mode used set by host. Default is always
* {@link #PROTOCOL_REPORT_MODE} unless notified otherwise.
*
* @see BluetoothHidDeviceCallback#onSetProtocol(byte)
* @see BluetoothHidDeviceCallback#onSetProtocol(BluetoothDevice, byte)
*/
public static final byte PROTOCOL_BOOT_MODE = (byte) 0;
public static final byte PROTOCOL_REPORT_MODE = (byte) 1;
@@ -169,18 +178,7 @@ public final class BluetoothHidDevice implements BluetoothProfile {
public void onBluetoothStateChange(boolean up) {
Log.d(TAG, "onBluetoothStateChange: up=" + up);
synchronized (mConnection) {
if (!up) {
Log.d(TAG, "Unbinding service...");
if (mService != null) {
mService = null;
try {
mContext.unbindService(mConnection);
} catch (IllegalArgumentException e) {
Log.e(TAG, "onBluetoothStateChange: could not unbind service:",
e);
}
}
} else {
if (up) {
try {
if (mService == null) {
Log.d(TAG, "Binding HID Device service...");
@@ -189,14 +187,15 @@ public final class BluetoothHidDevice implements BluetoothProfile {
} catch (IllegalStateException e) {
Log.e(TAG,
"onBluetoothStateChange: could not bind to HID Dev "
+ "service: ",
e);
+ "service: ", e);
} catch (SecurityException e) {
Log.e(TAG,
"onBluetoothStateChange: could not bind to HID Dev "
+ "service: ",
e);
+ "service: ", e);
}
} else {
Log.d(TAG, "Unbinding service...");
doUnbind();
}
}
}
@@ -252,6 +251,18 @@ public final class BluetoothHidDevice implements BluetoothProfile {
return true;
}
void doUnbind() {
Log.d(TAG, "Unbinding HidDevService");
if (mService != null) {
mService = null;
try {
mContext.unbindService(mConnection);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Unable to unbind HidDevService", e);
}
}
}
void close() {
Log.v(TAG, "close()");
@@ -265,16 +276,8 @@ public final class BluetoothHidDevice implements BluetoothProfile {
}
synchronized (mConnection) {
if (mService != null) {
mService = null;
try {
mContext.unbindService(mConnection);
} catch (IllegalArgumentException e) {
Log.e(TAG, "close: could not unbind HID Dev service: ", e);
}
}
doUnbind();
}
mServiceListener = null;
}
@@ -388,7 +391,9 @@ public final class BluetoothHidDevice implements BluetoothProfile {
/**
* Unregisters application. Active connection will be disconnected and no
* new connections will be allowed until registered again using
* {@link #registerApp(String, String, String, byte, byte[], BluetoothHidDeviceCallback)}
* {@link #registerApp
* (BluetoothHidDeviceAppQosSettings, BluetoothHidDeviceAppQosSettings,
* BluetoothHidDeviceAppQosSettings, BluetoothHidDeviceCallback)}
*
* @param config {@link BluetoothHidDeviceAppConfiguration} object as obtained from {@link
* BluetoothHidDeviceCallback#onAppStatusChanged(BluetoothDevice,

View File

@@ -21,7 +21,16 @@ import android.os.Parcelable;
import java.util.Random;
/** @hide */
/**
* Represents the app configuration for a Bluetooth HID Device application.
*
* The app needs a BluetoothHidDeviceAppConfiguration token to unregister
* the Bluetooth HID Device service.
*
* {@see BluetoothHidDevice}
*
* {@hide}
*/
public final class BluetoothHidDeviceAppConfiguration implements Parcelable {
private final long mHash;

View File

@@ -19,7 +19,17 @@ package android.bluetooth;
import android.os.Parcel;
import android.os.Parcelable;
/** @hide */
/**
* Represents the Quality of Service (QoS) settings for a Bluetooth HID Device
* application.
*
* The BluetoothHidDevice framework will update the L2CAP QoS settings for the
* app during registration.
*
* {@see BluetoothHidDevice}
*
* {@hide}
*/
public final class BluetoothHidDeviceAppQosSettings implements Parcelable {
public final int serviceType;
@@ -36,8 +46,7 @@ public final class BluetoothHidDeviceAppQosSettings implements Parcelable {
public static final int MAX = (int) 0xffffffff;
public BluetoothHidDeviceAppQosSettings(int serviceType, int tokenRate, int tokenBucketSize,
int peakBandwidth,
int latency, int delayVariation) {
int peakBandwidth, int latency, int delayVariation) {
this.serviceType = serviceType;
this.tokenRate = tokenRate;
this.tokenBucketSize = tokenBucketSize;
@@ -66,10 +75,13 @@ public final class BluetoothHidDeviceAppQosSettings implements Parcelable {
@Override
public BluetoothHidDeviceAppQosSettings createFromParcel(Parcel in) {
return new BluetoothHidDeviceAppQosSettings(in.readInt(), in.readInt(),
return new BluetoothHidDeviceAppQosSettings(
in.readInt(),
in.readInt(),
in.readInt(), in.readInt());
in.readInt(),
in.readInt(),
in.readInt(),
in.readInt());
}
@Override
@@ -90,7 +102,7 @@ public final class BluetoothHidDeviceAppQosSettings implements Parcelable {
/** @return an int array representation of this instance */
public int[] toArray() {
return new int[]{
return new int[] {
serviceType, tokenRate, tokenBucketSize, peakBandwidth, latency, delayVariation
};
}

View File

@@ -19,7 +19,18 @@ package android.bluetooth;
import android.os.Parcel;
import android.os.Parcelable;
/** @hide */
/**
* Represents the Service Discovery Protocol (SDP) settings for a Bluetooth
* HID Device application.
*
* The BluetoothHidDevice framework adds the SDP record during app
* registration, so that the Android device can be discovered as a Bluetooth
* HID Device.
*
* {@see BluetoothHidDevice}
*
* {@hide}
*/
public final class BluetoothHidDeviceAppSdpSettings implements Parcelable {
public final String name;
@@ -57,8 +68,12 @@ public final class BluetoothHidDeviceAppSdpSettings implements Parcelable {
@Override
public BluetoothHidDeviceAppSdpSettings createFromParcel(Parcel in) {
return new BluetoothHidDeviceAppSdpSettings(in.readString(), in.readString(),
in.readString(), in.readByte(), in.createByteArray());
return new BluetoothHidDeviceAppSdpSettings(
in.readString(),
in.readString(),
in.readString(),
in.readByte(),
in.createByteArray());
}
@Override

View File

@@ -18,16 +18,24 @@ package android.bluetooth;
import android.util.Log;
/** @hide */
/**
* The template class that applications use to call callback functions on
* events from the HID host. Callback functions are wrapped in this class and
* registered to the Android system during app registration.
*
* {@see BluetoothHidDevice}
*
* {@hide}
*/
public abstract class BluetoothHidDeviceCallback {
private static final String TAG = BluetoothHidDeviceCallback.class.getSimpleName();
private static final String TAG = "BluetoothHidDevCallback";
/**
* Callback called when application registration state changes. Usually it's
* called due to either
* {@link BluetoothHidDevice#registerApp(String, String, String, byte, byte[],
* BluetoothHidDeviceCallback)}
* {@link BluetoothHidDevice#registerApp
* (String, String, String, byte, byte[], BluetoothHidDeviceCallback)}
* or
* {@link BluetoothHidDevice#unregisterApp(BluetoothHidDeviceAppConfiguration)}
* , but can be also unsolicited in case e.g. Bluetooth was turned off in
@@ -79,7 +87,7 @@ public abstract class BluetoothHidDeviceCallback {
/**
* Callback called when SET_REPORT is received from remote host. In case
* received data are invalid, application shall respond with
* {@link BluetoothHidDevice#reportError(BluetoothDevice)}.
* {@link BluetoothHidDevice#reportError(BluetoothDevice, byte)}.
*
* @param type Report Type.
* @param id Report Id.