From 82a66ed271db7dd7daff741b09b6c7572409f4b6 Mon Sep 17 00:00:00 2001 From: okjack Date: Tue, 16 Jan 2024 14:48:00 +0800 Subject: [PATCH] episode vertical --- .../android/tv/ui/activity/VideoActivity.java | 49 +++++++++++++++---- .../android/tv/ui/adapter/QualityAdapter.java | 12 +++++ .../tv/ui/presenter/ArrayPresenter.java | 12 +++++ .../tv/ui/presenter/EpisodePresenter.java | 17 +++++-- .../leanback/res/layout/activity_video.xml | 14 +++--- .../leanback/res/layout/adapter_episode.xml | 2 +- .../com/fongmi/android/tv/bean/Episode.java | 9 ++++ 7 files changed, 96 insertions(+), 19 deletions(-) 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 8039e0164..a10129a5d 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 @@ -127,6 +127,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private QualityAdapter mQualityAdapter; private DanmakuContext mDanmakuContext; private FlagPresenter mFlagPresenter; + private ArrayPresenter mArrayPresenter; private PartPresenter mPartPresenter; private CustomKeyDownVod mKeyDown; private ExecutorService mExecutor; @@ -370,14 +371,14 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List mBinding.flag.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.flag.setAdapter(new ItemBridgeAdapter(mFlagAdapter = new ArrayObjectAdapter(mFlagPresenter = new FlagPresenter(this::setFlagActivated)))); mBinding.episode.setHorizontalSpacing(ResUtil.dp2px(8)); - mBinding.episode.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.episode.setVerticalSpacing(ResUtil.dp2px(8)); mBinding.episode.setAdapter(new ItemBridgeAdapter(mEpisodeAdapter = new ArrayObjectAdapter(mEpisodePresenter = new EpisodePresenter(this::setEpisodeActivated)))); mBinding.quality.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.quality.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.quality.setAdapter(mQualityAdapter = new QualityAdapter(this::setQualityActivated)); mBinding.array.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.array.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - mBinding.array.setAdapter(new ItemBridgeAdapter(mArrayAdapter = new ArrayObjectAdapter(new ArrayPresenter(this)))); + mBinding.array.setAdapter(new ItemBridgeAdapter(mArrayAdapter = new ArrayObjectAdapter(mArrayPresenter = new ArrayPresenter(this)))); mBinding.part.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.part.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(item -> initSearch(item, false))))); @@ -588,9 +589,28 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setEpisodeAdapter(List items) { + int size = items.size(); + for(int i = 0; i < size; i ++) { items.get(i).setIndex(i); } + int episodeNameLength = items.isEmpty() ? 0 : items.get(0).getName().length(); + int numColumns = 10; + if (episodeNameLength > 40) numColumns = 2; + else if (episodeNameLength > 20) numColumns = 4; + else if (episodeNameLength > 5) numColumns = 6; + else if (episodeNameLength > 2) numColumns = 8; + if (size < numColumns) numColumns = size; + int rowNum = (int)Math.ceil((double) size/ (double) numColumns); + int width = ResUtil.getScreenWidth() - ResUtil.dp2px(48); + mBinding.episode.setNumColumns(numColumns); + mBinding.episode.setColumnWidth((width - ((numColumns - 1) * ResUtil.dp2px(8))) / numColumns); + ViewGroup.LayoutParams layoutParams = mBinding.episode.getLayoutParams(); + layoutParams.width = ResUtil.getScreenWidth(); + layoutParams.height = rowNum > 6 ? ResUtil.dp2px(300) : ResUtil.dp2px(rowNum * 50); + mBinding.episode.setLayoutParams(layoutParams); mBinding.episode.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); + mEpisodePresenter.setNumColumns(numColumns); + mEpisodePresenter.setNumRows(rowNum); mEpisodeAdapter.setItems(items, null); - setArray(items.size()); + setArray(size); updateFocus(); } @@ -622,10 +642,15 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void setQualityVisible(boolean visible) { - mFlagPresenter.setNextFocusDown(visible ? R.id.quality : R.id.episode); - mEpisodePresenter.setNextFocusUp(visible ? R.id.quality : R.id.flag); + mFlagPresenter.setNextFocusDown(visible ? R.id.quality : R.id.array); + mArrayPresenter.setNextFocusUp(visible ? R.id.quality : R.id.flag); + mArrayPresenter.setNextFocusDown(isVisible(mBinding.episode) ? R.id.episode : R.id.part); + mEpisodePresenter.setNextFocusUp(R.id.array); + mQualityAdapter.setNextFocusUp(R.id.flag); + mQualityAdapter.setNextFocusDown(R.id.array); mBinding.quality.setVisibility(visible ? View.VISIBLE : View.GONE); notifyItemChanged(mBinding.episode, mEpisodeAdapter); + notifyItemChanged(mBinding.array, mArrayAdapter); notifyItemChanged(mBinding.flag, mFlagAdapter); } @@ -663,8 +688,8 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List } private void updateFocus() { - mEpisodePresenter.setNextFocusDown(isVisible(mBinding.array) ? R.id.array : R.id.part); - mPartPresenter.setNextFocusUp(isVisible(mBinding.array) ? R.id.array : R.id.episode); + mEpisodePresenter.setNextFocusDown(isVisible(mBinding.part) ? R.id.part : R.id.flag); + mPartPresenter.setNextFocusUp(isVisible(mBinding.episode) ? R.id.episode : R.id.array); notifyItemChanged(mBinding.episode, mEpisodeAdapter); notifyItemChanged(mBinding.part, mPartAdapter); } @@ -1031,14 +1056,20 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List List items = Part.get(response.body().string()); if (!items.contains(source)) items.add(0, source); App.post(() -> mPartAdapter.setItems(items, null)); - App.post(() -> mBinding.part.setVisibility(View.VISIBLE)); + App.post(() -> { + mBinding.part.setVisibility(View.VISIBLE); + updateFocus(); + }); } @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { List items = List.of(source); App.post(() -> mPartAdapter.setItems(items, null)); - App.post(() -> mBinding.part.setVisibility(View.VISIBLE)); + App.post(() -> { + mBinding.part.setVisibility(View.VISIBLE); + updateFocus(); + }); } }); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/QualityAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/QualityAdapter.java index abd009e27..cc6b44dd0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/QualityAdapter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/QualityAdapter.java @@ -14,6 +14,8 @@ public class QualityAdapter extends RecyclerView.Adapter onItemClick(position)); holder.binding.text.setActivated(mResult.getUrl().getPosition() == position); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ArrayPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ArrayPresenter.java index 86604c34e..bd574a0ab 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ArrayPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ArrayPresenter.java @@ -17,6 +17,8 @@ public class ArrayPresenter extends Presenter { private final String backward; private final String forward; private final String reverse; + private int nextFocusUp; + private int nextFocusDown; public ArrayPresenter(OnClickListener listener) { this.mListener = listener; @@ -32,6 +34,14 @@ public class ArrayPresenter extends Presenter { void onRevPlay(TextView view); } + public void setNextFocusUp(int nextFocusUp) { + this.nextFocusUp = nextFocusUp; + } + + public void setNextFocusDown(int nextFocusDown) { + this.nextFocusDown = nextFocusDown; + } + @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { return new ViewHolder(AdapterArrayBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); @@ -42,6 +52,8 @@ public class ArrayPresenter extends Presenter { ViewHolder holder = (ViewHolder) viewHolder; String text = object.toString(); holder.binding.text.setText(text); + holder.binding.text.setNextFocusUpId(nextFocusUp); + holder.binding.text.setNextFocusDownId(nextFocusDown); if (text.equals(reverse)) setOnClickListener(holder, view -> mListener.onRevSort()); else if (text.equals(backward) || text.equals(forward)) setOnClickListener(holder, view -> mListener.onRevPlay(holder.binding.text)); else setOnClickListener(holder, null); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java index 7eddee0e2..1842fed99 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java @@ -13,8 +13,10 @@ import com.fongmi.android.tv.databinding.AdapterEpisodeBinding; public class EpisodePresenter extends Presenter { private final OnClickListener mListener; - private int nextFocusDown; + private int numColumns; + private int numRows; private int nextFocusUp; + private int nextFocusDown; public EpisodePresenter(OnClickListener listener) { this.mListener = listener; @@ -32,6 +34,13 @@ public class EpisodePresenter extends Presenter { this.nextFocusDown = nextFocus; } + public void setNumColumns(int numColumns) { + this.numColumns = numColumns; + } + + public void setNumRows(int numRows) { + this.numRows = numRows; + } @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { return new ViewHolder(AdapterEpisodeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); @@ -41,9 +50,11 @@ public class EpisodePresenter extends Presenter { public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { Episode item = (Episode) object; ViewHolder holder = (ViewHolder) viewHolder; + if (item.getIndex() < numColumns) holder.binding.text.setNextFocusUpId(nextFocusUp); + else holder.binding.text.setNextFocusUpId(0); + if (item.getIndex() >= (numRows - 1) * numColumns) holder.binding.text.setNextFocusDownId(nextFocusDown); + else holder.binding.text.setNextFocusDownId(0); holder.binding.text.setMaxEms(Product.getEms()); - holder.binding.text.setNextFocusUpId(nextFocusUp); - holder.binding.text.setNextFocusDownId(nextFocusDown); holder.binding.text.setActivated(item.isActivated()); holder.binding.text.setText(item.getDesc().concat(item.getName())); setOnClickListener(holder, view -> mListener.onItemClick(item)); diff --git a/app/src/leanback/res/layout/activity_video.xml b/app/src/leanback/res/layout/activity_video.xml index a57565adf..57294d2f9 100644 --- a/app/src/leanback/res/layout/activity_video.xml +++ b/app/src/leanback/res/layout/activity_video.xml @@ -288,7 +288,7 @@ android:visibility="gone" /> - + android:visibility="gone" + app:focusOutEnd="true" + app:focusOutFront="true" />