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

Commit fd47f81c authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "BassClientService: Extract periodic scanner from state machine" into main

parents 453f1575 d6c9ba6a
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.os.ParcelFileDescriptor;
import android.provider.Telephony;
import android.util.Log;

import com.android.bluetooth.bass_client.BassClientPeriodicAdvertisingManager;
import com.android.bluetooth.gatt.AppAdvertiseStats;
import com.android.bluetooth.gatt.ContextMap;
import com.android.bluetooth.gatt.GattService;
@@ -236,6 +237,15 @@ public class BluetoothMethodProxy {
        return Telephony.Threads.getOrCreateThreadId(context, recipients);
    }

    /**
     * Proxies {@link
     * BassClientPeriodicAdvertisingManager#initializePeriodicAdvertisingManagerOnDefaultAdapter}.
     */
    public boolean initializePeriodicAdvertisingManagerOnDefaultAdapter() {
        return BassClientPeriodicAdvertisingManager
                .initializePeriodicAdvertisingManagerOnDefaultAdapter();
    }

    /**
     * Proxies {@link PeriodicAdvertisingManager#registerSync(ScanResult, int, int,
     * PeriodicAdvertisingCallback, Handler)}.
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import android.bluetooth.le.PeriodicAdvertisingManager;
import android.util.Log;

/** Bass Client Periodic Advertising object handler */
class BassClientPeriodicAdvertisingManager {
public class BassClientPeriodicAdvertisingManager {
    private static final String TAG = "BassClientPeriodicAdvertisingManager";

    private static PeriodicAdvertisingManager sPeriodicAdvertisingManager;
+773 −108

File changed.

Preview size limit exceeded, changes collapsed.

+130 −38
Original line number Diff line number Diff line
@@ -344,6 +344,11 @@ public class BassClientStateMachine extends StateMachine {
    }

