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

Commit add81287 authored by Rongxuan Liu's avatar Rongxuan Liu Committed by Gerrit Code Review
Browse files

Merge "[le audio] API broadcast to unicast fallback group changed callback" into main

parents 4db37d51 573b2d30
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
}
+26 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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) {
@@ -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: "
@@ -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) {
+54 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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) {
+15 −0
Original line number Diff line number Diff line
@@ -2229,6 +2229,9 @@ public class LeAudioServiceTest {

                    @Override
                    public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {}

                    @Override
                    public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {}
                };

        synchronized (mService.mLeAudioCallbacks) {
@@ -2287,6 +2290,9 @@ public class LeAudioServiceTest {
                        assertThat(gid == groupId).isTrue();
                        assertThat(gStreamStatus == groupStreamStatus).isTrue();
                    }

                    @Override
                    public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {}
                };

        synchronized (mService.mLeAudioCallbacks) {
@@ -2400,6 +2406,9 @@ public class LeAudioServiceTest {

                    @Override
                    public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {}

                    @Override
                    public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {}
                };

        synchronized (mService.mLeAudioCallbacks) {
@@ -2484,6 +2493,9 @@ public class LeAudioServiceTest {

                    @Override
                    public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {}

                    @Override
                    public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {}
                };

        synchronized (mService.mLeAudioCallbacks) {
@@ -2577,6 +2589,9 @@ public class LeAudioServiceTest {

                    @Override
                    public void onGroupStreamStatusChanged(int groupId, int groupStreamStatus) {}

                    @Override
                    public void onBroadcastToUnicastFallbackGroupChanged(int groupId) {}
                };

        synchronized (mService.mLeAudioCallbacks) {
+1 −0
Original line number Diff line number Diff line
@@ -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