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 741a17ed9..1d61edcf8 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 @@ -44,6 +44,7 @@ import com.fongmi.android.tv.ui.presenter.FlagPresenter; import com.fongmi.android.tv.ui.presenter.GroupPresenter; import com.fongmi.android.tv.ui.presenter.ParsePresenter; import com.fongmi.android.tv.ui.presenter.PartPresenter; +import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; @@ -63,7 +64,7 @@ import java.util.List; import okhttp3.Call; import okhttp3.Response; -public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, GroupPresenter.OnClickListener { +public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, GroupPresenter.OnClickListener, Clock.Callback { private ActivityDetailBinding mBinding; private ViewControllerBottomBinding mControl; @@ -234,7 +235,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen } private void setDetail(Vod item) { - Players.get().setKey(getHistoryKey()); mBinding.progressLayout.showContent(); mBinding.video.setTag(item.getVodPic()); mBinding.name.setText(item.getVodName()); @@ -275,7 +275,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen for (int i = 0; i < mFlagAdapter.size(); i++) ((Vod.Flag) mFlagAdapter.get(i)).toggle(mCurrent == i, item); mEpisodeAdapter.notifyArrayItemRangeChanged(0, mEpisodeAdapter.size()); mHandler.post(() -> mBinding.episode.setSelectedPosition(getEpisodePosition())); - mBinding.widget.title.setText(getString(R.string.detail_title, mBinding.name.getText(), item.getName())); if (mEpisodeAdapter.size() == 0) return; getPlayer(false); } @@ -336,7 +335,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen } private void exitFullscreen() { - mBinding.widget.title.setVisibility(View.GONE); + mBinding.widget.top.setVisibility(View.GONE); mBinding.widget.center.setVisibility(View.GONE); mBinding.video.setForeground(ResUtil.getDrawable(R.drawable.selector_video)); mBinding.video.setLayoutParams(mFrameParams); @@ -398,7 +397,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen private boolean onOpeningReset() { mHistory.setOpening(0); mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening())); - mHistory.update(); return true; } @@ -411,7 +409,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen private boolean onEndingReset() { mHistory.setEnding(0); mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding())); - mHistory.update(); return true; } @@ -427,7 +424,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen mHistory.setOpening(0); mControl.ending.setText(Players.get().getStringForTime(mHistory.getEnding())); mControl.opening.setText(Players.get().getStringForTime(mHistory.getOpening())); - mHistory.update(); } private void onTracks() { @@ -450,6 +446,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen private void checkHistory() { mHistory = History.find(getHistoryKey()); if (mFlagAdapter.size() == 0) { + mBinding.flag.setVisibility(View.GONE); + mBinding.group.setVisibility(View.GONE); + mBinding.episode.setVisibility(View.GONE); Notify.show(R.string.error_episode); return; } @@ -474,7 +473,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen history.setCid(ApiConfig.getCid()); history.setVodPic(mBinding.video.getTag().toString()); history.setVodName(mBinding.name.getText().toString()); - return history.save(); + return history; } private void updateHistory(Vod.Flag.Episode item, boolean replay) { @@ -488,9 +487,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen } private void updateHistory() { - if (mHistory == null) return; - mHistory.setDuration(Players.get().getCurrentPosition()); - mHistory.update(); + if (mHistory != null) mHistory.update(); } private final Runnable mHideCenter = new Runnable() { @@ -498,24 +495,20 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen public void run() { mBinding.widget.action.setImageResource(R.drawable.ic_play); mBinding.widget.center.setVisibility(View.GONE); - mBinding.widget.title.setVisibility(View.GONE); + mBinding.widget.top.setVisibility(View.GONE); } }; - private final Runnable mProgress = new Runnable() { - @Override - public void run() { - boolean keep = true; - long duration = Players.get().getDuration(); - long current = Players.get().getCurrentPosition(); - if (mHistory.getOpening() >= current) Players.get().seekTo(mHistory.getOpening()); - if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + current >= duration) { - keep = false; - checkNext(); - } - if (keep) mHandler.postDelayed(mProgress, 1000); + @Override + public void onTimeChanged() { + long duration = Players.get().getDuration(); + long current = Players.get().getCurrentPosition(); + if (mHistory.getOpening() >= current) Players.get().seekTo(mHistory.getOpening()); + if (mHistory.getEnding() > 0 && duration > 0 && mHistory.getEnding() + current >= duration) { + Clock.get().setCallback(null); + checkNext(); } - }; + } @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { @@ -545,20 +538,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen private void checkPosition() { Players.get().seekTo(mHistory.getDuration()); - stopTimer(); - setTimer(); - } - - private void stopTimer() { - mHandler.removeCallbacks(mProgress); - } - - private void setTimer() { - mHandler.postDelayed(mProgress, 1000); + Clock.get().setCallback(this); } private void onRetry() { - updateHistory(); + mHistory.setDuration(Players.get().getCurrentPosition()); getPlayer(false); } @@ -566,14 +550,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen mBinding.widget.progress.getRoot().setVisibility(View.GONE); mBinding.widget.error.setVisibility(View.VISIBLE); mBinding.widget.text.setText(msg); + Clock.get().setCallback(null); Players.get().stop(); - stopTimer(); } private void onPause(boolean visible) { mBinding.widget.exoPosition.setText(Players.get().getTime(0)); mBinding.widget.exoDuration.setText(mControl.exoDuration.getText()); - mBinding.widget.title.setVisibility(visible ? View.VISIBLE : View.GONE); + mBinding.widget.top.setVisibility(visible ? View.VISIBLE : View.GONE); mBinding.widget.center.setVisibility(visible ? View.VISIBLE : View.GONE); Players.get().pause(); } @@ -616,16 +600,20 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen else onPlay(0); } - @Override - protected void onPause() { - super.onPause(); - onPause(false); - } - @Override protected void onResume() { super.onResume(); onPlay(0); + Clock.start(mBinding.widget.time); + } + + @Override + protected void onPause() { + super.onPause(); + onPause(false); + updateHistory(); + RefreshEvent.history(); + Clock.get().release(); } @Override @@ -635,16 +623,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen } else if (mFullscreen) { exitFullscreen(); } else { - destroy(); super.onBackPressed(); } } - private void destroy() { - stopTimer(); - updateHistory(); + @Override + protected void onDestroy() { + super.onDestroy(); Players.get().stop(); - RefreshEvent.history(); EventBus.getDefault().unregister(this); } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index 55a23b180..cfde5ba1e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -75,7 +75,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen protected void initView() { mHandler = new Handler(Looper.getMainLooper()); Updater.create(this).start(); - Clock.start(mBinding.time); Server.get().start(); Players.get().init(); setRecyclerView(); @@ -264,6 +263,18 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen } } + @Override + protected void onResume() { + super.onResume(); + Clock.start(mBinding.time); + } + + @Override + protected void onPause() { + super.onPause(); + Clock.get().release(); + } + @Override public void onBackPressed() { if (mHistoryPresenter.isDelete()) { @@ -283,7 +294,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen private void destroy() { Server.get().stop(); - Clock.get().release(); Players.get().release(); EventBus.getDefault().unregister(this); } diff --git a/app/src/leanback/res/layout/activity_home.xml b/app/src/leanback/res/layout/activity_home.xml index 5f4e2ad56..a992ab94d 100644 --- a/app/src/leanback/res/layout/activity_home.xml +++ b/app/src/leanback/res/layout/activity_home.xml @@ -30,7 +30,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" - android:letterSpacing="0.02" android:textColor="@color/white" android:textSize="24sp" tools:text="07/25 09:20:00" /> diff --git a/app/src/leanback/res/layout/view_controller_widget.xml b/app/src/leanback/res/layout/view_controller_widget.xml index 42c68cdba..473504dc0 100644 --- a/app/src/leanback/res/layout/view_controller_widget.xml +++ b/app/src/leanback/res/layout/view_controller_widget.xml @@ -4,24 +4,45 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + tools:visibility="visible"> + + + + + + headers, String url) { exo().setMediaSource(ExoUtil.getSource(headers, url)); PlayerEvent.state(0); exo().prepare(); - exo().play(); + } + + public void play() { + if (exo() != null) exo().play(); } public void pause() { - exo().pause(); + if (exo() != null) exo().pause(); } public void stop() { @@ -164,10 +157,6 @@ public class Players implements Player.Listener, ParseTask.Callback { if (webView != null) webView.stop(false); } - public void play() { - exo().play(); - } - public void release() { if (exoPlayer != null) { exoPlayer.removeListener(this); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Clock.java b/app/src/main/java/com/fongmi/android/tv/utils/Clock.java index 1b6de0022..57d99893b 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Clock.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Clock.java @@ -13,8 +13,10 @@ import java.util.TimerTask; public class Clock { private SimpleDateFormat formatter; + private Callback callback; private Handler handler; private Timer timer; + private Date date; private static class Loader { static volatile Clock INSTANCE = new Clock(); @@ -27,6 +29,7 @@ public class Clock { public void init() { this.formatter = new SimpleDateFormat("MM/dd HH:mm:ss", Locale.getDefault()); this.handler = new Handler(Looper.getMainLooper()); + this.date = new Date(); } public static void start(TextView view) { @@ -34,21 +37,39 @@ public class Clock { get().run(view); } + public void setCallback(Callback callback) { + this.callback = callback; + } + private void run(TextView view) { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { - if (handler == null || view == null || formatter == null) return; - handler.post(() -> view.setText(formatter.format(new Date()))); + handler.post(() -> doJob(view)); } }, 0, 1000); } + private void doJob(TextView view) { + try { + date.setTime(System.currentTimeMillis()); + view.setText(formatter.format(date)); + if (callback != null) callback.onTimeChanged(); + } catch (Exception ignored) { + } + } + public void release() { if (timer != null) timer.cancel(); formatter = null; handler = null; timer = null; + date = null; + } + + public interface Callback { + + void onTimeChanged(); } }