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

Commit 3e7f451e authored by François Gaffie's avatar François Gaffie Committed by Oscar Azucena
Browse files

audiomanager: fix orphan focus holder when using ext focus policy



When an focus management is delegate to an external Audio Policy, the
answer to the request is expected within 250ms. If the timer expires,
it is rejected. Timer is armed on client side.
It may lead to orphan focus owner as ext AudioPolicy may be temporary
stuck and would manage the request anyway.

This CL fixes the orphan owner by abandonning any timed out request.

Bug: 400752237
Test: m

Change-Id: I0b4e60475e83b8faa58068fe2b7753c6fbd6df7c
Signed-off-by: default avatarFrançois Gaffie <francois.gaffie@ampere.cars>
parent 20a4a574
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -4716,7 +4716,7 @@ public class AudioManager {
            focusReceiver = addClientIdToFocusReceiverLocked(clientFakeId);
        }

        return handleExternalAudioPolicyWaitIfNeeded(clientFakeId, focusReceiver);
        return handleExternalAudioPolicyWaitIfNeeded(clientFakeId, focusReceiver, afr);
    }

    /**
@@ -4929,7 +4929,7 @@ public class AudioManager {
            focusReceiver = addClientIdToFocusReceiverLocked(clientId);
        }

        return handleExternalAudioPolicyWaitIfNeeded(clientId, focusReceiver);
        return handleExternalAudioPolicyWaitIfNeeded(clientId, focusReceiver, afr);
    }

    @GuardedBy("mFocusRequestsLock")
@@ -4945,12 +4945,21 @@ public class AudioManager {
    }

    private @FocusRequestResult int handleExternalAudioPolicyWaitIfNeeded(String clientId,
            BlockingFocusResultReceiver focusReceiver) {
            BlockingFocusResultReceiver focusReceiver, @NonNull AudioFocusRequest afr) {
        focusReceiver.waitForResult(EXT_FOCUS_POLICY_TIMEOUT_MS);
        if (DEBUG && !focusReceiver.receivedResult()) {
        if (!focusReceiver.receivedResult()) {
            if (DEBUG) {
                Log.e(TAG, "handleExternalAudioPolicyWaitIfNeeded"
                        + " response from ext policy timed out, denying request");
            }
            try {
                // To prevent from orphan focus holder, cleanup
                abandonAudioFocus(afr.getOnAudioFocusChangeListener());
            } catch (Exception e) {
                Log.e(TAG, "handleExternalAudioPolicyWaitIfNeeded failed to abandon audio"
                        +" focus after time out, error: " + e.getMessage());
            }
        }

        synchronized (mFocusRequestsLock) {
            mFocusRequestsAwaitingResult.remove(clientId);