diff --git a/app/src/leanback/AndroidManifest.xml b/app/src/leanback/AndroidManifest.xml index 199f39357..c99239b68 100644 --- a/app/src/leanback/AndroidManifest.xml +++ b/app/src/leanback/AndroidManifest.xml @@ -54,7 +54,6 @@ CollectActivity.start(this, item))))); mControl.parse.setHorizontalSpacing(ResUtil.dp2px(8)); mControl.parse.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mControl.parse.setAdapter(new ItemBridgeAdapter(mParseAdapter = new ArrayObjectAdapter(new ParsePresenter(this::setParseActivated)))); @@ -237,6 +244,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen setText(mBinding.director, R.string.detail_director, Html.fromHtml(item.getVodDirector()).toString()); mFlagAdapter.setItems(item.getVodFlags(), null); mBinding.video.requestFocus(); + getPart(item.getVodName()); checkHistory(); } @@ -288,6 +296,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen items.add(getString(mHistory.getRevPlayText())); int itemSize = (int) Math.ceil(size / 20.0f); if (itemSize > 1) for (int i = 0; i < itemSize; i++) items.add(String.valueOf(i * 20 + 1)); + mEpisodePresenter.setNextFocusDown(size > 1 ? R.id.group : R.id.part); + mPartPresenter.setNextFocusUp(size > 1 ? R.id.group : R.id.episode); mBinding.group.setVisibility(size > 1 ? View.VISIBLE : View.GONE); mGroupAdapter.setItems(items, null); } @@ -412,6 +422,17 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen mHistory.update(); } + private void getPart(String source) { + OKHttp.newCall("http://api.pullword.com/get.php?source=" + URLEncoder.encode(source) + "¶m1=0¶m2=0&json=1").enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + List items = Part.get(response.body().string()); + if (!items.contains(source)) items.add(source); + mHandler.post(() -> mPartAdapter.setItems(items, null)); + } + }); + } + private void checkHistory() { mHistory = History.find(getHistoryKey()); if (mFlagAdapter.size() == 0) { 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 35ec9e587..0766a7971 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,6 +13,7 @@ import com.fongmi.android.tv.utils.ResUtil; public class EpisodePresenter extends Presenter { private final OnClickListener mListener; + private int nextFocus; public EpisodePresenter(OnClickListener listener) { this.mListener = listener; @@ -22,6 +23,10 @@ public class EpisodePresenter extends Presenter { void onItemClick(Vod.Flag.Episode item); } + public void setNextFocusDown(int nextFocus) { + this.nextFocus = nextFocus; + } + @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { return new ViewHolder(AdapterEpisodeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); @@ -33,6 +38,7 @@ public class EpisodePresenter extends Presenter { ViewHolder holder = (ViewHolder) viewHolder; holder.binding.text.setText(item.getName()); holder.binding.text.setMaxEms(ResUtil.getEms()); + holder.binding.text.setNextFocusDownId(nextFocus); holder.binding.text.setActivated(item.isActivated()); setOnClickListener(holder, view -> mListener.onItemClick(item)); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/PartPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/PartPresenter.java new file mode 100644 index 000000000..0c6b5a660 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/PartPresenter.java @@ -0,0 +1,55 @@ +package com.fongmi.android.tv.ui.presenter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.android.tv.databinding.AdapterPartBinding; + +public class PartPresenter extends Presenter { + + private final OnClickListener mListener; + private int nextFocus; + + public PartPresenter(OnClickListener listener) { + this.mListener = listener; + } + + public interface OnClickListener { + void onItemClick(String item); + } + + public void setNextFocusUp(int nextFocus) { + this.nextFocus = nextFocus; + } + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + return new ViewHolder(AdapterPartBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + String text = object.toString(); + ViewHolder holder = (ViewHolder) viewHolder; + holder.binding.text.setText(text); + holder.binding.text.setNextFocusUpId(nextFocus); + setOnClickListener(holder, view -> mListener.onItemClick(text)); + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + private final AdapterPartBinding binding; + + public ViewHolder(@NonNull AdapterPartBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_detail.xml b/app/src/leanback/res/layout/activity_detail.xml index 31bcf9665..2bc22556f 100644 --- a/app/src/leanback/res/layout/activity_detail.xml +++ b/app/src/leanback/res/layout/activity_detail.xml @@ -1,216 +1,235 @@ - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent"> + + + + + + + + + + + + + + + android:textSize="24sp" + android:textStyle="bold" + tools:text="慶餘年第二季" /> + + + + + + + + + + + + + tools:text="導演:FongMi" /> + tools:text="演員:FongMi" /> - - - - - - - - - - - - - - - - \ No newline at end of file + tools:text="簡介:" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_group.xml b/app/src/leanback/res/layout/adapter_group.xml index ff2c47715..94840e351 100644 --- a/app/src/leanback/res/layout/adapter_group.xml +++ b/app/src/leanback/res/layout/adapter_group.xml @@ -9,6 +9,7 @@ android:focusableInTouchMode="true" android:gravity="center" android:nextFocusUp="@id/episode" + android:nextFocusDown="@id/part" android:textColor="@color/white" android:textSize="16sp" tools:text="11" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_part.xml b/app/src/leanback/res/layout/adapter_part.xml new file mode 100644 index 000000000..ff072bbda --- /dev/null +++ b/app/src/leanback/res/layout/adapter_part.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Part.java b/app/src/main/java/com/fongmi/android/tv/bean/Part.java new file mode 100644 index 000000000..5ea12052d --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/Part.java @@ -0,0 +1,30 @@ +package com.fongmi.android.tv.bean; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class Part { + + @SerializedName("t") + private String t; + + private static List arrayFrom(String str) { + Type listType = new TypeToken>() {}.getType(); + return new Gson().fromJson(str, listType); + } + + public static List get(String str) { + List items = new ArrayList<>(); + for (Part item : arrayFrom(str)) items.add(item.getT()); + return items; + } + + public String getT() { + return t; + } +} 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 e4f9fb933..53f96628b 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 @@ -153,7 +153,7 @@ public class Vod { } public int getYearVisible() { - return getVodYear().isEmpty() ? View.GONE : View.VISIBLE; + return getSite() != null || getVodYear().isEmpty() ? View.GONE : View.VISIBLE; } public int getRemarkVisible() {