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 +