Loading android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +23 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -513,6 +515,13 @@ class AdapterProperties { return mIsLePeriodicAdvertisingSyncTransferSenderSupported; } /** * @return the mIsLePeriodicAdvertisingSyncTransferRecipientSupported */ boolean isLePeriodicAdvertisingSyncTransferRecipientSupported() { return mIsLePeriodicAdvertisingSyncTransferRecipientSupported; } /** * @return the mIsLeConnectedIsochronousStreamCentralSupported */ Loading @@ -520,6 +529,13 @@ class AdapterProperties { return mIsLeConnectedIsochronousStreamCentralSupported; } /** * @return the mIsLeIsochronousBroadcasterSupported */ boolean isLeIsochronousBroadcasterSupported() { return mIsLeIsochronousBroadcasterSupported; } /** * @return the getLeMaximumAdvertisingDataLength */ Loading Loading @@ -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 = " Loading @@ -1005,7 +1023,11 @@ class AdapterProperties { + " mIsLePeriodicAdvertisingSyncTransferSenderSupported = " + mIsLePeriodicAdvertisingSyncTransferSenderSupported + " mIsLeConnectedIsochronousStreamCentralSupported = " + mIsLeConnectedIsochronousStreamCentralSupported); + mIsLeConnectedIsochronousStreamCentralSupported + " mIsLeIsochronousBroadcasterSupported = " + mIsLeIsochronousBroadcasterSupported + " mIsLePeriodicAdvertisingSyncTransferRecipientSupported = " + mIsLePeriodicAdvertisingSyncTransferRecipientSupported); //invalidateIsOffloadedFilteringSupportedCache(); } Loading android/app/src/com/android/bluetooth/btservice/AdapterService.java +39 −8 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -3474,16 +3488,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(); } /** Loading framework/java/android/bluetooth/BluetoothAdapter.java +45 −19 Original line number Diff line number Diff line Loading @@ -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(); Loading system/binder/android/bluetooth/IBluetooth.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading system/btif/src/btif_core.cc +5 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +23 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -513,6 +515,13 @@ class AdapterProperties { return mIsLePeriodicAdvertisingSyncTransferSenderSupported; } /** * @return the mIsLePeriodicAdvertisingSyncTransferRecipientSupported */ boolean isLePeriodicAdvertisingSyncTransferRecipientSupported() { return mIsLePeriodicAdvertisingSyncTransferRecipientSupported; } /** * @return the mIsLeConnectedIsochronousStreamCentralSupported */ Loading @@ -520,6 +529,13 @@ class AdapterProperties { return mIsLeConnectedIsochronousStreamCentralSupported; } /** * @return the mIsLeIsochronousBroadcasterSupported */ boolean isLeIsochronousBroadcasterSupported() { return mIsLeIsochronousBroadcasterSupported; } /** * @return the getLeMaximumAdvertisingDataLength */ Loading Loading @@ -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 = " Loading @@ -1005,7 +1023,11 @@ class AdapterProperties { + " mIsLePeriodicAdvertisingSyncTransferSenderSupported = " + mIsLePeriodicAdvertisingSyncTransferSenderSupported + " mIsLeConnectedIsochronousStreamCentralSupported = " + mIsLeConnectedIsochronousStreamCentralSupported); + mIsLeConnectedIsochronousStreamCentralSupported + " mIsLeIsochronousBroadcasterSupported = " + mIsLeIsochronousBroadcasterSupported + " mIsLePeriodicAdvertisingSyncTransferRecipientSupported = " + mIsLePeriodicAdvertisingSyncTransferRecipientSupported); //invalidateIsOffloadedFilteringSupportedCache(); } Loading
android/app/src/com/android/bluetooth/btservice/AdapterService.java +39 −8 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -3474,16 +3488,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(); } /** Loading
framework/java/android/bluetooth/BluetoothAdapter.java +45 −19 Original line number Diff line number Diff line Loading @@ -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(); Loading
system/binder/android/bluetooth/IBluetooth.aidl +3 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading
system/btif/src/btif_core.cc +5 −0 Original line number Diff line number Diff line Loading @@ -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