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

Commit 854938a7 authored by Eric Laurent's avatar Eric Laurent
Browse files

Fix issue 3388354.

Release all sco audio clients when the intent indicating
STATE_AUDIO_DISCONNECTED state is received.
Also clear mScoClients array when clients are released.

Change-Id: I63ec9d70fe72a102e09a4a473a367fb2e550b171
parent dd1ddc3b
Loading
Loading
Loading
Loading
+23 −9
Original line number Diff line number Diff line
@@ -1218,7 +1218,7 @@ public class AudioService extends IAudioService.Stub {
        if (!checkAudioSettingsPermission("startBluetoothSco()")) {
            return;
        }
        ScoClient client = getScoClient(cb);
        ScoClient client = getScoClient(cb, true);
        client.incCount();
    }

@@ -1227,9 +1227,11 @@ public class AudioService extends IAudioService.Stub {
        if (!checkAudioSettingsPermission("stopBluetoothSco()")) {
            return;
        }
        ScoClient client = getScoClient(cb);
        ScoClient client = getScoClient(cb, false);
        if (client != null) {
            client.decCount();
        }
    }

    private class ScoClient implements IBinder.DeathRecipient {
        private IBinder mCb; // To be notified of client's death
@@ -1355,27 +1357,38 @@ public class AudioService extends IAudioService.Stub {
        }
    }

    public ScoClient getScoClient(IBinder cb) {
    private ScoClient getScoClient(IBinder cb, boolean create) {
        synchronized(mScoClients) {
            ScoClient client;
            ScoClient client = null;
            int size = mScoClients.size();
            for (int i = 0; i < size; i++) {
                client = mScoClients.get(i);
                if (client.getBinder() == cb)
                    return client;
            }
            if (create) {
                client = new ScoClient(cb);
                mScoClients.add(client);
            }
            return client;
        }
    }

    public void clearAllScoClients(IBinder exceptBinder, boolean stopSco) {
        synchronized(mScoClients) {
            ScoClient savedClient = null;
            int size = mScoClients.size();
            for (int i = 0; i < size; i++) {
                if (mScoClients.get(i).getBinder() != exceptBinder)
                    mScoClients.get(i).clearCount(stopSco);
                ScoClient cl = mScoClients.get(i);
                if (cl.getBinder() != exceptBinder) {
                    cl.clearCount(stopSco);
                } else {
                    savedClient = cl;
                }
            }
            mScoClients.clear();
            if (savedClient != null) {
                mScoClients.add(savedClient);
            }
        }
    }
@@ -2320,6 +2333,7 @@ public class AudioService extends IAudioService.Stub {
                    case BluetoothHeadset.STATE_AUDIO_DISCONNECTED:
                        audioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED;
                        mScoAudioState = SCO_STATE_INACTIVE;
                        clearAllScoClients(null, false);
                        break;
                    case BluetoothHeadset.STATE_AUDIO_CONNECTING:
                        if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL) {