migrated to media3, dependency update

This commit is contained in:
nuclearfog 2023-07-14 22:28:21 +02:00
parent ea8b0ca764
commit 9c02e04e9f
No known key found for this signature in database
GPG Key ID: 03488A185C476379
7 changed files with 74 additions and 71 deletions

View File

@ -42,9 +42,6 @@ android {
dependencies { dependencies {
implementation 'com.google.android.material:material:1.9.0' implementation 'com.google.android.material:material:1.9.0'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.0'
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.0'
implementation 'com.google.android.exoplayer:extension-okhttp:2.19.0'
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.recyclerview:recyclerview:1.3.0' implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
@ -52,7 +49,7 @@ dependencies {
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
implementation 'org.jsoup:jsoup:1.15.4' implementation 'org.jsoup:jsoup:1.15.4'
//noinspection GradleDependency //noinspection GradleDependency
implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:okhttp:4.11.0'
//noinspection GradleDependency //noinspection GradleDependency
implementation 'com.squareup.picasso:picasso:2.8' implementation 'com.squareup.picasso:picasso:2.8'
implementation 'jp.wasabeef:picasso-transformations:2.4.0' implementation 'jp.wasabeef:picasso-transformations:2.4.0'
@ -62,4 +59,7 @@ dependencies {
implementation 'com.github.nuclearfog:LinkAndScrollMovement:1.4.1' implementation 'com.github.nuclearfog:LinkAndScrollMovement:1.4.1'
implementation 'com.github.kyleduo:SwitchButton:2.0.3-SNAPSHOT' implementation 'com.github.kyleduo:SwitchButton:2.0.3-SNAPSHOT'
implementation 'com.github.UnifiedPush:android-connector:2.1.1' implementation 'com.github.UnifiedPush:android-connector:2.1.1'
implementation 'androidx.media3:media3-exoplayer:1.1.0'
implementation 'androidx.media3:media3-ui:1.1.0'
implementation 'androidx.media3:media3-datasource-okhttp:1.1.0'
} }

View File

@ -1,5 +1,6 @@
package org.nuclearfog.twidda.ui.activities; package org.nuclearfog.twidda.ui.activities;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -17,26 +18,25 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.media3.common.MediaItem;
import com.google.android.exoplayer2.ExoPlayer; import androidx.media3.common.PlaybackException;
import com.google.android.exoplayer2.MediaItem; import androidx.media3.common.Player;
import com.google.android.exoplayer2.PlaybackException; import androidx.media3.datasource.ContentDataSource;
import com.google.android.exoplayer2.Player; import androidx.media3.ui.PlayerView;
import com.google.android.exoplayer2.Renderer; import androidx.media3.datasource.DataSource;
import com.google.android.exoplayer2.RenderersFactory; import androidx.media3.datasource.okhttp.OkHttpDataSource;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import androidx.media3.exoplayer.ExoPlayer;
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import androidx.media3.exoplayer.Renderer;
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; import androidx.media3.exoplayer.RenderersFactory;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
import com.google.android.exoplayer2.metadata.MetadataOutput; import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.source.ProgressiveMediaSource; import androidx.media3.exoplayer.metadata.MetadataOutput;
import com.google.android.exoplayer2.text.TextOutput; import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.ui.StyledPlayerView; import androidx.media3.exoplayer.text.TextOutput;
import com.google.android.exoplayer2.upstream.ContentDataSource; import androidx.media3.exoplayer.video.MediaCodecVideoRenderer;
import com.google.android.exoplayer2.upstream.DataSource; import androidx.media3.exoplayer.video.VideoRendererEventListener;
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import androidx.media3.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.video.VideoRendererEventListener;
import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.helper.MediaStatus; import org.nuclearfog.twidda.backend.helper.MediaStatus;
@ -52,11 +52,13 @@ import java.io.Serializable;
import okhttp3.Call; import okhttp3.Call;
/** /**
* video player activity to show local and online videos/animations * video player activity to show local and online videos/animations
* *
* @author nuclearfog * @author nuclearfog
*/ */
@SuppressLint("UnsafeOptInUsageError")
public class VideoViewer extends AppCompatActivity implements Player.Listener, DescriptionCallback, RenderersFactory { public class VideoViewer extends AppCompatActivity implements Player.Listener, DescriptionCallback, RenderersFactory {
/** /**
@ -78,7 +80,7 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
@Nullable @Nullable
private DescriptionView descriptionView; // only used in portrait layout private DescriptionView descriptionView; // only used in portrait layout
private Toolbar toolbar; private Toolbar toolbar;
private StyledPlayerView playerView; private PlayerView playerView;
private DescriptionDialog descriptionDialog; private DescriptionDialog descriptionDialog;
@ -277,9 +279,11 @@ public class VideoViewer extends AppCompatActivity implements Player.Listener, D
} }
@NonNull
@Override @Override
public Renderer[] createRenderers(Handler eventHandler, VideoRendererEventListener videoRendererEventListener, AudioRendererEventListener audioRendererEventListener, public Renderer[] createRenderers(@NonNull Handler eventHandler, @NonNull VideoRendererEventListener videoRendererEventListener,
TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) { @NonNull AudioRendererEventListener audioRendererEventListener, @NonNull TextOutput textRendererOutput,
@NonNull MetadataOutput metadataRendererOutput) {
return new Renderer[]{ return new Renderer[]{
new MediaCodecVideoRenderer(getApplicationContext(), MediaCodecSelector.DEFAULT, 0L, eventHandler, videoRendererEventListener, 4), new MediaCodecVideoRenderer(getApplicationContext(), MediaCodecSelector.DEFAULT, 0L, eventHandler, videoRendererEventListener, 4),
new MediaCodecAudioRenderer(getApplicationContext(), MediaCodecSelector.DEFAULT, eventHandler, audioRendererEventListener) new MediaCodecAudioRenderer(getApplicationContext(), MediaCodecSelector.DEFAULT, eventHandler, audioRendererEventListener)

View File

@ -1,8 +1,8 @@
package org.nuclearfog.twidda.ui.dialogs; package org.nuclearfog.twidda.ui.dialogs;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -12,24 +12,23 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.MediaItem;
import com.google.android.exoplayer2.ExoPlayer; import androidx.media3.datasource.ContentDataSource;
import com.google.android.exoplayer2.MediaItem; import androidx.media3.datasource.DataSource;
import com.google.android.exoplayer2.Renderer; import androidx.media3.datasource.okhttp.OkHttpDataSource;
import com.google.android.exoplayer2.RenderersFactory; import androidx.media3.exoplayer.ExoPlayer;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import androidx.media3.exoplayer.Renderer;
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import androidx.media3.exoplayer.RenderersFactory;
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource; import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import androidx.media3.exoplayer.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.metadata.MetadataOutput; import androidx.media3.exoplayer.metadata.MetadataOutput;
import com.google.android.exoplayer2.source.MediaSource; import androidx.media3.exoplayer.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource; import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.text.TextOutput; import androidx.media3.exoplayer.text.TextOutput;
import com.google.android.exoplayer2.ui.PlayerControlView; import androidx.media3.exoplayer.video.VideoRendererEventListener;
import com.google.android.exoplayer2.upstream.ContentDataSource; import androidx.media3.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.upstream.DataSource; import androidx.media3.ui.PlayerControlView;
import com.google.android.exoplayer2.video.VideoRendererEventListener;
import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.backend.utils.ConnectionBuilder; import org.nuclearfog.twidda.backend.utils.ConnectionBuilder;
@ -44,7 +43,8 @@ import okhttp3.Call;
* *
* @author nuclearfog * @author nuclearfog
*/ */
public class AudioPlayerDialog extends Dialog implements OnClickListener, Closeable { @SuppressLint("UnsafeOptInUsageError")
public class AudioPlayerDialog extends Dialog implements OnClickListener, RenderersFactory, Closeable {
private PlayerControlView controls; private PlayerControlView controls;
private TextView mediaLink; private TextView mediaLink;
@ -59,7 +59,7 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea
*/ */
public AudioPlayerDialog(Activity activity) { public AudioPlayerDialog(Activity activity) {
super(activity, R.style.AudioDialog); super(activity, R.style.AudioDialog);
player = new ExoPlayer.Builder(activity.getApplicationContext(), createRenderer(activity.getApplicationContext())).build(); player = new ExoPlayer.Builder(activity.getApplicationContext(), this).build();
} }
@ -70,11 +70,7 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea
mediaLink = findViewById(R.id.dialog_audio_player_share); mediaLink = findViewById(R.id.dialog_audio_player_share);
controls = findViewById(R.id.dialog_audio_player_controls); controls = findViewById(R.id.dialog_audio_player_controls);
controls.setShowNextButton(false);
controls.setShowPreviousButton(false);
controls.setPlayer(player); controls.setPlayer(player);
controls.setShowTimeoutMs(-1);
mediaLink.setOnClickListener(this); mediaLink.setOnClickListener(this);
} }
@ -154,6 +150,17 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea
} }
} }
@NonNull
@Override
public Renderer[] createRenderers(@NonNull Handler eventHandler, @NonNull VideoRendererEventListener videoRendererEventListener,
@NonNull AudioRendererEventListener audioRendererEventListener, @NonNull TextOutput textRendererOutput,
@NonNull MetadataOutput metadataRendererOutput) {
return new Renderer[]{
new MediaCodecAudioRenderer(getContext(), MediaCodecSelector.DEFAULT, eventHandler, audioRendererEventListener)
};
}
/** /**
* show dialog and play audio * show dialog and play audio
* *
@ -165,19 +172,4 @@ public class AudioPlayerDialog extends Dialog implements OnClickListener, Closea
super.show(); super.show();
} }
} }
/**
*
*/
private RenderersFactory createRenderer(Context context) {
return new RenderersFactory() {
@Override
public Renderer[] createRenderers(Handler eventHandler, VideoRendererEventListener videoRendererEventListener, AudioRendererEventListener audioRendererEventListener,
TextOutput textRendererOutput, MetadataOutput metadataRendererOutput) {
return new Renderer[]{
new MediaCodecAudioRenderer(context, MediaCodecSelector.DEFAULT, eventHandler, audioRendererEventListener)
};
}
};
}
} }

