From a014314c9490a18fd4b900302d873206df09a3e0 Mon Sep 17 00:00:00 2001 From: Jack He Date: Wed, 15 Dec 2021 15:40:34 -0800 Subject: Introduce LE audio broadcast system APIs * Rename BluetoothLeBroadcastSourceInfo to BluetoothLeBroadcastReceiveState so that it matches the name in the Bluetooth specification * Added callbacks to BluetoothLeBroadcast so that caller that wait for asynchronouze operations with reason code in the hope to reduce potential race conditions * Allow multiple broadcast to be set up on the same deivce if the device supports it * Added ScanFilter to searchForSources() method and removed selectSources() method for BluetoothLeBroadcastAssistant so that the Bluetooth stack can automatically handle periodic sync after a Broadcast source is found and only do this for a limited number of devices * Added structural APIs to store Broadcast Source and Group information * Added unknown address type in BluetoothDevice Bug: 208222281 Test: make Tag: #feature Ignore-AOSP-First: Merge conflict in master Change-Id: If4c3af658b5bc1283d76e5d1899485a487ab7626 Merged-In: If4c3af658b5bc1283d76e5d1899485a487ab7626 (cherry picked from commit 4f9d902028fbe271167547884c33fb9ec7601080) --- .../bluetooth/BluetoothLeBroadcastChannel.java | 206 +++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java (limited to 'framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java') diff --git a/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java b/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java new file mode 100644 index 0000000000..6addc062e3 --- /dev/null +++ b/framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java @@ -0,0 +1,206 @@ +/* + * Copyright 2022 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.NonNull; +import android.annotation.SystemApi; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * This class contains the Broadcast Isochronous Channel level information as defined in the BASE + * structure of the Basic Audio Profile. + * + * @hide + */ +@SystemApi +public final class BluetoothLeBroadcastChannel implements Parcelable { + private static final int UNKNOWN_VALUE_PLACEHOLDER = -1; + + private final boolean mIsSelected; + private final int mChannelIndex; + private final BluetoothLeAudioCodecConfigMetadata mCodecMetadata; + + private BluetoothLeBroadcastChannel(boolean isSelected, int channelIndex, + BluetoothLeAudioCodecConfigMetadata codecMetadata) { + mIsSelected = isSelected; + mChannelIndex = channelIndex; + mCodecMetadata = codecMetadata; + } + + /** + * Return true if the channel is selected by Broadcast Assistant for the Broadcast Sink. + * + * Used by Broadcast Assistant and Sink, but not Broadcast Source + * + * @return true if the channel is selected by Broadcast Assistant for the Broadcast Sink + * @hide + */ + @SystemApi + public boolean isSelected() { + return mIsSelected; + } + + /** + * Get the Broadcast Isochronous Channel index of this Broadcast Channel. + * + * @return Broadcast Isochronous Channel index + * @hide + */ + @SystemApi + public int getChannelIndex() { + return mChannelIndex; + } + + /** + * Return the codec specific configuration for this Broadcast Channel. + * + * @return codec specific configuration for this Broadcast Channel + * @hide + */ + @SystemApi + public @NonNull BluetoothLeAudioCodecConfigMetadata getCodecMetadata() { + return mCodecMetadata; + } + + /** + * {@inheritDoc} + * @hide + */ + @Override + public int describeContents() { + return 0; + } + + /** + * {@inheritDoc} + * @hide + */ + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeBoolean(mIsSelected); + out.writeInt(mChannelIndex); + out.writeTypedObject(mCodecMetadata, 0); + } + + /** + * A {@link Parcelable.Creator} to create {@link BluetoothLeBroadcastChannel} from parcel. + * @hide + */ + @SystemApi + public static final @NonNull Parcelable.Creator CREATOR = + new Parcelable.Creator() { + public @NonNull BluetoothLeBroadcastChannel createFromParcel(@NonNull Parcel in) { + BluetoothLeBroadcastChannel.Builder + builder = new BluetoothLeBroadcastChannel.Builder(); + builder.setSelected(in.readBoolean()); + builder.setChannelIndex(in.readInt()); + builder.setCodecMetadata( + in.readTypedObject(BluetoothLeAudioCodecConfigMetadata.CREATOR)); + return builder.build(); + } + + public @NonNull BluetoothLeBroadcastChannel[] newArray(int size) { + return new BluetoothLeBroadcastChannel[size]; + } + }; + + /** + * Builder for {@link BluetoothLeBroadcastChannel}. + * @hide + */ + @SystemApi + public static final class Builder { + private boolean mIsSelected = false; + private int mChannelIndex = UNKNOWN_VALUE_PLACEHOLDER; + private BluetoothLeAudioCodecConfigMetadata mCodecMetadata = null; + + /** + * Create an empty builder. + * @hide + */ + @SystemApi + public Builder() {} + + /** + * Create a builder with copies of information from original object. + * + * @param original original object + * @hide + */ + @SystemApi + public Builder(@NonNull BluetoothLeBroadcastChannel original) { + mIsSelected = original.isSelected(); + mChannelIndex = original.getChannelIndex(); + mCodecMetadata = original.getCodecMetadata(); + } + + /** + * Set if the channel is selected by Broadcast Assistant for the Broadcast Sink. + * + * Used by Broadcast Assistant and Sink, but not Broadcast Source + * + * @param isSelected true if the channel is selected by Broadcast Assistant for the + * Broadcast Sink + * @return this builder + * @hide + */ + @SystemApi + public @NonNull Builder setSelected(boolean isSelected) { + mIsSelected = isSelected; + return this; + } + + /** + * Set the Broadcast Isochronous Channel index of this Broadcast Channel. + * + * @return Broadcast Isochronous Channel index + * @hide + */ + @SystemApi + public @NonNull Builder setChannelIndex(int channelIndex) { + mChannelIndex = channelIndex; + return this; + } + + /** + * Set the codec specific configuration for this Broadcast Channel. + * + * @param codecMetadata codec specific configuration for this Broadcast Channel + * @return this builder + * @hide + */ + @SystemApi + public @NonNull Builder setCodecMetadata( + @NonNull BluetoothLeAudioCodecConfigMetadata codecMetadata) { + mCodecMetadata = codecMetadata; + return this; + } + + /** + * Build {@link BluetoothLeBroadcastChannel}. + * + * @return constructed {@link BluetoothLeBroadcastChannel} + * @throws IllegalArgumentException if the object cannot be built + * @hide + */ + @SystemApi + public @NonNull BluetoothLeBroadcastChannel build() { + return new BluetoothLeBroadcastChannel(mIsSelected, mChannelIndex, mCodecMetadata); + } + } +} -- cgit v1.2.3