From 9164668b8b5f7b1f8eea229620d1fad462e2df3e Mon Sep 17 00:00:00 2001 From: Sagar <85388413+Sagar0-0@users.noreply.github.com> Date: Fri, 25 Apr 2025 20:03:54 +0530 Subject: [PATCH] Duck and recover external audio on video play. --- .../securesms/video/VideoPlayer.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java index 80c01820da..0ccd234642 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -18,6 +18,10 @@ package org.thoughtcrime.securesms.video; import android.content.Context; import android.content.res.TypedArray; +import android.media.AudioAttributes; +import android.media.AudioFocusRequest; +import android.media.AudioManager; +import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.view.Window; @@ -27,6 +31,7 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.OptIn; +import androidx.core.content.ContextCompat; import androidx.media3.common.C; import androidx.media3.common.MediaItem; import androidx.media3.common.PlaybackException; @@ -94,6 +99,24 @@ public class VideoPlayer extends FrameLayout { this.progressBar = findViewById(R.id.progress_bar); this.exoControls = createPlayerControls(getContext()); + final AudioManager audioManager = ContextCompat.getSystemService(context, AudioManager.class); + final AudioFocusRequest audioFocusRequest; + if (Build.VERSION.SDK_INT >= 26) { + audioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK) + .setAudioAttributes( + new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + ) + .setOnAudioFocusChangeListener(focusChange -> { + + }) + .build(); + } else { + audioFocusRequest = null; + } + this.exoPlayerListener = new ExoPlayerListener(); this.playerListener = new Player.Listener() { @@ -103,6 +126,35 @@ public class VideoPlayer extends FrameLayout { exoPlayer.seekTo(0); exoPlayer.setPlayWhenReady(false); } + + if (audioManager == null) { + return; + } + + if (Build.VERSION.SDK_INT >= 26 && audioFocusRequest != null) { + if (isPlaying) { + audioManager.requestAudioFocus(audioFocusRequest); + } else { + audioManager.abandonAudioFocusRequest(audioFocusRequest); + } + } else { + if (isPlaying) { + audioManager.requestAudioFocus( + focusChange -> { + // Do nothing + }, + AudioManager.STREAM_MUSIC, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK + ); + } else { + audioManager.abandonAudioFocus( + focusChange -> { + // Do nothing + } + ); + } + } + } @Override