View File

@ -14,7 +14,7 @@
android:layout_height="@dimen/page_status_toolbar_height" android:layout_height="@dimen/page_status_toolbar_height"
android:visibility="gone" /> android:visibility="gone" />
<com.google.android.exoplayer2.ui.StyledPlayerView <androidx.media3.ui.PlayerView
android:id="@+id/page_video_player" android:id="@+id/page_video_player"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"

View File

@ -6,11 +6,16 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/dialog_audio_player_layout_padding"> android:padding="@dimen/dialog_audio_player_layout_padding">
<com.google.android.exoplayer2.ui.PlayerControlView <androidx.media3.ui.PlayerControlView
android:id="@+id/dialog_audio_player_controls" android:id="@+id/dialog_audio_player_controls"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="@dimen/dialog_audio_player_layout_margin" /> android:minHeight="@dimen/dialog_audio_player_height"
android:layout_margin="@dimen/dialog_audio_player_layout_margin"
app:show_shuffle_button="false"
app:show_previous_button="false"
app:show_next_button="false"
app:show_timeout="-1"/>
<TextView <TextView
android:id="@+id/dialog_audio_player_share" android:id="@+id/dialog_audio_player_share"
@ -19,6 +24,7 @@
android:drawablePadding="@dimen/dialog_audio_player_drawable_padding" android:drawablePadding="@dimen/dialog_audio_player_drawable_padding"
android:lines="1" android:lines="1"
android:text="@string/button_share" android:text="@string/button_share"
android:layout_margin="@dimen/dialog_audio_player_layout_margin"
app:drawableStartCompat="@drawable/share" /> app:drawableStartCompat="@drawable/share" />
</LinearLayout> </LinearLayout>

View File

@ -18,7 +18,7 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintEnd_toEndOf="parent" />
<com.google.android.exoplayer2.ui.StyledPlayerView <androidx.media3.ui.PlayerView
android:id="@+id/page_video_player" android:id="@+id/page_video_player"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"

View File

@ -305,6 +305,7 @@
<dimen name="dialog_status_dropdown_height">28sp</dimen> <dimen name="dialog_status_dropdown_height">28sp</dimen>
<!--dimens of dialog_audio_player.xml--> <!--dimens of dialog_audio_player.xml-->
<dimen name="dialog_audio_player_height">200sp</dimen>
<dimen name="dialog_audio_player_drawable_padding">5dp</dimen> <dimen name="dialog_audio_player_drawable_padding">5dp</dimen>
<dimen name="dialog_audio_player_layout_padding">5dp</dimen> <dimen name="dialog_audio_player_layout_padding">5dp</dimen>
<dimen name="dialog_audio_player_layout_margin">5dp</dimen> <dimen name="dialog_audio_player_layout_margin">5dp</dimen>