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
(cherry picked from commit 1ac82d982460f47589484052f57e27a63b0eb08b)
This commit is contained in:
tonihei 2025-02-27 06:01:26 -08:00 committed by oceanjules
parent c7fa2c3de6
commit 2cb6d4312b

View File

@ -22,7 +22,6 @@ import android.media.AudioFocusRequest;
import android.media.AudioManager; import android.media.AudioManager;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.media3.common.AudioAttributes; import androidx.media3.common.AudioAttributes;
@ -56,7 +55,7 @@ public final class AudioFocusRequestCompat {
this.audioAttributes = audioFocusRequestCompat; this.audioAttributes = audioFocusRequestCompat;
this.pauseOnDuck = pauseOnDuck; this.pauseOnDuck = pauseOnDuck;
if (Util.SDK_INT < 26 && focusChangeHandler.getLooper() != Looper.getMainLooper()) { if (Util.SDK_INT < 26) {
this.onAudioFocusChangeListener = this.onAudioFocusChangeListener =
new OnAudioFocusChangeListenerHandlerCompat( new OnAudioFocusChangeListenerHandlerCompat(
onAudioFocusChangeListener, focusChangeHandler); onAudioFocusChangeListener, focusChangeHandler);
@ -326,9 +325,7 @@ public final class AudioFocusRequestCompat {
* a specific thread prior to API 26. * a specific thread prior to API 26.
*/ */
private static class OnAudioFocusChangeListenerHandlerCompat private static class OnAudioFocusChangeListenerHandlerCompat
implements Handler.Callback, AudioManager.OnAudioFocusChangeListener { implements AudioManager.OnAudioFocusChangeListener {
private static final int FOCUS_CHANGE = 0x002a74b2;
private final Handler handler; private final Handler handler;
private final AudioManager.OnAudioFocusChangeListener listener; private final AudioManager.OnAudioFocusChangeListener listener;
@ -336,21 +333,12 @@ public final class AudioFocusRequestCompat {
/* package */ OnAudioFocusChangeListenerHandlerCompat( /* package */ OnAudioFocusChangeListenerHandlerCompat(
AudioManager.OnAudioFocusChangeListener listener, Handler handler) { AudioManager.OnAudioFocusChangeListener listener, Handler handler) {
this.listener = listener; this.listener = listener;
this.handler = Util.createHandler(handler.getLooper(), /* callback= */ this); this.handler = Util.createHandler(handler.getLooper(), /* callback= */ null);
} }
@Override @Override
public void onAudioFocusChange(int focusChange) { public void onAudioFocusChange(int focusChange) {
handler.sendMessage(Message.obtain(handler, FOCUS_CHANGE, focusChange, 0)); Util.postOrRun(handler, () -> listener.onAudioFocusChange(focusChange));
}
@Override
public boolean handleMessage(Message message) {
if (message.what == FOCUS_CHANGE) {
listener.onAudioFocusChange(message.arg1);
return true;
}
return false;
} }
} }
} }