Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d217bbb authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge changes from topic "bt-api-fix-v2" am: 1b64f3f9 am: 3fb9307c am: a0a32382

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2030692

Change-Id: Ie5334acca6d00ea3ca870d3f5ca4832ccdde8ebc
parents b0cd974f a0a32382
Loading
Loading
Loading
Loading
+184 −50
Original line number Diff line number Diff line
@@ -1227,11 +1227,15 @@ public class HapClientService extends ProfileService {
        public void getConnectedDevices(AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                List<BluetoothDevice> defaultValue = new ArrayList<>();
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getConnectedDevices();
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getConnectedDevices();
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1242,11 +1246,15 @@ public class HapClientService extends ProfileService {
        public void getDevicesMatchingConnectionStates(int[] states,
                AttributionSource source, SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                List<BluetoothDevice> defaultValue = new ArrayList<>();
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getDevicesMatchingConnectionStates(states);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getDevicesMatchingConnectionStates(states);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1257,11 +1265,16 @@ public class HapClientService extends ProfileService {
        public void getConnectionState(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                int defaultValue = BluetoothProfile.STATE_DISCONNECTED;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getConnectionState(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getConnectionState(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1272,11 +1285,16 @@ public class HapClientService extends ProfileService {
        public void setConnectionPolicy(BluetoothDevice device, int connectionPolicy,
                AttributionSource source, SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                boolean defaultValue = false;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.setConnectionPolicy(device, connectionPolicy);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.setConnectionPolicy(device, connectionPolicy);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1287,11 +1305,16 @@ public class HapClientService extends ProfileService {
        public void getConnectionPolicy(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                int defaultValue = BluetoothProfile.CONNECTION_POLICY_UNKNOWN;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getConnectionPolicy(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getConnectionPolicy(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1302,11 +1325,16 @@ public class HapClientService extends ProfileService {
        public void getActivePresetIndex(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                int defaultValue = BluetoothHapClient.PRESET_INDEX_UNAVAILABLE;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getActivePresetIndex(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getActivePresetIndex(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1317,11 +1345,16 @@ public class HapClientService extends ProfileService {
        public void getActivePresetInfo(BluetoothDevice device,
                AttributionSource source, SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                BluetoothHapPresetInfo defaultValue = null;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getActivePresetInfo(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getActivePresetInfo(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1332,11 +1365,16 @@ public class HapClientService extends ProfileService {
        public void getHapGroup(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                int defaultValue = BluetoothCsipSetCoordinator.GROUP_ID_INVALID;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getHapGroup(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getHapGroup(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1346,61 +1384,115 @@ public class HapClientService extends ProfileService {
        @Override
        public void selectPreset(BluetoothDevice device, int presetIndex,
                AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.selectPreset(device, presetIndex);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.selectPreset(device, presetIndex);
        }

        @Override
        public void selectPresetForGroup(int groupId, int presetIndex, AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.selectPresetForGroup(groupId, presetIndex);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.selectPresetForGroup(groupId, presetIndex);
        }

        @Override
        public void switchToNextPreset(BluetoothDevice device, AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.switchToNextPreset(device);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.switchToNextPreset(device);
        }

        @Override
        public void switchToNextPresetForGroup(int groupId, AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.switchToNextPresetForGroup(groupId);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.switchToNextPresetForGroup(groupId);
        }

        @Override
        public void switchToPreviousPreset(BluetoothDevice device, AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.switchToPreviousPreset(device);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.switchToPreviousPreset(device);
        }

        @Override
        public void switchToPreviousPresetForGroup(int groupId, AttributionSource source) {
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.switchToPreviousPresetForGroup(groupId);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.switchToPreviousPresetForGroup(groupId);
        }

        @Override
        public void getPresetInfo(BluetoothDevice device, int presetIndex,
                AttributionSource source, SynchronousResultReceiver receiver) {

            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                BluetoothHapPresetInfo defaultValue = null;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getPresetInfo(device, presetIndex);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getPresetInfo(device, presetIndex);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1411,11 +1503,16 @@ public class HapClientService extends ProfileService {
        public void getAllPresetInfo(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                List<BluetoothHapPresetInfo> defaultValue = new ArrayList<>();
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getAllPresetInfo(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getAllPresetInfo(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1426,11 +1523,16 @@ public class HapClientService extends ProfileService {
        public void getFeatures(BluetoothDevice device, AttributionSource source,
                SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(device, "device cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                int defaultValue = 0x00;
                HapClientService service = getService(source);
                if (service != null) {
                    defaultValue = service.getFeatures(device);
                if (service == null) {
                    throw new IllegalStateException("service is null");
                }
                enforceBluetoothPrivilegedPermission(service);
                defaultValue = service.getFeatures(device);
                receiver.send(defaultValue);
            } catch (RuntimeException e) {
                receiver.propagateException(e);
@@ -1440,31 +1542,60 @@ public class HapClientService extends ProfileService {
        @Override
        public void setPresetName(BluetoothDevice device, int presetIndex, String name,
                AttributionSource source) {
            if (device == null) {
                Log.w(TAG, "device cannot be null");
                return;
            }
            if (name == null) {
                Log.w(TAG, "name cannot be null");
                return;
            }
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }

            HapClientService service = getService(source);
            if (service != null) {
                service.setPresetName(device, presetIndex, name);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.setPresetName(device, presetIndex, name);
        }

        @Override
        public void setPresetNameForGroup(int groupId, int presetIndex, String name,
                AttributionSource source) {
            if (name == null) {
                Log.w(TAG, "name cannot be null");
                return;
            }
            if (source == null) {
                Log.w(TAG, "source cannot be null");
                return;
            }
            HapClientService service = getService(source);
            if (service != null) {
                service.setPresetNameForGroup(groupId, presetIndex, name);
            if (service == null) {
                Log.w(TAG, "service is null");
                return;
            }
            enforceBluetoothPrivilegedPermission(service);
            service.setPresetNameForGroup(groupId, presetIndex, name);
        }

        @Override
        public void registerCallback(IBluetoothHapClientCallback callback,
                AttributionSource source, SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(callback, "callback cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");
                HapClientService service = getService(source);
                if (service == null) {
                    throw new IllegalStateException("Service is unavailable");
                }

                enforceBluetoothPrivilegedPermission(service);
            try {
                service.mCallbacks.register(callback);
                receiver.send(null);
            } catch (RuntimeException e) {
@@ -1475,13 +1606,16 @@ public class HapClientService extends ProfileService {
        @Override
        public void unregisterCallback(IBluetoothHapClientCallback callback,
                AttributionSource source, SynchronousResultReceiver receiver) {
            try {
                Objects.requireNonNull(callback, "callback cannot be null");
                Objects.requireNonNull(source, "source cannot be null");
                Objects.requireNonNull(receiver, "receiver cannot be null");

                HapClientService service = getService(source);
                if (service == null) {
                    throw new IllegalStateException("Service is unavailable");
                }

                enforceBluetoothPrivilegedPermission(service);
            try {
                service.mCallbacks.unregister(callback);
                receiver.send(null);
            } catch (RuntimeException e) {
+3 −4
Original line number Diff line number Diff line
@@ -500,7 +500,7 @@ package android.bluetooth {
    method @IntRange(from=0, to=16777215) public int getPresentationDelayMicros();
    method public int getSourceAddressType();
    method public int getSourceAdvertisingSid();
    method @Nullable public android.bluetooth.BluetoothDevice getSourceDevice();
    method @NonNull public android.bluetooth.BluetoothDevice getSourceDevice();
    method @NonNull public java.util.List<android.bluetooth.BluetoothLeBroadcastSubgroup> getSubgroups();
    method public boolean isEncrypted();
    field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothLeBroadcastMetadata> CREATOR;
@@ -519,7 +519,7 @@ package android.bluetooth {
    method @NonNull public android.bluetooth.BluetoothLeBroadcastMetadata.Builder setPaSyncInterval(int);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastMetadata.Builder setPresentationDelayMicros(@IntRange(from=0, to=16777215) int);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastMetadata.Builder setSourceAdvertisingSid(int);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastMetadata.Builder setSourceDevice(@Nullable android.bluetooth.BluetoothDevice, int);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastMetadata.Builder setSourceDevice(@NonNull android.bluetooth.BluetoothDevice, int);
  }

  public final class BluetoothLeBroadcastReceiveState implements android.os.Parcelable {
@@ -551,7 +551,7 @@ package android.bluetooth {
    method public long getCodecId();
    method @NonNull public android.bluetooth.BluetoothLeAudioCodecConfigMetadata getCodecSpecificConfig();
    method @NonNull public android.bluetooth.BluetoothLeAudioContentMetadata getContentMetadata();
    method public boolean isNoChannelPreference();
    method public boolean hasChannelPreference();
    field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothLeBroadcastSubgroup> CREATOR;
  }

@@ -564,7 +564,6 @@ package android.bluetooth {
    method @NonNull public android.bluetooth.BluetoothLeBroadcastSubgroup.Builder setCodecId(long);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastSubgroup.Builder setCodecSpecificConfig(@NonNull android.bluetooth.BluetoothLeAudioCodecConfigMetadata);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastSubgroup.Builder setContentMetadata(@NonNull android.bluetooth.BluetoothLeAudioContentMetadata);
    method @NonNull public android.bluetooth.BluetoothLeBroadcastSubgroup.Builder setNoChannelPreference(boolean);
  }

  public final class BluetoothMap implements java.lang.AutoCloseable android.bluetooth.BluetoothProfile {
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ public final class BluetoothClass implements Parcelable {
        private static final int BITMASK = 0xFFE000;

        public static final int LIMITED_DISCOVERABILITY = 0x002000;
        /** Represent devices LE audio service */
        public static final int LE_AUDIO = 0x004000;
        public static final int POSITIONING = 0x010000;
        public static final int NETWORKING = 0x020000;
+86 −18

File changed.

Preview size limit exceeded, changes collapsed.

+16 −3
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.Objects;

/**
 * This class contains the Broadcast Isochronous Channel level information as defined in the BASE
 * structure of the Basic Audio Profile.
@@ -168,11 +170,17 @@ public final class BluetoothLeBroadcastChannel implements Parcelable {
        /**
         * Set the Broadcast Isochronous Channel index of this Broadcast Channel.
         *
         * @return Broadcast Isochronous Channel index
         * @param channelIndex Broadcast Isochronous Channel index
         * @throws IllegalArgumentException if the input argument is not valid
         * @return this builder
         * @hide
         */
        @SystemApi
        public @NonNull Builder setChannelIndex(int channelIndex) {
            if (channelIndex == UNKNOWN_VALUE_PLACEHOLDER) {
                throw new IllegalArgumentException("channelIndex cannot be "
                        + UNKNOWN_VALUE_PLACEHOLDER);
            }
            mChannelIndex = channelIndex;
            return this;
        }
@@ -181,12 +189,14 @@ public final class BluetoothLeBroadcastChannel implements Parcelable {
         * Set the codec specific configuration for this Broadcast Channel.
         *
         * @param codecMetadata codec specific configuration for this Broadcast Channel
         * @throws NullPointerException if codecMetadata is null
         * @return this builder
         * @hide
         */
        @SystemApi
        public @NonNull Builder setCodecMetadata(
                @NonNull BluetoothLeAudioCodecConfigMetadata codecMetadata) {
            Objects.requireNonNull(codecMetadata, "codecMetadata cannot be null");
            mCodecMetadata = codecMetadata;
            return this;
        }
@@ -195,13 +205,16 @@ public final class BluetoothLeBroadcastChannel implements Parcelable {
         * Build {@link BluetoothLeBroadcastChannel}.
         *
         * @return constructed {@link BluetoothLeBroadcastChannel}
         * @throws NullPointerException if {@link NonNull} items are null
         * @throws IllegalArgumentException if the object cannot be built
         * @hide
         */
        @SystemApi
        public @NonNull BluetoothLeBroadcastChannel build() {
            if (mCodecMetadata == null) {
                throw new IllegalArgumentException("codec metadata cannot be null");
            Objects.requireNonNull(mCodecMetadata, "codec metadata cannot be null");
            if (mChannelIndex == UNKNOWN_VALUE_PLACEHOLDER) {
                throw new IllegalArgumentException("mChannelIndex cannot be "
                        + UNKNOWN_VALUE_PLACEHOLDER);
            }
            return new BluetoothLeBroadcastChannel(mIsSelected, mChannelIndex, mCodecMetadata);
        }
Loading