From 8526a37cc4cd456450022688d8b2a1bd70366232 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 29 Mar 2023 14:39:29 +0800 Subject: [PATCH] Update to Media3 --- app/build.gradle | 22 ++++++-- .../java/com/fongmi/android/tv/bean/Sub.java | 3 +- .../fongmi/android/tv/event/PlayerEvent.java | 2 +- .../com/fongmi/android/tv/player/ExoUtil.java | 53 ++++++++++--------- .../com/fongmi/android/tv/player/Players.java | 20 +++---- .../android/tv/ui/custom/CustomSeekView.java | 6 +-- .../tv/ui/custom/TrackNameProvider.java | 10 ++-- .../tv/ui/custom/dialog/TrackDialog.java | 2 +- .../tv/ui/activity/DetailActivity.java | 10 ++-- .../java/com/fongmi/android/tv/utils/PiP.java | 8 +-- app/src/mobile/res/layout/activity_detail.xml | 4 +- .../mobile/res/layout/view_control_seek.xml | 2 +- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- settings.gradle | 4 +- 15 files changed, 85 insertions(+), 69 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9245e9058..a8f0b2ca1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,6 +55,10 @@ android { outputFileName = "${variant.productFlavors[0].name}-${variant.productFlavors[1].name}.apk" } } + + lint { + disable 'UnsafeOptInUsageError' + } } dependencies { @@ -64,13 +68,21 @@ dependencies { implementation project(':catvod') implementation project(':forcetech') implementation project(':ijkplayer') + implementation project(':media-lib-database') + implementation project(':media-lib-datasource') + implementation project(':media-lib-datasource-rtmp') + implementation project(':media-lib-decoder-av1') + implementation project(':media-lib-decoder-ffmpeg') + implementation project(':media-lib-exoplayer') + implementation project(':media-lib-exoplayer-dash') + implementation project(':media-lib-exoplayer-hls') + implementation project(':media-lib-exoplayer-rtsp') + implementation project(':media-lib-exoplayer-smoothstreaming') + implementation project(':media-lib-extractor') + implementation project(':media-lib-session') + implementation project(':media-lib-ui') pythonImplementation project(':pyramid') - implementation project(':exoplayer-library') - implementation project(':exoplayer-extension-av1') - implementation project(':exoplayer-extension-rtmp') - implementation project(':exoplayer-extension-ffmpeg') implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.5.1' implementation 'androidx.preference:preference:1.2.0' implementation 'androidx.room:room-runtime:2.5.1' diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Sub.java b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java index 2d437d414..9ea302c8d 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Sub.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Sub.java @@ -3,7 +3,8 @@ package com.fongmi.android.tv.bean; import android.net.Uri; import android.text.TextUtils; -import com.google.android.exoplayer2.MediaItem; +import androidx.media3.common.MediaItem; + import com.google.gson.annotations.SerializedName; public class Sub { diff --git a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java index d37310d0b..eed8d1ca4 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java @@ -1,6 +1,6 @@ package com.fongmi.android.tv.event; -import com.google.android.exoplayer2.Player; +import androidx.media3.common.Player; import org.greenrobot.eventbus.EventBus; diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index d58144d37..b52b5b339 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -3,38 +3,39 @@ package com.fongmi.android.tv.player; import android.graphics.Color; import android.net.Uri; +import androidx.media3.common.MediaItem; +import androidx.media3.common.MimeTypes; +import androidx.media3.common.PlaybackException; +import androidx.media3.common.Tracks; +import androidx.media3.common.util.Util; +import androidx.media3.database.DatabaseProvider; +import androidx.media3.database.StandaloneDatabaseProvider; +import androidx.media3.datasource.DataSource; +import androidx.media3.datasource.DefaultDataSource; +import androidx.media3.datasource.DefaultHttpDataSource; +import androidx.media3.datasource.HttpDataSource; +import androidx.media3.datasource.cache.Cache; +import androidx.media3.datasource.cache.CacheDataSource; +import androidx.media3.datasource.cache.NoOpCacheEvictor; +import androidx.media3.datasource.cache.SimpleCache; +import androidx.media3.exoplayer.DefaultRenderersFactory; +import androidx.media3.exoplayer.RenderersFactory; +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; +import androidx.media3.exoplayer.source.MediaSource; +import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; +import androidx.media3.exoplayer.trackselection.TrackSelector; +import androidx.media3.extractor.DefaultExtractorsFactory; +import androidx.media3.extractor.ExtractorsFactory; +import androidx.media3.extractor.ts.DefaultTsPayloadReaderFactory; +import androidx.media3.extractor.ts.TsExtractor; +import androidx.media3.ui.CaptionStyleCompat; + import com.fongmi.android.tv.App; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Sub; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Prefers; -import com.google.android.exoplayer2.DefaultRenderersFactory; -import com.google.android.exoplayer2.MediaItem; -import com.google.android.exoplayer2.PlaybackException; -import com.google.android.exoplayer2.RenderersFactory; -import com.google.android.exoplayer2.Tracks; -import com.google.android.exoplayer2.database.DatabaseProvider; -import com.google.android.exoplayer2.database.StandaloneDatabaseProvider; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; -import com.google.android.exoplayer2.extractor.ExtractorsFactory; -import com.google.android.exoplayer2.extractor.ts.DefaultTsPayloadReaderFactory; -import com.google.android.exoplayer2.extractor.ts.TsExtractor; -import com.google.android.exoplayer2.source.DefaultMediaSourceFactory; -import com.google.android.exoplayer2.source.MediaSource; -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelector; -import com.google.android.exoplayer2.ui.CaptionStyleCompat; -import com.google.android.exoplayer2.upstream.DataSource; -import com.google.android.exoplayer2.upstream.DefaultDataSource; -import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; -import com.google.android.exoplayer2.upstream.HttpDataSource; -import com.google.android.exoplayer2.upstream.cache.Cache; -import com.google.android.exoplayer2.upstream.cache.CacheDataSource; -import com.google.android.exoplayer2.upstream.cache.NoOpCacheEvictor; -import com.google.android.exoplayer2.upstream.cache.SimpleCache; -import com.google.android.exoplayer2.util.MimeTypes; -import com.google.android.exoplayer2.util.Util; import com.google.common.net.HttpHeaders; import java.util.ArrayList; diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 9a4b6c1b9..a3824c0ad 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -1,6 +1,14 @@ package com.fongmi.android.tv.player; import androidx.annotation.NonNull; +import androidx.media3.common.PlaybackException; +import androidx.media3.common.Player; +import androidx.media3.common.TrackSelectionOverride; +import androidx.media3.common.util.Util; +import androidx.media3.exoplayer.DefaultLoadControl; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.exoplayer.analytics.AnalyticsListener; +import androidx.media3.ui.PlayerView; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; @@ -16,14 +24,6 @@ import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; import com.github.catvod.crawler.SpiderDebug; -import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.PlaybackException; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.analytics.AnalyticsListener; -import com.google.android.exoplayer2.trackselection.TrackSelectionOverride; -import com.google.android.exoplayer2.ui.StyledPlayerView; -import com.google.android.exoplayer2.util.Util; import com.google.common.collect.ImmutableList; import java.util.Formatter; @@ -66,14 +66,14 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM return this; } - public void set(StyledPlayerView exo, IjkVideoView ijk) { + public void set(PlayerView exo, IjkVideoView ijk) { releaseExo(); releaseIjk(); setupExo(exo); setupIjk(ijk); } - private void setupExo(StyledPlayerView view) { + private void setupExo(PlayerView view) { exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(ExoUtil.buildRenderersFactory()).setTrackSelector(ExoUtil.buildTrackSelector()).build(); exoPlayer.addAnalyticsListener(this); exoPlayer.setPlayWhenReady(true); diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java index 41ccdda18..bafe6e5b4 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/CustomSeekView.java @@ -8,12 +8,12 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.media3.common.util.Util; +import androidx.media3.ui.DefaultTimeBar; +import androidx.media3.ui.TimeBar; import com.fongmi.android.tv.R; import com.fongmi.android.tv.player.Players; -import com.google.android.exoplayer2.ui.DefaultTimeBar; -import com.google.android.exoplayer2.ui.TimeBar; -import com.google.android.exoplayer2.util.Util; public class CustomSeekView extends FrameLayout implements TimeBar.OnScrubListener { diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackNameProvider.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackNameProvider.java index aa0fc55fc..c0ee2a574 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackNameProvider.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackNameProvider.java @@ -5,13 +5,13 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.media3.common.C; +import androidx.media3.common.Format; +import androidx.media3.common.MimeTypes; +import androidx.media3.common.util.Util; +import androidx.media3.ui.R; import com.fongmi.android.tv.App; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.ui.R; -import com.google.android.exoplayer2.util.MimeTypes; -import com.google.android.exoplayer2.util.Util; import java.util.Locale; diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java index aaa55a242..a4b21f606 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java @@ -5,6 +5,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.media3.common.Tracks; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.bean.Track; @@ -13,7 +14,6 @@ import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.adapter.TrackAdapter; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.TrackNameProvider; -import com.google.android.exoplayer2.Tracks; import java.util.ArrayList; import java.util.List; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 45a364bee..6c796bbd3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -20,6 +20,9 @@ import androidx.core.app.ShareCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.common.C; +import androidx.media3.common.Player; +import androidx.media3.ui.PlayerView; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; @@ -60,9 +63,6 @@ import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Traffic; import com.fongmi.android.tv.utils.Utils; -import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.Player; -import com.google.android.exoplayer2.ui.StyledPlayerView; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.permissionx.guolindev.PermissionX; @@ -164,7 +164,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis return mHistory != null && mHistory.getScale() != -1 ? mHistory.getScale() : Prefers.getScale(); } - private StyledPlayerView getExo() { + private PlayerView getExo() { return Prefers.getRender() == 0 ? mBinding.surface : mBinding.texture; } @@ -742,7 +742,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void checkPlayImg(boolean playing) { - mBinding.control.play.setImageResource(playing ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play); + mBinding.control.play.setImageResource(playing ? androidx.media3.ui.R.drawable.exo_icon_pause : androidx.media3.ui.R.drawable.exo_icon_play); mPiP.update(this, playing); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java index f54c0198b..978340321 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java +++ b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java @@ -11,6 +11,8 @@ import android.os.Build; import android.util.Rational; import android.view.View; +import androidx.media3.ui.R; + import java.util.ArrayList; import java.util.List; @@ -42,10 +44,10 @@ public class PiP { public void update(Activity activity, boolean play) { if (!Utils.hasPiP()) return; List actions = new ArrayList<>(); - int icon = play ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play; - actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); + int icon = play ? R.drawable.exo_icon_pause : R.drawable.exo_icon_play; + actions.add(new RemoteAction(Icon.createWithResource(activity, R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); actions.add(new RemoteAction(Icon.createWithResource(activity, icon), "", "", PendingIntent.getBroadcast(activity, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); - actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); + actions.add(new RemoteAction(Icon.createWithResource(activity, R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE))); activity.setPictureInPictureParams(builder.setActions(actions).build()); } diff --git a/app/src/mobile/res/layout/activity_detail.xml b/app/src/mobile/res/layout/activity_detail.xml index a5048a553..5de766f97 100644 --- a/app/src/mobile/res/layout/activity_detail.xml +++ b/app/src/mobile/res/layout/activity_detail.xml @@ -14,7 +14,7 @@ android:clickable="true" android:focusable="true"> - - -