diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 301da72a4..fcc451ea2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -61,6 +61,7 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { private boolean mFullscreen; private KeyDown mKeyDown; private Handler mHandler; + private History mHistory; private int mCurrent; private String getKey() { @@ -127,7 +128,11 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { mControl.next.setOnClickListener(view -> onNext()); mControl.prev.setOnClickListener(view -> onPrev()); mControl.scale.setOnClickListener(view -> onScale()); - mControl.reset.setOnClickListener(view -> getPlayer(true)); + mControl.reset.setOnClickListener(view -> onReset()); + mControl.ending.setOnClickListener(view -> onEnding()); + mControl.opening.setOnClickListener(view -> onOpening()); + mControl.interval.setOnClickListener(view -> onInterval()); + mControl.replay.setOnClickListener(view -> getPlayer(true)); mControl.speed.setOnClickListener(view -> mControl.speed.setText(Players.get().addSpeed())); mBinding.flag.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override @@ -161,6 +166,7 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { private void setVideoView() { mControl = ViewControllerBottomBinding.bind(mBinding.video.findViewById(com.google.android.exoplayer2.ui.R.id.exo_controller)); mControl.scale.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getScale()]); + mControl.interval.setText(ResUtil.getString(R.string.second, Prefers.getInterval())); mControl.speed.setText(Players.get().getSpeed()); mBinding.video.setResizeMode(Prefers.getScale()); mBinding.video.setPlayer(Players.get().exo()); @@ -170,12 +176,12 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { mSiteViewModel.detailContent(getKey(), getId()); } - private void getPlayer(boolean reset) { + private void getPlayer(boolean replay) { Vod.Flag.Episode item = (Vod.Flag.Episode) mEpisodeAdapter.get(getEpisodePosition()); if (mFullscreen) Notify.show(ResUtil.getString(R.string.play_ready, item.getName())); mSiteViewModel.playerContent(getKey(), getVodFlag().getFlag(), item.getUrl()); mBinding.progress.getRoot().setVisibility(View.VISIBLE); - updateHistory(item, reset); + updateHistory(item, replay); } private void setViewModel() { @@ -277,45 +283,74 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener { Prefers.putScale(scale); } + private void onOpening() { + mHistory.setOpening(mHistory.getOpening() + Prefers.getInterval() * 1000L); + if (mHistory.getOpening() > 5 * 60 * 1000) mHistory.setOpening(0); + mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening())); + } + + private void onEnding() { + mHistory.setEnding(mHistory.getEnding() + Prefers.getInterval() * 1000L); + if (mHistory.getEnding() > 5 * 60 * 1000) mHistory.setEnding(0); + mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding())); + } + + private void onInterval() { + int interval = Prefers.getInterval() * 2; + if (interval > 60) interval = 15; + Prefers.putInterval(interval); + mControl.interval.setText(ResUtil.getString(R.string.second, Prefers.getInterval())); + } + + private void onReset() { + mHistory.setEnding(0); + mHistory.setOpening(0); + mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding())); + mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening())); + AppDatabase.get().getHistoryDao().update(mHistory); + } + private void checkHistory() { - History history = AppDatabase.get().getHistoryDao().find(getHistoryKey()); - if (history != null) { - setFlagActivated(history.getFlag()); - setEpisodeActivated(history.getEpisode()); + mHistory = AppDatabase.get().getHistoryDao().find(getHistoryKey()); + if (mHistory != null) { + setFlagActivated(mHistory.getFlag()); + setEpisodeActivated(mHistory.getEpisode()); + mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening())); + mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding())); } else { - createHistory(); + mHistory = createHistory(); setFlagActivated((Vod.Flag) mFlagAdapter.get(0)); setEpisodeActivated((Vod.Flag.Episode) mEpisodeAdapter.get(0)); + mControl.opening.setText(Players.get().getStringForTime(0)); + mControl.ending.setText(Players.get().getStringForTime(0)); } } - private void createHistory() { + private History createHistory() { History history = new History(); history.setKey(getHistoryKey()); history.setVodPic(mBinding.video.getTag().toString()); history.setVodName(mBinding.name.getText().toString()); AppDatabase.get().getHistoryDao().insertOrUpdate(history); - } - - private void updateHistory(Vod.Flag.Episode item, boolean reset) { - History history = AppDatabase.get().getHistoryDao().find(getHistoryKey()); - reset = reset || !item.getUrl().equals(history.getEpisodeUrl()); - long duration = reset ? 0 : history.getDuration(); - history.setDuration(duration); - history.setEpisodeUrl(item.getUrl()); - history.setVodRemarks(item.getName()); - history.setVodFlag(getVodFlag().getFlag()); - history.setCreateTime(System.currentTimeMillis()); - AppDatabase.get().getHistoryDao().update(history); + return history; + } + + private void updateHistory(Vod.Flag.Episode item, boolean replay) { + replay = replay || !item.getUrl().equals(mHistory.getEpisodeUrl()); + long duration = replay ? 0 : mHistory.getDuration(); + mHistory.setDuration(duration); + mHistory.setEpisodeUrl(item.getUrl()); + mHistory.setVodRemarks(item.getName()); + mHistory.setVodFlag(getVodFlag().getFlag()); + mHistory.setCreateTime(System.currentTimeMillis()); + AppDatabase.get().getHistoryDao().update(mHistory); EventBus.getDefault().post(RefreshEvent.history()); } private void updateHistory() { - History history = AppDatabase.get().getHistoryDao().find(getHistoryKey()); - if (history != null) { - history.setDuration(Players.get().getCurrentPosition()); - AppDatabase.get().getHistoryDao().update(history); - } + if (mHistory == null) return; + mHistory.setDuration(Players.get().getCurrentPosition()); + AppDatabase.get().getHistoryDao().update(mHistory); } private final Runnable mHideCenter = new Runnable() { diff --git a/app/src/leanback/res/drawable/shape_controller.xml b/app/src/leanback/res/drawable/shape_controller.xml index 8fe8a16cd..bec4cc94b 100644 --- a/app/src/leanback/res/drawable/shape_controller.xml +++ b/app/src/leanback/res/drawable/shape_controller.xml @@ -2,7 +2,7 @@ - + @@ -54,57 +54,101 @@ android:textColor="@color/white" /> + android:layout_marginEnd="8dp" + android:background="@drawable/selector_text" + android:focusable="true" + android:focusableInTouchMode="true" + android:nextFocusDown="@id/exo_progress" + android:textColor="@color/white" + tools:text="1.00" /> + tools:text="預設" /> + tools:text="00:00" /> + + + + + + diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index ec9762aaa..3e8d6b9a7 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -16,6 +16,8 @@ public class History { private String vodRemarks; private String episodeUrl; private long createTime; + private long opening; + private long ending; private long duration; public History() { @@ -78,6 +80,22 @@ public class History { this.createTime = createTime; } + public long getOpening() { + return opening; + } + + public void setOpening(long opening) { + this.opening = opening; + } + + public long getEnding() { + return ending; + } + + public void setEnding(long ending) { + this.ending = ending; + } + public long getDuration() { return duration; } diff --git a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java index 1e57a53c7..2167a164a 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java +++ b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java @@ -13,7 +13,7 @@ import com.fongmi.android.tv.db.dao.HistoryDao; @Database(entities = {History.class}, version = AppDatabase.VERSION, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { - public static final int VERSION = 2; + public static final int VERSION = 3; private static volatile AppDatabase instance; 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 85c4b1b4b..21f19039f 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 @@ -82,6 +82,10 @@ public class Players implements Player.Listener { time = getCurrentPosition() + time; if (time > exoPlayer.getDuration()) time = exoPlayer.getDuration(); else if (time < 0) time = 0; + return getStringForTime(time); + } + + public String getStringForTime(long time) { return Util.getStringForTime(builder, formatter, time); } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java index e92f4d6fe..d1cdd3371 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java @@ -74,4 +74,12 @@ public class Prefers { public static void putThumbnail(int thumbnail) { Prefers.put("thumbnail", thumbnail); } + + public static int getInterval() { + return Prefers.getInt("interval", 15); + } + + public static void putInterval(int interval) { + Prefers.put("interval", interval); + } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 127593579..8e22d395b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -41,9 +41,9 @@ 下一集 上一集 准备播放:%s - 重播本集 - 倍速 - 缩放 + 重播本集 + 重置 + 片头片尾 首页 @@ -64,6 +64,9 @@ 无法解析网址 不支援的影片格式 + + %s + 低质量 中质量 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 715ca7e76..ecc5f6895 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -41,9 +41,9 @@ 下一集 上一集 準備播放:%s - 重播本集 - 倍速 - 縮放 + 重播本集 + 重置 + 片頭片尾 首頁 @@ -64,6 +64,9 @@ 無法解析網址 不支援的影片格式 + + %s + 低品質 中品質 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 949346983..c3b46a93c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,9 +41,9 @@ Next Prev Ready to play: %s - Replay - Speed - Scale + Replay + Reset + OP&ED Home site @@ -64,6 +64,9 @@ Unable to parse url Unsupported video format + + %s s + Low Medium