From f486074f8217724eaa2bdcd526911138ca37c1b6 Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 30 Jun 2023 19:17:32 +0000 Subject: [PATCH] AudioDeviceCallback should not be used below SDK 23. This gating should have been added in https://github.com/androidx/media/commit/6e46234589d700b1efc00439d0fc909a6ccdcd66. PiperOrigin-RevId: 544720503 --- .../media3/exoplayer/ExoPlayerImpl.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java index ae37756eca..80e2212c56 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java @@ -388,10 +388,12 @@ import java.util.concurrent.TimeoutException; audioBecomingNoisyManager.setEnabled(builder.handleAudioBecomingNoisy); audioFocusManager = new AudioFocusManager(builder.context, eventHandler, componentListener); audioFocusManager.setAudioAttributes(builder.handleAudioFocus ? audioAttributes : null); - if (suppressPlaybackOnUnsuitableOutput) { + if (suppressPlaybackOnUnsuitableOutput && Util.SDK_INT >= 23) { audioManager = (AudioManager) applicationContext.getSystemService(Context.AUDIO_SERVICE); - audioManager.registerAudioDeviceCallback( - new NoSuitableOutputPlaybackSuppressionAudioDeviceCallback(), /* handler= */ null); + Api23.registerAudioDeviceCallback( + audioManager, + new NoSuitableOutputPlaybackSuppressionAudioDeviceCallback(), + new Handler(applicationLooper)); } if (builder.deviceVolumeControlEnabled) { streamVolumeManager = @@ -3331,6 +3333,7 @@ import java.util.concurrent.TimeoutException; private static final class Api23 { private Api23() {} + @DoNotInline public static boolean isSuitableAudioOutputPresentInAudioDeviceInfoList( Context context, AudioDeviceInfo[] audioDeviceInfos) { if (!Util.isWear(context)) { @@ -3362,12 +3365,20 @@ import java.util.concurrent.TimeoutException; } return false; } + + @DoNotInline + public static void registerAudioDeviceCallback( + AudioManager audioManager, AudioDeviceCallback audioDeviceCallback, Handler handler) { + audioManager.registerAudioDeviceCallback(audioDeviceCallback, handler); + } } /** - * A {@link AudioDeviceCallback} to handle auto-resume and auto-pause for playback suppression due - * to no suitable audio output. + * A {@link AudioDeviceCallback} to change playback suppression reason when suitable audio outputs + * are either added in unsuitable output based playback suppression state or removed during an + * ongoing playback. */ + @RequiresApi(23) private final class NoSuitableOutputPlaybackSuppressionAudioDeviceCallback extends AudioDeviceCallback {