Loading android/app/src/com/android/bluetooth/bass_client/BassClientService.java +52 −50 Original line number Diff line number Diff line Loading @@ -105,9 +105,7 @@ public class BassClientService extends ProfileService { private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap; private ScanCallback mSearchScanCallback; private Callbacks mCallbacks; private BroadcastReceiver mBondStateChangedReceiver; private BroadcastReceiver mConnectionStateChangedReceiver; private BroadcastReceiver mIntentReceiver; @VisibleForTesting ServiceFactory mServiceFactory = new ServiceFactory(); Loading Loading @@ -252,12 +250,32 @@ public class BassClientService extends ProfileService { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); mBondStateChangedReceiver = new BondStateChangedReceiver(); registerReceiver(mBondStateChangedReceiver, filter); filter = new IntentFilter(); filter.addAction(BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED); mConnectionStateChangedReceiver = new ConnectionStateChangedReceiver(); registerReceiver(mConnectionStateChangedReceiver, filter, Context.RECEIVER_NOT_EXPORTED); mIntentReceiver = new BroadcastReceiver() { @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); mBassUtils = new BassUtils(this); Loading Loading @@ -291,15 +309,9 @@ public class BassClientService extends ProfileService { mStateMachinesThread = null; } // Unregister broadcast receivers if (mBondStateChangedReceiver != null) { unregisterReceiver(mBondStateChangedReceiver); mBondStateChangedReceiver = null; } if (mConnectionStateChangedReceiver != null) { unregisterReceiver(mConnectionStateChangedReceiver); mConnectionStateChangedReceiver = null; if (mIntentReceiver != null) { unregisterReceiver(mIntentReceiver); mIntentReceiver = null; } setBassClientService(null); Loading Loading @@ -1019,10 +1031,20 @@ public class BassClientService extends ProfileService { if (devices.size() < 2) { 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) { BassClientStateMachine stateMachine = getOrCreateStateMachine(device); if (sourceMetadata == null || stateMachine == null) { log("addSource: Error bad parameters: sourceMetadata = " + sourceMetadata); if (stateMachine == null) { log("addSource: Error bad parameter: no state machine for " + device); mCallbacks.notifySourceAddFailed(device, sourceMetadata, BluetoothStatusCodes.ERROR_BAD_PARAMETERS); continue; Loading Loading @@ -1073,6 +1095,15 @@ public class BassClientService extends ProfileService { log("modifySource: device: " + sink + " sourceId " + sourceId); 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()) { BluetoothDevice device = deviceSourceIdPair.getKey(); Integer deviceSourceId = deviceSourceIdPair.getValue(); Loading Loading @@ -1171,7 +1202,7 @@ public class BassClientService extends ProfileService { BluetoothDevice device = deviceSourceIdPair.getKey(); Integer deviceSourceId = deviceSourceIdPair.getValue(); enqueueSourceGroupOp(device, BassClientStateMachine.REMOVE_BCAST_SOURCE, new Integer(deviceSourceId)); Integer.valueOf(deviceSourceId)); } } Loading Loading @@ -1268,7 +1299,7 @@ public class BassClientService extends ProfileService { case MSG_SOURCE_REMOVED_FAILED: sink = (BluetoothDevice) msg.obj; sService.checkForPendingGroupOpRequest(sink, reason, BassClientStateMachine.REMOVE_BCAST_SOURCE, new Integer(msg.arg2)); BassClientStateMachine.REMOVE_BCAST_SOURCE, Integer.valueOf(msg.arg2)); break; default: break; Loading Loading @@ -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); } } } android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java +8 −7 Original line number Diff line number Diff line Loading @@ -98,8 +98,6 @@ import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; Loading Loading @@ -140,7 +138,7 @@ public class BassClientStateMachine extends StateMachine { // NOTE: the value is not "final" - it is modified in the unit tests @VisibleForTesting static int sConnectTimeoutMs = BassConstants.CONNECT_TIMEOUT_MS; private int mConnectTimeoutMs; /*key is combination of sourceId, Address and advSid for this hashmap*/ private final Map<Integer, BluetoothLeBroadcastReceiveState> Loading Loading @@ -191,10 +189,12 @@ public class BassClientStateMachine extends StateMachine { BluetoothGatt mBluetoothGatt = 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); mDevice = device; mService = svc; mConnectTimeoutMs = connectTimeoutMs; addState(mDisconnected); addState(mDisconnecting); addState(mConnected); Loading @@ -219,7 +219,8 @@ public class BassClientStateMachine extends StateMachine { static BassClientStateMachine make(BluetoothDevice device, BassClientService svc, Looper looper) { 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(); return BassclientSm; } Loading Loading @@ -1147,7 +1148,7 @@ public class BassClientStateMachine extends StateMachine { public void enter() { log("Enter Connecting(" + mDevice + "): " + messageWhatToString(getCurrentMessage().what)); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs); broadcastConnectionState( mDevice, mLastConnectionState, BluetoothProfile.STATE_CONNECTING); } Loading Loading @@ -1803,7 +1804,7 @@ public class BassClientStateMachine extends StateMachine { public void enter() { log("Enter Disconnecting(" + mDevice + "): " + messageWhatToString(getCurrentMessage().what)); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs); broadcastConnectionState( mDevice, mLastConnectionState, BluetoothProfile.STATE_DISCONNECTING); } Loading android/app/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java +3 −3 Original line number Diff line number Diff line Loading @@ -586,7 +586,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get collection of group IDs for a given UUID * @param uuid * @param uuid profile context UUID * @return list of group IDs */ public List<Integer> getAllGroupIds(ParcelUuid uuid) { Loading @@ -599,7 +599,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get device's groups/ * @param device * @param device group member device * @return map of group id and related uuids. */ public Map<Integer, ParcelUuid> getGroupUuidMapByDevice(BluetoothDevice device) { Loading Loading @@ -637,7 +637,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get grouped devices * @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. */ public @NonNull List<BluetoothDevice> getGroupDevicesOrdered(BluetoothDevice device, Loading android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientServiceTest.java +31 −27 Original line number Diff line number Diff line Loading @@ -17,16 +17,20 @@ package com.android.bluetooth.bass_client; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeast; 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.doCallRealMethod; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.notNull; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -498,7 +502,7 @@ public class BassClientServiceTest { meta.getSubgroups().size(), // Bis sync states meta.getSubgroups().stream() .map(e -> new Long(0x00000002)) .map(e -> (long) 0x00000002) .collect(Collectors.toList()), meta.getSubgroups().stream() .map(e -> e.getContentMetadata()) Loading Loading @@ -570,14 +574,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading Loading @@ -606,9 +610,9 @@ public class BassClientServiceTest { assertThat(msg.get().obj).isEqualTo(metaUpdate); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1); } } Loading @@ -624,14 +628,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -656,9 +660,9 @@ public class BassClientServiceTest { assertThat(msg.isPresent()).isEqualTo(true); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1); } } Loading @@ -675,14 +679,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta); // Inject source added for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -704,10 +708,10 @@ public class BassClientServiceTest { .findFirst(); assertThat(msg.isPresent()).isEqualTo(true); if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { assertThat(msg.get().arg1).isEqualTo(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); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1); } Loading Loading @@ -749,14 +753,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta); assertThat(mStateMachines.size()).isEqualTo(2); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -775,14 +779,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta1); assertThat(mStateMachines.size()).isEqualTo(2); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 2, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta1.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 3, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta1.isEncrypted() ? Loading @@ -807,10 +811,10 @@ public class BassClientServiceTest { assertThat(msg.isPresent()).isEqualTo(true); // 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); 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); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1); } else { Loading @@ -833,9 +837,9 @@ public class BassClientServiceTest { assertThat(msg.get().obj).isEqualTo(metaUpdate); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 3); } else { throw new AssertionError("Unexpected device"); Loading @@ -850,14 +854,14 @@ public class BassClientServiceTest { ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); verify(sm, atLeast(1)).sendMessage(messageCaptor.capture()); if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { Optional<Message> msg = messageCaptor.getAllValues().stream() .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE) && (m.arg1 == TEST_SOURCE_ID + 2)) .findFirst(); assertThat(msg.isPresent()).isEqualTo(true); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 2); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { Optional<Message> msg = messageCaptor.getAllValues().stream() .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE) && (m.arg1 == TEST_SOURCE_ID + 3)) Loading Loading @@ -889,7 +893,7 @@ public class BassClientServiceTest { for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice().equals(mCurrentDevice)) { verify(sm, times(0)).sendMessage(any()); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); verify(sm, times(1)).sendMessage(messageCaptor.capture()); List<Message> msgs = messageCaptor.getAllValues().stream() Loading @@ -910,14 +914,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java +5 −10 Original line number Diff line number Diff line Loading @@ -39,8 +39,6 @@ import android.os.Bundle; import android.os.HandlerThread; import android.os.Looper; import androidx.test.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; import com.android.bluetooth.R; Loading Loading @@ -68,7 +66,6 @@ public class BassClientStateMachineTest { public final MockitoRule mockito = MockitoJUnit.rule(); private BluetoothAdapter mAdapter; private Context mTargetContext; private HandlerThread mHandlerThread; private StubBassClientStateMachine mBassClientStateMachine; private static final int CONNECTION_TIMEOUT_MS = 1_000; Loading @@ -81,7 +78,6 @@ public class BassClientStateMachineTest { @Before public void setUp() throws Exception { mTargetContext = InstrumentationRegistry.getTargetContext(); TestUtils.setAdapterService(mAdapterService); mAdapter = BluetoothAdapter.getDefaultAdapter(); Loading @@ -93,9 +89,7 @@ public class BassClientStateMachineTest { mHandlerThread = new HandlerThread("BassClientStateMachineTestHandlerThread"); mHandlerThread.start(); mBassClientStateMachine = new StubBassClientStateMachine(mTestDevice, mBassClientService, mHandlerThread.getLooper()); // Override the timeout value to speed up the test BassClientStateMachine.sConnectTimeoutMs = CONNECTION_TIMEOUT_MS; mBassClientService, mHandlerThread.getLooper(), CONNECTION_TIMEOUT_MS); mBassClientStateMachine.start(); } Loading Loading @@ -228,11 +222,12 @@ public class BassClientStateMachineTest { } // It simulates GATT connection for testing. public class StubBassClientStateMachine extends BassClientStateMachine { public static class StubBassClientStateMachine extends BassClientStateMachine { boolean mShouldAllowGatt = true; StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper) { super(device, service, looper); StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper, int connectTimeout) { super(device, service, looper, connectTimeout); } @Override Loading Loading
android/app/src/com/android/bluetooth/bass_client/BassClientService.java +52 −50 Original line number Diff line number Diff line Loading @@ -105,9 +105,7 @@ public class BassClientService extends ProfileService { private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap; private ScanCallback mSearchScanCallback; private Callbacks mCallbacks; private BroadcastReceiver mBondStateChangedReceiver; private BroadcastReceiver mConnectionStateChangedReceiver; private BroadcastReceiver mIntentReceiver; @VisibleForTesting ServiceFactory mServiceFactory = new ServiceFactory(); Loading Loading @@ -252,12 +250,32 @@ public class BassClientService extends ProfileService { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); mBondStateChangedReceiver = new BondStateChangedReceiver(); registerReceiver(mBondStateChangedReceiver, filter); filter = new IntentFilter(); filter.addAction(BluetoothLeBroadcastAssistant.ACTION_CONNECTION_STATE_CHANGED); mConnectionStateChangedReceiver = new ConnectionStateChangedReceiver(); registerReceiver(mConnectionStateChangedReceiver, filter, Context.RECEIVER_NOT_EXPORTED); mIntentReceiver = new BroadcastReceiver() { @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); mBassUtils = new BassUtils(this); Loading Loading @@ -291,15 +309,9 @@ public class BassClientService extends ProfileService { mStateMachinesThread = null; } // Unregister broadcast receivers if (mBondStateChangedReceiver != null) { unregisterReceiver(mBondStateChangedReceiver); mBondStateChangedReceiver = null; } if (mConnectionStateChangedReceiver != null) { unregisterReceiver(mConnectionStateChangedReceiver); mConnectionStateChangedReceiver = null; if (mIntentReceiver != null) { unregisterReceiver(mIntentReceiver); mIntentReceiver = null; } setBassClientService(null); Loading Loading @@ -1019,10 +1031,20 @@ public class BassClientService extends ProfileService { if (devices.size() < 2) { 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) { BassClientStateMachine stateMachine = getOrCreateStateMachine(device); if (sourceMetadata == null || stateMachine == null) { log("addSource: Error bad parameters: sourceMetadata = " + sourceMetadata); if (stateMachine == null) { log("addSource: Error bad parameter: no state machine for " + device); mCallbacks.notifySourceAddFailed(device, sourceMetadata, BluetoothStatusCodes.ERROR_BAD_PARAMETERS); continue; Loading Loading @@ -1073,6 +1095,15 @@ public class BassClientService extends ProfileService { log("modifySource: device: " + sink + " sourceId " + sourceId); 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()) { BluetoothDevice device = deviceSourceIdPair.getKey(); Integer deviceSourceId = deviceSourceIdPair.getValue(); Loading Loading @@ -1171,7 +1202,7 @@ public class BassClientService extends ProfileService { BluetoothDevice device = deviceSourceIdPair.getKey(); Integer deviceSourceId = deviceSourceIdPair.getValue(); enqueueSourceGroupOp(device, BassClientStateMachine.REMOVE_BCAST_SOURCE, new Integer(deviceSourceId)); Integer.valueOf(deviceSourceId)); } } Loading Loading @@ -1268,7 +1299,7 @@ public class BassClientService extends ProfileService { case MSG_SOURCE_REMOVED_FAILED: sink = (BluetoothDevice) msg.obj; sService.checkForPendingGroupOpRequest(sink, reason, BassClientStateMachine.REMOVE_BCAST_SOURCE, new Integer(msg.arg2)); BassClientStateMachine.REMOVE_BCAST_SOURCE, Integer.valueOf(msg.arg2)); break; default: break; Loading Loading @@ -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); } } }
android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java +8 −7 Original line number Diff line number Diff line Loading @@ -98,8 +98,6 @@ import java.io.ByteArrayOutputStream; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; Loading Loading @@ -140,7 +138,7 @@ public class BassClientStateMachine extends StateMachine { // NOTE: the value is not "final" - it is modified in the unit tests @VisibleForTesting static int sConnectTimeoutMs = BassConstants.CONNECT_TIMEOUT_MS; private int mConnectTimeoutMs; /*key is combination of sourceId, Address and advSid for this hashmap*/ private final Map<Integer, BluetoothLeBroadcastReceiveState> Loading Loading @@ -191,10 +189,12 @@ public class BassClientStateMachine extends StateMachine { BluetoothGatt mBluetoothGatt = 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); mDevice = device; mService = svc; mConnectTimeoutMs = connectTimeoutMs; addState(mDisconnected); addState(mDisconnecting); addState(mConnected); Loading @@ -219,7 +219,8 @@ public class BassClientStateMachine extends StateMachine { static BassClientStateMachine make(BluetoothDevice device, BassClientService svc, Looper looper) { 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(); return BassclientSm; } Loading Loading @@ -1147,7 +1148,7 @@ public class BassClientStateMachine extends StateMachine { public void enter() { log("Enter Connecting(" + mDevice + "): " + messageWhatToString(getCurrentMessage().what)); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs); broadcastConnectionState( mDevice, mLastConnectionState, BluetoothProfile.STATE_CONNECTING); } Loading Loading @@ -1803,7 +1804,7 @@ public class BassClientStateMachine extends StateMachine { public void enter() { log("Enter Disconnecting(" + mDevice + "): " + messageWhatToString(getCurrentMessage().what)); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, sConnectTimeoutMs); sendMessageDelayed(CONNECT_TIMEOUT, mDevice, mConnectTimeoutMs); broadcastConnectionState( mDevice, mLastConnectionState, BluetoothProfile.STATE_DISCONNECTING); } Loading
android/app/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java +3 −3 Original line number Diff line number Diff line Loading @@ -586,7 +586,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get collection of group IDs for a given UUID * @param uuid * @param uuid profile context UUID * @return list of group IDs */ public List<Integer> getAllGroupIds(ParcelUuid uuid) { Loading @@ -599,7 +599,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get device's groups/ * @param device * @param device group member device * @return map of group id and related uuids. */ public Map<Integer, ParcelUuid> getGroupUuidMapByDevice(BluetoothDevice device) { Loading Loading @@ -637,7 +637,7 @@ public class CsipSetCoordinatorService extends ProfileService { /** * Get grouped devices * @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. */ public @NonNull List<BluetoothDevice> getGroupDevicesOrdered(BluetoothDevice device, Loading
android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientServiceTest.java +31 −27 Original line number Diff line number Diff line Loading @@ -17,16 +17,20 @@ package com.android.bluetooth.bass_client; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeast; 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.doCallRealMethod; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.notNull; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -498,7 +502,7 @@ public class BassClientServiceTest { meta.getSubgroups().size(), // Bis sync states meta.getSubgroups().stream() .map(e -> new Long(0x00000002)) .map(e -> (long) 0x00000002) .collect(Collectors.toList()), meta.getSubgroups().stream() .map(e -> e.getContentMetadata()) Loading Loading @@ -570,14 +574,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading Loading @@ -606,9 +610,9 @@ public class BassClientServiceTest { assertThat(msg.get().obj).isEqualTo(metaUpdate); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1); } } Loading @@ -624,14 +628,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -656,9 +660,9 @@ public class BassClientServiceTest { assertThat(msg.isPresent()).isEqualTo(true); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 1); } } Loading @@ -675,14 +679,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta); // Inject source added for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -704,10 +708,10 @@ public class BassClientServiceTest { .findFirst(); assertThat(msg.isPresent()).isEqualTo(true); if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { assertThat(msg.get().arg1).isEqualTo(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); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1); } Loading Loading @@ -749,14 +753,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta); assertThat(mStateMachines.size()).isEqualTo(2); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading @@ -775,14 +779,14 @@ public class BassClientServiceTest { verifyAddSourceForGroup(meta1); assertThat(mStateMachines.size()).isEqualTo(2); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 2, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta1.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta1, TEST_SOURCE_ID + 3, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta1.isEncrypted() ? Loading @@ -807,10 +811,10 @@ public class BassClientServiceTest { assertThat(msg.isPresent()).isEqualTo(true); // 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); 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); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 1); } else { Loading @@ -833,9 +837,9 @@ public class BassClientServiceTest { assertThat(msg.get().obj).isEqualTo(metaUpdate); // 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); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { assertThat(msg.get().arg1).isEqualTo(TEST_SOURCE_ID + 3); } else { throw new AssertionError("Unexpected device"); Loading @@ -850,14 +854,14 @@ public class BassClientServiceTest { ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); verify(sm, atLeast(1)).sendMessage(messageCaptor.capture()); if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { Optional<Message> msg = messageCaptor.getAllValues().stream() .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE) && (m.arg1 == TEST_SOURCE_ID + 2)) .findFirst(); assertThat(msg.isPresent()).isEqualTo(true); injectRemoteSourceStateRemoval(sm, TEST_SOURCE_ID + 2); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { Optional<Message> msg = messageCaptor.getAllValues().stream() .filter(m -> (m.what == BassClientStateMachine.REMOVE_BCAST_SOURCE) && (m.arg1 == TEST_SOURCE_ID + 3)) Loading Loading @@ -889,7 +893,7 @@ public class BassClientServiceTest { for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice().equals(mCurrentDevice)) { verify(sm, times(0)).sendMessage(any()); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class); verify(sm, times(1)).sendMessage(messageCaptor.capture()); List<Message> msgs = messageCaptor.getAllValues().stream() Loading @@ -910,14 +914,14 @@ public class BassClientServiceTest { BluetoothLeBroadcastMetadata meta = createBroadcastMetadata(TEST_BROADCAST_ID); verifyAddSourceForGroup(meta); for (BassClientStateMachine sm: mStateMachines.values()) { if (sm.getDevice() == mCurrentDevice) { if (sm.getDevice().equals(mCurrentDevice)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_DECRYPTING : BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_NOT_ENCRYPTED, null); } else if (sm.getDevice() == mCurrentDevice1) { } else if (sm.getDevice().equals(mCurrentDevice1)) { injectRemoteSourceState(sm, meta, TEST_SOURCE_ID + 1, BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_IDLE, meta.isEncrypted() ? Loading
android/app/tests/unit/src/com/android/bluetooth/bass_client/BassClientStateMachineTest.java +5 −10 Original line number Diff line number Diff line Loading @@ -39,8 +39,6 @@ import android.os.Bundle; import android.os.HandlerThread; import android.os.Looper; import androidx.test.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; import com.android.bluetooth.R; Loading Loading @@ -68,7 +66,6 @@ public class BassClientStateMachineTest { public final MockitoRule mockito = MockitoJUnit.rule(); private BluetoothAdapter mAdapter; private Context mTargetContext; private HandlerThread mHandlerThread; private StubBassClientStateMachine mBassClientStateMachine; private static final int CONNECTION_TIMEOUT_MS = 1_000; Loading @@ -81,7 +78,6 @@ public class BassClientStateMachineTest { @Before public void setUp() throws Exception { mTargetContext = InstrumentationRegistry.getTargetContext(); TestUtils.setAdapterService(mAdapterService); mAdapter = BluetoothAdapter.getDefaultAdapter(); Loading @@ -93,9 +89,7 @@ public class BassClientStateMachineTest { mHandlerThread = new HandlerThread("BassClientStateMachineTestHandlerThread"); mHandlerThread.start(); mBassClientStateMachine = new StubBassClientStateMachine(mTestDevice, mBassClientService, mHandlerThread.getLooper()); // Override the timeout value to speed up the test BassClientStateMachine.sConnectTimeoutMs = CONNECTION_TIMEOUT_MS; mBassClientService, mHandlerThread.getLooper(), CONNECTION_TIMEOUT_MS); mBassClientStateMachine.start(); } Loading Loading @@ -228,11 +222,12 @@ public class BassClientStateMachineTest { } // It simulates GATT connection for testing. public class StubBassClientStateMachine extends BassClientStateMachine { public static class StubBassClientStateMachine extends BassClientStateMachine { boolean mShouldAllowGatt = true; StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper) { super(device, service, looper); StubBassClientStateMachine(BluetoothDevice device, BassClientService service, Looper looper, int connectTimeout) { super(device, service, looper, connectTimeout); } @Override Loading