Optimize player

pull/586/head
FongMi 12 months ago
parent e50f1aec26
commit ba31550ddb
  1. 27
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 30
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  3. 2
      app/src/main/java/com/fongmi/android/tv/bean/Track.java
  4. 2
      app/src/main/java/com/fongmi/android/tv/db/dao/TrackDao.java
  5. 14
      app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java
  6. 16
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  7. 2
      app/src/main/java/com/fongmi/android/tv/ui/dialog/TrackDialog.java
  8. 28
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  9. 35
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  10. 2
      app/src/mobile/res/layout/dialog_track.xml

@ -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() {

@ -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()));

@ -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);
}

@ -12,7 +12,7 @@ import java.util.List;
@Dao
public abstract class TrackDao extends BaseDao<Track> {
@Query("SELECT * FROM Track WHERE `key` = :key")
@Query("SELECT * FROM Track WHERE `key` = :key and type = 3")
public abstract List<Track> find(String key);
@Insert(onConflict = OnConflictStrategy.REPLACE)

@ -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) {

@ -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);

@ -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]);
}

@ -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() {

@ -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()));

@ -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"

Loading…
Cancel
Save