From 53d6c7fe30c6fb71866471c9ae03cd97f086cba3 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 27 Oct 2022 13:05:27 +0800 Subject: [PATCH] Smooth switch live group --- app/build.gradle | 2 +- .../tv/ui/activity/CollectActivity.java | 12 ++- .../tv/ui/activity/DetailActivity.java | 15 ++- .../android/tv/ui/activity/LiveActivity.java | 94 ++++++++++--------- .../com/fongmi/android/tv/bean/Channel.java | 4 +- .../com/fongmi/android/tv/bean/Group.java | 4 +- .../java/com/fongmi/android/tv/bean/Vod.java | 5 +- 7 files changed, 73 insertions(+), 63 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index af25be204..31dc87f67 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -73,7 +73,7 @@ dependencies { implementation 'cat.ereza:customactivityoncrash:2.4.0' implementation 'com.github.bassaer:materialdesigncolors:1.0.0' implementation 'com.github.bumptech.glide:glide:4.14.1' - implementation 'com.google.android.material:material:1.6.1' + implementation 'com.google.android.material:material:1.7.0' implementation 'com.google.code.gson:gson:2.9.1' implementation 'com.google.zxing:core:3.5.0' implementation 'com.makeramen:roundedimageview:2.3.0' diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index 1c6837ee1..ec972742d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -85,10 +85,7 @@ public class CollectActivity extends BaseActivity { @Override public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) { mBinding.pager.setCurrentItem(position); - if (mOldView != null) mOldView.setActivated(false); - if (child == null) return; - mOldView = child.itemView; - mOldView.setActivated(true); + onChildSelected(child); } }); } @@ -128,6 +125,13 @@ public class CollectActivity extends BaseActivity { for (Site site : mSites) mExecutor.execute(() -> mViewModel.searchContent(site, getKeyword())); } + private void onChildSelected(@Nullable RecyclerView.ViewHolder child) { + if (mOldView != null) mOldView.setActivated(false); + if (child == null) return; + mOldView = child.itemView; + mOldView.setActivated(true); + } + private CollectFragment getFragment() { return (CollectFragment) mPageAdapter.instantiateItem(mBinding.pager, 0); } 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 2d7698243..24f016fc6 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 @@ -267,16 +267,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void setFlagActivated(Vod.Flag item) { - for (int i = 0; i < mFlagAdapter.size(); i++) { - Vod.Flag flag = (Vod.Flag) mFlagAdapter.get(i); - flag.setActivated(flag.equals(item)); - if (!flag.isActivated()) continue; - mBinding.flag.setSelectedPosition(i); - mEpisodeAdapter.setItems(flag.getEpisodes(), null); - setArray(flag.getEpisodes().size()); - seamless(flag); - } + if (item.isActivated()) return; + for (int i = 0; i < mFlagAdapter.size(); i++) ((Vod.Flag) mFlagAdapter.get(i)).setActivated(item); + mBinding.flag.setSelectedPosition(mFlagAdapter.indexOf(item)); + mEpisodeAdapter.setItems(item.getEpisodes(), null); notifyItemChanged(mBinding.flag, mFlagAdapter); + setArray(item.getEpisodes().size()); + seamless(item); } private void seamless(Vod.Flag flag) { 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 a1692763a..ad027bf4f 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 @@ -45,10 +45,14 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private ArrayObjectAdapter mGroupAdapter; private CustomKeyDownLive mKeyDown; private LiveViewModel mViewModel; - private Runnable mRunnable; private Handler mHandler; private Players mPlayers; - private Channel mCurrent; + private Channel mChannel; + private View mOldView; + private Group mGroup; + private Runnable mR1; + private Runnable mR2; + private Runnable mR3; public static void start(Activity activity) { activity.startActivity(new Intent(activity, LiveActivity.class)); @@ -58,10 +62,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick return Prefers.getRender() == 0 ? mBinding.surface : mBinding.texture; } - private Group getGroup() { - return (Group) mGroupAdapter.get(mBinding.group.getSelectedPosition()); - } - private boolean isVisible(View view) { return view.getVisibility() == View.VISIBLE; } @@ -77,7 +77,9 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override protected void initView() { - mRunnable = this::hideInfo; + mR1 = this::hideInfo; + mR2 = this::setGroupActivated; + mR3 = this::setChannelActivated; mPlayers = new Players().init(); mHandler = new Handler(Looper.getMainLooper()); mKeyDown = CustomKeyDownLive.create(this); @@ -94,7 +96,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) { - onItemClick((Group) mGroupAdapter.get(position)); + onChildSelected(child, mGroup = (Group) mGroupAdapter.get(position)); } }); } @@ -116,42 +118,47 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void getLive() { - int[] position = LiveConfig.get().getKeep(); mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null); - setPosition(position); + setPosition(LiveConfig.get().getKeep()); } private void setPosition(int[] position) { - Group group = (Group) mGroupAdapter.get(position[0]); + mGroup = (Group) mGroupAdapter.get(position[0]); mBinding.group.setSelectedPosition(position[0]); - group.setPosition(position[1]); - onItemClick(group); - onItemClick(group.current()); + mGroup.setPosition(position[1]); + onItemClick(mGroup); + onItemClick(mGroup.current()); } private void setPosition() { - mBinding.group.setSelectedPosition(mGroupAdapter.indexOf(mCurrent.getGroup())); - mBinding.channel.setSelectedPosition(mCurrent.getGroup().getPosition()); + mBinding.group.setSelectedPosition(mGroupAdapter.indexOf(mChannel.getGroup())); + mBinding.channel.setSelectedPosition(mChannel.getGroup().getPosition()); + } + + private void onChildSelected(@Nullable RecyclerView.ViewHolder child, Group group) { + if (mOldView != null) mOldView.setSelected(false); + if (child == null) return; + mOldView = child.itemView; + mOldView.setSelected(true); + onItemClick(group); } private void notifyItemChanged(VerticalGridView view, ArrayObjectAdapter adapter) { if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); } - private void setGroupActivated(Group item) { - for (int i = 0; i < mGroupAdapter.size(); i++) { - Group group = (Group) mGroupAdapter.get(i); - group.setSelected(item.equals(group)); - } + private void setGroupActivated() { + for (int i = 0; i < mGroupAdapter.size(); i++) ((Group) mGroupAdapter.get(i)).setSelected(mGroup); + mChannelAdapter.setItems(mGroup.getChannel(), null); + mBinding.channel.setSelectedPosition(mGroup.getPosition()); notifyItemChanged(mBinding.group, mGroupAdapter); } - private void setChannelActivated(Channel item) { - for (int i = 0; i < mChannelAdapter.size(); i++) { - Channel channel = (Channel) mChannelAdapter.get(i); - channel.setSelected(item.equals(channel)); - } + private void setChannelActivated() { + for (int i = 0; i < mChannelAdapter.size(); i++) ((Channel) mChannelAdapter.get(i)).setSelected(mChannel); notifyItemChanged(mBinding.channel, mChannelAdapter); + LiveConfig.get().setKeep(mGroup, mChannel); + getUrl(mChannel); } private void toggle() { @@ -161,11 +168,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void hideUI() { + if (isGone(mBinding.recycler)) return; mBinding.recycler.setVisibility(View.GONE); setPosition(); } private void showUI() { + if (isVisible(mBinding.recycler)) return; mBinding.recycler.setVisibility(View.VISIBLE); mBinding.channel.requestFocus(); setPosition(); @@ -176,34 +185,33 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void showInfo(Channel item) { - mHandler.removeCallbacks(mRunnable); + mHandler.removeCallbacks(mR1); mBinding.info.name.setSelected(true); mBinding.info.name.setText(item.getName()); mBinding.info.line.setText(item.getLineText()); mBinding.info.number.setText(item.getNumber()); mBinding.info.getRoot().setVisibility(View.VISIBLE); - mHandler.postDelayed(mRunnable, 5000); + mHandler.postDelayed(mR1, 5000); } @Override public void onItemClick(Group item) { - mChannelAdapter.setItems(item.getChannel(), null); - mBinding.channel.setSelectedPosition(item.getPosition()); - setGroupActivated(item); + if (item.isSelected()) return; + mHandler.removeCallbacks(mR2); + mHandler.postDelayed(mR2, 100); } @Override public void onItemClick(Channel item) { - getGroup().setPosition(mBinding.channel.getSelectedPosition()); - setChannel(mCurrent = item.group(getGroup())); + mGroup.setPosition(mBinding.channel.getSelectedPosition()); + setChannel(mChannel = item.group(mGroup)); hideUI(); } private void setChannel(Channel item) { - LiveConfig.get().setKeep(getGroup(), item); - setChannelActivated(item); + mHandler.removeCallbacks(mR3); + mHandler.postDelayed(mR3, 100); showInfo(item); - getUrl(item); } private void getUrl(Channel item) { @@ -232,17 +240,17 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onKeyUp() { - setChannel(mCurrent = getGroup().prev()); + setChannel(mChannel = mGroup.prev()); } @Override public void onKeyDown() { - setChannel(mCurrent = getGroup().next()); + setChannel(mChannel = mGroup.next()); } @Override public void onKeyLeft() { - Channel item = mCurrent.prevLine(); + Channel item = mChannel.prevLine(); if (item.getUrls().size() == 1) return; mBinding.info.getRoot().setVisibility(View.VISIBLE); mBinding.info.line.setText(item.getLineText()); @@ -251,7 +259,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onKeyRight() { - Channel item = mCurrent.nextLine(); + Channel item = mChannel.nextLine(); if (item.getUrls().size() == 1) return; mBinding.info.getRoot().setVisibility(View.VISIBLE); mBinding.info.line.setText(item.getLineText()); @@ -286,15 +294,15 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick break; default: if (!event.isRetry() || mPlayers.addRetry() > 1) onError(); - else getUrl(mCurrent); + else getUrl(mChannel); break; } } private void onError() { mPlayers.setRetry(0); - if (isGone(mBinding.recycler) && mCurrent.isLastLine()) onKeyDown(); - else getUrl(mCurrent.nextLine()); + if (isGone(mBinding.recycler) && mChannel.isLastLine()) onKeyDown(); + else getUrl(mChannel.nextLine()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java index 4c41a6ca2..a63b6fdec 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Channel.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Channel.java @@ -125,8 +125,8 @@ public class Channel { return selected; } - public void setSelected(boolean selected) { - this.selected = selected; + public void setSelected(Channel item) { + this.selected = item.equals(this); } public int getVisible() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Group.java b/app/src/main/java/com/fongmi/android/tv/bean/Group.java index fcd842fe3..a55015a63 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Group.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Group.java @@ -66,8 +66,8 @@ public class Group { return selected; } - public void setSelected(boolean selected) { - this.selected = selected; + public void setSelected(Group item) { + this.selected = item.equals(this); } public int getPosition() { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 5080deef0..3cc72c5f5 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -226,8 +226,9 @@ public class Vod { return activated; } - public void setActivated(boolean activated) { - this.activated = activated; + public void setActivated(Flag item) { + this.activated = item.equals(this); + if (activated) item.episodes = episodes; } public void createEpisode(String data) {