Merge "Make BluetoothCodecConfig and BluetoothCodecStatus public." am: 720d74c835 am: 60ee51b45b am: 6140b27f92

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1849460

Change-Id: Ia9a487ca2aaed32193a86c0d0fc22f53356ceea1
This commit is contained in:
Etienne Ruffieux
2021-12-06 16:18:10 +00:00
committed by Automerger Merge Worker
7 changed files with 620 additions and 380 deletions

View File

@@ -9031,6 +9031,72 @@ package android.bluetooth {
field public static final int TELEPHONY = 4194304; // 0x400000 field public static final int TELEPHONY = 4194304; // 0x400000
} }
public final class BluetoothCodecConfig implements android.os.Parcelable {
ctor public BluetoothCodecConfig(int);
method public int describeContents();
method public int getBitsPerSample();
method public int getChannelMode();
method public int getCodecPriority();
method public long getCodecSpecific1();
method public long getCodecSpecific2();
method public long getCodecSpecific3();
method public long getCodecSpecific4();
method public int getCodecType();
method public static int getMaxCodecType();
method public int getSampleRate();
method public void writeToParcel(android.os.Parcel, int);
field public static final int BITS_PER_SAMPLE_16 = 1; // 0x1
field public static final int BITS_PER_SAMPLE_24 = 2; // 0x2
field public static final int BITS_PER_SAMPLE_32 = 4; // 0x4
field public static final int BITS_PER_SAMPLE_NONE = 0; // 0x0
field public static final int CHANNEL_MODE_MONO = 1; // 0x1
field public static final int CHANNEL_MODE_NONE = 0; // 0x0
field public static final int CHANNEL_MODE_STEREO = 2; // 0x2
field public static final int CODEC_PRIORITY_DEFAULT = 0; // 0x0
field public static final int CODEC_PRIORITY_DISABLED = -1; // 0xffffffff
field public static final int CODEC_PRIORITY_HIGHEST = 1000000; // 0xf4240
field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothCodecConfig> CREATOR;
field public static final int SAMPLE_RATE_176400 = 16; // 0x10
field public static final int SAMPLE_RATE_192000 = 32; // 0x20
field public static final int SAMPLE_RATE_44100 = 1; // 0x1
field public static final int SAMPLE_RATE_48000 = 2; // 0x2
field public static final int SAMPLE_RATE_88200 = 4; // 0x4
field public static final int SAMPLE_RATE_96000 = 8; // 0x8
field public static final int SAMPLE_RATE_NONE = 0; // 0x0
field public static final int SOURCE_CODEC_TYPE_AAC = 1; // 0x1
field public static final int SOURCE_CODEC_TYPE_APTX = 2; // 0x2
field public static final int SOURCE_CODEC_TYPE_APTX_HD = 3; // 0x3
field public static final int SOURCE_CODEC_TYPE_INVALID = 1000000; // 0xf4240
field public static final int SOURCE_CODEC_TYPE_LDAC = 4; // 0x4
field public static final int SOURCE_CODEC_TYPE_SBC = 0; // 0x0
}
public static final class BluetoothCodecConfig.Builder {
ctor public BluetoothCodecConfig.Builder();
method @NonNull public android.bluetooth.BluetoothCodecConfig build();
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setBitsPerSample(int);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setChannelMode(int);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecPriority(int);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecSpecific1(long);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecSpecific2(long);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecSpecific3(long);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecSpecific4(long);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setCodecType(int);
method @NonNull public android.bluetooth.BluetoothCodecConfig.Builder setSampleRate(int);
}
public final class BluetoothCodecStatus implements android.os.Parcelable {
ctor public BluetoothCodecStatus(@Nullable android.bluetooth.BluetoothCodecConfig, @Nullable java.util.List<android.bluetooth.BluetoothCodecConfig>, @Nullable java.util.List<android.bluetooth.BluetoothCodecConfig>);
method public int describeContents();
method @Nullable public android.bluetooth.BluetoothCodecConfig getCodecConfig();
method @NonNull public java.util.List<android.bluetooth.BluetoothCodecConfig> getCodecsLocalCapabilities();
method @NonNull public java.util.List<android.bluetooth.BluetoothCodecConfig> getCodecsSelectableCapabilities();
method public boolean isCodecConfigSelectable(@Nullable android.bluetooth.BluetoothCodecConfig);
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothCodecStatus> CREATOR;
field public static final String EXTRA_CODEC_STATUS = "android.bluetooth.extra.CODEC_STATUS";
}
public final class BluetoothCsipSetCoordinator implements java.lang.AutoCloseable android.bluetooth.BluetoothProfile { public final class BluetoothCsipSetCoordinator implements java.lang.AutoCloseable android.bluetooth.BluetoothProfile {
method public void close(); method public void close();
method protected void finalize(); method protected void finalize();

View File

@@ -29,16 +29,14 @@ import java.util.Objects;
/** /**
* Represents the codec configuration for a Bluetooth A2DP source device. * Represents the codec configuration for a Bluetooth A2DP source device.
* <p>Contains the source codec type, the codec priority, the codec sample
* rate, the codec bits per sample, and the codec channel mode.
* <p>The source codec type values are the same as those supported by the
* device hardware.
* *
* {@see BluetoothA2dp} * {@see BluetoothA2dp}
*
* {@hide}
*/ */
public final class BluetoothCodecConfig implements Parcelable { public final class BluetoothCodecConfig implements Parcelable {
// Add an entry for each source codec here.
// NOTE: The values should be same as those listed in the following file:
// hardware/libhardware/include/hardware/bt_av.h
/** @hide */ /** @hide */
@IntDef(prefix = "SOURCE_CODEC_TYPE_", value = { @IntDef(prefix = "SOURCE_CODEC_TYPE_", value = {
SOURCE_CODEC_TYPE_SBC, SOURCE_CODEC_TYPE_SBC,
@@ -46,33 +44,49 @@ public final class BluetoothCodecConfig implements Parcelable {
SOURCE_CODEC_TYPE_APTX, SOURCE_CODEC_TYPE_APTX,
SOURCE_CODEC_TYPE_APTX_HD, SOURCE_CODEC_TYPE_APTX_HD,
SOURCE_CODEC_TYPE_LDAC, SOURCE_CODEC_TYPE_LDAC,
SOURCE_CODEC_TYPE_MAX,
SOURCE_CODEC_TYPE_INVALID SOURCE_CODEC_TYPE_INVALID
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface SourceCodecType {} public @interface SourceCodecType {}
@UnsupportedAppUsage /**
* Source codec type SBC. This is the mandatory source codec
* type.
*/
public static final int SOURCE_CODEC_TYPE_SBC = 0; public static final int SOURCE_CODEC_TYPE_SBC = 0;
@UnsupportedAppUsage /**
* Source codec type AAC.
*/
public static final int SOURCE_CODEC_TYPE_AAC = 1; public static final int SOURCE_CODEC_TYPE_AAC = 1;
@UnsupportedAppUsage /**
* Source codec type APTX.
*/
public static final int SOURCE_CODEC_TYPE_APTX = 2; public static final int SOURCE_CODEC_TYPE_APTX = 2;
@UnsupportedAppUsage /**
* Source codec type APTX HD.
*/
public static final int SOURCE_CODEC_TYPE_APTX_HD = 3; public static final int SOURCE_CODEC_TYPE_APTX_HD = 3;
@UnsupportedAppUsage /**
* Source codec type LDAC.
*/
public static final int SOURCE_CODEC_TYPE_LDAC = 4; public static final int SOURCE_CODEC_TYPE_LDAC = 4;
@UnsupportedAppUsage /**
public static final int SOURCE_CODEC_TYPE_MAX = 5; * Source codec type invalid. This is the default value used for codec
* type.
@UnsupportedAppUsage */
public static final int SOURCE_CODEC_TYPE_INVALID = 1000 * 1000; public static final int SOURCE_CODEC_TYPE_INVALID = 1000 * 1000;
/**
* Represents the count of valid source codec types. Can be accessed via
* {@link #getMaxCodecType}.
*/
private static final int SOURCE_CODEC_TYPE_MAX = 5;
/** @hide */ /** @hide */
@IntDef(prefix = "CODEC_PRIORITY_", value = { @IntDef(prefix = "CODEC_PRIORITY_", value = {
CODEC_PRIORITY_DISABLED, CODEC_PRIORITY_DISABLED,
@@ -82,16 +96,24 @@ public final class BluetoothCodecConfig implements Parcelable {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface CodecPriority {} public @interface CodecPriority {}
@UnsupportedAppUsage /**
* Codec priority disabled.
* Used to indicate that this codec is disabled and should not be used.
*/
public static final int CODEC_PRIORITY_DISABLED = -1; public static final int CODEC_PRIORITY_DISABLED = -1;
@UnsupportedAppUsage /**
* Codec priority default.
* Default value used for codec priority.
*/
public static final int CODEC_PRIORITY_DEFAULT = 0; public static final int CODEC_PRIORITY_DEFAULT = 0;
@UnsupportedAppUsage /**
* Codec priority highest.
* Used to indicate the highest priority a codec can have.
*/
public static final int CODEC_PRIORITY_HIGHEST = 1000 * 1000; public static final int CODEC_PRIORITY_HIGHEST = 1000 * 1000;
/** @hide */ /** @hide */
@IntDef(prefix = "SAMPLE_RATE_", value = { @IntDef(prefix = "SAMPLE_RATE_", value = {
SAMPLE_RATE_NONE, SAMPLE_RATE_NONE,
@@ -105,28 +127,42 @@ public final class BluetoothCodecConfig implements Parcelable {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface SampleRate {} public @interface SampleRate {}
@UnsupportedAppUsage /**
* Codec sample rate 0 Hz. Default value used for
* codec sample rate.
*/
public static final int SAMPLE_RATE_NONE = 0; public static final int SAMPLE_RATE_NONE = 0;
@UnsupportedAppUsage /**
* Codec sample rate 44100 Hz.
*/
public static final int SAMPLE_RATE_44100 = 0x1 << 0; public static final int SAMPLE_RATE_44100 = 0x1 << 0;
@UnsupportedAppUsage /**
* Codec sample rate 48000 Hz.
*/
public static final int SAMPLE_RATE_48000 = 0x1 << 1; public static final int SAMPLE_RATE_48000 = 0x1 << 1;
@UnsupportedAppUsage /**
* Codec sample rate 88200 Hz.
*/
public static final int SAMPLE_RATE_88200 = 0x1 << 2; public static final int SAMPLE_RATE_88200 = 0x1 << 2;
@UnsupportedAppUsage /**
* Codec sample rate 96000 Hz.
*/
public static final int SAMPLE_RATE_96000 = 0x1 << 3; public static final int SAMPLE_RATE_96000 = 0x1 << 3;
@UnsupportedAppUsage /**
* Codec sample rate 176400 Hz.
*/
public static final int SAMPLE_RATE_176400 = 0x1 << 4; public static final int SAMPLE_RATE_176400 = 0x1 << 4;
@UnsupportedAppUsage /**
* Codec sample rate 192000 Hz.
*/
public static final int SAMPLE_RATE_192000 = 0x1 << 5; public static final int SAMPLE_RATE_192000 = 0x1 << 5;
/** @hide */ /** @hide */
@IntDef(prefix = "BITS_PER_SAMPLE_", value = { @IntDef(prefix = "BITS_PER_SAMPLE_", value = {
BITS_PER_SAMPLE_NONE, BITS_PER_SAMPLE_NONE,
@@ -137,19 +173,27 @@ public final class BluetoothCodecConfig implements Parcelable {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface BitsPerSample {} public @interface BitsPerSample {}
@UnsupportedAppUsage /**
* Codec bits per sample 0. Default value of the codec
* bits per sample.
*/
public static final int BITS_PER_SAMPLE_NONE = 0; public static final int BITS_PER_SAMPLE_NONE = 0;
@UnsupportedAppUsage /**
* Codec bits per sample 16.
*/
public static final int BITS_PER_SAMPLE_16 = 0x1 << 0; public static final int BITS_PER_SAMPLE_16 = 0x1 << 0;
@UnsupportedAppUsage /**
* Codec bits per sample 24.
*/
public static final int BITS_PER_SAMPLE_24 = 0x1 << 1; public static final int BITS_PER_SAMPLE_24 = 0x1 << 1;
@UnsupportedAppUsage /**
* Codec bits per sample 32.
*/
public static final int BITS_PER_SAMPLE_32 = 0x1 << 2; public static final int BITS_PER_SAMPLE_32 = 0x1 << 2;
/** @hide */ /** @hide */
@IntDef(prefix = "CHANNEL_MODE_", value = { @IntDef(prefix = "CHANNEL_MODE_", value = {
CHANNEL_MODE_NONE, CHANNEL_MODE_NONE,
@@ -159,13 +203,20 @@ public final class BluetoothCodecConfig implements Parcelable {
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface ChannelMode {} public @interface ChannelMode {}
@UnsupportedAppUsage /**
* Codec channel mode NONE. Default value of the
* codec channel mode.
*/
public static final int CHANNEL_MODE_NONE = 0; public static final int CHANNEL_MODE_NONE = 0;
@UnsupportedAppUsage /**
* Codec channel mode MONO.
*/
public static final int CHANNEL_MODE_MONO = 0x1 << 0; public static final int CHANNEL_MODE_MONO = 0x1 << 0;
@UnsupportedAppUsage /**
* Codec channel mode STEREO.
*/
public static final int CHANNEL_MODE_STEREO = 0x1 << 1; public static final int CHANNEL_MODE_STEREO = 0x1 << 1;
private final @SourceCodecType int mCodecType; private final @SourceCodecType int mCodecType;
@@ -178,6 +229,21 @@ public final class BluetoothCodecConfig implements Parcelable {
private final long mCodecSpecific3; private final long mCodecSpecific3;
private final long mCodecSpecific4; private final long mCodecSpecific4;
/**
* Creates a new BluetoothCodecConfig.
*
* @param codecType the source codec type
* @param codecPriority the priority of this codec
* @param sampleRate the codec sample rate
* @param bitsPerSample the bits per sample of this codec
* @param channelMode the channel mode of this codec
* @param codecSpecific1 the specific value 1
* @param codecSpecific2 the specific value 2
* @param codecSpecific3 the specific value 3
* @param codecSpecific4 the specific value 4
* values to 0.
* @hide
*/
@UnsupportedAppUsage @UnsupportedAppUsage
public BluetoothCodecConfig(@SourceCodecType int codecType, @CodecPriority int codecPriority, public BluetoothCodecConfig(@SourceCodecType int codecType, @CodecPriority int codecPriority,
@SampleRate int sampleRate, @BitsPerSample int bitsPerSample, @SampleRate int sampleRate, @BitsPerSample int bitsPerSample,
@@ -195,17 +261,34 @@ public final class BluetoothCodecConfig implements Parcelable {
mCodecSpecific4 = codecSpecific4; mCodecSpecific4 = codecSpecific4;
} }
@UnsupportedAppUsage /**
* Creates a new BluetoothCodecConfig.
* <p> By default, the codec priority will be set
* to {@link BluetoothCodecConfig#CODEC_PRIORITY_DEFAULT}, the sample rate to
* {@link BluetoothCodecConfig#SAMPLE_RATE_NONE}, the bits per sample to
* {@link BluetoothCodecConfig#BITS_PER_SAMPLE_NONE}, the channel mode to
* {@link BluetoothCodecConfig#CHANNEL_MODE_NONE}, and all the codec specific
* values to 0.
*
* @param codecType the source codec type
*/
public BluetoothCodecConfig(@SourceCodecType int codecType) { public BluetoothCodecConfig(@SourceCodecType int codecType) {
mCodecType = codecType; this(codecType, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
mCodecPriority = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT; BluetoothCodecConfig.SAMPLE_RATE_NONE,
mSampleRate = BluetoothCodecConfig.SAMPLE_RATE_NONE; BluetoothCodecConfig.BITS_PER_SAMPLE_NONE,
mBitsPerSample = BluetoothCodecConfig.BITS_PER_SAMPLE_NONE; BluetoothCodecConfig.CHANNEL_MODE_NONE, 0, 0, 0, 0);
mChannelMode = BluetoothCodecConfig.CHANNEL_MODE_NONE; }
mCodecSpecific1 = 0;
mCodecSpecific2 = 0; private BluetoothCodecConfig(Parcel in) {
mCodecSpecific3 = 0; mCodecType = in.readInt();
mCodecSpecific4 = 0; mCodecPriority = in.readInt();
mSampleRate = in.readInt();
mBitsPerSample = in.readInt();
mChannelMode = in.readInt();
mCodecSpecific1 = in.readLong();
mCodecSpecific2 = in.readLong();
mCodecSpecific3 = in.readLong();
mCodecSpecific4 = in.readLong();
} }
@Override @Override
@@ -226,10 +309,8 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Returns a hash based on the config values * Returns a hash representation of this BluetoothCodecConfig
* * based on all the config values.
* @return a hash based on the config values
* @hide
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
@@ -238,33 +319,25 @@ public final class BluetoothCodecConfig implements Parcelable {
mCodecSpecific2, mCodecSpecific3, mCodecSpecific4); mCodecSpecific2, mCodecSpecific3, mCodecSpecific4);
} }
/**
* Checks whether the object contains valid codec configuration.
*
* @return true if the object contains valid codec configuration, otherwise false.
* @hide
*/
public boolean isValid() {
return (mSampleRate != SAMPLE_RATE_NONE)
&& (mBitsPerSample != BITS_PER_SAMPLE_NONE)
&& (mChannelMode != CHANNEL_MODE_NONE);
}
/** /**
* Adds capability string to an existing string. * Adds capability string to an existing string.
* *
* @param prevStr the previous string with the capabilities. Can be a null pointer. * @param prevStr the previous string with the capabilities. Can be a {@code null} pointer
* @param capStr the capability string to append to prevStr argument. * @param capStr the capability string to append to prevStr argument
* @return the result string in the form "prevStr|capStr". * @return the result string in the form "prevStr|capStr"
*/ */
private static String appendCapabilityToString(String prevStr, private static String appendCapabilityToString(@Nullable String prevStr,
String capStr) { @NonNull String capStr) {
if (prevStr == null) { if (prevStr == null) {
return capStr; return capStr;
} }
return prevStr + "|" + capStr; return prevStr + "|" + capStr;
} }
/**
* Returns a {@link String} that describes each BluetoothCodecConfig parameter
* current value.
*/
@Override @Override
public String toString() { public String toString() {
String sampleRateStr = null; String sampleRateStr = null;
@@ -331,8 +404,6 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Always returns 0
*
* @return 0 * @return 0
* @hide * @hide
*/ */
@@ -344,20 +415,7 @@ public final class BluetoothCodecConfig implements Parcelable {
public static final @android.annotation.NonNull Parcelable.Creator<BluetoothCodecConfig> CREATOR = public static final @android.annotation.NonNull Parcelable.Creator<BluetoothCodecConfig> CREATOR =
new Parcelable.Creator<BluetoothCodecConfig>() { new Parcelable.Creator<BluetoothCodecConfig>() {
public BluetoothCodecConfig createFromParcel(Parcel in) { public BluetoothCodecConfig createFromParcel(Parcel in) {
final int codecType = in.readInt(); return new BluetoothCodecConfig(in);
final int codecPriority = in.readInt();
final int sampleRate = in.readInt();
final int bitsPerSample = in.readInt();
final int channelMode = in.readInt();
final long codecSpecific1 = in.readLong();
final long codecSpecific2 = in.readLong();
final long codecSpecific3 = in.readLong();
final long codecSpecific4 = in.readLong();
return new BluetoothCodecConfig(codecType, codecPriority,
sampleRate, bitsPerSample,
channelMode, codecSpecific1,
codecSpecific2, codecSpecific3,
codecSpecific4);
} }
public BluetoothCodecConfig[] newArray(int size) { public BluetoothCodecConfig[] newArray(int size) {
@@ -368,8 +426,8 @@ public final class BluetoothCodecConfig implements Parcelable {
/** /**
* Flattens the object to a parcel * Flattens the object to a parcel
* *
* @param out The Parcel in which the object should be written. * @param out The Parcel in which the object should be written
* @param flags Additional flags about how the object should be written. * @param flags Additional flags about how the object should be written
* *
* @hide * @hide
*/ */
@@ -387,9 +445,8 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Gets the codec name. * Returns the codec name converted to {@link String}.
* * @hide
* @return the codec name
*/ */
public @NonNull String getCodecName() { public @NonNull String getCodecName() {
switch (mCodecType) { switch (mCodecType) {
@@ -412,137 +469,100 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Gets the codec type. * Returns the source codec type of this config.
* See {@link android.bluetooth.BluetoothCodecConfig#SOURCE_CODEC_TYPE_SBC}.
*
* @return the codec type
*/ */
@UnsupportedAppUsage
public @SourceCodecType int getCodecType() { public @SourceCodecType int getCodecType() {
return mCodecType; return mCodecType;
} }
/**
* Returns the valid codec types count.
*/
public static int getMaxCodecType() {
return SOURCE_CODEC_TYPE_MAX;
}
/** /**
* Checks whether the codec is mandatory. * Checks whether the codec is mandatory.
* <p> The actual mandatory codec type for Android Bluetooth audio is SBC.
* See {@link #SOURCE_CODEC_TYPE_SBC}.
* *
* @return true if the codec is mandatory, otherwise false. * @return {@code true} if the codec is mandatory, {@code false} otherwise
* @hide
*/ */
public boolean isMandatoryCodec() { public boolean isMandatoryCodec() {
return mCodecType == SOURCE_CODEC_TYPE_SBC; return mCodecType == SOURCE_CODEC_TYPE_SBC;
} }
/** /**
* Gets the codec selection priority. * Returns the codec selection priority.
* The codec selection priority is relative to other codecs: larger value * <p>The codec selection priority is relative to other codecs: larger value
* means higher priority. If 0, reset to default. * means higher priority.
*
* @return the codec priority
*/ */
@UnsupportedAppUsage
public @CodecPriority int getCodecPriority() { public @CodecPriority int getCodecPriority() {
return mCodecPriority; return mCodecPriority;
} }
/** /**
* Sets the codec selection priority. * Sets the codec selection priority.
* The codec selection priority is relative to other codecs: larger value * <p>The codec selection priority is relative to other codecs: larger value
* means higher priority. If 0, reset to default. * means higher priority.
* *
* @param codecPriority the codec priority * @param codecPriority the priority this codec should have
* @hide * @hide
*/ */
@UnsupportedAppUsage
public void setCodecPriority(@CodecPriority int codecPriority) { public void setCodecPriority(@CodecPriority int codecPriority) {
mCodecPriority = codecPriority; mCodecPriority = codecPriority;
} }
/** /**
* Gets the codec sample rate. The value can be a bitmask with all * Returns the codec sample rate. The value can be a bitmask with all
* supported sample rates: * supported sample rates.
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_NONE} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_44100} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_48000} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_88200} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_96000} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_176400} or
* {@link android.bluetooth.BluetoothCodecConfig#SAMPLE_RATE_192000}
*
* @return the codec sample rate
*/ */
@UnsupportedAppUsage
public @SampleRate int getSampleRate() { public @SampleRate int getSampleRate() {
return mSampleRate; return mSampleRate;
} }
/** /**
* Gets the codec bits per sample. The value can be a bitmask with all * Returns the codec bits per sample. The value can be a bitmask with all
* bits per sample supported: * bits per sample supported.
* {@link android.bluetooth.BluetoothCodecConfig#BITS_PER_SAMPLE_NONE} or
* {@link android.bluetooth.BluetoothCodecConfig#BITS_PER_SAMPLE_16} or
* {@link android.bluetooth.BluetoothCodecConfig#BITS_PER_SAMPLE_24} or
* {@link android.bluetooth.BluetoothCodecConfig#BITS_PER_SAMPLE_32}
*
* @return the codec bits per sample
*/ */
@UnsupportedAppUsage
public @BitsPerSample int getBitsPerSample() { public @BitsPerSample int getBitsPerSample() {
return mBitsPerSample; return mBitsPerSample;
} }
/** /**
* Gets the codec channel mode. The value can be a bitmask with all * Returns the codec channel mode. The value can be a bitmask with all
* supported channel modes: * supported channel modes.
* {@link android.bluetooth.BluetoothCodecConfig#CHANNEL_MODE_NONE} or
* {@link android.bluetooth.BluetoothCodecConfig#CHANNEL_MODE_MONO} or
* {@link android.bluetooth.BluetoothCodecConfig#CHANNEL_MODE_STEREO}
*
* @return the codec channel mode
* @hide
*/ */
@UnsupportedAppUsage
public @ChannelMode int getChannelMode() { public @ChannelMode int getChannelMode() {
return mChannelMode; return mChannelMode;
} }
/** /**
* Gets a codec specific value1. * Returns the codec specific value1.
*
* @return a codec specific value1.
*/ */
@UnsupportedAppUsage
public long getCodecSpecific1() { public long getCodecSpecific1() {
return mCodecSpecific1; return mCodecSpecific1;
} }
/** /**
* Gets a codec specific value2. * Returns the codec specific value2.
*
* @return a codec specific value2
* @hide
*/ */
@UnsupportedAppUsage
public long getCodecSpecific2() { public long getCodecSpecific2() {
return mCodecSpecific2; return mCodecSpecific2;
} }
/** /**
* Gets a codec specific value3. * Returns the codec specific value3.
*
* @return a codec specific value3
* @hide
*/ */
@UnsupportedAppUsage
public long getCodecSpecific3() { public long getCodecSpecific3() {
return mCodecSpecific3; return mCodecSpecific3;
} }
/** /**
* Gets a codec specific value4. * Returns the codec specific value4.
*
* @return a codec specific value4
* @hide
*/ */
@UnsupportedAppUsage
public long getCodecSpecific4() { public long getCodecSpecific4() {
return mCodecSpecific4; return mCodecSpecific4;
} }
@@ -551,7 +571,7 @@ public final class BluetoothCodecConfig implements Parcelable {
* Checks whether a value set presented by a bitmask has zero or single bit * Checks whether a value set presented by a bitmask has zero or single bit
* *
* @param valueSet the value set presented by a bitmask * @param valueSet the value set presented by a bitmask
* @return true if the valueSet contains zero or single bit, otherwise false. * @return {@code true} if the valueSet contains zero or single bit, {@code false} otherwise
* @hide * @hide
*/ */
private static boolean hasSingleBit(int valueSet) { private static boolean hasSingleBit(int valueSet) {
@@ -559,9 +579,7 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Checks whether the object contains none or single sample rate. * Returns whether the object contains none or single sample rate.
*
* @return true if the object contains none or single sample rate, otherwise false.
* @hide * @hide
*/ */
public boolean hasSingleSampleRate() { public boolean hasSingleSampleRate() {
@@ -569,9 +587,7 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Checks whether the object contains none or single bits per sample. * Returns whether the object contains none or single bits per sample.
*
* @return true if the object contains none or single bits per sample, otherwise false.
* @hide * @hide
*/ */
public boolean hasSingleBitsPerSample() { public boolean hasSingleBitsPerSample() {
@@ -579,9 +595,7 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Checks whether the object contains none or single channel mode. * Returns whether the object contains none or single channel mode.
*
* @return true if the object contains none or single channel mode, otherwise false.
* @hide * @hide
*/ */
public boolean hasSingleChannelMode() { public boolean hasSingleChannelMode() {
@@ -589,10 +603,10 @@ public final class BluetoothCodecConfig implements Parcelable {
} }
/** /**
* Checks whether the audio feeding parameters are same. * Checks whether the audio feeding parameters are the same.
* *
* @param other the codec config to compare against * @param other the codec config to compare against
* @return true if the audio feeding parameters are same, otherwise false * @return {@code true} if the audio feeding parameters are same, {@code false} otherwise
* @hide * @hide
*/ */
public boolean sameAudioFeedingParameters(BluetoothCodecConfig other) { public boolean sameAudioFeedingParameters(BluetoothCodecConfig other) {
@@ -606,7 +620,7 @@ public final class BluetoothCodecConfig implements Parcelable {
* Any parameters with NONE value will be considered to be a wildcard matching. * Any parameters with NONE value will be considered to be a wildcard matching.
* *
* @param other the codec config to compare against * @param other the codec config to compare against
* @return true if the audio feeding parameters are similar, otherwise false. * @return {@code true} if the audio feeding parameters are similar, {@code false} otherwise
* @hide * @hide
*/ */
public boolean similarCodecFeedingParameters(BluetoothCodecConfig other) { public boolean similarCodecFeedingParameters(BluetoothCodecConfig other) {
@@ -614,18 +628,18 @@ public final class BluetoothCodecConfig implements Parcelable {
return false; return false;
} }
int sampleRate = other.mSampleRate; int sampleRate = other.mSampleRate;
if (mSampleRate == BluetoothCodecConfig.SAMPLE_RATE_NONE if (mSampleRate == SAMPLE_RATE_NONE
|| sampleRate == BluetoothCodecConfig.SAMPLE_RATE_NONE) { || sampleRate == SAMPLE_RATE_NONE) {
sampleRate = mSampleRate; sampleRate = mSampleRate;
} }
int bitsPerSample = other.mBitsPerSample; int bitsPerSample = other.mBitsPerSample;
if (mBitsPerSample == BluetoothCodecConfig.BITS_PER_SAMPLE_NONE if (mBitsPerSample == BITS_PER_SAMPLE_NONE
|| bitsPerSample == BluetoothCodecConfig.BITS_PER_SAMPLE_NONE) { || bitsPerSample == BITS_PER_SAMPLE_NONE) {
bitsPerSample = mBitsPerSample; bitsPerSample = mBitsPerSample;
} }
int channelMode = other.mChannelMode; int channelMode = other.mChannelMode;
if (mChannelMode == BluetoothCodecConfig.CHANNEL_MODE_NONE if (mChannelMode == CHANNEL_MODE_NONE
|| channelMode == BluetoothCodecConfig.CHANNEL_MODE_NONE) { || channelMode == CHANNEL_MODE_NONE) {
channelMode = mChannelMode; channelMode = mChannelMode;
} }
return sameAudioFeedingParameters(new BluetoothCodecConfig( return sameAudioFeedingParameters(new BluetoothCodecConfig(
@@ -636,25 +650,158 @@ public final class BluetoothCodecConfig implements Parcelable {
/** /**
* Checks whether the codec specific parameters are the same. * Checks whether the codec specific parameters are the same.
* <p> Currently, only AAC VBR and LDAC Playback Quality on CodecSpecific1
* are compared.
* *
* @param other the codec config to compare against * @param other the codec config to compare against
* @return true if the codec specific parameters are the same, otherwise false. * @return {@code true} if the codec specific parameters are the same, {@code false} otherwise
* @hide * @hide
*/ */
public boolean sameCodecSpecificParameters(BluetoothCodecConfig other) { public boolean sameCodecSpecificParameters(BluetoothCodecConfig other) {
if (other == null && mCodecType != other.mCodecType) { if (other == null && mCodecType != other.mCodecType) {
return false; return false;
} }
// Currently we only care about the AAC VBR and LDAC Playback Quality at CodecSpecific1
switch (mCodecType) { switch (mCodecType) {
case SOURCE_CODEC_TYPE_AAC: case SOURCE_CODEC_TYPE_AAC:
case SOURCE_CODEC_TYPE_LDAC: case SOURCE_CODEC_TYPE_LDAC:
if (mCodecSpecific1 != other.mCodecSpecific1) { if (mCodecSpecific1 != other.mCodecSpecific1) {
return false; return false;
} }
// fall through
default: default:
return true; return true;
} }
} }
/**
* Builder for {@link BluetoothCodecConfig}.
* <p> By default, the codec type will be set to
* {@link BluetoothCodecConfig#SOURCE_CODEC_TYPE_INVALID}, the codec priority
* to {@link BluetoothCodecConfig#CODEC_PRIORITY_DEFAULT}, the sample rate to
* {@link BluetoothCodecConfig#SAMPLE_RATE_NONE}, the bits per sample to
* {@link BluetoothCodecConfig#BITS_PER_SAMPLE_NONE}, the channel mode to
* {@link BluetoothCodecConfig#CHANNEL_MODE_NONE}, and all the codec specific
* values to 0.
*/
public static final class Builder {
private int mCodecType = BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID;
private int mCodecPriority = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT;
private int mSampleRate = BluetoothCodecConfig.SAMPLE_RATE_NONE;
private int mBitsPerSample = BluetoothCodecConfig.BITS_PER_SAMPLE_NONE;
private int mChannelMode = BluetoothCodecConfig.CHANNEL_MODE_NONE;
private long mCodecSpecific1 = 0;
private long mCodecSpecific2 = 0;
private long mCodecSpecific3 = 0;
private long mCodecSpecific4 = 0;
/**
* Set codec type for Bluetooth codec config.
*
* @param codecType of this codec
* @return the same Builder instance
*/
public @NonNull Builder setCodecType(@SourceCodecType int codecType) {
mCodecType = codecType;
return this;
}
/**
* Set codec priority for Bluetooth codec config.
*
* @param codecPriority of this codec
* @return the same Builder instance
*/
public @NonNull Builder setCodecPriority(@CodecPriority int codecPriority) {
mCodecPriority = codecPriority;
return this;
}
/**
* Set sample rate for Bluetooth codec config.
*
* @param sampleRate of this codec
* @return the same Builder instance
*/
public @NonNull Builder setSampleRate(@SampleRate int sampleRate) {
mSampleRate = sampleRate;
return this;
}
/**
* Set the bits per sample for Bluetooth codec config.
*
* @param bitsPerSample of this codec
* @return the same Builder instance
*/
public @NonNull Builder setBitsPerSample(@BitsPerSample int bitsPerSample) {
mBitsPerSample = bitsPerSample;
return this;
}
/**
* Set the channel mode for Bluetooth codec config.
*
* @param channelMode of this codec
* @return the same Builder instance
*/
public @NonNull Builder setChannelMode(@ChannelMode int channelMode) {
mChannelMode = channelMode;
return this;
}
/**
* Set the first codec specific values for Bluetooth codec config.
*
* @param codecSpecific1 codec specific value or 0 if default
* @return the same Builder instance
*/
public @NonNull Builder setCodecSpecific1(long codecSpecific1) {
mCodecSpecific1 = codecSpecific1;
return this;
}
/**
* Set the second codec specific values for Bluetooth codec config.
*
* @param codecSpecific2 codec specific value or 0 if default
* @return the same Builder instance
*/
public @NonNull Builder setCodecSpecific2(long codecSpecific2) {
mCodecSpecific2 = codecSpecific2;
return this;
}
/**
* Set the third codec specific values for Bluetooth codec config.
*
* @param codecSpecific3 codec specific value or 0 if default
* @return the same Builder instance
*/
public @NonNull Builder setCodecSpecific3(long codecSpecific3) {
mCodecSpecific3 = codecSpecific3;
return this;
}
/**
* Set the fourth codec specific values for Bluetooth codec config.
*
* @param codecSpecific4 codec specific value or 0 if default
* @return the same Builder instance
*/
public @NonNull Builder setCodecSpecific4(long codecSpecific4) {
mCodecSpecific4 = codecSpecific4;
return this;
}
/**
* Build {@link BluetoothCodecConfig}.
* @return new BluetoothCodecConfig built
*/
public @NonNull BluetoothCodecConfig build() {
return new BluetoothCodecConfig(mCodecType, mCodecPriority,
mSampleRate, mBitsPerSample,
mChannelMode, mCodecSpecific1,
mCodecSpecific2, mCodecSpecific3,
mCodecSpecific4);
}
}
} }

View File

@@ -16,12 +16,13 @@
package android.bluetooth; package android.bluetooth;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.util.Arrays; import java.util.Collections;
import java.util.List;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -29,8 +30,6 @@ import java.util.Objects;
* A2DP source device. * A2DP source device.
* *
* {@see BluetoothA2dp} * {@see BluetoothA2dp}
*
* {@hide}
*/ */
public final class BluetoothCodecStatus implements Parcelable { public final class BluetoothCodecStatus implements Parcelable {
/** /**
@@ -39,22 +38,27 @@ public final class BluetoothCodecStatus implements Parcelable {
* This extra represents the current codec status of the A2DP * This extra represents the current codec status of the A2DP
* profile. * profile.
*/ */
@UnsupportedAppUsage
public static final String EXTRA_CODEC_STATUS = public static final String EXTRA_CODEC_STATUS =
"android.bluetooth.extra.CODEC_STATUS"; "android.bluetooth.extra.CODEC_STATUS";
private final @Nullable BluetoothCodecConfig mCodecConfig; private final @Nullable BluetoothCodecConfig mCodecConfig;
private final BluetoothCodecConfig[] mCodecsLocalCapabilities; private final @Nullable List<BluetoothCodecConfig> mCodecsLocalCapabilities;
private final BluetoothCodecConfig[] mCodecsSelectableCapabilities; private final @Nullable List<BluetoothCodecConfig> mCodecsSelectableCapabilities;
public BluetoothCodecStatus(@Nullable BluetoothCodecConfig codecConfig, public BluetoothCodecStatus(@Nullable BluetoothCodecConfig codecConfig,
@Nullable BluetoothCodecConfig[] codecsLocalCapabilities, @Nullable List<BluetoothCodecConfig> codecsLocalCapabilities,
@Nullable BluetoothCodecConfig[] codecsSelectableCapabilities) { @Nullable List<BluetoothCodecConfig> codecsSelectableCapabilities) {
mCodecConfig = codecConfig; mCodecConfig = codecConfig;
mCodecsLocalCapabilities = codecsLocalCapabilities; mCodecsLocalCapabilities = codecsLocalCapabilities;
mCodecsSelectableCapabilities = codecsSelectableCapabilities; mCodecsSelectableCapabilities = codecsSelectableCapabilities;
} }
private BluetoothCodecStatus(Parcel in) {
mCodecConfig = in.readTypedObject(BluetoothCodecConfig.CREATOR);
mCodecsLocalCapabilities = in.createTypedArrayList(BluetoothCodecConfig.CREATOR);
mCodecsSelectableCapabilities = in.createTypedArrayList(BluetoothCodecConfig.CREATOR);
}
@Override @Override
public boolean equals(@Nullable Object o) { public boolean equals(@Nullable Object o) {
if (o instanceof BluetoothCodecStatus) { if (o instanceof BluetoothCodecStatus) {
@@ -68,26 +72,25 @@ public final class BluetoothCodecStatus implements Parcelable {
} }
/** /**
* Checks whether two arrays of capabilities contain same capabilities. * Checks whether two lists of capabilities contain same capabilities.
* The order of the capabilities in each array is ignored. * The order of the capabilities in each list is ignored.
* *
* @param c1 the first array of capabilities to compare * @param c1 the first list of capabilities to compare
* @param c2 the second array of capabilities to compare * @param c2 the second list of capabilities to compare
* @return true if both arrays contain same capabilities * @return {@code true} if both lists contain same capabilities
* @hide
*/ */
public static boolean sameCapabilities(BluetoothCodecConfig[] c1, private static boolean sameCapabilities(@Nullable List<BluetoothCodecConfig> c1,
BluetoothCodecConfig[] c2) { @Nullable List<BluetoothCodecConfig> c2) {
if (c1 == null) { if (c1 == null) {
return (c2 == null); return (c2 == null);
} }
if (c2 == null) { if (c2 == null) {
return false; return false;
} }
if (c1.length != c2.length) { if (c1.size() != c2.size()) {
return false; return false;
} }
return Arrays.asList(c1).containsAll(Arrays.asList(c2)); return c1.containsAll(c2);
} }
/** /**
@@ -95,10 +98,9 @@ public final class BluetoothCodecStatus implements Parcelable {
* Any parameters of the codec config with NONE value will be considered a wildcard matching. * Any parameters of the codec config with NONE value will be considered a wildcard matching.
* *
* @param codecConfig the codec config to compare against * @param codecConfig the codec config to compare against
* @return true if the codec config matches, otherwise false * @return {@code true} if the codec config matches, {@code false} otherwise
* @hide
*/ */
public boolean isCodecConfigSelectable(BluetoothCodecConfig codecConfig) { public boolean isCodecConfigSelectable(@Nullable BluetoothCodecConfig codecConfig) {
if (codecConfig == null || !codecConfig.hasSingleSampleRate() if (codecConfig == null || !codecConfig.hasSingleSampleRate()
|| !codecConfig.hasSingleBitsPerSample() || !codecConfig.hasSingleChannelMode()) { || !codecConfig.hasSingleBitsPerSample() || !codecConfig.hasSingleChannelMode()) {
return false; return false;
@@ -128,10 +130,7 @@ public final class BluetoothCodecStatus implements Parcelable {
} }
/** /**
* Returns a hash based on the codec config and local capabilities * Returns a hash based on the codec config and local capabilities.
*
* @return a hash based on the config values
* @hide
*/ */
@Override @Override
public int hashCode() { public int hashCode() {
@@ -139,17 +138,19 @@ public final class BluetoothCodecStatus implements Parcelable {
mCodecsLocalCapabilities); mCodecsLocalCapabilities);
} }
/**
* Returns a {@link String} that describes each BluetoothCodecStatus parameter
* current value.
*/
@Override @Override
public String toString() { public String toString() {
return "{mCodecConfig:" + mCodecConfig return "{mCodecConfig:" + mCodecConfig
+ ",mCodecsLocalCapabilities:" + Arrays.toString(mCodecsLocalCapabilities) + ",mCodecsLocalCapabilities:" + mCodecsLocalCapabilities
+ ",mCodecsSelectableCapabilities:" + Arrays.toString(mCodecsSelectableCapabilities) + ",mCodecsSelectableCapabilities:" + mCodecsSelectableCapabilities
+ "}"; + "}";
} }
/** /**
* Always returns 0
*
* @return 0 * @return 0
* @hide * @hide
*/ */
@@ -161,16 +162,7 @@ public final class BluetoothCodecStatus implements Parcelable {
public static final @android.annotation.NonNull Parcelable.Creator<BluetoothCodecStatus> CREATOR = public static final @android.annotation.NonNull Parcelable.Creator<BluetoothCodecStatus> CREATOR =
new Parcelable.Creator<BluetoothCodecStatus>() { new Parcelable.Creator<BluetoothCodecStatus>() {
public BluetoothCodecStatus createFromParcel(Parcel in) { public BluetoothCodecStatus createFromParcel(Parcel in) {
final BluetoothCodecConfig codecConfig = in.readTypedObject( return new BluetoothCodecStatus(in);
BluetoothCodecConfig.CREATOR);
final BluetoothCodecConfig[] codecsLocalCapabilities = in.createTypedArray(
BluetoothCodecConfig.CREATOR);
final BluetoothCodecConfig[] codecsSelectableCapabilities = in.createTypedArray(
BluetoothCodecConfig.CREATOR);
return new BluetoothCodecStatus(codecConfig,
codecsLocalCapabilities,
codecsSelectableCapabilities);
} }
public BluetoothCodecStatus[] newArray(int size) { public BluetoothCodecStatus[] newArray(int size) {
@@ -179,47 +171,38 @@ public final class BluetoothCodecStatus implements Parcelable {
}; };
/** /**
* Flattens the object to a parcel * Flattens the object to a parcel.
* *
* @param out The Parcel in which the object should be written. * @param out The Parcel in which the object should be written
* @param flags Additional flags about how the object should be written. * @param flags Additional flags about how the object should be written
*
* @hide
*/ */
@Override @Override
public void writeToParcel(Parcel out, int flags) { public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeTypedObject(mCodecConfig, 0); out.writeTypedObject(mCodecConfig, 0);
out.writeTypedArray(mCodecsLocalCapabilities, 0); out.writeTypedList(mCodecsLocalCapabilities);
out.writeTypedArray(mCodecsSelectableCapabilities, 0); out.writeTypedList(mCodecsSelectableCapabilities);
} }
/** /**
* Gets the current codec configuration. * Returns the current codec configuration.
*
* @return the current codec configuration
*/ */
@UnsupportedAppUsage
public @Nullable BluetoothCodecConfig getCodecConfig() { public @Nullable BluetoothCodecConfig getCodecConfig() {
return mCodecConfig; return mCodecConfig;
} }
/** /**
* Gets the codecs local capabilities. * Returns the codecs local capabilities.
*
* @return an array with the codecs local capabilities
*/ */
@UnsupportedAppUsage public @NonNull List<BluetoothCodecConfig> getCodecsLocalCapabilities() {
public @Nullable BluetoothCodecConfig[] getCodecsLocalCapabilities() { return (mCodecsLocalCapabilities == null)
return mCodecsLocalCapabilities; ? Collections.emptyList() : mCodecsLocalCapabilities;
} }
/** /**
* Gets the codecs selectable capabilities. * Returns the codecs selectable capabilities.
*
* @return an array with the codecs selectable capabilities
*/ */
@UnsupportedAppUsage public @NonNull List<BluetoothCodecConfig> getCodecsSelectableCapabilities() {
public @Nullable BluetoothCodecConfig[] getCodecsSelectableCapabilities() { return (mCodecsSelectableCapabilities == null)
return mCodecsSelectableCapabilities; ? Collections.emptyList() : mCodecsSelectableCapabilities;
} }
} }

View File

@@ -17,7 +17,6 @@
package android.bluetooth; package android.bluetooth;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
import junit.framework.TestCase; import junit.framework.TestCase;
@@ -34,7 +33,6 @@ public class BluetoothCodecConfigTest extends TestCase {
BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_MAX,
BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID, BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID,
}; };
private static final int[] kCodecPriorityArray = new int[] { private static final int[] kCodecPriorityArray = new int[] {
@@ -168,20 +166,11 @@ public class BluetoothCodecConfigTest extends TestCase {
long codec_specific3 = selectCodecSpecific3(config_id); long codec_specific3 = selectCodecSpecific3(config_id);
long codec_specific4 = selectCodecSpecific4(config_id); long codec_specific4 = selectCodecSpecific4(config_id);
BluetoothCodecConfig bcc = new BluetoothCodecConfig(codec_type, codec_priority, BluetoothCodecConfig bcc = buildBluetoothCodecConfig(codec_type, codec_priority,
sample_rate, bits_per_sample, sample_rate, bits_per_sample,
channel_mode, codec_specific1, channel_mode, codec_specific1,
codec_specific2, codec_specific3, codec_specific2, codec_specific3,
codec_specific4); codec_specific4);
if (sample_rate == BluetoothCodecConfig.SAMPLE_RATE_NONE) {
assertFalse(bcc.isValid());
} else if (bits_per_sample == BluetoothCodecConfig.BITS_PER_SAMPLE_NONE) {
assertFalse(bcc.isValid());
} else if (channel_mode == BluetoothCodecConfig.CHANNEL_MODE_NONE) {
assertFalse(bcc.isValid());
} else {
assertTrue(bcc.isValid());
}
if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC) { if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC) {
assertTrue(bcc.isMandatoryCodec()); assertTrue(bcc.isMandatoryCodec());
@@ -204,10 +193,6 @@ public class BluetoothCodecConfigTest extends TestCase {
if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC) { if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC) {
assertEquals("LDAC", bcc.getCodecName()); assertEquals("LDAC", bcc.getCodecName());
} }
if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_MAX) {
assertEquals("UNKNOWN CODEC(" + BluetoothCodecConfig.SOURCE_CODEC_TYPE_MAX + ")",
bcc.getCodecName());
}
if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID) { if (codec_type == BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID) {
assertEquals("INVALID CODEC", bcc.getCodecName()); assertEquals("INVALID CODEC", bcc.getCodecName());
} }
@@ -227,7 +212,7 @@ public class BluetoothCodecConfigTest extends TestCase {
@SmallTest @SmallTest
public void testBluetoothCodecConfig_equals() { public void testBluetoothCodecConfig_equals() {
BluetoothCodecConfig bcc1 = BluetoothCodecConfig bcc1 =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -235,7 +220,7 @@ public class BluetoothCodecConfigTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
BluetoothCodecConfig bcc2_same = BluetoothCodecConfig bcc2_same =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -244,7 +229,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertTrue(bcc1.equals(bcc2_same)); assertTrue(bcc1.equals(bcc2_same));
BluetoothCodecConfig bcc3_codec_type = BluetoothCodecConfig bcc3_codec_type =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -253,7 +238,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc3_codec_type)); assertFalse(bcc1.equals(bcc3_codec_type));
BluetoothCodecConfig bcc4_codec_priority = BluetoothCodecConfig bcc4_codec_priority =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST, BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -262,7 +247,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc4_codec_priority)); assertFalse(bcc1.equals(bcc4_codec_priority));
BluetoothCodecConfig bcc5_sample_rate = BluetoothCodecConfig bcc5_sample_rate =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -271,7 +256,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc5_sample_rate)); assertFalse(bcc1.equals(bcc5_sample_rate));
BluetoothCodecConfig bcc6_bits_per_sample = BluetoothCodecConfig bcc6_bits_per_sample =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_24, BluetoothCodecConfig.BITS_PER_SAMPLE_24,
@@ -280,7 +265,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc6_bits_per_sample)); assertFalse(bcc1.equals(bcc6_bits_per_sample));
BluetoothCodecConfig bcc7_channel_mode = BluetoothCodecConfig bcc7_channel_mode =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -289,7 +274,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc7_channel_mode)); assertFalse(bcc1.equals(bcc7_channel_mode));
BluetoothCodecConfig bcc8_codec_specific1 = BluetoothCodecConfig bcc8_codec_specific1 =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -298,7 +283,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc8_codec_specific1)); assertFalse(bcc1.equals(bcc8_codec_specific1));
BluetoothCodecConfig bcc9_codec_specific2 = BluetoothCodecConfig bcc9_codec_specific2 =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -307,7 +292,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc9_codec_specific2)); assertFalse(bcc1.equals(bcc9_codec_specific2));
BluetoothCodecConfig bcc10_codec_specific3 = BluetoothCodecConfig bcc10_codec_specific3 =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -316,7 +301,7 @@ public class BluetoothCodecConfigTest extends TestCase {
assertFalse(bcc1.equals(bcc10_codec_specific3)); assertFalse(bcc1.equals(bcc10_codec_specific3));
BluetoothCodecConfig bcc11_codec_specific4 = BluetoothCodecConfig bcc11_codec_specific4 =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -324,4 +309,21 @@ public class BluetoothCodecConfigTest extends TestCase {
1000, 2000, 3000, 4004); 1000, 2000, 3000, 4004);
assertFalse(bcc1.equals(bcc11_codec_specific4)); assertFalse(bcc1.equals(bcc11_codec_specific4));
} }
private BluetoothCodecConfig buildBluetoothCodecConfig(int sourceCodecType,
int codecPriority, int sampleRate, int bitsPerSample, int channelMode,
long codecSpecific1, long codecSpecific2, long codecSpecific3, long codecSpecific4) {
return new BluetoothCodecConfig.Builder()
.setCodecType(sourceCodecType)
.setCodecPriority(codecPriority)
.setSampleRate(sampleRate)
.setBitsPerSample(bitsPerSample)
.setChannelMode(channelMode)
.setCodecSpecific1(codecSpecific1)
.setCodecSpecific2(codecSpecific2)
.setCodecSpecific3(codecSpecific3)
.setCodecSpecific4(codecSpecific4)
.build();
}
} }

View File

@@ -17,13 +17,13 @@
package android.bluetooth; package android.bluetooth;
import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
import java.util.Arrays;
import java.util.Objects;
import junit.framework.TestCase; import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/** /**
* Unit test cases for {@link BluetoothCodecStatus}. * Unit test cases for {@link BluetoothCodecStatus}.
* <p> * <p>
@@ -34,7 +34,7 @@ public class BluetoothCodecStatusTest extends TestCase {
// Codec configs: A and B are same; C is different // Codec configs: A and B are same; C is different
private static final BluetoothCodecConfig config_A = private static final BluetoothCodecConfig config_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -42,7 +42,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig config_B = private static final BluetoothCodecConfig config_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -50,7 +50,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig config_C = private static final BluetoothCodecConfig config_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -59,7 +59,7 @@ public class BluetoothCodecStatusTest extends TestCase {
// Local capabilities: A and B are same; C is different // Local capabilities: A and B are same; C is different
private static final BluetoothCodecConfig local_capability1_A = private static final BluetoothCodecConfig local_capability1_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -69,7 +69,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability1_B = private static final BluetoothCodecConfig local_capability1_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -79,7 +79,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability1_C = private static final BluetoothCodecConfig local_capability1_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -89,7 +89,7 @@ public class BluetoothCodecStatusTest extends TestCase {
private static final BluetoothCodecConfig local_capability2_A = private static final BluetoothCodecConfig local_capability2_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -99,7 +99,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability2_B = private static final BluetoothCodecConfig local_capability2_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -109,7 +109,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability2_C = private static final BluetoothCodecConfig local_capability2_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -118,7 +118,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability3_A = private static final BluetoothCodecConfig local_capability3_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -128,7 +128,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability3_B = private static final BluetoothCodecConfig local_capability3_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -138,7 +138,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability3_C = private static final BluetoothCodecConfig local_capability3_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -147,7 +147,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability4_A = private static final BluetoothCodecConfig local_capability4_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -157,7 +157,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability4_B = private static final BluetoothCodecConfig local_capability4_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -167,7 +167,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability4_C = private static final BluetoothCodecConfig local_capability4_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000, BluetoothCodecConfig.SAMPLE_RATE_48000,
@@ -176,7 +176,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability5_A = private static final BluetoothCodecConfig local_capability5_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -190,7 +190,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability5_B = private static final BluetoothCodecConfig local_capability5_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -204,7 +204,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig local_capability5_C = private static final BluetoothCodecConfig local_capability5_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -219,7 +219,7 @@ public class BluetoothCodecStatusTest extends TestCase {
// Selectable capabilities: A and B are same; C is different // Selectable capabilities: A and B are same; C is different
private static final BluetoothCodecConfig selectable_capability1_A = private static final BluetoothCodecConfig selectable_capability1_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -228,7 +228,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability1_B = private static final BluetoothCodecConfig selectable_capability1_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -237,7 +237,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability1_C = private static final BluetoothCodecConfig selectable_capability1_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -245,7 +245,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability2_A = private static final BluetoothCodecConfig selectable_capability2_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -254,7 +254,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability2_B = private static final BluetoothCodecConfig selectable_capability2_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -263,7 +263,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability2_C = private static final BluetoothCodecConfig selectable_capability2_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -271,7 +271,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability3_A = private static final BluetoothCodecConfig selectable_capability3_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -280,7 +280,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability3_B = private static final BluetoothCodecConfig selectable_capability3_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -289,7 +289,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability3_C = private static final BluetoothCodecConfig selectable_capability3_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_16, BluetoothCodecConfig.BITS_PER_SAMPLE_16,
@@ -297,7 +297,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability4_A = private static final BluetoothCodecConfig selectable_capability4_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_24, BluetoothCodecConfig.BITS_PER_SAMPLE_24,
@@ -306,7 +306,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability4_B = private static final BluetoothCodecConfig selectable_capability4_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_24, BluetoothCodecConfig.BITS_PER_SAMPLE_24,
@@ -315,7 +315,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability4_C = private static final BluetoothCodecConfig selectable_capability4_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100, BluetoothCodecConfig.SAMPLE_RATE_44100,
BluetoothCodecConfig.BITS_PER_SAMPLE_24, BluetoothCodecConfig.BITS_PER_SAMPLE_24,
@@ -323,7 +323,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability5_A = private static final BluetoothCodecConfig selectable_capability5_A =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -337,7 +337,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability5_B = private static final BluetoothCodecConfig selectable_capability5_B =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -351,7 +351,7 @@ public class BluetoothCodecStatusTest extends TestCase {
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig selectable_capability5_C = private static final BluetoothCodecConfig selectable_capability5_C =
new BluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC, buildBluetoothCodecConfig(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT, BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT,
BluetoothCodecConfig.SAMPLE_RATE_44100 | BluetoothCodecConfig.SAMPLE_RATE_44100 |
BluetoothCodecConfig.SAMPLE_RATE_48000 | BluetoothCodecConfig.SAMPLE_RATE_48000 |
@@ -363,79 +363,87 @@ public class BluetoothCodecStatusTest extends TestCase {
BluetoothCodecConfig.CHANNEL_MODE_STEREO, BluetoothCodecConfig.CHANNEL_MODE_STEREO,
1000, 2000, 3000, 4000); 1000, 2000, 3000, 4000);
private static final BluetoothCodecConfig[] local_capability_A = { private static final List<BluetoothCodecConfig> LOCAL_CAPABILITY_A =
local_capability1_A, new ArrayList() {{
local_capability2_A, add(local_capability1_A);
local_capability3_A, add(local_capability2_A);
local_capability4_A, add(local_capability3_A);
local_capability5_A, add(local_capability4_A);
}; add(local_capability5_A);
}};
private static final BluetoothCodecConfig[] local_capability_B = { private static final List<BluetoothCodecConfig> LOCAL_CAPABILITY_B =
local_capability1_B, new ArrayList() {{
local_capability2_B, add(local_capability1_B);
local_capability3_B, add(local_capability2_B);
local_capability4_B, add(local_capability3_B);
local_capability5_B, add(local_capability4_B);
}; add(local_capability5_B);
}};
private static final BluetoothCodecConfig[] local_capability_B_reordered = { private static final List<BluetoothCodecConfig> LOCAL_CAPABILITY_B_REORDERED =
local_capability5_B, new ArrayList() {{
local_capability4_B, add(local_capability5_B);
local_capability2_B, add(local_capability4_B);
local_capability3_B, add(local_capability2_B);
local_capability1_B, add(local_capability3_B);
}; add(local_capability1_B);
}};
private static final BluetoothCodecConfig[] local_capability_C = { private static final List<BluetoothCodecConfig> LOCAL_CAPABILITY_C =
local_capability1_C, new ArrayList() {{
local_capability2_C, add(local_capability1_C);
local_capability3_C, add(local_capability2_C);
local_capability4_C, add(local_capability3_C);
local_capability5_C, add(local_capability4_C);
}; add(local_capability5_C);
}};
private static final BluetoothCodecConfig[] selectable_capability_A = { private static final List<BluetoothCodecConfig> SELECTABLE_CAPABILITY_A =
selectable_capability1_A, new ArrayList() {{
selectable_capability2_A, add(selectable_capability1_A);
selectable_capability3_A, add(selectable_capability2_A);
selectable_capability4_A, add(selectable_capability3_A);
selectable_capability5_A, add(selectable_capability4_A);
}; add(selectable_capability5_A);
}};
private static final BluetoothCodecConfig[] selectable_capability_B = { private static final List<BluetoothCodecConfig> SELECTABLE_CAPABILITY_B =
selectable_capability1_B, new ArrayList() {{
selectable_capability2_B, add(selectable_capability1_B);
selectable_capability3_B, add(selectable_capability2_B);
selectable_capability4_B, add(selectable_capability3_B);
selectable_capability5_B, add(selectable_capability4_B);
}; add(selectable_capability5_B);
}};
private static final BluetoothCodecConfig[] selectable_capability_B_reordered = { private static final List<BluetoothCodecConfig> SELECTABLE_CAPABILITY_B_REORDERED =
selectable_capability5_B, new ArrayList() {{
selectable_capability4_B, add(selectable_capability5_B);
selectable_capability2_B, add(selectable_capability4_B);
selectable_capability3_B, add(selectable_capability2_B);
selectable_capability1_B, add(selectable_capability3_B);
}; add(selectable_capability1_B);
}};
private static final BluetoothCodecConfig[] selectable_capability_C = { private static final List<BluetoothCodecConfig> SELECTABLE_CAPABILITY_C =
selectable_capability1_C, new ArrayList() {{
selectable_capability2_C, add(selectable_capability1_C);
selectable_capability3_C, add(selectable_capability2_C);
selectable_capability4_C, add(selectable_capability3_C);
selectable_capability5_C, add(selectable_capability4_C);
}; add(selectable_capability5_C);
}};
private static final BluetoothCodecStatus bcs_A = private static final BluetoothCodecStatus bcs_A =
new BluetoothCodecStatus(config_A, local_capability_A, selectable_capability_A); new BluetoothCodecStatus(config_A, LOCAL_CAPABILITY_A, SELECTABLE_CAPABILITY_A);
private static final BluetoothCodecStatus bcs_B = private static final BluetoothCodecStatus bcs_B =
new BluetoothCodecStatus(config_B, local_capability_B, selectable_capability_B); new BluetoothCodecStatus(config_B, LOCAL_CAPABILITY_B, SELECTABLE_CAPABILITY_B);
private static final BluetoothCodecStatus bcs_B_reordered = private static final BluetoothCodecStatus bcs_B_reordered =
new BluetoothCodecStatus(config_B, local_capability_B_reordered, new BluetoothCodecStatus(config_B, LOCAL_CAPABILITY_B_REORDERED,
selectable_capability_B_reordered); SELECTABLE_CAPABILITY_B_REORDERED);
private static final BluetoothCodecStatus bcs_C = private static final BluetoothCodecStatus bcs_C =
new BluetoothCodecStatus(config_C, local_capability_C, selectable_capability_C); new BluetoothCodecStatus(config_C, LOCAL_CAPABILITY_C, SELECTABLE_CAPABILITY_C);
@SmallTest @SmallTest
public void testBluetoothCodecStatus_get_methods() { public void testBluetoothCodecStatus_get_methods() {
@@ -444,16 +452,16 @@ public class BluetoothCodecStatusTest extends TestCase {
assertTrue(Objects.equals(bcs_A.getCodecConfig(), config_B)); assertTrue(Objects.equals(bcs_A.getCodecConfig(), config_B));
assertFalse(Objects.equals(bcs_A.getCodecConfig(), config_C)); assertFalse(Objects.equals(bcs_A.getCodecConfig(), config_C));
assertTrue(Arrays.equals(bcs_A.getCodecsLocalCapabilities(), local_capability_A)); assertTrue(bcs_A.getCodecsLocalCapabilities().equals(LOCAL_CAPABILITY_A));
assertTrue(Arrays.equals(bcs_A.getCodecsLocalCapabilities(), local_capability_B)); assertTrue(bcs_A.getCodecsLocalCapabilities().equals(LOCAL_CAPABILITY_B));
assertFalse(Arrays.equals(bcs_A.getCodecsLocalCapabilities(), local_capability_C)); assertFalse(bcs_A.getCodecsLocalCapabilities().equals(LOCAL_CAPABILITY_C));
assertTrue(Arrays.equals(bcs_A.getCodecsSelectableCapabilities(), assertTrue(bcs_A.getCodecsSelectableCapabilities()
selectable_capability_A)); .equals(SELECTABLE_CAPABILITY_A));
assertTrue(Arrays.equals(bcs_A.getCodecsSelectableCapabilities(), assertTrue(bcs_A.getCodecsSelectableCapabilities()
selectable_capability_B)); .equals(SELECTABLE_CAPABILITY_B));
assertFalse(Arrays.equals(bcs_A.getCodecsSelectableCapabilities(), assertFalse(bcs_A.getCodecsSelectableCapabilities()
selectable_capability_C)); .equals(SELECTABLE_CAPABILITY_C));
} }
@SmallTest @SmallTest
@@ -465,4 +473,21 @@ public class BluetoothCodecStatusTest extends TestCase {
assertFalse(bcs_A.equals(bcs_C)); assertFalse(bcs_A.equals(bcs_C));
assertFalse(bcs_C.equals(bcs_A)); assertFalse(bcs_C.equals(bcs_A));
} }
private static BluetoothCodecConfig buildBluetoothCodecConfig(int sourceCodecType,
int codecPriority, int sampleRate, int bitsPerSample, int channelMode,
long codecSpecific1, long codecSpecific2, long codecSpecific3, long codecSpecific4) {
return new BluetoothCodecConfig.Builder()
.setCodecType(sourceCodecType)
.setCodecPriority(codecPriority)
.setSampleRate(sampleRate)
.setBitsPerSample(bitsPerSample)
.setChannelMode(channelMode)
.setCodecSpecific1(codecSpecific1)
.setCodecSpecific2(codecSpecific2)
.setCodecSpecific3(codecSpecific3)
.setCodecSpecific4(codecSpecific4)
.build();
}
} }

View File

@@ -28,13 +28,16 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid; import android.bluetooth.BluetoothUuid;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.os.ParcelUuid; import android.os.ParcelUuid;
import android.util.Log; import android.util.Log;
import androidx.annotation.RequiresApi;
import com.android.settingslib.R; import com.android.settingslib.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Collections;
import java.util.List; import java.util.List;
public class A2dpProfile implements LocalBluetoothProfile { public class A2dpProfile implements LocalBluetoothProfile {
@@ -226,6 +229,10 @@ public class A2dpProfile implements LocalBluetoothProfile {
return support == BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED; return support == BluetoothA2dp.OPTIONAL_CODECS_SUPPORTED;
} }
/**
* @return whether high quality audio is enabled or not
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public boolean isHighQualityAudioEnabled(BluetoothDevice device) { public boolean isHighQualityAudioEnabled(BluetoothDevice device) {
BluetoothDevice bluetoothDevice = (device != null) ? device : mService.getActiveDevice(); BluetoothDevice bluetoothDevice = (device != null) ? device : mService.getActiveDevice();
if (bluetoothDevice == null) { if (bluetoothDevice == null) {
@@ -271,6 +278,13 @@ public class A2dpProfile implements LocalBluetoothProfile {
} }
} }
/**
* Gets the label associated with the codec of a Bluetooth device.
*
* @param device to get codec label from
* @return the label associated with the device codec
*/
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public String getHighQualityAudioOptionLabel(BluetoothDevice device) { public String getHighQualityAudioOptionLabel(BluetoothDevice device) {
BluetoothDevice bluetoothDevice = (device != null) ? device : mService.getActiveDevice(); BluetoothDevice bluetoothDevice = (device != null) ? device : mService.getActiveDevice();
int unknownCodecId = R.string.bluetooth_profile_a2dp_high_quality_unknown_codec; int unknownCodecId = R.string.bluetooth_profile_a2dp_high_quality_unknown_codec;
@@ -280,18 +294,18 @@ public class A2dpProfile implements LocalBluetoothProfile {
} }
// We want to get the highest priority codec, since that's the one that will be used with // We want to get the highest priority codec, since that's the one that will be used with
// this device, and see if it is high-quality (ie non-mandatory). // this device, and see if it is high-quality (ie non-mandatory).
BluetoothCodecConfig[] selectable = null; List<BluetoothCodecConfig> selectable = null;
if (mService.getCodecStatus(device) != null) { if (mService.getCodecStatus(device) != null) {
selectable = mService.getCodecStatus(device).getCodecsSelectableCapabilities(); selectable = mService.getCodecStatus(device).getCodecsSelectableCapabilities();
// To get the highest priority, we sort in reverse. // To get the highest priority, we sort in reverse.
Arrays.sort(selectable, Collections.sort(selectable,
(a, b) -> { (a, b) -> {
return b.getCodecPriority() - a.getCodecPriority(); return b.getCodecPriority() - a.getCodecPriority();
}); });
} }
final BluetoothCodecConfig codecConfig = (selectable == null || selectable.length < 1) final BluetoothCodecConfig codecConfig = (selectable == null || selectable.size() < 1)
? null : selectable[0]; ? null : selectable.get(0);
final int codecType = (codecConfig == null || codecConfig.isMandatoryCodec()) final int codecType = (codecConfig == null || codecConfig.isMandatoryCodec())
? BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID : codecConfig.getCodecType(); ? BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID : codecConfig.getCodecType();

View File

@@ -43,6 +43,9 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
import java.util.Arrays;
import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowBluetoothAdapter.class}) @Config(shadows = {ShadowBluetoothAdapter.class})
public class A2dpProfileTest { public class A2dpProfileTest {
@@ -179,7 +182,7 @@ public class A2dpProfileTest {
BluetoothProfile.STATE_CONNECTED); BluetoothProfile.STATE_CONNECTED);
BluetoothCodecStatus status = mock(BluetoothCodecStatus.class); BluetoothCodecStatus status = mock(BluetoothCodecStatus.class);
BluetoothCodecConfig config = mock(BluetoothCodecConfig.class); BluetoothCodecConfig config = mock(BluetoothCodecConfig.class);
BluetoothCodecConfig[] configs = {config}; List<BluetoothCodecConfig> configs = Arrays.asList(config);
when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status); when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status);
when(status.getCodecsSelectableCapabilities()).thenReturn(configs); when(status.getCodecsSelectableCapabilities()).thenReturn(configs);
@@ -194,7 +197,7 @@ public class A2dpProfileTest {
BluetoothProfile.STATE_CONNECTED); BluetoothProfile.STATE_CONNECTED);
BluetoothCodecStatus status = mock(BluetoothCodecStatus.class); BluetoothCodecStatus status = mock(BluetoothCodecStatus.class);
BluetoothCodecConfig config = mock(BluetoothCodecConfig.class); BluetoothCodecConfig config = mock(BluetoothCodecConfig.class);
BluetoothCodecConfig[] configs = {config}; List<BluetoothCodecConfig> configs = Arrays.asList(config);
when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status); when(mBluetoothA2dp.getCodecStatus(mDevice)).thenReturn(status);
when(status.getCodecsSelectableCapabilities()).thenReturn(configs); when(status.getCodecsSelectableCapabilities()).thenReturn(configs);