From ba31550ddb7147f6bf004e894082b7c73911920c Mon Sep 17 00:00:00 2001 From: FongMi Date: Sat, 4 Jan 2025 00:49:57 +0800 Subject: [PATCH] Optimize player --- .../android/tv/ui/activity/LiveActivity.java | 27 +++++++------- .../android/tv/ui/activity/VideoActivity.java | 30 ++++++++-------- .../com/fongmi/android/tv/bean/Track.java | 2 ++ .../fongmi/android/tv/db/dao/TrackDao.java | 2 +- .../fongmi/android/tv/event/PlayerEvent.java | 14 +++++++- .../com/fongmi/android/tv/player/Players.java | 16 +++++++-- .../android/tv/ui/dialog/TrackDialog.java | 2 +- .../android/tv/ui/activity/LiveActivity.java | 28 +++++++-------- .../android/tv/ui/activity/VideoActivity.java | 35 +++++++++---------- app/src/mobile/res/layout/dialog_track.xml | 2 +- 10 files changed, 90 insertions(+), 68 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index c3e276d4c..58d8cb94a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -701,32 +701,31 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { switch (event.getState()) { - case 0: - setTrackVisible(false); - break; - case Player.STATE_IDLE: - break; case Player.STATE_BUFFERING: showProgress(); break; case Player.STATE_READY: - setMetadata(); hideProgress(); - mPlayers.reset(); - setTrackVisible(true); - mBinding.widget.size.setText(mPlayers.getSizeText()); break; case Player.STATE_ENDED: checkNext(); break; + case PlayerEvent.TRACK: + setMetadata(); + mPlayers.reset(); + setTrackVisible(); + break; + case PlayerEvent.SIZE: + mBinding.widget.size.setText(mPlayers.getSizeText()); + break; } } - private void setTrackVisible(boolean visible) { - mBinding.control.text.setVisibility(visible ? View.VISIBLE : View.GONE); - mBinding.control.speed.setVisibility(visible && mPlayers.isVod() ? View.VISIBLE : View.GONE); - mBinding.control.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); - mBinding.control.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + private void setTrackVisible() { + mBinding.control.text.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_TEXT) || mPlayers.isVod() ? View.VISIBLE : View.GONE); + mBinding.control.audio.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); + mBinding.control.video.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + mBinding.control.speed.setVisibility(mPlayers.isVod() ? View.VISIBLE : View.GONE); } private void setMetadata() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 7595db820..ba4acb7a3 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1032,28 +1032,28 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List public void onPlayerEvent(PlayerEvent event) { if (isBackground()) return; switch (event.getState()) { - case 0: + case PlayerEvent.PREPARE: setInitTrack(true); - setTrackVisible(false); mClock.setCallback(this); break; - case Player.STATE_IDLE: - break; case Player.STATE_BUFFERING: showProgress(); break; case Player.STATE_READY: - stopSearch(); - setMetadata(); hideProgress(); - mPlayers.reset(); - setDefaultTrack(); - setTrackVisible(true); - mBinding.widget.size.setText(mPlayers.getSizeText()); break; case Player.STATE_ENDED: checkEnded(); break; + case PlayerEvent.TRACK: + setMetadata(); + setInitTrack(); + mPlayers.reset(); + setTrackVisible(); + break; + case PlayerEvent.SIZE: + mBinding.widget.size.setText(mPlayers.getSizeText()); + break; } } @@ -1066,13 +1066,13 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } } - private void setTrackVisible(boolean visible) { - mBinding.control.text.setVisibility(visible ? View.VISIBLE : View.GONE); - mBinding.control.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); - mBinding.control.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + private void setTrackVisible() { + mBinding.control.text.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_TEXT) || mPlayers.isVod() ? View.VISIBLE : View.GONE); + mBinding.control.audio.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); + mBinding.control.video.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); } - private void setDefaultTrack() { + private void setInitTrack() { if (isInitTrack()) { setInitTrack(false); mPlayers.setTrack(Track.find(getHistoryKey())); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Track.java b/app/src/main/java/com/fongmi/android/tv/bean/Track.java index 1bcdce56f..ff6c5f96f 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Track.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Track.java @@ -1,6 +1,7 @@ package com.fongmi.android.tv.bean; import androidx.annotation.NonNull; +import androidx.media3.common.C; import androidx.room.Entity; import androidx.room.Index; import androidx.room.PrimaryKey; @@ -97,6 +98,7 @@ public class Track { } public void save() { + if (getType() != C.TRACK_TYPE_TEXT) return; AppDatabase.get().getTrackDao().insert(this); } diff --git a/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java index d2ec7ff70..c1ac0700c 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java +++ b/app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java @@ -12,7 +12,7 @@ import java.util.List; @Dao public abstract class TrackDao extends BaseDao { - @Query("SELECT * FROM Track WHERE `key` = :key") + @Query("SELECT * FROM Track WHERE `key` = :key and type = 3") public abstract List find(String key); @Insert(onConflict = OnConflictStrategy.REPLACE) 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 f3e7e0a24..1291019e2 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 @@ -4,10 +4,22 @@ import org.greenrobot.eventbus.EventBus; public class PlayerEvent { + public static final int PREPARE = 0; + public static final int TRACK = 21; + public static final int SIZE = 11; + private final int state; public static void prepare() { - EventBus.getDefault().post(new PlayerEvent(0)); + EventBus.getDefault().post(new PlayerEvent(PREPARE)); + } + + public static void track() { + EventBus.getDefault().post(new PlayerEvent(TRACK)); + } + + public static void size() { + EventBus.getDefault().post(new PlayerEvent(SIZE)); } public static void state(int state) { 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 3472483f9..35756ce9f 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 @@ -21,6 +21,8 @@ import androidx.media3.common.AudioAttributes; import androidx.media3.common.C; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; +import androidx.media3.common.Tracks; +import androidx.media3.common.VideoSize; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.drm.FrameworkMediaDrm; import androidx.media3.exoplayer.util.EventLogger; @@ -223,11 +225,11 @@ public class Players implements Player.Listener, ParseCallback { } public boolean isLive() { - return getDuration() < 5 * 60 * 1000 || exoPlayer.isCurrentMediaItemLive(); + return getDuration() < 3 * 60 * 1000 || exoPlayer.isCurrentMediaItemLive(); } public boolean isVod() { - return getDuration() > 5 * 60 * 1000 && !exoPlayer.isCurrentMediaItemLive(); + return getDuration() > 3 * 60 * 1000 && !exoPlayer.isCurrentMediaItemLive(); } public boolean isHard() { @@ -556,6 +558,16 @@ public class Players implements Player.Listener, ParseCallback { PlayerEvent.state(state); } + @Override + public void onVideoSizeChanged(@NonNull VideoSize videoSize) { + PlayerEvent.size(); + } + + @Override + public void onTracksChanged(@NonNull Tracks tracks) { + PlayerEvent.track(); + } + @Override public void onPlayerError(@NonNull PlaybackException error) { Logger.t(TAG).e(error.errorCode + "," + url); diff --git a/app/src/main/java/com/fongmi/android/tv/ui/dialog/TrackDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/dialog/TrackDialog.java index 0fe7b699f..5ccf0c239 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/dialog/TrackDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/dialog/TrackDialog.java @@ -79,7 +79,7 @@ public final class TrackDialog extends BaseDialog implements TrackAdapter.OnClic binding.recycler.post(() -> binding.recycler.scrollToPosition(adapter.getSelected())); binding.recycler.setVisibility(adapter.getItemCount() == 0 ? View.GONE : View.VISIBLE); binding.choose.setVisibility(type == C.TRACK_TYPE_TEXT && player.isVod() ? View.VISIBLE : View.GONE); - binding.subtitle.setVisibility(type == C.TRACK_TYPE_TEXT ? View.VISIBLE : View.GONE); + binding.subtitle.setVisibility(type == C.TRACK_TYPE_TEXT && player.haveTrack(C.TRACK_TYPE_TEXT) ? View.VISIBLE : View.GONE); binding.title.setText(ResUtil.getStringArray(R.array.select_track)[type - 1]); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 1e1733c0b..7e80f5cab 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -752,34 +752,32 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { switch (event.getState()) { - case 0: - setTrackVisible(false); - break; - case Player.STATE_IDLE: - break; case Player.STATE_BUFFERING: showProgress(); break; case Player.STATE_READY: - setMetadata(); hideProgress(); - mPlayers.reset(); - setTrackVisible(true); checkPlayImg(mPlayers.isPlaying()); - mBinding.control.size.setText(mPlayers.getSizeText()); - if (isVisible(mBinding.control.getRoot())) showControl(); break; case Player.STATE_ENDED: checkNext(); break; + case PlayerEvent.TRACK: + setMetadata(); + mPlayers.reset(); + setTrackVisible(); + break; + case PlayerEvent.SIZE: + mBinding.control.size.setText(mPlayers.getSizeText()); + break; } } - private void setTrackVisible(boolean visible) { - mBinding.control.action.text.setVisibility(visible ? View.VISIBLE : View.GONE); - mBinding.control.action.speed.setVisibility(visible && mPlayers.isVod() ? View.VISIBLE : View.GONE); - mBinding.control.action.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); - mBinding.control.action.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + private void setTrackVisible() { + mBinding.control.action.text.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_TEXT) || mPlayers.isVod() ? View.VISIBLE : View.GONE); + mBinding.control.action.audio.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); + mBinding.control.action.video.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + mBinding.control.action.speed.setVisibility(mPlayers.isVod() ? View.VISIBLE : View.GONE); } private void setMetadata() { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 96ca9b13f..a43168b43 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1078,35 +1078,34 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo public void onPlayerEvent(PlayerEvent event) { if (isRedirect()) return; switch (event.getState()) { - case 0: + case PlayerEvent.PREPARE: setInitTrack(true); - setTrackVisible(false); mClock.setCallback(this); break; - case Player.STATE_IDLE: - break; case Player.STATE_BUFFERING: showProgress(); break; case Player.STATE_READY: - stopSearch(); - checkRotate(); - setMetadata(); hideProgress(); - mPlayers.reset(); - setDefaultTrack(); - setTrackVisible(true); checkPlayImg(mPlayers.isPlaying()); - mBinding.control.size.setText(mPlayers.getSizeText()); - if (isVisible(mBinding.control.getRoot())) showControl(); break; case Player.STATE_ENDED: checkEnded(); break; + case PlayerEvent.TRACK: + setMetadata(); + setInitTrack(); + mPlayers.reset(); + setTrackVisible(); + break; + case PlayerEvent.SIZE: + checkPortrait(); + mBinding.control.size.setText(mPlayers.getSizeText()); + break; } } - private void checkRotate() { + private void checkPortrait() { if (isFullscreen() && !isRotate() && mPlayers.isPortrait()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT); setRotate(true); @@ -1123,14 +1122,14 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo } } - private void setTrackVisible(boolean visible) { - mBinding.control.action.text.setVisibility(visible ? View.VISIBLE : View.GONE); - mBinding.control.action.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); - mBinding.control.action.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + private void setTrackVisible() { + mBinding.control.action.text.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_TEXT) || mPlayers.isVod() ? View.VISIBLE : View.GONE); + mBinding.control.action.audio.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); + mBinding.control.action.video.setVisibility(mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.setTrackVisible(); } - private void setDefaultTrack() { + private void setInitTrack() { if (isInitTrack()) { setInitTrack(false); mPlayers.setTrack(Track.find(getHistoryKey())); diff --git a/app/src/mobile/res/layout/dialog_track.xml b/app/src/mobile/res/layout/dialog_track.xml index ce08179cc..75e8467a3 100644 --- a/app/src/mobile/res/layout/dialog_track.xml +++ b/app/src/mobile/res/layout/dialog_track.xml @@ -26,7 +26,6 @@ android:id="@+id/choose" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="16dp" android:background="?attr/selectableItemBackgroundBorderless" android:src="@drawable/ic_action_choose" android:visibility="gone" @@ -36,6 +35,7 @@ android:id="@+id/subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="16dp" android:background="?attr/selectableItemBackgroundBorderless" android:src="@drawable/ic_action_subtitle" android:visibility="gone"