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

Commit 1017d43e authored by Weilin Xu's avatar Weilin Xu
Browse files

Fix flaky CarAudioFocusTest

Modify the scope of locks in requestAudioFocus in AudioManager so
that method dispatchFocusResut FromExtPolicy is called only
after clientId has been already added into
mFocusRequestsAwaitingResult. Meanwhile, increase
EXT_FOCUS_POLICY_TIMEOUT_MS time since the method notifyResult
sometimes reaches 200ms timeout when the emulator device is slow.

Bug: 234467798
Test: m -j
Test: atest CarAudioFocusTest AudioFocusTest
Test: atest com.android.car.audio
Change-Id: I0198549bbae0b4e78523e244962a71a24be4dde8
parent 04e27fb1
Loading
Loading
Loading
Loading
+30 −18
Original line number Diff line number Diff line
@@ -4004,7 +4004,7 @@ public class AudioManager {
     * Timeout duration in ms when waiting on an external focus policy for the result for a
     * focus request
     */
    private static final int EXT_FOCUS_POLICY_TIMEOUT_MS = 200;
    private static final int EXT_FOCUS_POLICY_TIMEOUT_MS = 250;

    private static final String FOCUS_CLIENT_ID_STRING = "android_audio_focus_client_id";

@@ -4284,8 +4284,17 @@ public class AudioManager {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        if (status != AudioManager.AUDIOFOCUS_REQUEST_WAITING_FOR_EXT_POLICY) {
            // default path with no external focus policy
            return status;
        }

        return handleExternalAudioPolicyWaitIfNeeded(clientFakeId, status);
        BlockingFocusResultReceiver focusReceiver;
        synchronized (mFocusRequestsLock) {
            focusReceiver = addClientIdToFocusReceiverLocked(clientFakeId);
        }

        return handleExternalAudioPolicyWaitIfNeeded(clientFakeId, focusReceiver);
    }

    /**
@@ -4368,7 +4377,9 @@ public class AudioManager {
        }

        final String clientId = getIdForAudioFocusListener(afr.getOnAudioFocusChangeListener());
        BlockingFocusResultReceiver focusReceiver;
        synchronized (mFocusRequestsLock) {

            try {
                // TODO status contains result and generation counter for ext policy
                status = service.requestAudioFocus(afr.getAudioAttributes(),
@@ -4383,29 +4394,30 @@ public class AudioManager {
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
            if (status != AudioManager.AUDIOFOCUS_REQUEST_WAITING_FOR_EXT_POLICY) {
                // default path with no external focus policy
                return status;
            }

        return handleExternalAudioPolicyWaitIfNeeded(clientId, status);
            focusReceiver = addClientIdToFocusReceiverLocked(clientId);
        }

    private @FocusRequestResult int handleExternalAudioPolicyWaitIfNeeded(String clientId,
            @FocusRequestResult int results) {
        if (results != AudioManager.AUDIOFOCUS_REQUEST_WAITING_FOR_EXT_POLICY) {
            // default path with no external focus policy
            return results;
        return handleExternalAudioPolicyWaitIfNeeded(clientId, focusReceiver);
    }

    @GuardedBy("mFocusRequestsLock")
    private BlockingFocusResultReceiver addClientIdToFocusReceiverLocked(String clientId) {
        BlockingFocusResultReceiver focusReceiver;

        synchronized (mFocusRequestsLock) {
        if (mFocusRequestsAwaitingResult == null) {
            mFocusRequestsAwaitingResult =
                    new HashMap<String, BlockingFocusResultReceiver>(1);
        }
        focusReceiver = new BlockingFocusResultReceiver(clientId);
        mFocusRequestsAwaitingResult.put(clientId, focusReceiver);
        return focusReceiver;
    }

    private @FocusRequestResult int handleExternalAudioPolicyWaitIfNeeded(String clientId,
            BlockingFocusResultReceiver focusReceiver) {
        focusReceiver.waitForResult(EXT_FOCUS_POLICY_TIMEOUT_MS);
        if (DEBUG && !focusReceiver.receivedResult()) {
            Log.e(TAG, "handleExternalAudioPolicyWaitIfNeeded"