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

Commit fead0fa2 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioService: focus abandon notifies focus followers

When a focus owner abandons focus, notify focus
followers.

Bug: 155098568
Test: atest com.google.android.gts.audio.AudioHostTest#testFocusChangeMediaToGuidance
Test: atest com.google.android.gts.audio.AudioHostTest#testFocusAbandonNotification
Change-Id: I5b05663cd526a28c8f537bbd8760ace4e461f168
parent 3693be0b
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -288,6 +288,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
    @GuardedBy("mAudioFocusLock")
    private void removeFocusStackEntry(String clientToRemove, boolean signal,
            boolean notifyFocusFollowers) {
        AudioFocusInfo abandonSource = null;
        // is the current top of the focus stack abandoning focus? (because of request, not death)
        if (!mFocusStack.empty() && mFocusStack.peek().hasSameClient(clientToRemove))
        {
@@ -295,9 +296,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
            FocusRequester fr = mFocusStack.pop();
            fr.release();
            if (notifyFocusFollowers) {
                final AudioFocusInfo afi = fr.toAudioFocusInfo();
                afi.clearLossReceived();
                notifyExtPolicyFocusLoss_syncAf(afi, false);
                abandonSource = fr.toAudioFocusInfo();
            }
            if (signal) {
                // notify the new top of the stack it gained focus
@@ -315,11 +314,19 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
                    Log.i(TAG, "AudioFocus  removeFocusStackEntry(): removing entry for "
                            + clientToRemove);
                    stackIterator.remove();
                    if (notifyFocusFollowers) {
                        abandonSource = fr.toAudioFocusInfo();
                    }
                    // stack entry not used anymore, clear references
                    fr.release();
                }
            }
        }
        // focus followers still want to know focus was abandoned, handled as a loss
        if (abandonSource != null) {
            abandonSource.clearLossReceived();
            notifyExtPolicyFocusLoss_syncAf(abandonSource, false);
        }

        if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {
            Iterator<FocusRequester> listIterator = mMultiAudioFocusList.iterator();