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

Commit 99f9def1 authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

BassClient: Fix using Metadata cache

Fixes the following:
 - the container is never initialized
 - sourceId to metadata map has no remote context

Bug: 150670922
Tag: #feature
Sponsor: jpawlowski@
Test: atest BluetoothInstrumentationTests
Change-Id: I5dc6275841cecc6851e461cb29f1d9f53724be89
parent 45f6e294
Loading
Loading
Loading
Loading
+0 −24
Original line number Original line Diff line number Diff line
@@ -83,7 +83,6 @@ public class BassClientService extends ProfileService {
    private Map<BluetoothDevice, Integer> mDeviceToSyncHandleMap;
    private Map<BluetoothDevice, Integer> mDeviceToSyncHandleMap;
    /*syncHandle, parsed BaseData data*/
    /*syncHandle, parsed BaseData data*/
    private Map<Integer, BaseData> mSyncHandleToBaseDataMap;
    private Map<Integer, BaseData> mSyncHandleToBaseDataMap;
    private Map<Integer, BluetoothLeBroadcastMetadata> mBroadcastSources;
    /*bcastSrcDevice, corresponding PeriodicAdvertisementResult*/
    /*bcastSrcDevice, corresponding PeriodicAdvertisementResult*/
    private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap;
    private Map<BluetoothDevice, PeriodicAdvertisementResult> mPeriodicAdvertisementResultMap;
    private ScanCallback mSearchScanCallback;
    private ScanCallback mSearchScanCallback;
@@ -181,25 +180,6 @@ public class BassClientService extends ProfileService {
        return base;
        return base;
    }
    }


    void updateSourceInternal(int sourceId, BluetoothLeBroadcastMetadata metaData) {
        if (mBroadcastSources == null) {
            return;
        }
        if (metaData != null) {
            // This will replace old metadata with new one
            mBroadcastSources.put(sourceId, metaData);
        } else {
            mBroadcastSources.remove(sourceId);
        }
    }

    BluetoothLeBroadcastMetadata getSourceInternal(int sourceId) {
        if (mBroadcastSources != null) {
            return mBroadcastSources.get(sourceId);
        }
        return null;
    }

    void setActiveSyncedSource(BluetoothDevice scanDelegator, BluetoothDevice sourceDevice) {
    void setActiveSyncedSource(BluetoothDevice scanDelegator, BluetoothDevice sourceDevice) {
        log("setActiveSyncedSource: scanDelegator" + scanDelegator
        log("setActiveSyncedSource: scanDelegator" + scanDelegator
                + ":: sourceDevice:" + sourceDevice);
                + ":: sourceDevice:" + sourceDevice);
@@ -283,10 +263,6 @@ public class BassClientService extends ProfileService {
            mActiveSourceMap.clear();
            mActiveSourceMap.clear();
            mActiveSourceMap = null;
            mActiveSourceMap = null;
        }
        }
        if (mBroadcastSources != null) {
            mBroadcastSources.clear();
            mBroadcastSources = null;
        }
        if (mBassUtils != null) {
        if (mBassUtils != null) {
            mBassUtils.cleanUp();
            mBassUtils.cleanUp();
            mBassUtils = null;
            mBassUtils = null;
+21 −5
Original line number Original line Diff line number Diff line
@@ -141,6 +141,7 @@ public class BassClientStateMachine extends StateMachine {
    private final Map<Integer, BluetoothLeBroadcastReceiveState>
    private final Map<Integer, BluetoothLeBroadcastReceiveState>
            mBluetoothLeBroadcastReceiveStates =
            mBluetoothLeBroadcastReceiveStates =
            new HashMap<Integer, BluetoothLeBroadcastReceiveState>();
            new HashMap<Integer, BluetoothLeBroadcastReceiveState>();
    private final Map<Integer, BluetoothLeBroadcastMetadata> mCurrentMetadata = new HashMap();
    private final Disconnected mDisconnected = new Disconnected();
    private final Disconnected mDisconnected = new Disconnected();
    private final Connected mConnected = new Connected();
    private final Connected mConnected = new Connected();
    private final Connecting mConnecting = new Connecting();
    private final Connecting mConnecting = new Connecting();
@@ -241,6 +242,20 @@ public class BassClientStateMachine extends StateMachine {
        mPendingOperation = -1;
        mPendingOperation = -1;
        mPendingSourceId = -1;
        mPendingSourceId = -1;
        mPendingMetadata = null;
        mPendingMetadata = null;
        mCurrentMetadata.clear();
    }

    BluetoothLeBroadcastMetadata getCurrentBroadcastMetadata(Integer sourceId) {
        return mCurrentMetadata.getOrDefault(sourceId, null);
    }

    private void setCurrentBroadcastMetadata(Integer sourceId,
            BluetoothLeBroadcastMetadata metadata) {
        if (metadata != null) {
            mCurrentMetadata.put(sourceId, metadata);
        } else {
            mCurrentMetadata.remove(sourceId);
        }
    }
    }


    BluetoothLeBroadcastReceiveState getBroadcastReceiveStateForSourceDevice(
    BluetoothLeBroadcastReceiveState getBroadcastReceiveStateForSourceDevice(
@@ -725,7 +740,7 @@ public class BassClientStateMachine extends StateMachine {
                mService.getCallbacks().notifySourceAdded(mDevice,
                mService.getCallbacks().notifySourceAdded(mDevice,
                        recvState.getSourceId(), BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                        recvState.getSourceId(), BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                if (mPendingMetadata != null) {
                if (mPendingMetadata != null) {
                    mService.updateSourceInternal(recvState.getSourceId(), mPendingMetadata);
                    setCurrentBroadcastMetadata(recvState.getSourceId(), mPendingMetadata);
                }
                }
                checkAndUpdateBroadcastCode(recvState);
                checkAndUpdateBroadcastCode(recvState);
                processPASyncState(recvState);
                processPASyncState(recvState);
@@ -735,13 +750,13 @@ public class BassClientStateMachine extends StateMachine {
                    BluetoothDevice removedDevice = oldRecvState.getSourceDevice();
                    BluetoothDevice removedDevice = oldRecvState.getSourceDevice();
                    log("sourceInfo removal" + removedDevice);
                    log("sourceInfo removal" + removedDevice);
                    cancelActiveSync(removedDevice);
                    cancelActiveSync(removedDevice);
                    mService.updateSourceInternal(oldRecvState.getSourceId(), null);
                    setCurrentBroadcastMetadata(oldRecvState.getSourceId(), null);
                    mService.getCallbacks().notifySourceRemoved(mDevice,
                    mService.getCallbacks().notifySourceRemoved(mDevice,
                            oldRecvState.getSourceId(),
                            oldRecvState.getSourceId(),
                            BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                            BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                } else {
                } else {
                    log("update to an existing recvState");
                    log("update to an existing recvState");
                    mService.updateSourceInternal(recvState.getSourceId(), mPendingMetadata);
                    setCurrentBroadcastMetadata(recvState.getSourceId(), mPendingMetadata);
                    mService.getCallbacks().notifySourceModified(mDevice,
                    mService.getCallbacks().notifySourceModified(mDevice,
                            recvState.getSourceId(), BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                            recvState.getSourceId(), BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
                    checkAndUpdateBroadcastCode(recvState);
                    checkAndUpdateBroadcastCode(recvState);
@@ -960,6 +975,7 @@ public class BassClientStateMachine extends StateMachine {
        }
        }
        mPendingOperation = -1;
        mPendingOperation = -1;
        mPendingMetadata = null;
        mPendingMetadata = null;
        mCurrentMetadata.clear();
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -1290,8 +1306,8 @@ public class BassClientStateMachine extends StateMachine {
        res[1] = (byte) recvState.getSourceId();
        res[1] = (byte) recvState.getSourceId();
        log("convertRecvStateToSetBroadcastCodeByteArray: Source device : "
        log("convertRecvStateToSetBroadcastCodeByteArray: Source device : "
                + recvState.getSourceDevice());
                + recvState.getSourceDevice());
        BluetoothLeBroadcastMetadata metaData = mService.getSourceInternal(
        BluetoothLeBroadcastMetadata metaData =
                recvState.getSourceId());
                getCurrentBroadcastMetadata(recvState.getSourceId());
        if (metaData == null) {
        if (metaData == null) {
            Log.e(TAG, "Fail to find broadcast source, sourceId = "
            Log.e(TAG, "Fail to find broadcast source, sourceId = "
                    + recvState.getSourceId());
                    + recvState.getSourceId());