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

Commit 3a6f2551 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "Focus gain sends focus loss through the focus stack"

parents 46fc6a6e cbb212ff
Loading
Loading
Loading
Loading
+22 −19
Original line number Diff line number Diff line
@@ -37,9 +37,10 @@ class FocusRequester {

    // on purpose not using this classe's name, as it will only be used from MediaFocusControl
    private static final String TAG = "MediaFocusControl";
    private static final boolean DEBUG = false;

    private AudioFocusDeathHandler mDeathHandler;
    private final IAudioFocusDispatcher mFocusDispatcher;
    private final IAudioFocusDispatcher mFocusDispatcher; // may be null
    private final IBinder mSourceRef;
    private final String mClientId;
    private final String mPackageName;
@@ -73,10 +74,6 @@ class FocusRequester {
    }


    boolean canDispatchFocus() {
        return (mFocusDispatcher != null);
    }

    boolean hasSameClient(String otherClient) {
        try {
            return mClientId.compareTo(otherClient) == 0;
@@ -197,7 +194,7 @@ class FocusRequester {
                switch(mFocusLossReceived) {
                    case AUDIOFOCUS_NONE:
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        return AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
                        return AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                        return AudioManager.AUDIOFOCUS_LOSS_TRANSIENT;
                    case AudioManager.AUDIOFOCUS_LOSS:
@@ -210,20 +207,19 @@ class FocusRequester {
    }

    void handleExternalFocusGain(int focusGain) {
        try {
        int focusLoss = focusLossForGainRequest(focusGain);
            if (focusLoss != mFocusLossReceived) {
                mFocusDispatcher.dispatchAudioFocusChange(focusLoss, mClientId);
                mFocusLossReceived = focusLoss;
            }
        } catch (android.os.RemoteException e) {
            Log.e(TAG, "Failure to signal loss of focus: ", e);
        }
        handleFocusLoss(focusLoss);
    }

    void handleFocusGain(int focusGain) {
        try {
            if (mFocusDispatcher != null) {
                if (DEBUG) {
                    Log.v(TAG, "dispatching " + focusChangeToString(focusGain) + " to "
                        + mClientId);
                }
                mFocusDispatcher.dispatchAudioFocusChange(focusGain, mClientId);
            }
            mFocusLossReceived = AUDIOFOCUS_NONE;
        } catch (android.os.RemoteException e) {
            Log.e(TAG, "Failure to signal gain of audio focus due to: ", e);
@@ -232,9 +228,16 @@ class FocusRequester {

    void handleFocusLoss(int focusLoss) {
        try {
            mFocusDispatcher.dispatchAudioFocusChange(
                    focusLoss, mClientId);
            if (focusLoss != mFocusLossReceived) {
                if (mFocusDispatcher != null) {
                    if (DEBUG) {
                        Log.v(TAG, "dispatching " + focusChangeToString(focusLoss) + " to "
                            + mClientId);
                    }
                    mFocusDispatcher.dispatchAudioFocusChange(focusLoss, mClientId);
                }
                mFocusLossReceived = focusLoss;
            }
        } catch (android.os.RemoteException e) {
            Log.e(TAG, "Failure to signal loss of audio focus due to:", e);
        }
+20 −7
Original line number Diff line number Diff line
@@ -265,7 +265,7 @@ public class MediaFocusControl implements OnFinished {
     */
    protected void discardAudioFocusOwner() {
        synchronized(mAudioFocusLock) {
            if (!mFocusStack.empty() && mFocusStack.peek().canDispatchFocus()) {
            if (!mFocusStack.empty()) {
                // notify the current focus owner it lost focus after removing it from stack
                final FocusRequester exFocusOwner = mFocusStack.pop();
                exFocusOwner.handleFocusLoss(AudioManager.AUDIOFOCUS_LOSS);
@@ -280,13 +280,26 @@ public class MediaFocusControl implements OnFinished {

    private void notifyTopOfAudioFocusStack() {
        // notify the top of the stack it gained focus
        if (!mFocusStack.empty() && mFocusStack.peek().canDispatchFocus()) {
        if (!mFocusStack.empty()) {
            if (canReassignAudioFocus()) {
                mFocusStack.peek().handleFocusGain(AudioManager.AUDIOFOCUS_GAIN);
            }
        }
    }

    /**
     * Focus is requested, propagate the associated loss throughout the stack.
     * @param focusGain the new focus gain that will later be added at the top of the stack
     */
    private void propagateFocusLossFromGain_syncAf(int focusGain) {
        // going through the audio focus stack to signal new focus, traversing order doesn't
        // matter as all entries respond to the same external focus gain
        Iterator<FocusRequester> stackIterator = mFocusStack.iterator();
        while(stackIterator.hasNext()) {
            stackIterator.next().handleExternalFocusGain(focusGain);
        }
    }

    private final Stack<FocusRequester> mFocusStack = new Stack<FocusRequester>();

    /**
@@ -462,14 +475,14 @@ public class MediaFocusControl implements OnFinished {
                fr.release();
            }

            // notify current top of stack it is losing focus
            if (!mFocusStack.empty() && mFocusStack.peek().canDispatchFocus()) {
                mFocusStack.peek().handleExternalFocusGain(focusChangeHint);
            }

            // focus requester might already be somewhere below in the stack, remove it
            removeFocusStackEntry(clientId, false /* signal */);

            // propagate the focus change through the stack
            if (!mFocusStack.empty()) {
                propagateFocusLossFromGain_syncAf(focusChangeHint);
            }

            // push focus requester at the top of the audio focus stack
            mFocusStack.push(new FocusRequester(mainStreamType, focusChangeHint, fd, cb,
                    clientId, afdh, callingPackageName, Binder.getCallingUid()));