From 1ac82d982460f47589484052f57e27a63b0eb08b Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 27 Feb 2025 06:01:26 -0800 Subject: [PATCH] Do not assume default callback for Audio focus requests is main looper On API < 26, the callback thread couldn't be set and the current compat code assumes it's always the main thread. This isn't true, however, because AudioManager uses the thread on which it was first instantiated anywhere in the app. #cherrypick PiperOrigin-RevId: 731696188 --- .../common/audio/AudioFocusRequestCompat.java | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusRequestCompat.java b/libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusRequestCompat.java index 712108a9b3..175e6f0b13 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusRequestCompat.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/AudioFocusRequestCompat.java @@ -22,7 +22,6 @@ import android.media.AudioFocusRequest; import android.media.AudioManager; import android.os.Handler; import android.os.Looper; -import android.os.Message; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.media3.common.AudioAttributes; @@ -56,7 +55,7 @@ public final class AudioFocusRequestCompat { this.audioAttributes = audioFocusRequestCompat; this.pauseOnDuck = pauseOnDuck; - if (Util.SDK_INT < 26 && focusChangeHandler.getLooper() != Looper.getMainLooper()) { + if (Util.SDK_INT < 26) { this.onAudioFocusChangeListener = new OnAudioFocusChangeListenerHandlerCompat( onAudioFocusChangeListener, focusChangeHandler); @@ -326,9 +325,7 @@ public final class AudioFocusRequestCompat { * a specific thread prior to API 26. */ private static class OnAudioFocusChangeListenerHandlerCompat - implements Handler.Callback, AudioManager.OnAudioFocusChangeListener { - - private static final int FOCUS_CHANGE = 0x002a74b2; + implements AudioManager.OnAudioFocusChangeListener { private final Handler handler; private final AudioManager.OnAudioFocusChangeListener listener; @@ -336,21 +333,12 @@ public final class AudioFocusRequestCompat { /* package */ OnAudioFocusChangeListenerHandlerCompat( AudioManager.OnAudioFocusChangeListener listener, Handler handler) { this.listener = listener; - this.handler = Util.createHandler(handler.getLooper(), /* callback= */ this); + this.handler = Util.createHandler(handler.getLooper(), /* callback= */ null); } @Override public void onAudioFocusChange(int focusChange) { - handler.sendMessage(Message.obtain(handler, FOCUS_CHANGE, focusChange, 0)); - } - - @Override - public boolean handleMessage(Message message) { - if (message.what == FOCUS_CHANGE) { - listener.onAudioFocusChange(message.arg1); - return true; - } - return false; + Util.postOrRun(handler, () -> listener.onAudioFocusChange(focusChange)); } } }