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

Commit 39ae014a authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Bass: Multiple improvements and minor fixes" am: af8615ec

parents 8fa9c2e7 af8615ec
Loading
Loading
Loading
Loading
+52 −50
Original line number Original line Diff line number Diff line
@@ -105,9 +105,7 @@ public class BassClientService extends ProfileService {
    private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap;
    private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap;
    private ScanCallback mSearchScanCallback;
    private ScanCallback mSearchScanCallback;
    private Callbacks mCallbacks;
    private Callbacks mCallbacks;

    private BroadcastReceiver mIntentReceiver;
    private BroadcastReceiver mBondStateChangedReceiver;
    private BroadcastReceiver mConnectionStateChangedReceiver;


    @VisibleForTesting
    @VisibleForTesting
    ServiceFactory mServiceFactory = new ServiceFactory();
    ServiceFactory mServiceFactory = new ServiceFactory();
@@ -252,12 +250,32 @@ public class BassClientService extends ProfileService {


        IntentFilter filter = new IntentFilter();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        mBondStateChangedReceiver = new BondStateChangedReceiver();
        registerReceiver(mBondStateChangedReceiver, filter);
        filter = new IntentFilter();
        filter.addAction(BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED);
        filter.addAction(BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED);
        mConnectionStateChangedReceiver = new ConnectionStateChangedReceiver();
        mIntentReceiver = new BroadcastReceiver() {
        registerReceiver(mConnectionStateChangedReceiver, filter, Context.RECEIVER_NOT_EXPORTED);
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();

                if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
                    int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                            BluetoothDevice.ERROR);
                    BluetoothDevice device =
                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    Objects.requireNonNull(device,
                            "ACTION_BOND_STATE_CHANGED with no EXTRA_DEVICE");
                    bondStateChanged(device, state);

                } else if (action.equals(
                            BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED)) {
                    BluetoothDevice device =
                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    int toState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
                    int fromState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
                    connectionStateChanged(device, fromState, toState);
                }
            }
        };
        registerReceiver(mIntentReceiver, filter, Context.RECEIVER_NOT_EXPORTED);


        setBassClientService(this);
        setBassClientService(this);
        mBassUtils = new BassUtils(this);
        mBassUtils = new BassUtils(this);
@@ -291,15 +309,9 @@ public class BassClientService extends ProfileService {
            mStateMachinesThread = null;
            mStateMachinesThread = null;
        }
        }


        // Unregister broadcast receivers
        if (mIntentReceiver != null) {
        if (mBondStateChangedReceiver != null) {
            unregisterReceiver(mIntentReceiver);
            unregisterReceiver(mBondStateChangedReceiver);
            mIntentReceiver = null;
            mBondStateChangedReceiver = null;
        }

        if (mConnectionStateChangedReceiver != null) {
            unregisterReceiver(mConnectionStateChangedReceiver);
            mConnectionStateChangedReceiver = null;
        }
        }


        setBassClientService(null);
        setBassClientService(null);
