diff options
author | Jack He <siyuanh@google.com> | 2021-12-15 15:40:34 -0800 |
---|---|---|
committer | Jack He <siyuanh@google.com> | 2022-02-02 15:17:34 -0800 |
commit | a014314c9490a18fd4b900302d873206df09a3e0 (patch) | |
tree | b60b0f2f949032b8b4a9c16d28d61357d9ff1f3f /framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java | |
parent | b99f7eced58e8e722366ce364a8a2eef4e4449e0 (diff) |
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)
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java')
-rw-r--r-- | framework/java/android/bluetooth/BluetoothLeBroadcastChannel.java | 206 |
1 files changed, 206 insertions, 0 deletions
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<BluetoothLeBroadcastChannel> CREATOR = + new Parcelable.Creator<BluetoothLeBroadcastChannel>() { + 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); + } + } +} |