From 5b34a09ff912ca466b5db03d7f707a189b227f60 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Mon, 12 Aug 2024 11:01:47 +1000 Subject: [PATCH] Upgrading to the latest exoplayer: 2.19.1 --- app/build.gradle | 4 +- .../securesms/audio/AudioSlidePlayer.java | 61 ++++++--------- .../securesms/video/VideoPlayer.java | 74 ++++++------------- app/src/main/res/values/attrs.xml | 16 ---- libsession/src/main/res/values/attrs.xml | 16 ---- 5 files changed, 45 insertions(+), 126 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f72856553d..d5f06b4d68 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -267,8 +267,8 @@ dependencies { exclude group: 'com.google.firebase', module: 'firebase-measurement-connector' } if (project.hasProperty('huawei')) huaweiImplementation 'com.huawei.hms:push:6.7.0.300' - implementation 'com.google.android.exoplayer:exoplayer-core:2.9.1' - implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.1' + implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' + implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1' implementation 'org.conscrypt:conscrypt-android:2.5.2' implementation 'org.signal:aesgcmprovider:0.0.3' implementation 'org.webrtc:google-webrtc:1.0.32006' diff --git a/app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java index ef404bb070..8efece4e3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java @@ -6,49 +6,35 @@ import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.media.AudioManager; -import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; +import android.util.Pair; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import android.util.Pair; -import android.widget.Toast; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.DefaultRenderersFactory; -import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.LoadControl; +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; +import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.audio.AudioAttributes; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; -import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import org.jetbrains.annotations.NotNull; -import org.thoughtcrime.securesms.attachments.AttachmentServer; -import org.session.libsignal.utilities.Log; -import org.thoughtcrime.securesms.mms.AudioSlide; import org.session.libsession.utilities.ServiceUtil; - import org.session.libsession.utilities.Util; - +import org.session.libsignal.utilities.Log; import org.session.libsignal.utilities.guava.Optional; +import org.thoughtcrime.securesms.attachments.AttachmentServer; +import org.thoughtcrime.securesms.mms.AudioSlide; import java.io.IOException; import java.lang.ref.WeakReference; -import network.loki.messenger.BuildConfig; -import network.loki.messenger.R; - public class AudioSlidePlayer implements SensorEventListener { private static final String TAG = AudioSlidePlayer.class.getSimpleName(); @@ -64,7 +50,7 @@ public class AudioSlidePlayer implements SensorEventListener { private final @Nullable WakeLock wakeLock; private @NonNull WeakReference listener; - private @Nullable SimpleExoPlayer mediaPlayer; + private @Nullable ExoPlayer mediaPlayer; private @Nullable AttachmentServer audioAttachmentServer; private long startTime; @@ -111,20 +97,23 @@ public class AudioSlidePlayer implements SensorEventListener { private void play(final double progress, boolean earpiece) throws IOException { if (this.mediaPlayer != null) { stop(); } - LoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE).createDefaultLoadControl(); - this.mediaPlayer = ExoPlayerFactory.newSimpleInstance(context, new DefaultRenderersFactory(context), new DefaultTrackSelector(), loadControl); + this.mediaPlayer = new ExoPlayer.Builder(context).build(); this.audioAttachmentServer = new AttachmentServer(context, slide.asAttachment()); this.startTime = System.currentTimeMillis(); audioAttachmentServer.start(); - mediaPlayer.prepare(createMediaSource(audioAttachmentServer.getUri())); + MediaItem mediaItem = MediaItem.fromUri(audioAttachmentServer.getUri()); + mediaPlayer.setMediaItem(mediaItem); + + mediaPlayer.prepare(); mediaPlayer.setPlayWhenReady(true); mediaPlayer.setAudioAttributes(new AudioAttributes.Builder() - .setContentType(earpiece ? C.CONTENT_TYPE_SPEECH : C.CONTENT_TYPE_MUSIC) + .setContentType(earpiece ? C.AUDIO_CONTENT_TYPE_SPEECH : C.AUDIO_CONTENT_TYPE_MUSIC) .setUsage(earpiece ? C.USAGE_VOICE_COMMUNICATION : C.USAGE_MEDIA) - .build()); - mediaPlayer.addListener(new Player.EventListener() { + .build(), + true); + mediaPlayer.addListener(new Player.Listener() { boolean started = false; @@ -187,7 +176,7 @@ public class AudioSlidePlayer implements SensorEventListener { } @Override - public void onPlayerError(ExoPlaybackException error) { + public void onPlayerError(PlaybackException error) { Log.w(TAG, "MediaPlayer Error: " + error); synchronized (AudioSlidePlayer.this) { @@ -213,12 +202,6 @@ public class AudioSlidePlayer implements SensorEventListener { }); } - private MediaSource createMediaSource(@NonNull Uri uri) { - return new ExtractorMediaSource.Factory(new DefaultDataSourceFactory(context, BuildConfig.USER_AGENT)) - .setExtractorsFactory(new DefaultExtractorsFactory().setConstantBitrateSeekingEnabled(true)) - .createMediaSource(uri); - } - public synchronized void stop() { Log.i(TAG, "Stop called!"); @@ -355,7 +338,7 @@ public class AudioSlidePlayer implements SensorEventListener { } if (streamType == AudioManager.STREAM_VOICE_CALL && - mediaPlayer.getAudioStreamType() != streamType && + mediaPlayer.getAudioAttributes().contentType != streamType && !audioManager.isWiredHeadsetOn()) { double position = mediaPlayer.getCurrentPosition(); @@ -370,7 +353,7 @@ public class AudioSlidePlayer implements SensorEventListener { Log.w(TAG, e); } } else if (streamType == AudioManager.STREAM_MUSIC && - mediaPlayer.getAudioStreamType() != streamType && + mediaPlayer.getAudioAttributes().contentType != streamType && System.currentTimeMillis() - startTime > 500) { if (wakeLock != null) wakeLock.release(); @@ -411,7 +394,7 @@ public class AudioSlidePlayer implements SensorEventListener { sendEmptyMessageDelayed(0, 50); } - private boolean isPlayerActive(@NonNull SimpleExoPlayer player) { + private boolean isPlayerActive(@NonNull ExoPlayer player) { return player.getPlaybackState() == Player.STATE_READY || player.getPlaybackState() == Player.STATE_BUFFERING; } } 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 08d3a52a2f..03f70f89e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java @@ -18,42 +18,29 @@ package org.thoughtcrime.securesms.video; import android.content.Context; import android.os.Build; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; -import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; -import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.ExoPlayerFactory; -import com.google.android.exoplayer2.LoadControl; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.exoplayer2.ExoPlayer; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.SimpleExoPlayer; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; -import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.source.ExtractorMediaSource; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelector; +import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.PlayerView; -import com.google.android.exoplayer2.upstream.BandwidthMeter; -import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; -import org.thoughtcrime.securesms.attachments.AttachmentServer; +import org.session.libsession.utilities.ViewUtil; import org.session.libsignal.utilities.Log; +import org.thoughtcrime.securesms.attachments.AttachmentServer; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.VideoSlide; -import org.session.libsession.utilities.ViewUtil; -import org.thoughtcrime.securesms.video.exo.AttachmentDataSourceFactory; import java.io.IOException; @@ -66,7 +53,7 @@ public class VideoPlayer extends FrameLayout { @Nullable private final VideoView videoView; @Nullable private final PlayerView exoView; - @Nullable private SimpleExoPlayer exoPlayer; + @Nullable private ExoPlayer exoPlayer; @Nullable private PlayerControlView exoControls; @Nullable private AttachmentServer attachmentServer; @Nullable private Window window; @@ -84,16 +71,10 @@ public class VideoPlayer extends FrameLayout { inflate(context, R.layout.video_player, this); - if (Build.VERSION.SDK_INT >= 16) { - this.exoView = ViewUtil.findById(this, R.id.video_view); - this.videoView = null; - this.exoControls = new PlayerControlView(getContext()); - this.exoControls.setShowTimeoutMs(-1); - } else { - this.videoView = ViewUtil.findById(this, R.id.video_view); - this.exoView = null; - initializeVideoViewControls(videoView); - } + this.exoView = ViewUtil.findById(this, R.id.video_view); + this.videoView = null; + this.exoControls = new PlayerControlView(getContext()); + this.exoControls.setShowTimeoutMs(-1); } public void setVideoSource(@NonNull VideoSlide videoSource, boolean autoplay) @@ -141,25 +122,20 @@ public class VideoPlayer extends FrameLayout { private void setExoViewSource(@NonNull VideoSlide videoSource, boolean autoplay) throws IOException { - BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter(); - TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter); - TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); - LoadControl loadControl = new DefaultLoadControl(); - - exoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl); + exoPlayer = new ExoPlayer.Builder(getContext()).build(); exoPlayer.addListener(new ExoPlayerListener(window)); + exoPlayer.setAudioAttributes(AudioAttributes.DEFAULT, true); //noinspection ConstantConditions exoView.setPlayer(exoPlayer); //noinspection ConstantConditions exoControls.setPlayer(exoPlayer); - DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(getContext(), "GenericUserAgent", null); - AttachmentDataSourceFactory attachmentDataSourceFactory = new AttachmentDataSourceFactory(getContext(), defaultDataSourceFactory, null); - ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory(); + if(videoSource.getUri() != null){ + MediaItem mediaItem = MediaItem.fromUri(videoSource.getUri()); + exoPlayer.setMediaItem(mediaItem); + } - MediaSource mediaSource = new ExtractorMediaSource(videoSource.getUri(), attachmentDataSourceFactory, extractorsFactory, null, null); - - exoPlayer.prepare(mediaSource); + exoPlayer.prepare(); exoPlayer.setPlayWhenReady(autoplay); } @@ -189,15 +165,7 @@ public class VideoPlayer extends FrameLayout { if (autoplay) this.videoView.start(); } - private void initializeVideoViewControls(@NonNull VideoView videoView) { - MediaController mediaController = new MediaController(getContext()); - mediaController.setAnchorView(videoView); - mediaController.setMediaPlayer(videoView); - - videoView.setMediaController(mediaController); - } - - private static class ExoPlayerListener extends Player.DefaultEventListener { + private static class ExoPlayerListener implements Player.Listener { private final Window window; ExoPlayerListener(Window window) { diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index e9fb04f341..389a190622 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -341,22 +341,6 @@ - - - - - - - - - - - - - - - - diff --git a/libsession/src/main/res/values/attrs.xml b/libsession/src/main/res/values/attrs.xml index a412c13e76..5588e25ece 100644 --- a/libsession/src/main/res/values/attrs.xml +++ b/libsession/src/main/res/values/attrs.xml @@ -270,22 +270,6 @@ - - - - - - - - - - - - - - - -