episode vertical

pull/219/head
okjack 2 years ago
parent b949fc4d9e
commit 82a66ed271
  1. 49
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  2. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/QualityAdapter.java
  3. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/ArrayPresenter.java
  4. 17
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java
  5. 14
      app/src/leanback/res/layout/activity_video.xml
  6. 2
      app/src/leanback/res/layout/adapter_episode.xml
  7. 9
      app/src/main/java/com/fongmi/android/tv/bean/Episode.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<Episode> 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<String> 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<String> 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();
});
}
});
}

@ -14,6 +14,8 @@ public class QualityAdapter extends RecyclerView.Adapter<QualityAdapter.ViewHold
private final OnClickListener mListener;
private Result mResult;
private int position;
private int nextFocusUp;
private int nextFocusDown;
public QualityAdapter(OnClickListener listener) {
this.mListener = listener;
@ -25,6 +27,14 @@ public class QualityAdapter extends RecyclerView.Adapter<QualityAdapter.ViewHold
void onItemClick(Result result);
}
public void setNextFocusUp(int nextFocusUp) {
this.nextFocusUp = nextFocusUp;
}
public void setNextFocusDown(int nextFocusDown) {
this.nextFocusDown = nextFocusDown;
}
public void addAll(Result result) {
mResult = result;
notifyDataSetChanged();
@ -48,6 +58,8 @@ public class QualityAdapter extends RecyclerView.Adapter<QualityAdapter.ViewHold
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.binding.text.setText(mResult.getUrl().n(position));
holder.binding.text.setNextFocusUpId(nextFocusUp);
holder.binding.text.setNextFocusDownId(nextFocusDown);
holder.binding.text.setOnClickListener(v -> onItemClick(position));
holder.binding.text.setActivated(mResult.getUrl().getPosition() == position);
}

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

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

@ -288,7 +288,7 @@
android:visibility="gone" />
<com.fongmi.android.tv.ui.custom.CustomHorizontalGridView
android:id="@+id/episode"
android:id="@+id/array"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
@ -299,17 +299,19 @@
android:paddingBottom="8dp"
android:visibility="gone" />
<com.fongmi.android.tv.ui.custom.CustomHorizontalGridView
android:id="@+id/array"
android:layout_width="match_parent"
android:layout_height="wrap_content"
<androidx.leanback.widget.VerticalGridView
android:id="@+id/episode"
android:layout_width="1024dp"
android:layout_height="300dp"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingTop="8dp"
android:paddingEnd="24dp"
android:paddingBottom="8dp"
android:visibility="gone" />
android:visibility="gone"
app:focusOutEnd="true"
app:focusOutFront="true" />
<com.fongmi.android.tv.ui.custom.CustomHorizontalGridView
android:id="@+id/part"

@ -2,7 +2,7 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_item"
android:ellipsize="marquee"

@ -20,6 +20,7 @@ public class Episode implements Parcelable {
private int number;
private boolean activated;
private boolean selected;
private int index;
public static Episode create(String name, String url) {
return new Episode(name, "", url);
@ -63,6 +64,10 @@ public class Episode implements Parcelable {
return number;
}
public int getIndex() {
return index;
}
public boolean isActivated() {
return activated;
}
@ -84,6 +89,10 @@ public class Episode implements Parcelable {
this.selected = selected;
}
public void setIndex(int index) {
this.index = index;
}
public boolean rule1(String name) {
return getName().equalsIgnoreCase(name);
}

Loading…
Cancel
Save