diff --git a/build.gradle b/build.gradle
index 36f563d22..66adb62b5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -162,8 +162,8 @@ dependencies {
implementation 'androidx.work:work-runtime:2.8.1'
implementation 'androidx.emoji2:emoji2-emojipicker:1.4.0'
implementation 'com.google.guava:guava:29.0-android'
- implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6' // plays video and audio
- implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.6'
+ implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1' // plays video and audio
+ implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.journeyapps:zxing-android-embedded:3.4.0' // QR Code scanner
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library
diff --git a/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java b/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
index b48d1301b..375291bd5 100644
--- a/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
+++ b/src/main/java/org/thoughtcrime/securesms/audio/AudioSlidePlayer.java
@@ -16,16 +16,16 @@ import androidx.annotation.Nullable;
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.MediaItem;
+import com.google.android.exoplayer2.PlaybackException;
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.extractor.ExtractorsFactory;
-import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
+import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
@@ -76,10 +76,13 @@ public class AudioSlidePlayer {
public void requestDuration() {
try {
- LoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE).createDefaultLoadControl();
- durationCalculator = ExoPlayerFactory.newSimpleInstance(context, new DefaultRenderersFactory(context), new DefaultTrackSelector(), loadControl);
+ LoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE).build();
+ durationCalculator = new SimpleExoPlayer.Builder(context, new DefaultRenderersFactory(context))
+ .setTrackSelector(new DefaultTrackSelector(context))
+ .setLoadControl(loadControl)
+ .build();
durationCalculator.setPlayWhenReady(false);
- durationCalculator.addListener(new Player.EventListener() {
+ durationCalculator.addListener(new Player.Listener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == Player.STATE_READY) {
@@ -113,16 +116,19 @@ public class AudioSlidePlayer {
throw new IOException("Slide has no URI!");
}
- 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);
+ LoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE).build();
+ this.mediaPlayer = new SimpleExoPlayer.Builder(context, new DefaultRenderersFactory(context))
+ .setTrackSelector(new DefaultTrackSelector(context))
+ .setLoadControl(loadControl)
+ .build();
mediaPlayer.prepare(createMediaSource(slide.getUri()));
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(), false);
+ mediaPlayer.addListener(new Player.Listener() {
boolean started = false;
@@ -171,7 +177,7 @@ public class AudioSlidePlayer {
}
@Override
- public void onPlayerError(ExoPlaybackException error) {
+ public void onPlayerError(PlaybackException error) {
Log.w(TAG, "MediaPlayer Error: " + error);
synchronized (AudioSlidePlayer.this) {
@@ -194,9 +200,8 @@ public class AudioSlidePlayer {
AttachmentDataSourceFactory attachmentDataSourceFactory = new AttachmentDataSourceFactory(defaultDataSourceFactory);
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory().setConstantBitrateSeekingEnabled(true);
- return new ExtractorMediaSource.Factory(attachmentDataSourceFactory)
- .setExtractorsFactory(extractorsFactory)
- .createMediaSource(uri);
+ return new ProgressiveMediaSource.Factory(attachmentDataSourceFactory, extractorsFactory)
+ .createMediaSource(MediaItem.fromUri(uri));
}
public synchronized void stop() {
diff --git a/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java b/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
index e5b001a41..818a478fb 100644
--- a/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
+++ b/src/main/java/org/thoughtcrime/securesms/video/VideoPlayer.java
@@ -17,27 +17,26 @@
package org.thoughtcrime.securesms.video;
import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import com.google.android.exoplayer2.DefaultLoadControl;
-import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.LoadControl;
+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.source.ProgressiveMediaSource;
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.ui.SimpleExoPlayerView;
+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;
@@ -49,7 +48,7 @@ import org.thoughtcrime.securesms.video.exo.AttachmentDataSourceFactory;
public class VideoPlayer extends FrameLayout {
- @Nullable private final SimpleExoPlayerView exoView;
+ @Nullable private final PlayerView exoView;
@Nullable private SimpleExoPlayer exoPlayer;
@Nullable private Window window;
@@ -93,12 +92,15 @@ public class VideoPlayer extends FrameLayout {
private void setExoViewSource(@NonNull VideoSlide videoSource, boolean autoplay)
{
- BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
- TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
- TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
+ BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(getContext()).build();
+ TrackSelector trackSelector = new DefaultTrackSelector(getContext());
LoadControl loadControl = new DefaultLoadControl();
- exoPlayer = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
+ exoPlayer = new SimpleExoPlayer.Builder(getContext())
+ .setTrackSelector(trackSelector)
+ .setBandwidthMeter(bandwidthMeter)
+ .setLoadControl(loadControl)
+ .build();
exoPlayer.addListener(new ExoPlayerListener(window));
//noinspection ConstantConditions
exoView.setPlayer(exoPlayer);
@@ -107,13 +109,14 @@ public class VideoPlayer extends FrameLayout {
AttachmentDataSourceFactory attachmentDataSourceFactory = new AttachmentDataSourceFactory(defaultDataSourceFactory);
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
- MediaSource mediaSource = new ExtractorMediaSource(videoSource.getUri(), attachmentDataSourceFactory, extractorsFactory, null, null);
+ MediaSource mediaSource = new ProgressiveMediaSource.Factory(attachmentDataSourceFactory, extractorsFactory)
+ .createMediaSource(MediaItem.fromUri(videoSource.getUri()));
exoPlayer.prepare(mediaSource);
exoPlayer.setPlayWhenReady(autoplay);
}
- private static class ExoPlayerListener implements Player.EventListener {
+ private static class ExoPlayerListener implements Player.Listener {
private final Window window;
ExoPlayerListener(Window window) {
diff --git a/src/main/res/layout-v16/video_player.xml b/src/main/res/layout-v16/video_player.xml
deleted file mode 100644
index 9d8b07520..000000000
--- a/src/main/res/layout-v16/video_player.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/res/layout/video_player.xml b/src/main/res/layout/video_player.xml
index 144e0f51e..25f852928 100644
--- a/src/main/res/layout/video_player.xml
+++ b/src/main/res/layout/video_player.xml
@@ -4,10 +4,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+
-
\ No newline at end of file
+