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

Commit a7168437 authored by Alice Kuo's avatar Alice Kuo
Browse files

Add broadcast feature supported API

Expose isLeAudioBroadcastSourceSupported and isLeAudioBroadcastAssistantSupported
API. It would check the controller capabilities for now, and plan to
check the profile enable status later.

Bug: 150670922
Bug: 208368819
Test: make build
Change-Id: Ic68a19575e09dc8cf525c28afaca92ea44158981
Merged-In: Ic68a19575e09dc8cf525c28afaca92ea44158981
parent c35fd28f
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -127,7 +127,9 @@ class AdapterProperties {
    private int mDynamicAudioBufferSizeSupportedCodecsGroup2;

    private boolean mIsLePeriodicAdvertisingSyncTransferSenderSupported;
    private boolean mIsLePeriodicAdvertisingSyncTransferRecipientSupported;
    private boolean mIsLeConnectedIsochronousStreamCentralSupported;
    private boolean mIsLeIsochronousBroadcasterSupported;

    private List<BufferConstraint> mBufferConstraintList;

@@ -513,6 +515,13 @@ class AdapterProperties {
        return mIsLePeriodicAdvertisingSyncTransferSenderSupported;
    }

    /**
     * @return the mIsLePeriodicAdvertisingSyncTransferRecipientSupported
     */
    boolean isLePeriodicAdvertisingSyncTransferRecipientSupported() {
        return mIsLePeriodicAdvertisingSyncTransferRecipientSupported;
    }

    /**
     * @return the mIsLeConnectedIsochronousStreamCentralSupported
     */
@@ -520,6 +529,13 @@ class AdapterProperties {
        return mIsLeConnectedIsochronousStreamCentralSupported;
    }

    /**
     * @return the mIsLeIsochronousBroadcasterSupported
     */
    boolean isLeIsochronousBroadcasterSupported() {
        return mIsLeIsochronousBroadcasterSupported;
    }

    /**
     * @return the getLeMaximumAdvertisingDataLength
     */
@@ -982,6 +998,8 @@ class AdapterProperties {
                ((0xFF & ((int) val[23])) << 8) + (0xFF & ((int) val[22]));
        mIsLePeriodicAdvertisingSyncTransferSenderSupported = ((0xFF & ((int) val[24])) != 0);
        mIsLeConnectedIsochronousStreamCentralSupported = ((0xFF & ((int) val[25])) != 0);
        mIsLeIsochronousBroadcasterSupported = ((0xFF & ((int) val[26])) != 0);
        mIsLePeriodicAdvertisingSyncTransferRecipientSupported = ((0xFF & ((int) val[27])) != 0);

        Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller"
                + " mNumOfAdvertisementInstancesSupported = "
@@ -1005,7 +1023,11 @@ class AdapterProperties {
                + " mIsLePeriodicAdvertisingSyncTransferSenderSupported = "
                + mIsLePeriodicAdvertisingSyncTransferSenderSupported
                + " mIsLeConnectedIsochronousStreamCentralSupported = "
                + mIsLeConnectedIsochronousStreamCentralSupported);
                + mIsLeConnectedIsochronousStreamCentralSupported
                + " mIsLeIsochronousBroadcasterSupported = "
                + mIsLeIsochronousBroadcasterSupported
                + " mIsLePeriodicAdvertisingSyncTransferRecipientSupported = "
                + mIsLePeriodicAdvertisingSyncTransferRecipientSupported);
        //invalidateIsOffloadedFilteringSupportedCache();
    }

