BassClient: Fix issue that source could not be found

Test: presubmit
Bug: 229965085
Change-Id: Id23db8e7bd9b2bdc42c688ffc0ae19551385c40b
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
index b38d32e..b1395a3 100755
--- a/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
+++ b/android/app/src/com/android/bluetooth/bass_client/BassClientService.java
@@ -69,6 +69,7 @@
 
     private final Map<BluetoothDevice, BassClientStateMachine> mStateMachines = new HashMap<>();
     private final Object mSearchScanCallbackLock = new Object();
+    private final Map<Integer, ScanResult> mScanBroadcasts = new HashMap<>();
 
     private HandlerThread mStateMachinesThread;
     private HandlerThread mCallbackHandlerThread;
@@ -326,8 +327,16 @@
     }
 
     private boolean hasRoomForBroadcastSourceAddition(BluetoothDevice device) {
-        List<BluetoothLeBroadcastReceiveState> currentAllSources = getAllSources(device);
-        return currentAllSources.size() < getMaximumSourceCapacity(device);
+        boolean isRoomAvailable = false;
+        String emptyBluetoothDevice = "00:00:00:00:00:00";
+        for (BluetoothLeBroadcastReceiveState recvState: getAllSources(device)) {
+            if (recvState.getSourceDevice().getAddress().equals(emptyBluetoothDevice)) {
+                isRoomAvailable = true;
+                break;
+            }
+        }
+        log("isRoomAvailable: " + isRoomAvailable);
+        return isRoomAvailable;
     }
 
     private BassClientStateMachine getOrCreateStateMachine(BluetoothDevice device) {
@@ -633,16 +642,29 @@
                             BassConstants.BAAS_UUID)) {
                         return;
                     }
-                    Message msg = mBassUtils.getAutoAssistScanHandler()
-                            .obtainMessage(BassConstants.AA_SCAN_SUCCESS);
-                    msg.obj = result;
-                    mBassUtils.getAutoAssistScanHandler().sendMessage(msg);
+                    log( "Broadcast Source Found:" + result.getDevice());
+                    byte[] broadcastIdArray = listOfUuids.get(BassConstants.BAAS_UUID);
+                    int broadcastId = (int)(((broadcastIdArray[2] & 0xff) << 16)
+                            | ((broadcastIdArray[1] & 0xff) << 8)
+                            | (broadcastIdArray[0] & 0xff));
+                    if (mScanBroadcasts.get(broadcastId) == null) {
+                        log("selectBroadcastSource: broadcastId " + broadcastId);
+                        mScanBroadcasts.put(broadcastId, result);
+                        synchronized (mStateMachines) {
+                            for (BassClientStateMachine sm : mStateMachines.values()) {
+                                if (sm.isConnected()) {
+                                    selectSource(sm.getDevice(), result, false);
+                                }
+                            }
+                        }
+                    }
                 }
 
                 public void onScanFailed(int errorCode) {
                     Log.e(TAG, "Scan Failure:" + errorCode);
                 }
             };
+            mScanBroadcasts.clear();
             ScanSettings settings = new ScanSettings.Builder().setCallbackType(
                     ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                     .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
@@ -688,6 +710,7 @@
             scanner.stopScan(mSearchScanCallback);
             mSearchScanCallback = null;
             mCallbacks.notifySearchStopped(BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
+            mScanBroadcasts.clear();
         }
     }
 
diff --git a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
index a37a947..e28ce1f 100755
--- a/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
+++ b/android/app/src/com/android/bluetooth/bass_client/BassClientStateMachine.java
@@ -436,7 +436,13 @@
                 channel.setSelected(false);
                 subGroup.addChannel(channel.build());
             }
-            subGroup.setCodecId(ByteBuffer.wrap(baseLevel2.codecId).getLong());
+            byte[] arrayCodecId = baseLevel2.codecId;
+            long codeId = (long) ((arrayCodecId[4] & 0xff) << 32
+                    | (arrayCodecId[3] & 0xff) << 24
+                    | (arrayCodecId[2] & 0xff) << 16
+                    | (arrayCodecId[1] & 0xff) << 8
+                    | (arrayCodecId[0] & 0xff));
+            subGroup.setCodecId(codeId);
             subGroup.setCodecSpecificConfig(BluetoothLeAudioCodecConfigMetadata.
                     fromRawBytes(baseLevel2.codecConfigInfo));
             subGroup.setContentMetadata(BluetoothLeAudioContentMetadata.
@@ -444,6 +450,19 @@
             metaData.addSubgroup(subGroup.build());
         }
         metaData.setSourceDevice(device, device.getAddressType());
+        byte[] arrayPresentationDelay = baseData.getLevelOne().presentationDelay;
+        int presentationDelay = (int) ((arrayPresentationDelay[2] & 0xff) << 16
+                | (arrayPresentationDelay[1] & 0xff)
+                | (arrayPresentationDelay[0] & 0xff));
+        metaData.setPresentationDelayMicros(presentationDelay);
+        PeriodicAdvertisementResult result =
+                mService.getPeriodicAdvertisementResult(device);
+        if (result != null) {
+            int broadcastId = result.getBroadcastId();
+            log("broadcast ID: " + broadcastId);
+            metaData.setBroadcastId(broadcastId);
+            metaData.setSourceAdvertisingSid(result.getAdvSid());
+        }
         return metaData.build();
     }
 
@@ -634,6 +653,7 @@
             byte metaDataSyncState = receiverState[BassConstants.BCAST_RCVR_STATE_PA_SYNC_IDX];
             byte encryptionStatus = receiverState[BassConstants.BCAST_RCVR_STATE_ENC_STATUS_IDX];
             byte[] badBroadcastCode = null;
+            int badBroadcastCodeLen = 0;
             if (encryptionStatus
                     == BluetoothLeBroadcastReceiveState.BIG_ENCRYPTION_STATE_BAD_CODE) {
                 badBroadcastCode = new byte[BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE];
@@ -643,12 +663,12 @@
                         badBroadcastCode,
                         0,
                         BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE);
-                badBroadcastCode = reverseBytes(badBroadcastCode);
+                badBroadcastCodeLen = BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE;
             }
             byte numSubGroups = receiverState[BassConstants.BCAST_RCVR_STATE_BADCODE_START_IDX
-                    + BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE];
+                    + badBroadcastCodeLen];
             int offset = BassConstants.BCAST_RCVR_STATE_BADCODE_START_IDX
-                    + BassConstants.BCAST_RCVR_STATE_BADCODE_SIZE + 1;
+                    + badBroadcastCodeLen + 1;
             ArrayList<BluetoothLeAudioContentMetadata> metadataList =
                     new ArrayList<BluetoothLeAudioContentMetadata>();
             ArrayList<Long> audioSyncState = new ArrayList<Long>();
@@ -660,7 +680,7 @@
                 log("BIS index byte array: ");
                 BassUtils.printByteArray(audioSyncIndex);
                 ByteBuffer wrapped = ByteBuffer.wrap(audioSyncIndex);
-                audioSyncState.add(wrapped.getLong());
+                audioSyncState.add((long) wrapped.getInt());
 
                 byte metaDataLength = receiverState[offset++];
                 if (metaDataLength > 0) {