Merge "Add BluetoothLeBroadcast profile API." am: afd5a827a7 am: 562b6f9093 am: aaca31b70b
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1881629 Change-Id: I594870742bcf4c8ceb4037db4dbb048e61fdf64f
This commit is contained in:
287
core/java/android/bluetooth/BluetoothLeBroadcast.java
Normal file
287
core/java/android/bluetooth/BluetoothLeBroadcast.java
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at:
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package android.bluetooth;
|
||||||
|
|
||||||
|
import android.annotation.IntDef;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class provides the public APIs to control the Bluetooth LE Broadcast Source profile.
|
||||||
|
*
|
||||||
|
* <p>BluetoothLeBroadcast is a proxy object for controlling the Bluetooth LE Broadcast
|
||||||
|
* Source Service via IPC. Use {@link BluetoothAdapter#getProfileProxy}
|
||||||
|
* to get the BluetoothLeBroadcast proxy object.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public final class BluetoothLeBroadcast implements BluetoothProfile {
|
||||||
|
private static final String TAG = "BluetoothLeBroadcast";
|
||||||
|
private static final boolean DBG = true;
|
||||||
|
private static final boolean VDBG = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants used by the LE Audio Broadcast profile for the Broadcast state
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@IntDef(prefix = {"LE_AUDIO_BROADCAST_STATE_"}, value = {
|
||||||
|
LE_AUDIO_BROADCAST_STATE_DISABLED,
|
||||||
|
LE_AUDIO_BROADCAST_STATE_ENABLING,
|
||||||
|
LE_AUDIO_BROADCAST_STATE_ENABLED,
|
||||||
|
LE_AUDIO_BROADCAST_STATE_DISABLING,
|
||||||
|
LE_AUDIO_BROADCAST_STATE_PLAYING,
|
||||||
|
LE_AUDIO_BROADCAST_STATE_NOT_PLAYING
|
||||||
|
})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface LeAudioBroadcastState {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that LE Audio Broadcast mode is currently disabled
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_DISABLED = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that LE Audio Broadcast mode is being enabled
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_ENABLING = 11;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that LE Audio Broadcast mode is currently enabled
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_ENABLED = 12;
|
||||||
|
/**
|
||||||
|
* Indicates that LE Audio Broadcast mode is being disabled
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_DISABLING = 13;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that an LE Audio Broadcast mode is currently playing
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_PLAYING = 14;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that LE Audio Broadcast is currently not playing
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_STATE_NOT_PLAYING = 15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constants used by the LE Audio Broadcast profile for encryption key length
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@IntDef(prefix = {"LE_AUDIO_BROADCAST_ENCRYPTION_KEY_"}, value = {
|
||||||
|
LE_AUDIO_BROADCAST_ENCRYPTION_KEY_32BIT,
|
||||||
|
LE_AUDIO_BROADCAST_ENCRYPTION_KEY_128BIT
|
||||||
|
})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface LeAudioEncryptionKeyLength {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the LE Audio Broadcast encryption key size is 32 bits.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_ENCRYPTION_KEY_32BIT = 16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that the LE Audio Broadcast encryption key size is 128 bits.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int LE_AUDIO_BROADCAST_ENCRYPTION_KEY_128BIT = 17;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for receiving events related to broadcasts
|
||||||
|
*/
|
||||||
|
public interface Callback {
|
||||||
|
/**
|
||||||
|
* Called when broadcast state has changed
|
||||||
|
*
|
||||||
|
* @param prevState broadcast state before the change
|
||||||
|
* @param newState broadcast state after the change
|
||||||
|
*/
|
||||||
|
@LeAudioBroadcastState
|
||||||
|
void onBroadcastStateChange(int prevState, int newState);
|
||||||
|
/**
|
||||||
|
* Called when encryption key has been updated
|
||||||
|
*
|
||||||
|
* @param success true if the key was updated successfully, false otherwise
|
||||||
|
*/
|
||||||
|
void onEncryptionKeySet(boolean success);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a BluetoothLeBroadcast proxy object for interacting with the local
|
||||||
|
* LE Audio Broadcast Source service.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
/*package*/ BluetoothLeBroadcast(Context context,
|
||||||
|
BluetoothProfile.ServiceListener listener) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not supported since LE Audio Broadcasts do not establish a connection
|
||||||
|
*
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int getConnectionState(BluetoothDevice device) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"LE Audio Broadcasts are not connection-oriented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not supported since LE Audio Broadcasts do not establish a connection
|
||||||
|
*
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"LE Audio Broadcasts are not connection-oriented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Not supported since LE Audio Broadcasts do not establish a connection
|
||||||
|
*
|
||||||
|
* @throws UnsupportedOperationException
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<BluetoothDevice> getConnectedDevices() {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"LE Audio Broadcasts are not connection-oriented.");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable LE Audio Broadcast mode.
|
||||||
|
*
|
||||||
|
* Generates a new broadcast ID and enables sending of encrypted or unencrypted
|
||||||
|
* isochronous PDUs
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int enableBroadcastMode() {
|
||||||
|
if (DBG) log("enableBroadcastMode");
|
||||||
|
return BluetoothStatusCodes.ERROR_LE_AUDIO_BROADCAST_SOURCE_SET_BROADCAST_MODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable LE Audio Broadcast mode.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int disableBroadcastMode() {
|
||||||
|
if (DBG) log("disableBroadcastMode");
|
||||||
|
return BluetoothStatusCodes.ERROR_LE_AUDIO_BROADCAST_SOURCE_SET_BROADCAST_MODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current LE Audio broadcast state
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@LeAudioBroadcastState
|
||||||
|
public int getBroadcastState() {
|
||||||
|
if (DBG) log("getBroadcastState");
|
||||||
|
return LE_AUDIO_BROADCAST_STATE_DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable LE Audio broadcast encryption
|
||||||
|
*
|
||||||
|
* @param keyLength if useExisting is true, this specifies the length of the key that should
|
||||||
|
* be generated
|
||||||
|
* @param useExisting true, if an existing key should be used
|
||||||
|
* false, if a new key should be generated
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@LeAudioEncryptionKeyLength
|
||||||
|
public int enableEncryption(boolean useExisting, int keyLength) {
|
||||||
|
if (DBG) log("enableEncryption useExisting=" + useExisting + " keyLength=" + keyLength);
|
||||||
|
return BluetoothStatusCodes.ERROR_LE_AUDIO_BROADCAST_SOURCE_ENABLE_ENCRYPTION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable LE Audio broadcast encryption
|
||||||
|
*
|
||||||
|
* @param removeExisting true, if the existing key should be removed
|
||||||
|
* false, otherwise
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public int disableEncryption(boolean removeExisting) {
|
||||||
|
if (DBG) log("disableEncryption removeExisting=" + removeExisting);
|
||||||
|
return BluetoothStatusCodes.ERROR_LE_AUDIO_BROADCAST_SOURCE_DISABLE_ENCRYPTION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable LE Audio broadcast encryption
|
||||||
|
*
|
||||||
|
* @param key use the provided key if non-null, generate a new key if null
|
||||||
|
* @param keyLength 0 if encryption is disabled, 4 bytes (low security),
|
||||||
|
* 16 bytes (high security)
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
@LeAudioEncryptionKeyLength
|
||||||
|
public int setEncryptionKey(byte[] key, int keyLength) {
|
||||||
|
if (DBG) log("setEncryptionKey key=" + key + " keyLength=" + keyLength);
|
||||||
|
return BluetoothStatusCodes.ERROR_LE_AUDIO_BROADCAST_SOURCE_SET_ENCRYPTION_KEY_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the encryption key that was set before
|
||||||
|
*
|
||||||
|
* @return encryption key as a byte array or null if no encryption key was set
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public byte[] getEncryptionKey() {
|
||||||
|
if (DBG) log("getEncryptionKey");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void log(String msg) {
|
||||||
|
Log.d(TAG, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -232,13 +232,20 @@ public interface BluetoothProfile {
|
|||||||
*/
|
*/
|
||||||
int CSIP_SET_COORDINATOR = 25;
|
int CSIP_SET_COORDINATOR = 25;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LE Audio Broadcast Source
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
int LE_AUDIO_BROADCAST = 26;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Max profile ID. This value should be updated whenever a new profile is added to match
|
* Max profile ID. This value should be updated whenever a new profile is added to match
|
||||||
* the largest value assigned to a profile.
|
* the largest value assigned to a profile.
|
||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
int MAX_PROFILE_ID = 25;
|
int MAX_PROFILE_ID = 26;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default priority for devices that we try to auto-connect to and
|
* Default priority for devices that we try to auto-connect to and
|
||||||
|
|||||||
@@ -225,6 +225,66 @@ public final class BluetoothStatusCodes {
|
|||||||
*/
|
*/
|
||||||
public static final int ERROR_DISCONNECT_REASON_BAD_PARAMETERS = 1109;
|
public static final int ERROR_DISCONNECT_REASON_BAD_PARAMETERS = 1109;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that setting the LE Audio Broadcast mode failed.
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_SOURCE_SET_BROADCAST_MODE_FAILED = 1110;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that setting a new encryption key for Bluetooth LE Audio Broadcast Source failed.
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_SOURCE_SET_ENCRYPTION_KEY_FAILED = 1111;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that connecting to a remote Broadcast Audio Scan Service failed.
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_AUDIO_SCAN_SERVICE_CONNECT_FAILED = 1112;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that disconnecting from a remote Broadcast Audio Scan Service failed.
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_AUDIO_SCAN_SERVICE_DISCONNECT_FAILED = 1113;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that enabling LE Audio Broadcast encryption failed
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_SOURCE_ENABLE_ENCRYPTION_FAILED = 1114;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that disabling LE Audio Broadcast encryption failed
|
||||||
|
* <p>
|
||||||
|
* Example solution: Change parameters and try again. If error persists, the app can report
|
||||||
|
* telemetry and/or log the error in a bugreport.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final int ERROR_LE_AUDIO_BROADCAST_SOURCE_DISABLE_ENCRYPTION_FAILED = 1115;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates that an unknown error has occurred has occurred.
|
* Indicates that an unknown error has occurred has occurred.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user