+39 −8
Original line number Diff line number Diff line
@@ -2457,13 +2457,27 @@ public class AdapterService extends Service {
        }

        @Override
        public int isLePeriodicAdvertisingSyncTransferSenderSupported() {
        public int isLeAudioBroadcastSourceSupported() {
            AdapterService service = getService();
            if (service == null) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;
            }

            if (service.mAdapterProperties.isLePeriodicAdvertisingSyncTransferSenderSupported()) {
            if (service.isLeAudioBroadcastSourceSupported()) {
                return BluetoothStatusCodes.SUCCESS;
            }

            return BluetoothStatusCodes.ERROR_FEATURE_NOT_SUPPORTED;
        }

        @Override
        public int isLeAudioBroadcastAssistantSupported() {
            AdapterService service = getService();
            if (service == null) {
                return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;
            }

            if (service.isLeAudioBroadcastAssistantSupported()) {
                return BluetoothStatusCodes.SUCCESS;
            }

@@ -3464,16 +3478,33 @@ public class AdapterService extends Service {
        return mAdapterProperties.isLePeriodicAdvertisingSupported();
    }

    public int getLeMaximumAdvertisingDataLength() {
        return mAdapterProperties.getLeMaximumAdvertisingDataLength();
    /**
     * Check if the LE audio broadcast source feature is supported.
     *
     * @return true, if the LE audio broadcast source is supported
     */
    public boolean isLeAudioBroadcastSourceSupported() {
        //TODO: check the profile support status as well after we have the implementation
        return mAdapterProperties.isLePeriodicAdvertisingSupported()
                && mAdapterProperties.isLeExtendedAdvertisingSupported()
                && mAdapterProperties.isLeIsochronousBroadcasterSupported();
    }

    public boolean isLePeriodicAdvertisingSyncTransferSenderSupported() {
        return mAdapterProperties.isLePeriodicAdvertisingSyncTransferSenderSupported();
    /**
     * Check if the LE audio broadcast assistant feature is supported.
     *
     * @return true, if the LE audio broadcast assistant is supported
     */
    public boolean isLeAudioBroadcastAssistantSupported() {
        //TODO: check the profile support status as well after we have the implementation
        return mAdapterProperties.isLePeriodicAdvertisingSupported()
            && mAdapterProperties.isLeExtendedAdvertisingSupported()
            && (mAdapterProperties.isLePeriodicAdvertisingSyncTransferSenderSupported()
                || mAdapterProperties.isLePeriodicAdvertisingSyncTransferRecipientSupported());
    }

    public boolean isLeConnectedIsochronousStreamCentralSupported() {
        return mAdapterProperties.isLeConnectedIsochronousStreamCentralSupported();
    public int getLeMaximumAdvertisingDataLength() {
        return mAdapterProperties.getLeMaximumAdvertisingDataLength();
    }

    /**
+45 −19
Original line number Diff line number Diff line
@@ -2325,21 +2325,47 @@ public final class BluetoothAdapter {
    }

    /**
     * Returns {@link BluetoothStatusCodes#SUCCESS} if LE Periodic Advertising Sync Transfer Sender
     * feature is supported, returns {@link BluetoothStatusCodes#ERROR_FEATURE_NOT_SUPPORTED} if the
     * feature is not supported or an error code
     * Returns {@link BluetoothStatusCodes#SUCCESS} if the LE audio broadcast source
     * feature is supported, {@link BluetoothStatusCodes#ERROR_FEATURE_NOT_SUPPORTED} if the
     * feature is not supported, or an error code.
     *
     * @return whether the chipset supports the LE Periodic Advertising Sync Transfer Sender feature
     * @return whether the LE audio broadcast source is supported
     */
    @RequiresNoPermission
    public @LeFeatureReturnValues int isLePeriodicAdvertisingSyncTransferSenderSupported() {
    public @LeFeatureReturnValues int isLeAudioBroadcastSourceSupported() {
      if (!getLeAccess()) {
        return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;
      }
      try {
        mServiceLock.readLock().lock();
        if (mService != null) {
                return mService.isLePeriodicAdvertisingSyncTransferSenderSupported();
          return mService.isLeAudioBroadcastSourceSupported();
        }
      } catch (RemoteException e) {
        e.rethrowFromSystemServer();
      } finally {
        mServiceLock.readLock().unlock();
      }

      return BluetoothStatusCodes.ERROR_UNKNOWN;
    }

    /**
     * Returns {@link BluetoothStatusCodes#SUCCESS} if the LE audio broadcast assistant
     * feature is supported, {@link BluetoothStatusCodes#ERROR_FEATURE_NOT_SUPPORTED} if the
     * feature is not supported, or an error code.
     *
     * @return whether the LE audio broadcast assistent is supported
     */
    @RequiresNoPermission
    public @LeFeatureReturnValues int isLeAudioBroadcastAssistantSupported() {
      if (!getLeAccess()) {
        return BluetoothStatusCodes.ERROR_BLUETOOTH_NOT_ENABLED;
      }
      try {
        mServiceLock.readLock().lock();
        if (mService != null) {
          return mService.isLeAudioBroadcastAssistantSupported();
        }
      } catch (RemoteException e) {
        e.rethrowFromSystemServer();
+3 −1
Original line number Diff line number Diff line
@@ -198,7 +198,9 @@ interface IBluetooth
    @JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
    int isLeAudioSupported();
    @JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
    int isLePeriodicAdvertisingSyncTransferSenderSupported();
    int isLeAudioBroadcastSourceSupported();
    @JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
    int isLeAudioBroadcastAssistantSupported();
    @JavaPassthrough(annotation="@android.annotation.RequiresNoPermission")
    int getLeMaximumAdvertisingDataLength();

+5 −0
Original line number Diff line number Diff line
@@ -622,6 +622,11 @@ void btif_get_adapter_property(bt_property_type_t type) {
        controller->supports_ble_periodic_advertising_sync_transfer_sender();
    local_le_features.le_connected_isochronous_stream_central_supported =
        controller->supports_ble_connected_isochronous_stream_central();
    local_le_features.le_isochronous_broadcast_supported =
        controller->supports_ble_isochronous_broadcaster();
    local_le_features
        .le_periodic_advertising_sync_transfer_recipient_supported =
        controller->supports_ble_periodic_advertising_sync_transfer_recipient();
    memcpy(prop.val, &local_le_features, prop.len);
  } else if (prop.type == BT_PROPERTY_DYNAMIC_AUDIO_BUFFER) {
    tBTM_BLE_VSC_CB cmn_vsc_cb;
Loading