Loading android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -32,4 +32,5 @@ oneway interface IBluetoothLeAudioCallback { void onGroupNodeRemoved(in BluetoothDevice device, int groupId); void onGroupStatusChanged(int groupId, int groupStatus); void onGroupStreamStatusChanged(int groupId, int groupStreamStatus); void onBroadcastToUnicastFallbackGroupChanged(in int groupId); } android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +26 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.bluetooth.bass_client.BassConstants.INVALID_BROADCAST_ import static com.android.bluetooth.flags.Flags.leaudioAllowedContextMask; import static com.android.bluetooth.flags.Flags.leaudioBigDependsOnAudioState; import static com.android.bluetooth.flags.Flags.leaudioBroadcastAssistantPeripheralEntrustment; import static com.android.bluetooth.flags.Flags.leaudioBroadcastApiManagePrimaryGroup; import static com.android.bluetooth.flags.Flags.leaudioUseAudioModeListener; import static com.android.modules.utils.build.SdkLevel.isAtLeastU; Loading Loading @@ -2943,6 +2944,22 @@ public class LeAudioService extends ProfileService { } } private void notifyBroadcastToUnicastFallbackGroupChanged(int groupId) { synchronized (mLeAudioCallbacks) { int n = mLeAudioCallbacks.beginBroadcast(); for (int i = 0; i < n; i++) { try { mLeAudioCallbacks .getBroadcastItem(i) .onBroadcastToUnicastFallbackGroupChanged(groupId); } catch (RemoteException e) { continue; } } mLeAudioCallbacks.finishBroadcast(); } } private void setGroupAllowedContextMask( int groupId, int sinkContextTypes, int sourceContextTypes) { if (!mLeAudioNativeIsInitialized) { Loading Loading @@ -5075,6 +5092,11 @@ public class LeAudioService extends ProfileService { * @param groupId group id to update */ private void updateFallbackUnicastGroupIdForBroadcast(int groupId) { if (leaudioBroadcastApiManagePrimaryGroup() && mUnicastGroupIdDeactivatedForBroadcastTransition == groupId) { Log.d(TAG, "Skip updateFallbackUnicastGroupIdForBroadcast, already is primary"); return; } Log.i( TAG, "Update unicast fallback active group from: " Loading @@ -5097,6 +5119,10 @@ public class LeAudioService extends ProfileService { } finally { Binder.restoreCallingIdentity(callingIdentity); } if (leaudioBroadcastApiManagePrimaryGroup()) { mHandler.post(() -> notifyBroadcastToUnicastFallbackGroupChanged(groupId)); } } private boolean isAudioModeChangedFromCommunicationToNormal(int previousMode, int currentMode) { Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +54 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.ParcelUuid; import android.os.RemoteException; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.filters.MediumTest; Loading Loading @@ -86,6 +87,7 @@ public class LeAudioBroadcastServiceTest { private LeAudioService mService; private LeAudioIntentReceiver mLeAudioIntentReceiver; private LinkedBlockingQueue<Intent> mIntentQueue; private boolean onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock private ActiveDeviceManager mActiveDeviceManager; Loading Loading @@ -1593,6 +1595,58 @@ public class LeAudioBroadcastServiceTest { Assert.assertEquals(mService.mUnicastGroupIdDeactivatedForBroadcastTransition, groupId2); } @Test @EnableFlags(Flags.FLAG_LEAUDIO_BROADCAST_API_MANAGE_PRIMARY_GROUP) public void testOnBroadcastToUnicastFallbackGroupChanged() { int groupId1 = 1; int groupId2 = 2; int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; IBluetoothLeAudioCallback leAudioCallbacks = new IBluetoothLeAudioCallback.Stub() { @Override public void onCodecConfigChanged(int gid, BluetoothLeAudioCodecStatus status) {} @Override public void onGroupStatusChanged(int gid, int gStatus) {} @Override public void onGroupNodeAdded(BluetoothDevice device, int gid) {} @Override public void onGroupNodeRemoved(BluetoothDevice device, int gid) {} @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) { onBroadcastToUnicastFallbackGroupChangedCallbackCalled = true; Assert.assertEquals(groupId1, groupId); } }; synchronized (mService.mLeAudioCallbacks) { mService.mLeAudioCallbacks.register(leAudioCallbacks); } initializeNative(); prepareConnectedUnicastDevice(groupId2, mDevice2); prepareHandoverStreamingBroadcast(groupId1, broadcastId, code); TestUtils.waitForLooperToFinishScheduledTask(mService.getMainLooper()); Assert.assertEquals(groupId1, mService.mUnicastGroupIdDeactivatedForBroadcastTransition); Assert.assertTrue(onBroadcastToUnicastFallbackGroupChangedCallbackCalled); onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; synchronized (mService.mLeAudioCallbacks) { mService.mLeAudioCallbacks.unregister(leAudioCallbacks); } } private class LeAudioIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -2229,6 +2229,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2287,6 +2290,9 @@ public class LeAudioServiceTest { assertThat(gid == groupId).isTrue(); assertThat(gStreamStatus == groupStreamStatus).isTrue(); } @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2400,6 +2406,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2484,6 +2493,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2577,6 +2589,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading framework/api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -517,6 +517,7 @@ package android.bluetooth { } public static interface BluetoothLeAudio.Callback { method @FlaggedApi("com.android.bluetooth.flags.leaudio_broadcast_api_manage_primary_group") public default void onBroadcastToUnicastFallbackGroupChanged(int); method public void onCodecConfigChanged(int, @NonNull android.bluetooth.BluetoothLeAudioCodecStatus); method public void onGroupNodeAdded(@NonNull android.bluetooth.BluetoothDevice, int); method public void onGroupNodeRemoved(@NonNull android.bluetooth.BluetoothDevice, int); Loading Loading
android/app/aidl/android/bluetooth/IBluetoothLeAudioCallback.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -32,4 +32,5 @@ oneway interface IBluetoothLeAudioCallback { void onGroupNodeRemoved(in BluetoothDevice device, int groupId); void onGroupStatusChanged(int groupId, int groupStatus); void onGroupStreamStatusChanged(int groupId, int groupStreamStatus); void onBroadcastToUnicastFallbackGroupChanged(in int groupId); }
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +26 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.bluetooth.bass_client.BassConstants.INVALID_BROADCAST_ import static com.android.bluetooth.flags.Flags.leaudioAllowedContextMask; import static com.android.bluetooth.flags.Flags.leaudioBigDependsOnAudioState; import static com.android.bluetooth.flags.Flags.leaudioBroadcastAssistantPeripheralEntrustment; import static com.android.bluetooth.flags.Flags.leaudioBroadcastApiManagePrimaryGroup; import static com.android.bluetooth.flags.Flags.leaudioUseAudioModeListener; import static com.android.modules.utils.build.SdkLevel.isAtLeastU; Loading Loading @@ -2943,6 +2944,22 @@ public class LeAudioService extends ProfileService { } } private void notifyBroadcastToUnicastFallbackGroupChanged(int groupId) { synchronized (mLeAudioCallbacks) { int n = mLeAudioCallbacks.beginBroadcast(); for (int i = 0; i < n; i++) { try { mLeAudioCallbacks .getBroadcastItem(i) .onBroadcastToUnicastFallbackGroupChanged(groupId); } catch (RemoteException e) { continue; } } mLeAudioCallbacks.finishBroadcast(); } } private void setGroupAllowedContextMask( int groupId, int sinkContextTypes, int sourceContextTypes) { if (!mLeAudioNativeIsInitialized) { Loading Loading @@ -5075,6 +5092,11 @@ public class LeAudioService extends ProfileService { * @param groupId group id to update */ private void updateFallbackUnicastGroupIdForBroadcast(int groupId) { if (leaudioBroadcastApiManagePrimaryGroup() && mUnicastGroupIdDeactivatedForBroadcastTransition == groupId) { Log.d(TAG, "Skip updateFallbackUnicastGroupIdForBroadcast, already is primary"); return; } Log.i( TAG, "Update unicast fallback active group from: " Loading @@ -5097,6 +5119,10 @@ public class LeAudioService extends ProfileService { } finally { Binder.restoreCallingIdentity(callingIdentity); } if (leaudioBroadcastApiManagePrimaryGroup()) { mHandler.post(() -> notifyBroadcastToUnicastFallbackGroupChanged(groupId)); } } private boolean isAudioModeChangedFromCommunicationToNormal(int previousMode, int currentMode) { Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +54 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.ParcelUuid; import android.os.RemoteException; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.filters.MediumTest; Loading Loading @@ -86,6 +87,7 @@ public class LeAudioBroadcastServiceTest { private LeAudioService mService; private LeAudioIntentReceiver mLeAudioIntentReceiver; private LinkedBlockingQueue<Intent> mIntentQueue; private boolean onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock private ActiveDeviceManager mActiveDeviceManager; Loading Loading @@ -1593,6 +1595,58 @@ public class LeAudioBroadcastServiceTest { Assert.assertEquals(mService.mUnicastGroupIdDeactivatedForBroadcastTransition, groupId2); } @Test @EnableFlags(Flags.FLAG_LEAUDIO_BROADCAST_API_MANAGE_PRIMARY_GROUP) public void testOnBroadcastToUnicastFallbackGroupChanged() { int groupId1 = 1; int groupId2 = 2; int broadcastId = 243; byte[] code = {0x00, 0x01, 0x00, 0x02}; onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; IBluetoothLeAudioCallback leAudioCallbacks = new IBluetoothLeAudioCallback.Stub() { @Override public void onCodecConfigChanged(int gid, BluetoothLeAudioCodecStatus status) {} @Override public void onGroupStatusChanged(int gid, int gStatus) {} @Override public void onGroupNodeAdded(BluetoothDevice device, int gid) {} @Override public void onGroupNodeRemoved(BluetoothDevice device, int gid) {} @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) { onBroadcastToUnicastFallbackGroupChangedCallbackCalled = true; Assert.assertEquals(groupId1, groupId); } }; synchronized (mService.mLeAudioCallbacks) { mService.mLeAudioCallbacks.register(leAudioCallbacks); } initializeNative(); prepareConnectedUnicastDevice(groupId2, mDevice2); prepareHandoverStreamingBroadcast(groupId1, broadcastId, code); TestUtils.waitForLooperToFinishScheduledTask(mService.getMainLooper()); Assert.assertEquals(groupId1, mService.mUnicastGroupIdDeactivatedForBroadcastTransition); Assert.assertTrue(onBroadcastToUnicastFallbackGroupChangedCallbackCalled); onBroadcastToUnicastFallbackGroupChangedCallbackCalled = false; synchronized (mService.mLeAudioCallbacks) { mService.mLeAudioCallbacks.unregister(leAudioCallbacks); } } private class LeAudioIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioServiceTest.java +15 −0 Original line number Diff line number Diff line Loading @@ -2229,6 +2229,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2287,6 +2290,9 @@ public class LeAudioServiceTest { assertThat(gid == groupId).isTrue(); assertThat(gStreamStatus == groupStreamStatus).isTrue(); } @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2400,6 +2406,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2484,6 +2493,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading Loading @@ -2577,6 +2589,9 @@ public class LeAudioServiceTest { @Override public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {} @Override public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {} }; synchronized (mService.mLeAudioCallbacks) { Loading
framework/api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -517,6 +517,7 @@ package android.bluetooth { } public static interface BluetoothLeAudio.Callback { method @FlaggedApi("com.android.bluetooth.flags.leaudio_broadcast_api_manage_primary_group") public default void onBroadcastToUnicastFallbackGroupChanged(int); method public void onCodecConfigChanged(int, @NonNull android.bluetooth.BluetoothLeAudioCodecStatus); method public void onGroupNodeAdded(@NonNull android.bluetooth.BluetoothDevice, int); method public void onGroupNodeRemoved(@NonNull android.bluetooth.BluetoothDevice, int); Loading