From b596c55c2709968d3efa377eefa59d3ac3245ca9 Mon Sep 17 00:00:00 2001 From: okjack Date: Fri, 26 Jan 2024 12:38:44 +0800 Subject: [PATCH] display duration --- .../android/tv/ui/activity/LiveActivity.java | 32 +++++++++++++++++-- .../tv/ui/activity/SettingCustomActivity.java | 7 ++++ .../android/tv/ui/activity/VideoActivity.java | 8 +++-- .../res/drawable/shape_controller.xml | 4 +-- app/src/leanback/res/drawable/shape_info.xml | 15 --------- .../res/drawable/shape_text_activated.xml | 2 +- .../res/drawable/shape_text_normal.xml | 2 +- app/src/leanback/res/layout/activity_live.xml | 7 ++++ .../res/layout/activity_setting_custom.xml | 29 +++++++++++++++++ .../res/layout/view_widget_display.xml | 25 +++++++++++++-- .../leanback/res/layout/view_widget_vod.xml | 3 +- .../java/com/fongmi/android/tv/Setting.java | 8 +++++ .../com/fongmi/android/tv/utils/Clock.java | 20 ++++++++++-- app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../android/tv/ui/activity/LiveActivity.java | 32 +++++++++++++++++-- .../android/tv/ui/activity/VideoActivity.java | 8 ++++- .../android/tv/ui/dialog/ControlDialog.java | 9 ++++++ app/src/mobile/res/layout/activity_live.xml | 7 ++++ app/src/mobile/res/layout/dialog_control.xml | 10 ++++++ .../mobile/res/layout/view_widget_display.xml | 24 ++++++++++++++ 22 files changed, 222 insertions(+), 33 deletions(-) delete mode 100644 app/src/leanback/res/drawable/shape_info.xml 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 1067847b4..eb233af3e 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 @@ -68,12 +68,13 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, SubtitleCallback { +public class LiveActivity extends BaseActivity implements Clock.Callback, GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, SubtitleCallback { private ActivityLiveBinding mBinding; private ArrayObjectAdapter mChannelAdapter; @@ -139,7 +140,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override protected void initView() { - mClock = Clock.create(mBinding.widget.time); + mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time)); mKeyDown = CustomKeyDownLive.create(this); mPlayers = new Players().init(this); mHides = new ArrayList<>(); @@ -151,6 +152,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick Server.get().start(); setRecyclerView(); setVideoView(); + setDisplayView(); setViewModel(); checkLive(); } @@ -217,6 +219,11 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE); } + private void setDisplayView() { + mBinding.display.getRoot().setVisibility(View.VISIBLE); + showDisplayInfo(); + } + private void setScale(int scale) { getExo().setResizeMode(scale); getIjk().setResizeMode(scale); @@ -449,6 +456,21 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick App.removeCallbacks(mR1); } + private void showDisplayInfo() { + boolean controlVisible = isVisible(mBinding.control.getRoot()); + boolean visible = !controlVisible; + mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE); + mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE); + mBinding.display.duration.setVisibility(View.GONE); + } + + private void onTimeChangeDisplaySpeed() { + boolean controlVisible = isVisible(mBinding.control.getRoot()); + boolean visible = !controlVisible; + if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed); + showDisplayInfo(); + } + private void hideCenter() { mBinding.widget.action.setImageResource(R.drawable.ic_widget_play); mBinding.widget.center.setVisibility(View.GONE); @@ -608,6 +630,11 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick public void onTrackClick(Track item) { } + @Override + public void onTimeChanged() { + onTimeChangeDisplaySpeed(); + } + @Override public void setLive(Live item) { LiveConfig.get().setHome(item); @@ -660,6 +687,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick switch (event.getState()) { case 0: setTrackVisible(false); + mClock.setCallback(this); break; case Player.STATE_IDLE: break; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java index ab5370dc7..b9e5bef44 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java @@ -41,6 +41,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.episodeText.setText((episode = ResUtil.getStringArray(R.array.select_episode))[Setting.getEpisode()]); mBinding.displayTimeText.setText(getSwitch(Setting.isDisplayTime())); mBinding.displayNetspeedText.setText(getSwitch(Setting.isDisplaySpeed())); + mBinding.displayDurationText.setText(getSwitch(Setting.isDisplayDuration())); } @Override @@ -50,6 +51,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.episode.setOnClickListener(this::setEpisode); mBinding.displayTime.setOnClickListener(this::setDisplayTime); mBinding.displayNetspeed.setOnClickListener(this::setDisplaySpeed); + mBinding.displayDuration.setOnClickListener(this::setDisplayDuration); } private void setQuality(View view) { @@ -82,4 +84,9 @@ public class SettingCustomActivity extends BaseActivity { mBinding.displayNetspeedText.setText(getSwitch(Setting.isDisplaySpeed())); } + private void setDisplayDuration(View view) { + Setting.putDisplayDuration(!Setting.isDisplayDuration()); + mBinding.displayDurationText.setText(getSwitch(Setting.isDisplayDuration())); + } + } 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 3544d3fa9..444bcca33 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 @@ -748,11 +748,15 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void showDisplayInfo() { mBinding.display.time.setVisibility(Setting.isDisplayTime() || isVisible(mBinding.widget.info) ? View.VISIBLE : View.GONE); mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && !isVisible(mBinding.control.getRoot()) ? View.VISIBLE : View.GONE); + mBinding.display.duration.setVisibility(Setting.isDisplayDuration() && !isVisible(mBinding.control.getRoot()) ? View.VISIBLE : View.GONE); } private void onTimeChangeDisplaySpeed() { - if (isVisible(mBinding.control.getRoot())) showDisplayInfo(); - else if (Setting.isDisplaySpeed()) Traffic.setSpeed(mBinding.display.netspeed); + boolean visible = isVisible(mBinding.control.getRoot()); + long position = mPlayers.getPosition(); + if (Setting.isDisplaySpeed() && !visible) Traffic.setSpeed(mBinding.display.netspeed); + if (Setting.isDisplayDuration() && !visible && position > 0) mBinding.display.duration.setText(mPlayers.getPositionTime(0) + "/" + mPlayers.getDurationTime()); + showDisplayInfo(); } @Override diff --git a/app/src/leanback/res/drawable/shape_controller.xml b/app/src/leanback/res/drawable/shape_controller.xml index 2278e6de7..928fd7ab5 100644 --- a/app/src/leanback/res/drawable/shape_controller.xml +++ b/app/src/leanback/res/drawable/shape_controller.xml @@ -4,8 +4,8 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/leanback/res/drawable/shape_text_activated.xml b/app/src/leanback/res/drawable/shape_text_activated.xml index bad85c441..28ed9761a 100644 --- a/app/src/leanback/res/drawable/shape_text_activated.xml +++ b/app/src/leanback/res/drawable/shape_text_activated.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/leanback/res/drawable/shape_text_normal.xml b/app/src/leanback/res/drawable/shape_text_normal.xml index bad85c441..28ed9761a 100644 --- a/app/src/leanback/res/drawable/shape_text_normal.xml +++ b/app/src/leanback/res/drawable/shape_text_normal.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/leanback/res/layout/activity_live.xml b/app/src/leanback/res/layout/activity_live.xml index 8efaf333a..5fa9f4ffa 100644 --- a/app/src/leanback/res/layout/activity_live.xml +++ b/app/src/leanback/res/layout/activity_live.xml @@ -45,6 +45,13 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/view_widget_display.xml b/app/src/leanback/res/layout/view_widget_display.xml index 5f3b5d59e..21f2aafb1 100644 --- a/app/src/leanback/res/layout/view_widget_display.xml +++ b/app/src/leanback/res/layout/view_widget_display.xml @@ -19,15 +19,36 @@ android:textSize="20sp" tools:text="10:20:00" /> + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/view_widget_vod.xml b/app/src/leanback/res/layout/view_widget_vod.xml index 93d594565..9507a3b72 100644 --- a/app/src/leanback/res/layout/view_widget_vod.xml +++ b/app/src/leanback/res/layout/view_widget_vod.xml @@ -7,7 +7,6 @@ views; private Timer timer; public static Clock create() { @@ -26,12 +28,22 @@ public class Clock { return new Clock().view(view).format("HH:mm:ss"); } + public static Clock create(List views) { + return new Clock().view(views).format("HH:mm:ss"); + } + public Clock() { this.date = new Date(); + this.views = new ArrayList<>(); } public Clock view(TextView view) { - this.view = view; + this.views.add(view); + return this; + } + + public Clock view(List views) { + this.views = views; return this; } @@ -58,7 +70,9 @@ public class Clock { try { date.setTime(System.currentTimeMillis()); if (callback != null) callback.onTimeChanged(); - if (view != null) view.setText(format.format(date)); + for(TextView view : views) { + if (view != null) view.setText(format.format(date)); + } } catch (Exception ignored) { } } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index b5d1ffd9a..7bf872aca 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,6 +37,7 @@ 定时 时间 网速 + 进度 弹幕 换源 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 454c092f8..6c9990711 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -37,6 +37,7 @@ 定時 時間 網速 + 進度 彈幕 換源 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23a597076..13409e0cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -37,6 +37,7 @@ Timer Time Net Speed + Duration Danmu Change 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 1b51295ba..215315c31 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 @@ -73,12 +73,13 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class LiveActivity extends BaseActivity implements CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener { +public class LiveActivity extends BaseActivity implements Clock.Callback, CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener { private ActivityLiveBinding mBinding; private ChannelAdapter mChannelAdapter; @@ -156,7 +157,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Override protected void initView(Bundle savedInstanceState) { mKeyDown = CustomKeyDownLive.create(this, mBinding.video); - mClock = Clock.create(mBinding.widget.time); + mClock = Clock.create(Arrays.asList(mBinding.widget.time, mBinding.display.time)); setPadding(mBinding.control.getRoot()); setPadding(mBinding.recycler, true); mPlayers = new Players().init(this); @@ -172,6 +173,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List setForeground(true); setRecyclerView(); setVideoView(); + setDisplayView(); setViewModel(); checkLive(); } @@ -236,6 +238,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List mBinding.control.action.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE); } + private void setDisplayView() { + mBinding.display.getRoot().setVisibility(View.VISIBLE); + showDisplayInfo(); + } + @Override public void setSubtitle(int size) { getExo().getSubtitleView().setFixedTextSize(Dimension.SP, size); @@ -501,6 +508,21 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List App.removeCallbacks(mR1); } + private void showDisplayInfo() { + boolean controlVisible = isVisible(mBinding.control.getRoot()); + boolean visible = (!controlVisible || isLock()); + mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE); + mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE); + mBinding.display.duration.setVisibility(View.GONE); + } + + private void onTimeChangeDisplaySpeed() { + boolean controlVisible = isVisible(mBinding.control.getRoot()); + boolean visible = (!controlVisible || isLock()); + if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed); + showDisplayInfo(); + } + private void showInfo() { boolean pip = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N && isInPictureInPictureMode(); mBinding.widget.infoPip.setVisibility(pip ? View.VISIBLE : View.GONE); @@ -670,6 +692,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List public void onTrackClick(Track item) { } + @Override + public void onTimeChanged() { + onTimeChangeDisplaySpeed(); + } + @Override public void setLive(Live item) { LiveConfig.get().setHome(item); @@ -720,6 +747,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List switch (event.getState()) { case 0: setTrackVisible(false); + mClock.setCallback(this); break; case Player.STATE_IDLE: break; 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 83dfc378c..7735884e9 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 @@ -942,10 +942,16 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo boolean visible = (!controlVisible || isLock()); mBinding.display.time.setVisibility(Setting.isDisplayTime() && visible ? View.VISIBLE : View.GONE); mBinding.display.netspeed.setVisibility(Setting.isDisplaySpeed() && visible ? View.VISIBLE : View.GONE); + mBinding.display.duration.setVisibility(Setting.isDisplayDuration() && visible ? View.VISIBLE : View.GONE); } private void onTimeChangeDisplaySpeed() { - if (Setting.isDisplaySpeed() && (!isVisible(mBinding.control.getRoot()) || isLock())) Traffic.setSpeed(mBinding.display.netspeed); + boolean controlVisible = isVisible(mBinding.control.getRoot()); + boolean visible = (!controlVisible || isLock()); + long position = mPlayers.getPosition(); + if (Setting.isDisplaySpeed() && visible) Traffic.setSpeed(mBinding.display.netspeed); + if (Setting.isDisplayDuration() && visible && position > 0) mBinding.display.duration.setText(mPlayers.getPositionTime(0) + "/" + mPlayers.getDurationTime()); + showDisplayInfo(); } private void toggleFullscreen() { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java index 5e0590152..47dd29930 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ControlDialog.java @@ -98,6 +98,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis binding.timer.setActivated(Timer.get().isRunning()); binding.dptime.setActivated(Setting.isDisplayTime()); binding.dpspeed.setActivated(Setting.isDisplaySpeed()); + binding.dpduration.setActivated(Setting.isDisplayDuration()); setTrackVisible(); setScaleText(); setParse(); @@ -121,6 +122,7 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis binding.opening.setOnLongClickListener(v -> longClick(binding.opening, parent.control.action.opening)); binding.dptime.setOnClickListener(v -> displayTime()); binding.dpspeed.setOnClickListener(v -> displaySpeed()); + binding.dpduration.setOnClickListener(v -> displayDuration()); } private void displayTime() { @@ -137,6 +139,13 @@ public class ControlDialog extends BaseDialog implements ParseAdapter.OnClickLis binding.dpspeed.setActivated(!display); } + private void displayDuration() { + boolean display = Setting.isDisplayDuration(); + parent.display.duration.setVisibility(!display ? View.VISIBLE : View.GONE); + Setting.putDisplayDuration(!display); + binding.dpduration.setActivated(!display); + } + private void onTimer(View view) { App.post(() -> TimerDialog.create().show(activity), 200); dismiss(); diff --git a/app/src/mobile/res/layout/activity_live.xml b/app/src/mobile/res/layout/activity_live.xml index bc82cf86e..431adc381 100644 --- a/app/src/mobile/res/layout/activity_live.xml +++ b/app/src/mobile/res/layout/activity_live.xml @@ -45,6 +45,13 @@ android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + + + +