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

Commit 4394d3b2 authored by Eric Laurent's avatar Eric Laurent
Browse files

BtHelper: do not clear sco clients when sco audio is disconnected

When sco audio is disconnected by BT stack, do not clear the list
of pending activation requests by apps (mScoClients). Instead, restart
sco audio if a client is still in the list.

Also restore BT SCO forced usage when speakerphone is turned off
and sco audio is connected.

Bug: 154464603
Test: repro steps in bug.
Test: manual regression tests with VoIP and cell calls

Change-Id: I54930df9da9477dfb943dc08cebd78986b6568e9
parent ff779f6d
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -211,8 +211,14 @@ import java.io.PrintWriter;
                }
                mForcedUseForComm = AudioSystem.FORCE_SPEAKER;
            } else if (mForcedUseForComm == AudioSystem.FORCE_SPEAKER) {
                if (mBtHelper.isBluetoothScoOn()) {
                    mForcedUseForComm = AudioSystem.FORCE_BT_SCO;
                    setForceUse_Async(
                            AudioSystem.FOR_RECORD, AudioSystem.FORCE_BT_SCO, eventSource);
                } else {
                    mForcedUseForComm = AudioSystem.FORCE_NONE;
                }
            }

            mForcedUseForCommExt = mForcedUseForComm;
            setForceUse_Async(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, eventSource);
+12 −3
Original line number Diff line number Diff line
@@ -307,8 +307,15 @@ public class BtHelper {
                case BluetoothHeadset.STATE_AUDIO_DISCONNECTED:
                    mDeviceBroker.setBluetoothScoOn(false, "BtHelper.receiveBtEvent");
                    scoAudioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED;
                    // startBluetoothSco called after stopBluetoothSco
                    if (mScoAudioState == SCO_STATE_ACTIVATE_REQ) {
                    // There are two cases where we want to immediately reconnect audio:
                    // 1) If a new start request was received while disconnecting: this was
                    // notified by requestScoState() setting state to SCO_STATE_ACTIVATE_REQ.
                    // 2) If audio was connected then disconnected via Bluetooth APIs and
                    // we still have pending activation requests by apps: this is indicated by
                    // state SCO_STATE_ACTIVE_EXTERNAL and the mScoClients list not empty.
                    if (mScoAudioState == SCO_STATE_ACTIVATE_REQ
                            || (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL
                                    && !mScoClients.isEmpty())) {
                        if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null
                                && connectBluetoothScoAudioHelper(mBluetoothHeadset,
                                mBluetoothHeadsetDevice, mScoAudioMode)) {
@@ -318,7 +325,9 @@ public class BtHelper {
                        }
                    }
                    // Tear down SCO if disconnected from external
                    clearAllScoClients(0, mScoAudioState == SCO_STATE_ACTIVE_INTERNAL);
                    if (mScoAudioState == SCO_STATE_DEACTIVATING) {
                        clearAllScoClients(0, false);
                    }
                    mScoAudioState = SCO_STATE_INACTIVE;
                    break;
                case BluetoothHeadset.STATE_AUDIO_CONNECTING: