Smooth switch live group

pull/123/head
FongMi 3 years ago
parent aea8fffcae
commit 53d6c7fe30
  1. 2
      app/build.gradle
  2. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java
  3. 15
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  4. 94
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  5. 4
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  6. 4
      app/src/main/java/com/fongmi/android/tv/bean/Group.java
  7. 5
      app/src/main/java/com/fongmi/android/tv/bean/Vod.java

@ -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'

@ -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);
}

@ -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) {

@ -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

@ -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() {

@ -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() {

@ -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) {

Loading…
Cancel
Save