From 6fc25cbcd9f20fadb6b7c671a7d07f13a3903f9a Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 21 May 2025 17:51:31 +0800 Subject: [PATCH] Optimize live ui --- .../android/tv/ui/activity/LiveActivity.java | 60 ++++++++------- .../tv/ui/custom/CustomLiveListView.java | 4 +- .../tv/ui/presenter/EpgDataPresenter.java | 4 +- app/src/leanback/res/layout/activity_live.xml | 14 ++-- .../leanback/res/layout/view_control_live.xml | 16 +++- .../leanback/res/layout/view_widget_live.xml | 75 ++++++++++--------- .../leanback/res/layout/view_widget_vod.xml | 1 - 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 + 10 files changed, 101 insertions(+), 76 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 ffbcff9f4..779b28b21 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 @@ -151,6 +151,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick protected void initEvent() { mBinding.group.setListener(this); mBinding.channel.setListener(this); + mBinding.epgData.setListener(this); mBinding.control.seek.setListener(mPlayers); mBinding.control.text.setOnClickListener(this::onTrack); mBinding.control.audio.setOnClickListener(this::onTrack); @@ -163,6 +164,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.line.setOnClickListener(view -> onLine()); mBinding.control.scale.setOnClickListener(view -> onScale()); mBinding.control.speed.setOnClickListener(view -> onSpeed()); + mBinding.control.action.setOnClickListener(view -> onAction()); mBinding.control.invert.setOnClickListener(view -> onInvert()); mBinding.control.across.setOnClickListener(view -> onAcross()); mBinding.control.change.setOnClickListener(view -> onChange()); @@ -181,10 +183,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void setRecyclerView() { mBinding.group.setItemAnimator(null); mBinding.channel.setItemAnimator(null); - mBinding.widget.epgData.setItemAnimator(null); + mBinding.epgData.setItemAnimator(null); mBinding.group.setAdapter(new ItemBridgeAdapter(mGroupAdapter = new ArrayObjectAdapter(new GroupPresenter(this)))); mBinding.channel.setAdapter(new ItemBridgeAdapter(mChannelAdapter = new ArrayObjectAdapter(new ChannelPresenter(this)))); - mBinding.widget.epgData.setAdapter(new ItemBridgeAdapter(mEpgDataAdapter = new ArrayObjectAdapter(new EpgDataPresenter(this)))); + mBinding.epgData.setAdapter(new ItemBridgeAdapter(mEpgDataAdapter = new ArrayObjectAdapter(new EpgDataPresenter(this)))); } private void setVideoView() { @@ -193,7 +195,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick setScale(Setting.getLiveScale()); ExoUtil.setSubtitleView(mBinding.exo); mPlayers.setTag(tag = UUID.randomUUID().toString()); - findViewById(R.id.timeBar).setNextFocusUpId(R.id.player); + findViewById(R.id.timeBar).setNextFocusUpId(R.id.action); mBinding.control.invert.setActivated(Setting.isInvert()); mBinding.control.across.setActivated(Setting.isAcross()); mBinding.control.change.setActivated(Setting.isChange()); @@ -263,7 +265,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick int padding = ResUtil.dp2px(48); if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 16))); mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4); - mBinding.divide.setVisibility(live.getWidth() == 0 ? View.GONE : View.VISIBLE); } private Group setWidth(Group group) { @@ -280,7 +281,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick if (epg.getList().isEmpty()) return; int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 16); if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 16))); - mBinding.widget.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); + mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); } private void setPosition(int[] position) { @@ -321,7 +322,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void setActivated(EpgData item) { for (int i = 0; i < mEpgDataAdapter.size(); i++) ((EpgData) mEpgDataAdapter.get(i)).setSelected(item); - notifyItemChanged(mBinding.widget.epgData, mEpgDataAdapter); + notifyItemChanged(mBinding.epgData, mEpgDataAdapter); } private void checkPlay() { @@ -367,6 +368,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick return true; } + private void onAction() { + checkPlay(); + } + private void onInvert() { Setting.putInvert(!Setting.isInvert()); mBinding.control.invert.setActivated(Setting.isInvert()); @@ -399,11 +404,9 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick setPosition(); } - @Override - public void showUI() { + private void showUI() { if (isVisible(mBinding.recycler)) return; mBinding.recycler.setVisibility(View.VISIBLE); - mBinding.channel.requestFocus(); setPosition(); setUITimer(); hideEpg(); @@ -412,14 +415,19 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void showEpg(Channel item) { if (mChannel == null || mChannel.getData().getList().isEmpty() || mEpgDataAdapter.size() == 0 || !mChannel.equals(item) || !mChannel.getGroup().equals(mGroup)) return; - mBinding.widget.epgData.setSelectedPosition(mChannel.getData().getSelected()); - mBinding.widget.epg.setVisibility(View.VISIBLE); - mBinding.widget.epg.requestFocus(); - hideUI(); + mBinding.epgData.setSelectedPosition(mChannel.getData().getSelected()); + mBinding.epgData.setVisibility(View.VISIBLE); + mBinding.channel.setVisibility(View.GONE); + mBinding.group.setVisibility(View.GONE); + mBinding.epgData.requestFocus(); } - private void hideEpg() { - mBinding.widget.epg.setVisibility(View.GONE); + @Override + public void hideEpg() { + mBinding.channel.setVisibility(View.VISIBLE); + mBinding.group.setVisibility(View.VISIBLE); + mBinding.epgData.setVisibility(View.GONE); + mBinding.channel.requestFocus(); } private void showProgress() { @@ -447,16 +455,15 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void showControl(View view) { mBinding.control.getRoot().setVisibility(View.VISIBLE); - mBinding.widget.top.setVisibility(View.VISIBLE); + mBinding.widget.info.setVisibility(View.VISIBLE); App.post(view::requestFocus, 25); setR1Callback(); hideInfo(); - hideEpg(); } private void hideControl() { mBinding.control.getRoot().setVisibility(View.GONE); - mBinding.widget.top.setVisibility(View.GONE); + mBinding.widget.info.setVisibility(View.GONE); App.removeCallbacks(mR1); } @@ -468,7 +475,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void showInfo() { mBinding.widget.bottom.setVisibility(View.VISIBLE); setR3Callback(); - hideEpg(); setInfo(); } @@ -555,6 +561,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick if (item.isSelected()) { fetch(item); } else if (mChannel.hasCatchup()) { + mBinding.widget.epg.setVisibility(item.isInRange() ? View.GONE : View.VISIBLE); + mBinding.widget.epg.setText(item.isInRange() ? "" : item.getTitle()); Notify.show(getString(R.string.play_ready, item.getTitle())); setActivated(item); fetch(item); @@ -588,6 +596,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.widget.play.setText(""); mChannel.loadLogo(mBinding.widget.logo); mBinding.widget.title.setSelected(true); + mBinding.widget.epg.setVisibility(View.GONE); mBinding.widget.name.setText(mChannel.getName()); mBinding.widget.title.setText(mChannel.getName()); mBinding.widget.line.setText(mChannel.getLineText()); @@ -619,7 +628,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mViewModel.getUrl(mChannel, item); mPlayers.clear(); mPlayers.stop(); - hideEpg(); + hideUI(); } private void fetch() { @@ -637,13 +646,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void checkPlayImg() { ActionEvent.update(); + mBinding.control.action.setText(mPlayers.isPlaying() ? R.string.pause : R.string.play); } private void resetAdapter() { - mBinding.widget.epgData.getLayoutParams().width = 0; mBinding.channel.getLayoutParams().width = 0; + mBinding.epgData.getLayoutParams().width = 0; mBinding.group.getLayoutParams().width = 0; - mBinding.divide.setVisibility(View.GONE); mEpgDataAdapter.clear(); mChannelAdapter.clear(); mGroupAdapter.clear(); @@ -882,7 +891,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public boolean dispatch(boolean check) { - return !check || isGone(mBinding.recycler) && isGone(mBinding.control.getRoot()) && isGone(mBinding.widget.epg); + return !check || isGone(mBinding.recycler) && isGone(mBinding.control.getRoot()); } @Override @@ -937,7 +946,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onMenu() { - showControl(mBinding.control.player); + showControl(mBinding.control.action); } @Override @@ -948,7 +957,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onDoubleTap() { if (isVisible(mBinding.recycler)) hideUI(); - else if (isVisible(mBinding.widget.epg)) hideEpg(); else if (isVisible(mBinding.control.getRoot())) hideControl(); else onMenu(); } @@ -986,8 +994,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick hideControl(); } else if (isVisible(mBinding.widget.bottom)) { hideInfo(); - } else if (isVisible(mBinding.widget.epg)) { - hideEpg(); } else if (isVisible(mBinding.recycler)) { hideUI(); } else { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomLiveListView.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomLiveListView.java index e3c55d368..6eabf7955 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomLiveListView.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomLiveListView.java @@ -34,14 +34,14 @@ public class CustomLiveListView extends VerticalGridView { private boolean onKeyDown() { if (getSelectedPosition() != getAdapter().getItemCount() - 1) return false; - if (getId() == R.id.channel) setSelectedPosition(0); + if (getId() == R.id.channel || getId() == R.id.epg) setSelectedPosition(0); else if (listener != null) listener.nextGroup(false); return true; } private boolean onKeyUp() { if (getSelectedPosition() != 0) return false; - if (getId() == R.id.channel) setSelectedPosition(getAdapter().getItemCount()); + if (getId() == R.id.channel || getId() == R.id.epg) setSelectedPosition(getAdapter().getItemCount()); else if (listener != null) listener.prevGroup(false); return true; } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpgDataPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpgDataPresenter.java index 81ae9a8f7..4d77a026a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpgDataPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpgDataPresenter.java @@ -19,7 +19,7 @@ public class EpgDataPresenter extends Presenter { public interface OnClickListener { - void showUI(); + void hideEpg(); void onItemClick(EpgData item); } @@ -36,7 +36,7 @@ public class EpgDataPresenter extends Presenter { holder.binding.time.setText(item.getTime()); holder.binding.title.setText(item.getTitle()); holder.binding.getRoot().setSelected(item.isSelected()); - holder.binding.getRoot().setLeftListener(mListener::showUI); + holder.binding.getRoot().setLeftListener(mListener::hideEpg); setOnClickListener(holder, view -> { if (!item.isFuture()) mListener.onItemClick(item); }); diff --git a/app/src/leanback/res/layout/activity_live.xml b/app/src/leanback/res/layout/activity_live.xml index 130b153a9..e10cfa176 100644 --- a/app/src/leanback/res/layout/activity_live.xml +++ b/app/src/leanback/res/layout/activity_live.xml @@ -53,13 +53,6 @@ tools:itemCount="5" tools:listitem="@layout/adapter_group" /> - - + + diff --git a/app/src/leanback/res/layout/view_control_live.xml b/app/src/leanback/res/layout/view_control_live.xml index fd8947d81..e114bcf9c 100644 --- a/app/src/leanback/res/layout/view_control_live.xml +++ b/app/src/leanback/res/layout/view_control_live.xml @@ -18,7 +18,7 @@ android:orientation="horizontal"> + + @@ -170,7 +182,7 @@ android:background="@drawable/selector_text" android:focusable="true" android:focusableInTouchMode="true" - android:nextFocusRight="@id/player" + android:nextFocusRight="@id/action" android:text="@string/play_change" android:textColor="@color/text" android:textSize="14sp" /> diff --git a/app/src/leanback/res/layout/view_widget_live.xml b/app/src/leanback/res/layout/view_widget_live.xml index 910812b22..b29f56d2d 100644 --- a/app/src/leanback/res/layout/view_widget_live.xml +++ b/app/src/leanback/res/layout/view_widget_live.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent"> + tools:text="民視" /> + + + + - - - - - - - - \ 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 5f333b57e..c3a779e45 100644 --- a/app/src/leanback/res/layout/view_widget_vod.xml +++ b/app/src/leanback/res/layout/view_widget_vod.xml @@ -33,7 +33,6 @@ android:layout_height="wrap_content" android:layout_below="@+id/title" android:layout_alignStart="@+id/title" - android:layout_marginBottom="16dp" android:shadowColor="@color/grey_900" android:shadowDx="2" android:shadowDy="2" diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index fd7198d3b..2c2f5566f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -28,6 +28,7 @@ 播放 + 暂停 片头 片尾 EXO diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bf84d7a10..e984a3f2c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -28,6 +28,7 @@ 播放 + 暫停 片頭 片尾 EXO diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c5c619d4..3d1f2dfab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,6 +28,7 @@ Play + Pause OP ED EXO