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

Commit 5c9a47bd authored by Jack He's avatar Jack He
Browse files

HFP: Allow SCO audio to be forcibly connected

* Normally, Android only allows SCO audio to be connected in several
  allowed cases (e.g. in call, in ringing, in virtual call state, etc)
* Sometimes, it is necessary to force a SCO audio connection (e.g.
  during PTS test)
* This change adds setForceScoAudio(boolean) hidden, system only method
  to allow such behaviour

Bug: 38040125
Test: PTS HFP tests
Change-Id: Iab6bca8ec437d04804d61c169f570c1966d164c1
parent 32956449
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -252,10 +252,15 @@ public class HeadsetService extends ProfileService {
            if (service != null) {
                return service.getAudioRouteAllowed();
            }

            return false;
        }

        public void setForceScoAudio(boolean forced) {
            HeadsetService service = getService();
            if (service == null) return;
            service.setForceScoAudio(forced);
        }

        public boolean startScoUsingVirtualVoiceCall(BluetoothDevice device) {
            HeadsetService service = getService();
            if (service == null) return false;
@@ -469,6 +474,11 @@ public class HeadsetService extends ProfileService {
        return mStateMachine.getAudioRouteAllowed();
    }

    public void setForceScoAudio(boolean forced) {
        enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
        mStateMachine.setForceScoAudio(forced);
    }

    boolean connectAudio() {
        // TODO(BT) BLUETOOTH or BLUETOOTH_ADMIN permission
        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+8 −0
Original line number Diff line number Diff line
@@ -164,6 +164,9 @@ final class HeadsetStateMachine extends StateMachine {
    // Indicates whether audio can be routed to the device.
    private boolean mAudioRouteAllowed = true;

    // Indicates whether SCO audio needs to be forced to open regardless ANY OTHER restrictions
    private boolean mForceScoAudio = false;

    // Indicate whether service level connection has been established for this device
    private boolean mSlcConnected = false;

@@ -2116,6 +2119,10 @@ final class HeadsetStateMachine extends StateMachine {
        return mAudioRouteAllowed;
    }

    public void setForceScoAudio(boolean forced) {
        mForceScoAudio = forced;
    }

    int getAudioState(BluetoothDevice device) {
        synchronized (this) {
            if (mConnectedDevicesList.size() == 0) {
@@ -3274,6 +3281,7 @@ final class HeadsetStateMachine extends StateMachine {
    // Accept incoming SCO only when there is in-band ringing, incoming call,
    // active call, VR activated, active VOIP call
    private boolean isScoAcceptable() {
        if (mForceScoAudio) return true;
        return mAudioRouteAllowed
                && (mVoiceRecognitionStarted || isInCall()
                           || (BluetoothHeadset.isInbandRingingSupported(mService) && isRinging()));