    void parseBaseData(BluetoothDevice device, int syncHandle, byte[] serviceData) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        log("parseBaseData" + Arrays.toString(serviceData));
        BaseData base = BaseData.parseBaseData(serviceData);
        if (base != null) {
@@ -374,6 +379,11 @@ public class BassClientStateMachine extends StateMachine {
    }

    void parseScanRecord(int syncHandle, ScanRecord record) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        log("parseScanRecord: " + record);
        Map<ParcelUuid, byte[]> bmsAdvDataMap = record.getServiceData();
        if (bmsAdvDataMap != null) {
@@ -396,6 +406,11 @@ public class BassClientStateMachine extends StateMachine {
    }

    private String checkAndParseBroadcastName(ScanRecord record) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        log("checkAndParseBroadcastName");
        byte[] rawBytes = record.getBytes();
        List<TypeValueEntry> entries = BluetoothUtils.parseLengthTypeValueBytes(rawBytes);
@@ -421,8 +436,12 @@ public class BassClientStateMachine extends StateMachine {
        return broadcastName;
    }

    private boolean selectSource(
            ScanResult scanRes, boolean autoTriggered) {
    private boolean selectSource(ScanResult scanRes, boolean autoTriggered) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        log("selectSource: ScanResult " + scanRes);
        mAutoTriggered = autoTriggered;
        mPASyncRetryCounter = 1;
@@ -495,12 +514,22 @@ public class BassClientStateMachine extends StateMachine {
    }

    private boolean isSourceSynced(int broadcastId) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        List<Integer> activeSyncedSrc = mService.getActiveSyncedSources(mDevice);
        return (activeSyncedSrc != null
                && activeSyncedSrc.contains(mService.getSyncHandleForBroadcastId(broadcastId)));
    }

    private void cancelActiveSync(Integer syncHandle) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        log("cancelActiveSync: syncHandle = " + syncHandle);
        if (syncHandle == null) {
            // clean up the pending sync request if syncHandle is null
@@ -531,6 +560,11 @@ public class BassClientStateMachine extends StateMachine {
    }

    private boolean unsyncSource(int syncHandle) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        if (syncHandle != BassConstants.INVALID_SYNC_HANDLE
                && mPeriodicAdvCallbacksMap.containsKey(syncHandle)) {
            try {
@@ -560,6 +594,11 @@ public class BassClientStateMachine extends StateMachine {

    private BluetoothLeBroadcastMetadata getBroadcastMetadataFromBaseData(
            BaseData baseData, BluetoothDevice device, int syncHandle, boolean encrypted) {
        if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
            throw new RuntimeException(
                    "Should never be executed with"
                            + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
        }
        BluetoothLeBroadcastMetadata.Builder metaData =
                new BluetoothLeBroadcastMetadata.Builder();
        int index = 0;
@@ -934,8 +973,10 @@ public class BassClientStateMachine extends StateMachine {
                        || recvState.getSourceDevice().getAddress().equals(emptyBluetoothDevice)) {
                    BluetoothDevice removedDevice = oldRecvState.getSourceDevice();
                    log("sourceInfo removal " + removedDevice);
                    if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                        cancelActiveSync(
                                mService.getSyncHandleForBroadcastId(recvState.getBroadcastId()));
                    }
                    setCurrentBroadcastMetadata(oldRecvState.getSourceId(), null);
                    if (mPendingSourceToSwitch != null) {
                        // Source remove is triggered by switch source request
@@ -1124,6 +1165,11 @@ public class BassClientStateMachine extends StateMachine {
                int skip,
                int timeout,
                int status) {
            if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                throw new RuntimeException(
                        "Should never be executed with"
                                + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
            }
            log("onSyncEstablished syncHandle: " + syncHandle
                    + ", device: " + device
                    + ", advertisingSid: " + advertisingSid
@@ -1180,6 +1226,11 @@ public class BassClientStateMachine extends StateMachine {

        @Override
        public void onPeriodicAdvertisingReport(PeriodicAdvertisingReport report) {
            if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                throw new RuntimeException(
                        "Should never be executed with"
                                + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
            }
            log("onPeriodicAdvertisingReport");
            Boolean first = mFirstTimeBisDiscoveryMap.get(report.getSyncHandle());
            // Parse the BIS indices from report's service data
@@ -1191,6 +1242,11 @@ public class BassClientStateMachine extends StateMachine {

        @Override
        public void onSyncLost(int syncHandle) {
            if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                throw new RuntimeException(
                        "Should never be executed with"
                                + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
            }
            log("OnSyncLost" + syncHandle);
            if (Flags.leaudioBroadcastMonitorSourceSyncStatus()) {
                int broadcastId = mService.getBroadcastIdForSyncHandle(syncHandle);
@@ -1204,6 +1260,11 @@ public class BassClientStateMachine extends StateMachine {

        @Override
        public void onBigInfoAdvertisingReport(int syncHandle, boolean encrypted) {
            if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                throw new RuntimeException(
                        "Should never be executed with"
                                + " leaudioBroadcastExtractPeriodicScannerFromStateMachine flag");
            }
            log(
                    "onBIGInfoAdvertisingReport: syncHandle="
                            + syncHandle
@@ -1738,7 +1799,9 @@ public class BassClientStateMachine extends StateMachine {
                        mBluetoothGatt.disconnect();
                        mBluetoothGatt.close();
                        mBluetoothGatt = null;
                        if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                            cancelActiveSync(null);
                        }
                        transitionTo(mDisconnected);
                    } else {
                        log("mBluetoothGatt is null");
@@ -1753,7 +1816,9 @@ public class BassClientStateMachine extends StateMachine {
                        Log.w(TAG, "unexpected disconnected from " + mDevice);
                        mService.handleDeviceDisconnection(mDevice, false);
                        resetBluetoothGatt();
                        if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                            cancelActiveSync(null);
                        }
                        transitionTo(mDisconnected);
                    }
                    break;
@@ -1786,6 +1851,12 @@ public class BassClientStateMachine extends StateMachine {
                    }
                    break;
                case SELECT_BCAST_SOURCE:
                    if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                        throw new RuntimeException(
                                "Should never be executed with"
                                        + " leaudioBroadcastExtractPeriodicScannerFromStateMachine"
                                        + " flag");
                    }
                    ScanResult scanRes = (ScanResult) message.obj;
                    boolean auto = ((int) message.arg1) == BassConstants.AUTO;
                    // check if invalid sync handle exists indicating a pending sync request
@@ -1800,6 +1871,12 @@ public class BassClientStateMachine extends StateMachine {
                    }
                    break;
                case REACHED_MAX_SOURCE_LIMIT:
                    if (Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                        throw new RuntimeException(
                                "Should never be executed with"
                                        + " leaudioBroadcastExtractPeriodicScannerFromStateMachine"
                                        + " flag");
                    }
                    int handle = message.arg1;
                    cancelActiveSync(handle);
                    break;
@@ -1828,6 +1905,7 @@ public class BassClientStateMachine extends StateMachine {
                case ADD_BCAST_SOURCE:
                    metaData = (BluetoothLeBroadcastMetadata) message.obj;

                    if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                        List<Integer> activeSyncedSrc = mService.getActiveSyncedSources(mDevice);
                        BluetoothDevice sourceDevice = metaData.getSourceDevice();
                        if (!mService.isLocalBroadcast(metaData)
@@ -1847,11 +1925,15 @@ public class BassClientStateMachine extends StateMachine {
                                sendMessage(msg);
                                mPendingSourceToAdd = metaData;
                            } else {
                            mService.getCallbacks().notifySourceAddFailed(mDevice, metaData,
                                mService.getCallbacks()
                                        .notifySourceAddFailed(
                                                mDevice,
                                                metaData,
                                                BluetoothStatusCodes.ERROR_UNKNOWN);
                            }
                            break;
                        }
                    }

                    byte[] addSourceInfo = convertMetadataToAddSourceByteArray(metaData);
                    if (addSourceInfo == null) {
@@ -2021,6 +2103,8 @@ public class BassClientStateMachine extends StateMachine {
    void sendPendingCallbacks(int pendingOp, int status) {
        switch (pendingOp) {
            case START_SCAN_OFFLOAD:
                // Do not want to cancel sync because one remote does not receive START_SCAN_OFFLOAD
                if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                    if (!isSuccess(status)) {
                        if (!mAutoTriggered) {
                            cancelActiveSync(null);
@@ -2028,10 +2112,13 @@ public class BassClientStateMachine extends StateMachine {
                            mAutoTriggered = false;
                        }
                    }
                }
                break;
            case ADD_BCAST_SOURCE:
                if (!isSuccess(status)) {
                    if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                        cancelActiveSync(null);
                    }
                    if (mPendingMetadata != null) {
                        mService.getCallbacks()
                                .notifySourceAddFailed(mDevice, mPendingMetadata, status);
@@ -2041,7 +2128,8 @@ public class BassClientStateMachine extends StateMachine {
                }
                break;
            case UPDATE_BCAST_SOURCE:
                if (!mAutoTriggered) {
                if (!mAutoTriggered
                        || Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                    if (!isSuccess(status)) {
                        mService.getCallbacks().notifySourceModifyFailed(mDevice,
                                mPendingSourceId, status);
@@ -2115,7 +2203,9 @@ public class BassClientStateMachine extends StateMachine {
                        mBluetoothGatt.disconnect();
                        mBluetoothGatt.close();
                        mBluetoothGatt = null;
                        if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                            cancelActiveSync(null);
                        }
                        transitionTo(mDisconnected);
                    } else {
                        log("mBluetoothGatt is null");
@@ -2134,7 +2224,9 @@ public class BassClientStateMachine extends StateMachine {
                        Log.w(TAG, "Unexpected disconnection " + mDevice);
                        mService.handleDeviceDisconnection(mDevice, false);
                        resetBluetoothGatt();
                        if (!Flags.leaudioBroadcastExtractPeriodicScannerFromStateMachine()) {
                            cancelActiveSync(null);
                        }
                        transitionTo(mDisconnected);
                    }
                    break;
+7 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.bluetooth.bass_client;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.BluetoothLeScanner;
import android.os.Looper;
import android.util.Log;

@@ -95,6 +96,11 @@ public class BassObjectsFactory {
     * @return a bluetooth LE scanner
     */
    public BluetoothLeScannerWrapper getBluetoothLeScannerWrapper(BluetoothAdapter adapter) {
        return new BluetoothLeScannerWrapper(adapter.getBluetoothLeScanner());
        BluetoothLeScanner bluetoothLeScanner = adapter.getBluetoothLeScanner();
        if (bluetoothLeScanner == null) {
            return null;
        } else {
            return new BluetoothLeScannerWrapper(bluetoothLeScanner);
        }
    }
}
Loading