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 1db9e7083..8eb745fdf 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 @@ -97,6 +97,7 @@ import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; @@ -147,6 +148,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private Runnable mR1; private Runnable mR2; private Runnable mR3; + private Runnable mR4; private Clock mClock; private View mFocus1; private View mFocus2; @@ -303,8 +305,9 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mPlayers = new Players().init(this); mBroken = new ArrayList<>(); mR1 = this::hideControl; - mR2 = this::setTraffic; - mR3 = this::showEmpty; + mR2 = this::updateFocus; + mR3 = this::setTraffic; + mR4 = this::showEmpty; setBackground(false); setRecyclerView(); setEpisodeView(); @@ -395,10 +398,11 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setEpisodeView() { - getEpisodeView().setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.episodeVert.setVerticalSpacing(ResUtil.dp2px(8)); + mBinding.episodeHori.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.episodeVert.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.episodeHori.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); getEpisodeView().setAdapter(new ItemBridgeAdapter(mEpisodeAdapter = new ArrayObjectAdapter(mEpisodePresenter = new EpisodePresenter(this::setEpisodeActivated)))); - if (Setting.getEpisode() == 0) mBinding.episodeHori.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - else mBinding.episodeVert.setVerticalSpacing(ResUtil.dp2px(8)); } private void setVideoView() { @@ -512,7 +516,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List showEmpty(); } else { mBinding.name.setText(getName()); - App.post(mR3, 10000); + App.post(mR4, 10000); checkSearch(false); } } @@ -539,7 +543,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mBinding.video.requestFocus(); setArtwork(item.getVodPic()); getPart(item.getVodName()); - App.removeCallbacks(mR3); + App.removeCallbacks(mR4); checkHistory(item); checkFlag(item); checkKeep(); @@ -600,10 +604,10 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setEpisodeAdapter(List items) { getEpisodeView().setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); - if (items.size() > 0 && Setting.getEpisode() == 1) setEpisodeView(items); + if (isVisible(mBinding.episodeVert)) setEpisodeView(items); mEpisodeAdapter.setItems(items, null); setArrayAdapter(items.size()); - updateFocus(); + setR2Callback(); } private void setEpisodeView(List items) { @@ -658,7 +662,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setQualityVisible(boolean visible) { mBinding.quality.setVisibility(visible ? View.VISIBLE : View.GONE); - updateFocus(); + setR2Callback(); } private void setQualityActivated(Result result) { @@ -694,25 +698,28 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mArrayAdapter.setItems(items, null); } + private int findFocusDown(int index) { + List orders = Arrays.asList(R.id.flag, R.id.quality, R.id.episodeHori, R.id.array, R.id.episodeVert, R.id.part, R.id.quick); + for (int i = 0; i < orders.size(); i++) if (i > index) if (isVisible(findViewById(orders.get(i)))) return orders.get(i); + return 0; + } + + private int findFocusUp(int index) { + List orders = Arrays.asList(R.id.flag, R.id.quality, R.id.episodeHori, R.id.array, R.id.episodeVert, R.id.part, R.id.quick); + for (int i = orders.size() - 1; i >= 0; i--) if (i < index) if (isVisible(findViewById(orders.get(i)))) return orders.get(i); + return 0; + } + private void updateFocus() { - if (Setting.getEpisode() == 0) { - mArrayPresenter.setNextFocusUp(R.id.episodeHori); - mQualityAdapter.setNextFocusDown(R.id.episodeHori); - mArrayPresenter.setNextFocusDown(isVisible(mBinding.part) ? R.id.part : R.id.quick); - mEpisodePresenter.setNextFocusDown(isVisible(mBinding.array) ? R.id.array : R.id.part); - mEpisodePresenter.setNextFocusUp(isVisible(mBinding.quality) ? R.id.quality : R.id.flag); - mPartPresenter.setNextFocusUp(isVisible(mBinding.array) ? R.id.array : R.id.episodeHori); - mFlagPresenter.setNextFocusDown(isVisible(mBinding.quality) ? R.id.quality : R.id.episodeHori); - } else { - mArrayPresenter.setNextFocusDown(R.id.episodeVert); - mEpisodePresenter.setNextFocusDown(isVisible(mBinding.part) ? R.id.part : R.id.quick); - mArrayPresenter.setNextFocusUp(isVisible(mBinding.quality) ? R.id.quality : R.id.flag); - mQualityAdapter.setNextFocusDown(isVisible(mBinding.array) ? R.id.array : R.id.episodeVert); - mEpisodePresenter.setNextFocusUp(isVisible(mBinding.array) ? R.id.array : isVisible(mBinding.quality) ? R.id.quality : R.id.flag); - mFlagPresenter.setNextFocusDown(isVisible(mBinding.quality) ? R.id.quality : isVisible(mBinding.array) ? R.id.array : R.id.episodeVert); - mPartPresenter.setNextFocusUp(isVisible(mBinding.episodeVert) ? R.id.episodeVert : isVisible(mBinding.quality) ? R.id.quality : R.id.flag); - } + mEpisodePresenter.setNextFocusDown(findFocusDown(Setting.getEpisode() == 0 ? 2 : 4)); + mEpisodePresenter.setNextFocusUp(findFocusUp(Setting.getEpisode() == 0 ? 2 : 4)); + mQualityAdapter.setNextFocusDown(findFocusDown(1)); + mArrayPresenter.setNextFocusDown(findFocusDown(3)); + mFlagPresenter.setNextFocusDown(findFocusDown(0)); + mArrayPresenter.setNextFocusUp(findFocusUp(3)); + mPartPresenter.setNextFocusUp(findFocusUp(5)); notifyItemChanged(getEpisodeView(), mEpisodeAdapter); + notifyItemChanged(mBinding.quality, mQualityAdapter); notifyItemChanged(mBinding.array, mArrayAdapter); notifyItemChanged(mBinding.part, mPartAdapter); notifyItemChanged(mBinding.flag, mFlagAdapter); @@ -979,13 +986,13 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void showProgress() { mBinding.widget.progress.setVisibility(View.VISIBLE); - App.post(mR2, 0); + App.post(mR3, 0); hideError(); } private void hideProgress() { mBinding.widget.progress.setVisibility(View.GONE); - App.removeCallbacks(mR2); + App.removeCallbacks(mR3); Traffic.reset(); } @@ -1041,13 +1048,17 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setTraffic() { Traffic.setSpeed(mBinding.widget.traffic); - App.post(mR2, Constant.INTERVAL_TRAFFIC); + App.post(mR3, Constant.INTERVAL_TRAFFIC); } private void setR1Callback() { App.post(mR1, Constant.INTERVAL_HIDE); } + private void setR2Callback() { + App.post(mR2, 500); + } + private void setArtwork(String url) { ImgUtil.load(url, R.drawable.radio, new CustomTarget<>() { @Override @@ -1093,7 +1104,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private void setPartAdapter(List items) { mBinding.part.setVisibility(View.VISIBLE); mPartAdapter.setItems(items, null); - updateFocus(); + setR2Callback(); } private void checkFlag(Vod item) { @@ -1370,7 +1381,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mBinding.quick.setVisibility(View.VISIBLE); if (isInitAuto()) nextSite(); if (items.isEmpty()) return; - App.removeCallbacks(mR3); + App.removeCallbacks(mR4); } private void setSearch(Vod item) { @@ -1650,6 +1661,6 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mPlayers.release(); Source.get().stop(); RefreshEvent.history(); - App.removeCallbacks(mR1, mR2, mR3); + App.removeCallbacks(mR1, mR2, mR3, mR4); } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java index 3eb891c74..de6620d03 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java @@ -79,6 +79,10 @@ public abstract class BaseActivity extends AppCompatActivity { if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); } + protected void notifyItemChanged(RecyclerView view, RecyclerView.Adapter adapter) { + if (!view.isComputingLayout()) adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + } + private void setBackCallback() { getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(handleBack()) { @Override diff --git a/build.gradle b/build.gradle index 99d97e231..a70c26ddb 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,6 @@ tasks.register('clean', Delete) { project.ext { gsonVersion = '2.10.1' jsoupVersion = '1.15.3' - okhttpVersion = '4.11.0' + okhttpVersion = '4.12.0' annotationVersion = '1.3.0' }