From b6ea4a6958add545b2b72324b067145fd8cc6092 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 10 Nov 2022 23:47:15 +0800 Subject: [PATCH] Optimize live vod --- .../android/tv/ui/activity/LiveActivity.java | 116 ++++++++++++------ .../tv/ui/custom/CustomKeyDownLive.java | 25 +++- .../tv/ui/custom/CustomKeyDownVod.java | 8 +- .../tv/ui/presenter/ChannelPresenter.java | 3 +- .../res/layout/view_controller_live.xml | 15 ++- .../leanback/res/layout/view_widget_live.xml | 53 ++++++++ .../com/fongmi/android/tv/bean/Channel.java | 14 +-- .../com/fongmi/android/tv/player/Players.java | 4 + 8 files changed, 183 insertions(+), 55 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 4cb5badcc..02a9a2bbc 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 @@ -78,6 +78,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private Runnable mR0; private Runnable mR1; private Runnable mR2; + private Runnable mR3; private int count; public static void start(Activity activity) { @@ -111,7 +112,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick protected void initView() { mR0 = this::hideUI; mR1 = this::hideInfo; - mR2 = this::setChannelActivated; + mR2 = this::hideCenter; + mR3 = this::setChannelActivated; mPlayers = new Players().init(); mKeyDown = CustomKeyDownLive.create(this); mFormatDate = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); @@ -131,6 +133,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mControl.scale.setOnClickListener(view -> onScale()); mControl.speed.setOnClickListener(view -> onSpeed()); mControl.tracks.setOnClickListener(view -> onTracks()); + mControl.line.setOnClickListener(view -> nextLine(false)); mControl.speed.setOnLongClickListener(view -> onSpeedLong()); mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override @@ -270,43 +273,23 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void showInfo() { - mChannel.loadLogo(mBinding.widget.logo); - mControl.name.setText(mChannel.getName()); - mControl.number.setText(mChannel.getNumber()); - mBinding.widget.name.setText(mChannel.getName()); mBinding.widget.info.setVisibility(View.VISIBLE); - mBinding.widget.line.setText(mChannel.getLineText()); - mBinding.widget.number.setText(mChannel.getNumber()); - mBinding.widget.logo.setVisibility(mChannel.getVisible()); App.post(mR1, 5000); - checkEpg(); - } - - private void resetPass() { - this.count = 0; + setInfo(); } - private void checkEpg() { - if (mChannel.getEpg().isEmpty()) return; - String date = mFormatDate.format(new Date()); - String epg = mChannel.getEpg().replace("{date}", date); - if (mChannel.getData().equal(date)) showEpg(); - else getEpg(epg, mChannel); + private void showEpg() { + mControl.play.setText(mChannel.getData().getEpg()); + mBinding.widget.play.setText(mChannel.getData().getEpg()); } - private void getEpg(String epg, Channel channel) { - OKHttp.newCall(epg).enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { - channel.setData(Epg.objectFrom(response.body().string(), mFormatTime)); - if (mChannel.equals(channel)) App.post(() -> showEpg()); - } - }); + private void hideCenter() { + mBinding.widget.action.setImageResource(R.drawable.ic_play); + mBinding.widget.center.setVisibility(View.GONE); } - private void showEpg() { - mControl.play.setText(mChannel.getData().getEpg()); - mBinding.widget.play.setText(mChannel.getData().getEpg()); + private void resetPass() { + this.count = 0; } @Override @@ -353,15 +336,61 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void setChannel(Channel item) { LiveConfig.get().setKeep(mGroup, mChannel = item); - App.post(mR2, 100); + App.post(mR3, 100); showInfo(); } + private void setInfo() { + mChannel.loadLogo(mBinding.widget.logo); + mControl.name.setText(mChannel.getName()); + mControl.line.setText(mChannel.getLineText()); + mControl.number.setText(mChannel.getNumber()); + mBinding.widget.name.setText(mChannel.getName()); + mBinding.widget.line.setText(mChannel.getLineText()); + mBinding.widget.number.setText(mChannel.getNumber()); + mControl.line.setVisibility(mChannel.getLineVisible()); + mBinding.widget.logo.setVisibility(mChannel.getLogoVisible()); + mBinding.widget.line.setVisibility(mChannel.getLineVisible()); + checkEpg(); + } + + private void checkEpg() { + if (mChannel.getEpg().isEmpty()) return; + String date = mFormatDate.format(new Date()); + String epg = mChannel.getEpg().replace("{date}", date); + if (mChannel.getData().equal(date)) showEpg(); + else getEpg(epg, mChannel); + } + + private void getEpg(String epg, Channel channel) { + OKHttp.newCall(epg).enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + channel.setData(Epg.objectFrom(response.body().string(), mFormatTime)); + if (mChannel.equals(channel)) App.post(() -> showEpg()); + } + }); + } + private void getUrl() { mBinding.widget.progress.getRoot().setVisibility(View.VISIBLE); mViewModel.getUrl(mChannel); } + private void prevLine(boolean show) { + mChannel.prevLine(); + if (show) showInfo(); + else setInfo(); + getUrl(); + } + + private void nextLine(boolean show) { + mChannel.nextLine(); + if (show) showInfo(); + else setInfo(); + getUrl(); + } + @Override public boolean nextGroup(boolean skip) { int position = mBinding.group.getSelectedPosition() + 1; @@ -411,6 +440,23 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick setPosition(LiveConfig.get().find(number, mGroupAdapter.unmodifiableList())); } + @Override + public void onSeeking(int time) { + if (!mPlayers.isVod()) return; + mBinding.widget.exoDuration.setText(mControl.exoDuration.getText()); + mBinding.widget.exoPosition.setText(mPlayers.getTime(time)); + mBinding.widget.action.setImageResource(time > 0 ? R.drawable.ic_forward : R.drawable.ic_rewind); + mBinding.widget.center.setVisibility(View.VISIBLE); + } + + @Override + public void onSeekTo(int time) { + if (!mPlayers.isVod()) return; + mPlayers.seekTo(time); + mKeyDown.resetTime(); + App.post(mR2, 500); + } + @Override public void onKeyUp() { int position = mGroup.getPosition() - 1; @@ -430,17 +476,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onKeyLeft() { if (mChannel.getUrls().size() == 1) return; - mChannel.prevLine(); - showInfo(); - getUrl(); + prevLine(true); } @Override public void onKeyRight() { if (mChannel.getUrls().size() == 1) return; - mChannel.nextLine(); - showInfo(); - getUrl(); + nextLine(true); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java index a8d14417e..ad2c918df 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java @@ -10,6 +10,7 @@ public class CustomKeyDownLive { private final Listener listener; private final StringBuilder text; private boolean press; + private int holdTime; private final Runnable runnable = new Runnable() { @Override @@ -36,14 +37,20 @@ public class CustomKeyDownLive { } public boolean onKeyDown(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) { + if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) { + listener.onSeeking(subTime()); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) { + listener.onSeeking(addTime()); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) { listener.onKeyUp(); } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) { listener.onKeyDown(); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) { listener.onKeyLeft(); + listener.onSeekTo(holdTime); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) { listener.onKeyRight(); + listener.onSeekTo(holdTime); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDigitKey(event)) { onKeyDown(event.getKeyCode()); } else if (Utils.isEnterKey(event)) { @@ -70,12 +77,28 @@ public class CustomKeyDownLive { return keyCode >= 144 ? keyCode - 144 : keyCode - 7; } + private int addTime() { + return holdTime = holdTime + 10000; + } + + private int subTime() { + return holdTime = holdTime - 10000; + } + + public void resetTime() { + holdTime = 0; + } + public interface Listener { void onShow(String number); void onFind(String number); + void onSeeking(int time); + + void onSeekTo(int time); + void onKeyUp(); void onKeyDown(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java index bdc7d868a..7a3aa09e1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java @@ -34,6 +34,10 @@ public class CustomKeyDownVod { return true; } + public boolean hasEvent(KeyEvent event) { + return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event); + } + private int addTime() { return holdTime = holdTime + 10000; } @@ -46,10 +50,6 @@ public class CustomKeyDownVod { holdTime = 0; } - public boolean hasEvent(KeyEvent event) { - return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event); - } - public interface Listener { void onSeeking(int time); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java index 099b7d283..a054f77c0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ChannelPresenter.java @@ -36,8 +36,7 @@ public class ChannelPresenter extends Presenter { item.loadLogo(holder.binding.logo); holder.binding.name.setText(item.getName()); holder.binding.number.setText(item.getNumber()); - holder.binding.logo.setVisibility(item.getVisible()); - holder.binding.getRoot().setSelected(item.isSelected()); + holder.binding.logo.setVisibility(item.getLogoVisible()); setOnClickListener(holder, view -> mListener.onItemClick(item)); holder.view.setOnLongClickListener(view -> mListener.onLongClick(item)); } diff --git a/app/src/leanback/res/layout/view_controller_live.xml b/app/src/leanback/res/layout/view_controller_live.xml index c787a8aeb..5425858ab 100644 --- a/app/src/leanback/res/layout/view_controller_live.xml +++ b/app/src/leanback/res/layout/view_controller_live.xml @@ -36,8 +36,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="12dp" - android:marqueeRepeatLimit="marquee_forever" - android:scrollHorizontally="true" + android:maxEms="30" android:singleLine="true" android:textColor="@color/grey_800" android:textSize="18sp" @@ -67,6 +66,18 @@ android:textSize="14sp" tools:text="首頁" /> + + + + + + + + + + + + + + + + + 5 * 60 * 1000; + } + public boolean canNext() { return getCurrentPosition() >= getDuration(); }