@@ -1019,10 +1031,20 @@ public class BassClientService extends ProfileService {
        if (devices.size() < 2) {
        if (devices.size() < 2) {
            isGroupOp = false;
            isGroupOp = false;
        }
        }

        if (sourceMetadata == null) {
            log("addSource: Error bad parameter: sourceMetadata cannot be null");
            for (BluetoothDevice device : devices) {
                mCallbacks.notifySourceAddFailed(device, sourceMetadata,
                        BluetoothStatusCodes.ERROR_BAD_PARAMETERS);
            }
            return;
        }

        for (BluetoothDevice device : devices) {
        for (BluetoothDevice device : devices) {
            BassClientStateMachine stateMachine = getOrCreateStateMachine(device);
            BassClientStateMachine stateMachine = getOrCreateStateMachine(device);
            if (sourceMetadata == null || stateMachine == null) {
            if (stateMachine == null) {
                log("addSource: Error bad parameters: sourceMetadata = " + sourceMetadata);
                log("addSource: Error bad parameter: no state machine for " + device);
                mCallbacks.notifySourceAddFailed(device, sourceMetadata,
                mCallbacks.notifySourceAddFailed(device, sourceMetadata,
                        BluetoothStatusCodes.ERROR_BAD_PARAMETERS);
                        BluetoothStatusCodes.ERROR_BAD_PARAMETERS);
                continue;
                continue;
@@ -1073,6 +1095,15 @@ public class BassClientService extends ProfileService {
        log("modifySource: device: " + sink + " sourceId " + sourceId);
        log("modifySource: device: " + sink + " sourceId " + sourceId);


        Map<BluetoothDevice, Integer> devices = getGroupManagedDeviceSources(sink, sourceId).second;
        Map<BluetoothDevice, Integer> devices = getGroupManagedDeviceSources(sink, sourceId).second;
        if (updatedMetadata == null) {
            log("modifySource: Error bad parameters: updatedMetadata cannot be null");
            for (BluetoothDevice device : devices.keySet()) {
                mCallbacks.notifySourceModifyFailed(device, sourceId,
                        BluetoothStatusCodes.ERROR_BAD_PARAMETERS);
            }
            return;
        }

        for (Map.Entry<BluetoothDevice, Integer> deviceSourceIdPair : devices.entrySet()) {
        for (Map.Entry<BluetoothDevice, Integer> deviceSourceIdPair : devices.entrySet()) {
            BluetoothDevice device = deviceSourceIdPair.getKey();
            BluetoothDevice device = deviceSourceIdPair.getKey();
            Integer deviceSourceId = deviceSourceIdPair.getValue();
            Integer deviceSourceId = deviceSourceIdPair.getValue();
@@ -1171,7 +1202,7 @@ public class BassClientService extends ProfileService {
            BluetoothDevice device = deviceSourceIdPair.getKey();
            BluetoothDevice device = deviceSourceIdPair.getKey();
            Integer deviceSourceId = deviceSourceIdPair.getValue();
            Integer deviceSourceId = deviceSourceIdPair.getValue();
            enqueueSourceGroupOp(device, BassClientStateMachine.REMOVE_BCAST_SOURCE,
            enqueueSourceGroupOp(device, BassClientStateMachine.REMOVE_BCAST_SOURCE,
                    new Integer(deviceSourceId));
                    Integer.valueOf(deviceSourceId));
        }
        }
    }
    }


@@ -1268,7 +1299,7 @@ public class BassClientService extends ProfileService {
                case MSG_SOURCE_REMOVED_FAILED:
                case MSG_SOURCE_REMOVED_FAILED:
                    sink = (BluetoothDevice) msg.obj;
                    sink = (BluetoothDevice) msg.obj;
                    sService.checkForPendingGroupOpRequest(sink, reason,
                    sService.checkForPendingGroupOpRequest(sink, reason,
                            BassClientStateMachine.REMOVE_BCAST_SOURCE, new Integer(msg.arg2));
                            BassClientStateMachine.REMOVE_BCAST_SOURCE, Integer.valueOf(msg.arg2));
                    break;
                    break;
                default:
                default:
                    break;
                    break;
@@ -1673,33 +1704,4 @@ public class BassClientService extends ProfileService {
            }
            }
        }
        }
    }
    }

    // Remove state machine if the bonding for a device is removed
    private class BondStateChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) {
                return;
            }
            int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
                    BluetoothDevice.ERROR);
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Objects.requireNonNull(device, "ACTION_BOND_STATE_CHANGED with no EXTRA_DEVICE");
            bondStateChanged(device, state);
        }
    }

    private class ConnectionStateChangedReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (!BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED.equals(
                    intent.getAction())) {
                return;
            }
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            int toState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
            int fromState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1);
            connectionStateChanged(device, fromState, toState);
        }
    }
}
}
+8 −7
Original line number Original line Diff line number Diff line
@@ -98,8 +98,6 @@ import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.StringWriter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collection;
@@ -140,7 +138,7 @@ public class BassClientStateMachine extends StateMachine {


    // NOTE: the value is not "final" - it is modified in the unit tests
    // NOTE: the value is not "final" - it is modified in the unit tests
    @VisibleForTesting
    @VisibleForTesting
    static int sConnectTimeoutMs = BassConstants.CONNECT_TIMEOUT_MS;
    private int mConnectTimeoutMs;


    /*key is combination of sourceId, Address and advSid for this hashmap*/
    /*key is combination of sourceId, Address and advSid for this hashmap*/
    private final Map<Integer, BluetoothLeBroadcastReceiveState>
    private final Map<Integer, BluetoothLeBroadcastReceiveState>
@@ -191,10 +189,12 @@ public class BassClientStateMachine extends StateMachine {
    BluetoothGatt mBluetoothGatt = null;
    BluetoothGatt mBluetoothGatt = null;
    BluetoothGattCallback mGattCallback = null;
    BluetoothGattCallback mGattCallback = null;


    BassClientStateMachine(BluetoothDevice device, BassClientService svc, Looper looper) {
    BassClientStateMachine(BluetoothDevice device, BassClientService svc, Looper looper,
            int connectTimeoutMs) {
        super(TAG + "(" + device.toString() + ")", looper);
        super(TAG + "(" + device.toString() + ")", looper);
        mDevice = device;
        mDevice = device;
        mService = svc;
        mService = svc;
        mConnectTimeoutMs = connectTimeoutMs;
        addState(mDisconnected);
        addState(mDisconnected);
        addState(mDisconnecting);
        addState(mDisconnecting);
        addState(mConnected);
        addState(mConnected);
@@ -219,7 +219,8 @@ public class BassClientStateMachine extends StateMachine {
    static BassClientStateMachine make(BluetoothDevice device,
    static BassClientStateMachine make(BluetoothDevice device,
            BassClientService svc, Looper looper) {
            BassClientService svc, Looper looper) {
        Log.d(TAG, "make for device " + device);
        Log.d(TAG, "make for device " + device);
        BassClientStateMachine BassclientSm = new BassClientStateMachine(device, svc, looper);
        BassClientStateMachine BassclientSm = new BassClientStateMachine(device, svc, looper,
                BassConstants.CONNECT_TIMEOUT_MS);
        BassclientSm.start();
        BassclientSm.start();
        return BassclientSm;
        return BassclientSm;
    }
    }
@@ -1147,7 +1148,7 @@ public class BassClientStateMachine extends StateMachine {
        public void enter() {
        public void enter() {
            log("Enter Connecting(" + mDevice + "): "
            log("Enter Connecting(" + mDevice + "): "
                    + messageWhatToString(getCurrentMessage().what));
                    + messageWhatToString(getCurrentMessage().what));
            sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs);
            sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs);
            broadcastConnectionState(
            broadcastConnectionState(
                    mDevice, mLastConnectionState, BluetoothProfile.STATE_CONNECTING);
                    mDevice, mLastConnectionState, BluetoothProfile.STATE_CONNECTING);
        }
        }
@@ -1803,7 +1804,7 @@ public class BassClientStateMachine extends StateMachine {
        public void enter() {
        public void enter() {
            log("Enter Disconnecting(" + mDevice + "): "
            log("Enter Disconnecting(" + mDevice + "): "
                    + messageWhatToString(getCurrentMessage().what));
                    + messageWhatToString(getCurrentMessage().what));
            sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs);
            sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs);
            broadcastConnectionState(
            broadcastConnectionState(
                    mDevice, mLastConnectionState, BluetoothProfile.STATE_DISCONNECTING);
                    mDevice, mLastConnectionState, BluetoothProfile.STATE_DISCONNECTING);
        }
        }
+3 −3
Original line number Original line Diff line number Diff line
@@ -586,7 +586,7 @@ public class CsipSetCoordinatorService extends ProfileService {


    /**
    /**
     * Get collection of group IDs for a given UUID
     * Get collection of group IDs for a given UUID
     * @param uuid
     * @param uuid profile context UUID
     * @return list of group IDs
     * @return list of group IDs
     */
     */
    public List<Integer> getAllGroupIds(ParcelUuid uuid) {
    public List<Integer> getAllGroupIds(ParcelUuid uuid) {
@@ -599,7 +599,7 @@ public class CsipSetCoordinatorService extends ProfileService {


    /**
    /**
     * Get device's groups/
     * Get device's groups/
     * @param device
     * @param device group member device
     * @return map of group id and related uuids.
     * @return map of group id and related uuids.
     */
     */
    public Map<Integer, ParcelUuid> getGroupUuidMapByDevice(BluetoothDevice device) {
    public Map<Integer, ParcelUuid> getGroupUuidMapByDevice(BluetoothDevice device) {
@@ -637,7 +637,7 @@ public class CsipSetCoordinatorService extends ProfileService {
    /**
    /**
     * Get grouped devices
     * Get grouped devices
     * @param device group member device
     * @param device group member device
     * @param uuid
     * @param uuid profile context UUID
     * @return related list of devices sorted from the lowest to the highest rank value.
     * @return related list of devices sorted from the lowest to the highest rank value.
     */
     */
    public @NonNull List<BluetoothDevice> getGroupDevicesOrdered(BluetoothDevice device,
    public @NonNull List<BluetoothDevice> getGroupDevicesOrdered(BluetoothDevice device,
+31 −27
Original line number Original line Diff line number Diff line
@@ -17,16 +17,20 @@
package com.android.bluetooth.bass_client;
package com.android.bluetooth.bass_client;


import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.*;


import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.after;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.notNull;
import static org.mockito.Mockito.notNull;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -498,7 +502,7 @@ public class BassClientServiceTest {
                meta.getSubgroups().size(),
                meta.getSubgroups().size(),
                // Bis sync states
                // Bis sync states
                meta.getSubgroups().stream()
                meta.getSubgroups().stream()
                        .map(e -> new Long(0x00000002))
                        .map(e -> (long) 0x00000002)
                        .collect(Collectors.toList()),
                        .collect(Collectors.toList()),
                meta.getSubgroups().stream()
                meta.getSubgroups().stream()
                                .map(e -> e.getContentMetadata())
                                .map(e -> e.getContentMetadata())
@@ -570,14 +574,14 @@ public class BassClientServiceTest {
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        verifyAddSourceForGroup(meta);
        verifyAddSourceForGroup(meta);
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
@@ -606,9 +610,9 @@ public class BassClientServiceTest {
            assertThat(msg.get().obj).isEqualTo(metaUpdate);
            assertThat(msg.get().obj).isEqualTo(metaUpdate);


            // Verify using the right sourceId on each device
            // Verify using the right sourceId on each device
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
            }
            }
        }
        }
@@ -624,14 +628,14 @@ public class BassClientServiceTest {
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        verifyAddSourceForGroup(meta);
        verifyAddSourceForGroup(meta);
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
@@ -656,9 +660,9 @@ public class BassClientServiceTest {
            assertThat(msg.isPresent()).isEqualTo(true);
            assertThat(msg.isPresent()).isEqualTo(true);


            // Verify using the right sourceId on each device
            // Verify using the right sourceId on each device
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
            }
            }
        }
        }
@@ -675,14 +679,14 @@ public class BassClientServiceTest {
        verifyAddSourceForGroup(meta);
        verifyAddSourceForGroup(meta);
        // Inject source added
        // Inject source added
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
@@ -704,10 +708,10 @@ public class BassClientServiceTest {
                    .findFirst();
                    .findFirst();
            assertThat(msg.isPresent()).isEqualTo(true);
            assertThat(msg.isPresent()).isEqualTo(true);


            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1);
            }
            }
@@ -749,14 +753,14 @@ public class BassClientServiceTest {
        verifyAddSourceForGroup(meta);
        verifyAddSourceForGroup(meta);
        assertThat(mStateMachines.size()).isEqualTo(2);
        assertThat(mStateMachines.size()).isEqualTo(2);
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
@@ -775,14 +779,14 @@ public class BassClientServiceTest {
        verifyAddSourceForGroup(meta1);
        verifyAddSourceForGroup(meta1);
        assertThat(mStateMachines.size()).isEqualTo(2);
        assertThat(mStateMachines.size()).isEqualTo(2);
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 2,
                injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 2,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta1.isEncrypted() ?
                        meta1.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 3,
                injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 3,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta1.isEncrypted() ?
                        meta1.isEncrypted() ?
@@ -807,10 +811,10 @@ public class BassClientServiceTest {
            assertThat(msg.isPresent()).isEqualTo(true);
            assertThat(msg.isPresent()).isEqualTo(true);


            // Verify using the right sourceId on each device
            // Verify using the right sourceId on each device
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1);
            } else {
            } else {
@@ -833,9 +837,9 @@ public class BassClientServiceTest {
            assertThat(msg.get().obj).isEqualTo(metaUpdate);
            assertThat(msg.get().obj).isEqualTo(metaUpdate);


            // Verify using the right sourceId on each device
            // Verify using the right sourceId on each device
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                    assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 2);
                    assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 2);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                    assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 3);
                    assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 3);
            } else {
            } else {
                throw new AssertionError("Unexpected device");
                throw new AssertionError("Unexpected device");
@@ -850,14 +854,14 @@ public class BassClientServiceTest {
            ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
            ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
            verify(sm, atLeast(1)).sendMessage(messageCaptor.capture());
            verify(sm, atLeast(1)).sendMessage(messageCaptor.capture());


            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                Optional<Message> msg = messageCaptor.getAllValues().stream()
                Optional<Message> msg = messageCaptor.getAllValues().stream()
                        .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE)
                        .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE)
                                && (m.arg1 == TEST_SOURCE_ID + 2))
                                && (m.arg1 == TEST_SOURCE_ID + 2))
                        .findFirst();
                        .findFirst();
                assertThat(msg.isPresent()).isEqualTo(true);
                assertThat(msg.isPresent()).isEqualTo(true);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 2);
                injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 2);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                Optional<Message> msg = messageCaptor.getAllValues().stream()
                Optional<Message> msg = messageCaptor.getAllValues().stream()
                        .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE)
                        .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE)
                                && (m.arg1 == TEST_SOURCE_ID + 3))
                                && (m.arg1 == TEST_SOURCE_ID + 3))
@@ -889,7 +893,7 @@ public class BassClientServiceTest {
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice().equals(mCurrentDevice)) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                verify(sm, times(0)).sendMessage(any());
                verify(sm, times(0)).sendMessage(any());
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
                ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
                verify(sm, times(1)).sendMessage(messageCaptor.capture());
                verify(sm, times(1)).sendMessage(messageCaptor.capture());
                List<Message> msgs = messageCaptor.getAllValues().stream()
                List<Message> msgs = messageCaptor.getAllValues().stream()
@@ -910,14 +914,14 @@ public class BassClientServiceTest {
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID);
        verifyAddSourceForGroup(meta);
        verifyAddSourceForGroup(meta);
        for (BassClientStateMachine sm: mStateMachines.values()) {
        for (BassClientStateMachine sm: mStateMachines.values()) {
            if (sm.getDevice() == mCurrentDevice) {
            if (sm.getDevice().equals(mCurrentDevice)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING :
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                                BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED,
                        null);
                        null);
            } else if (sm.getDevice() == mCurrentDevice1) {
            } else if (sm.getDevice().equals(mCurrentDevice1)) {
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE,
                        meta.isEncrypted() ?
                        meta.isEncrypted() ?
+5 −10
Original line number Original line Diff line number Diff line
@@ -39,8 +39,6 @@ import android.os.Bundle;
import android.os.HandlerThread;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Looper;


import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
import androidx.test.filters.MediumTest;


import com.android.bluetooth.R;
import com.android.bluetooth.R;
@@ -68,7 +66,6 @@ public class BassClientStateMachineTest {
    public final MockitoRule mockito = MockitoJUnit.rule();
    public final MockitoRule mockito = MockitoJUnit.rule();


    private BluetoothAdapter mAdapter;
    private BluetoothAdapter mAdapter;
    private Context mTargetContext;
    private HandlerThread mHandlerThread;
    private HandlerThread mHandlerThread;
    private StubBassClientStateMachine mBassClientStateMachine;
    private StubBassClientStateMachine mBassClientStateMachine;
    private static final int CONNECTION_TIMEOUT_MS = 1_000;
    private static final int CONNECTION_TIMEOUT_MS = 1_000;
@@ -81,7 +78,6 @@ public class BassClientStateMachineTest {


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        mTargetContext = InstrumentationRegistry.getTargetContext();
        TestUtils.setAdapterService(mAdapterService);
        TestUtils.setAdapterService(mAdapterService);


        mAdapter = BluetoothAdapter.getDefaultAdapter();
        mAdapter = BluetoothAdapter.getDefaultAdapter();
@@ -93,9 +89,7 @@ public class BassClientStateMachineTest {
        mHandlerThread = new HandlerThread("BassClientStateMachineTestHandlerThread");
        mHandlerThread = new HandlerThread("BassClientStateMachineTestHandlerThread");
        mHandlerThread.start();
        mHandlerThread.start();
        mBassClientStateMachine = new StubBassClientStateMachine(mTestDevice,
        mBassClientStateMachine = new StubBassClientStateMachine(mTestDevice,
                mBassClientService, mHandlerThread.getLooper());
                mBassClientService, mHandlerThread.getLooper(), CONNECTION_TIMEOUT_MS);
        // Override the timeout value to speed up the test
        BassClientStateMachine.sConnectTimeoutMs = CONNECTION_TIMEOUT_MS;
        mBassClientStateMachine.start();
        mBassClientStateMachine.start();
    }
    }


@@ -228,11 +222,12 @@ public class BassClientStateMachineTest {
    }
    }


    // It simulates GATT connection for testing.
    // It simulates GATT connection for testing.
    public class StubBassClientStateMachine extends BassClientStateMachine {
    public static class StubBassClientStateMachine extends BassClientStateMachine {
        boolean mShouldAllowGatt = true;
        boolean mShouldAllowGatt = true;


        StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper) {
        StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper,
            super(device, service, looper);
                int connectTimeout) {
            super(device, service, looper, connectTimeout);
        }
        }


        @Override
        @Override