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

Commit e8218e30 authored by zhenchao's avatar zhenchao
Browse files

[le audio] use broadcastId instead of Sid to check for local broadcast

Advertising sid is likely to be same for local source and external
source. As a result, external source is unable to be added while local
source is enabled.

This fix use broadcastId instead of advertising Sid to check for local
broadcast source.

Bug: 370267705
Test: manual
Test: atest BassClientServiceTest LeAudioBroadcastServiceTest
Change-Id: I6e969a4f47d4280019c32195c177654e2f713158
parent 43bb005e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -3100,7 +3100,7 @@ public class BassClientService extends ProfileService {
        return stateMachine.getMaximumSourceCapacity();
    }

    private boolean isLocalBroadcast(int sourceAdvertisingSid) {
    private boolean isLocalBroadcast(int broadcastId) {
        LeAudioService leAudioService = mServiceFactory.getLeAudioService();
        if (leAudioService == null) {
            return false;
@@ -3110,7 +3110,7 @@ public class BassClientService extends ProfileService {
                leAudioService.getAllBroadcastMetadata().stream()
                        .anyMatch(
                                meta -> {
                                    return meta.getSourceAdvertisingSid() == sourceAdvertisingSid;
                                    return meta.getBroadcastId() == broadcastId;
                                });
        log("isLocalBroadcast=" + wasFound);
        return wasFound;
@@ -3121,7 +3121,7 @@ public class BassClientService extends ProfileService {
            return false;
        }

        return isLocalBroadcast(metaData.getSourceAdvertisingSid());
        return isLocalBroadcast(metaData.getBroadcastId());
    }

    boolean isLocalBroadcast(BluetoothLeBroadcastReceiveState receiveState) {
@@ -3129,7 +3129,7 @@ public class BassClientService extends ProfileService {
            return false;
        }

        return isLocalBroadcast(receiveState.getSourceAdvertisingSid());
        return isLocalBroadcast(receiveState.getBroadcastId());
    }

    static void log(String msg) {
+41 −0
Original line number Diff line number Diff line
@@ -6926,4 +6926,45 @@ public class BassClientServiceTest {
            }
        }
    }

    @Test
    public void testIsLocalBroadacst() {
        int broadcastId = 12345;

        BluetoothLeBroadcastMetadata metadata = createBroadcastMetadata(broadcastId);
        BluetoothLeBroadcastReceiveState receiveState =
                new BluetoothLeBroadcastReceiveState(
                        TEST_SOURCE_ID,
                        metadata.getSourceAddressType(),
                        metadata.getSourceDevice(),
                        metadata.getSourceAdvertisingSid(),
                        metadata.getBroadcastId(),
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_SYNCHRONIZED,
                        BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null,
                        metadata.getSubgroups().size(),
                        // Bis sync states
                        metadata.getSubgroups().stream()
                                .map(e -> (long) 0x00000001)
                                .collect(Collectors.toList()),
                        metadata.getSubgroups().stream()
                                .map(e -> e.getContentMetadata())
                                .collect(Collectors.toList()));

        /* External broadcast check */
        doReturn(new ArrayList<BluetoothLeBroadcastMetadata>())
                .when(mLeAudioService)
                .getAllBroadcastMetadata();

        assertThat(mBassClientService.isLocalBroadcast(metadata)).isFalse();
        assertThat(mBassClientService.isLocalBroadcast(receiveState)).isFalse();

        /* Local broadcast check */
        doReturn(new ArrayList<BluetoothLeBroadcastMetadata>(Arrays.asList(metadata)))
                .when(mLeAudioService)
                .getAllBroadcastMetadata();

        assertThat(mBassClientService.isLocalBroadcast(metadata)).isTrue();
        assertThat(mBassClientService.isLocalBroadcast(receiveState)).isTrue();
    }
}