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

Commit 678cef6b authored by Rongxuan Liu's avatar Rongxuan Liu Committed by Gerrit Code Review
Browse files

Merge "bass_client: Inform sinks about start/stop scanning" into main

parents 539a0794 9780a4fc
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -978,6 +978,20 @@ public class BassClientService extends ProfileService {
        }
    }

    private void informConnectedDeviceAboutScanOffloadStop() {
        for (BluetoothDevice device : getConnectedDevices()) {
            synchronized (mStateMachines) {
                BassClientStateMachine stateMachine = getOrCreateStateMachine(device);
                if (stateMachine == null) {
                    Log.w(TAG, "informConnectedDeviceAboutScanOffloadStop: Can't get state "
                            + "machine for device: " + device);
                    continue;
                }
                stateMachine.sendMessage(BassClientStateMachine.STOP_SCAN_OFFLOAD);
            }
        }
    }

    void handleConnectionStateChanged(BluetoothDevice device, int fromState, int toState) {
        mHandler.post(() -> connectionStateChanged(device, fromState, toState));
    }
@@ -1339,6 +1353,7 @@ public class BassClientService extends ProfileService {

                public void onScanFailed(int errorCode) {
                    Log.e(TAG, "Scan Failure:" + errorCode);
                    informConnectedDeviceAboutScanOffloadStop();
                }
            };
            // when starting scan, clear the previously cached broadcast scan results
@@ -1364,6 +1379,19 @@ public class BassClientService extends ProfileService {
                        .setServiceData(BassConstants.BAAS_UUID,
                                serviceData, serviceDataMask).build());
            }

            for (BluetoothDevice device : getConnectedDevices()) {
                synchronized (mStateMachines) {
                    BassClientStateMachine stateMachine = getOrCreateStateMachine(device);
                    if (stateMachine == null) {
                        Log.w(TAG, "startSearchingForSources: Can't get state machine for "
                                + "device: " + device);
                        continue;
                    }
                    stateMachine.sendMessage(BassClientStateMachine.START_SCAN_OFFLOAD);
                }
            }

            scanner.startScan(filters, settings, mSearchScanCallback);
            sEventLogger.logd(TAG, "startSearchingForSources");
            mCallbacks.notifySearchStarted(BluetoothStatusCodes.REASON_LOCAL_APP_REQUEST);
@@ -1391,6 +1419,7 @@ public class BassClientService extends ProfileService {
                mCallbacks.notifySearchStopFailed(BluetoothStatusCodes.ERROR_UNKNOWN);
                return;
            }
            informConnectedDeviceAboutScanOffloadStop();
            scanner.stopScan(mSearchScanCallback);
            mSearchScanCallback = null;
            sEventLogger.logd(TAG, "stopSearchingForSources");
+0 −15
Original line number Diff line number Diff line
@@ -470,8 +470,6 @@ public class BassClientStateMachine extends StateMachine {
                                null);
            } catch (IllegalArgumentException ex) {
                Log.w(TAG, "registerSync:IllegalArgumentException");
                Message message = obtainMessage(STOP_SCAN_OFFLOAD);
                sendMessage(message);
                mPeriodicAdvCallbacksMap.remove(tempHandle);
                return false;
            }
@@ -521,9 +519,6 @@ public class BassClientStateMachine extends StateMachine {
                // all sources are removed, clean up
                removeMessages(PSYNC_ACTIVE_TIMEOUT);
                mService.clearNotifiedFlags();
                // trigger scan stop here
                Message message = obtainMessage(STOP_SCAN_OFFLOAD);
                sendMessage(message);
            }
        }
    }
@@ -731,10 +726,6 @@ public class BassClientStateMachine extends StateMachine {
                    Log.e(TAG, "There is no valid sync handle for this Source");
                }
            }
        } else if (state == BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_SYNCHRONIZED
                || state == BluetoothLeBroadcastReceiveState.PA_SYNC_STATE_NO_PAST) {
            Message message = obtainMessage(STOP_SCAN_OFFLOAD);
            sendMessage(message);
        }
    }

@@ -1165,10 +1156,6 @@ public class BassClientStateMachine extends StateMachine {
                }
            } else {
                log("failed to sync to PA: " + mPASyncRetryCounter);
                if (!mAutoTriggered) {
                    Message message = obtainMessage(STOP_SCAN_OFFLOAD);
                    sendMessage(message);
                }
                mAutoTriggered = false;
                // remove failed sync handle
                mPeriodicAdvCallbacksMap.remove(BassConstants.INVALID_SYNC_HANDLE);
@@ -2003,8 +1990,6 @@ public class BassClientStateMachine extends StateMachine {
            case ADD_BCAST_SOURCE:
                if (!isSuccess(status)) {
                    cancelActiveSync(null);
                    Message message = obtainMessage(STOP_SCAN_OFFLOAD);
                    sendMessage(message);
                    if (mPendingMetadata != null) {
                        mService.getCallbacks()
                                .notifySourceAddFailed(mDevice, mPendingMetadata, status);
+11 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

@@ -395,10 +396,20 @@ public class BassClientServiceTest {
     */
    @Test
    public void testStartSearchingForSources() {
        prepareConnectedDeviceGroup();
        List<ScanFilter> scanFilters = new ArrayList<>();

        assertThat(mStateMachines.size()).isEqualTo(2);
        for (BassClientStateMachine sm : mStateMachines.values()) {
            Mockito.clearInvocations(sm);
        }

        mBassClientService.startSearchingForSources(scanFilters);

        verify(mBluetoothLeScannerWrapper).startScan(notNull(), notNull(), notNull());
        for (BassClientStateMachine sm : mStateMachines.values()) {
            verify(sm).sendMessage(BassClientStateMachine.START_SCAN_OFFLOAD);
        }
    }

    /**
+0 −1
Original line number Diff line number Diff line
@@ -794,7 +794,6 @@ public class BassClientStateMachineTest {

        verify(callbacks).notifySourceAdded(any(), any(), anyInt());
        verify(callbacks).notifyReceiveStateChanged(any(), anyInt(), any());
        assertThat(mBassClientStateMachine.mMsgWhats).contains(STOP_SCAN_OFFLOAD);

        // set some values for covering more lines of processPASyncState()
        mBassClientStateMachine.mPendingMetadata = null;