From ffba2b2d94b0dd5db60836126db9bb67856b7a1f Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 6 Jul 2022 00:53:12 +0800 Subject: [PATCH] Add vod detail - part 3 --- .../main/java/com/fongmi/bear/bean/Vod.java | 60 +++++++++++++- .../bear/ui/activity/DetailActivity.java | 82 +++++++++++++------ .../fongmi/bear/ui/fragment/VodFragment.java | 1 + ...emPresenter.java => EpisodePresenter.java} | 9 +- .../bear/ui/presenter/FlagPresenter.java | 39 +++++++++ app/src/main/res/layout/activity_detail.xml | 11 ++- 6 files changed, 166 insertions(+), 36 deletions(-) rename app/src/main/java/com/fongmi/bear/ui/presenter/{ItemPresenter.java => EpisodePresenter.java} (82%) create mode 100644 app/src/main/java/com/fongmi/bear/ui/presenter/FlagPresenter.java diff --git a/app/src/main/java/com/fongmi/bear/bean/Vod.java b/app/src/main/java/com/fongmi/bear/bean/Vod.java index add66e68d..ec351ddb0 100644 --- a/app/src/main/java/com/fongmi/bear/bean/Vod.java +++ b/app/src/main/java/com/fongmi/bear/bean/Vod.java @@ -6,6 +6,9 @@ import android.view.View; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; +import java.util.List; + public class Vod { @SerializedName("vod_id") @@ -74,7 +77,7 @@ public class Vod { } public String getVodContent() { - return TextUtils.isEmpty(vodContent) ? "" : vodContent.replaceAll("\\s+",""); + return TextUtils.isEmpty(vodContent) ? "" : vodContent.replaceAll("\\s+", ""); } public String getVodPlayFrom() { @@ -88,4 +91,59 @@ public class Vod { public int getRemarkVisible() { return getVodRemarks().isEmpty() ? View.GONE : View.VISIBLE; } + + public List getVodFlags() { + List items = new ArrayList<>(); + String[] playFlags = getVodPlayFrom().split("\\$\\$\\$"); + String[] playUrls = getVodPlayUrl().split("\\$\\$\\$"); + for (int i = 0; i < playFlags.length; i++) { + Flag item = new Flag(playFlags[i]); + String[] urls = playUrls[i].contains("#") ? playUrls[i].split("#") : new String[]{playUrls[i]}; + for (String url : urls) { + if (!url.contains("$")) continue; + String[] split = url.split("\\$"); + if (split.length >= 2) item.episodes.add(new Flag.Episode(split[0], split[1])); + } + items.add(item); + } + return items; + } + + public static class Flag { + + private final String flag; + private final List episodes; + + public Flag(String flag) { + this.flag = flag; + this.episodes = new ArrayList<>(); + } + + public String getFlag() { + return flag; + } + + public List getEpisodes() { + return episodes; + } + + public static class Episode { + + private final String name; + private final String url; + + public Episode(String name, String url) { + this.name = name; + this.url = url; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url; + } + } + } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java index e7b6a03af..7e8955e11 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java @@ -6,11 +6,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.leanback.widget.ArrayObjectAdapter; -import androidx.leanback.widget.FocusHighlight; -import androidx.leanback.widget.FocusHighlightHelper; import androidx.leanback.widget.ItemBridgeAdapter; +import androidx.leanback.widget.OnChildViewHolderSelectedListener; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; import com.fongmi.bear.ApiConfig; @@ -18,15 +20,20 @@ import com.fongmi.bear.R; import com.fongmi.bear.bean.Vod; import com.fongmi.bear.databinding.ActivityDetailBinding; import com.fongmi.bear.model.SiteViewModel; -import com.fongmi.bear.ui.presenter.ItemPresenter; +import com.fongmi.bear.ui.presenter.EpisodePresenter; +import com.fongmi.bear.ui.presenter.FlagPresenter; import com.fongmi.bear.utils.ResUtil; -import java.util.Arrays; +import java.util.List; public class DetailActivity extends BaseActivity { private ActivityDetailBinding mBinding; private SiteViewModel mSiteViewModel; + private ArrayObjectAdapter mFlagAdapter; + private ArrayObjectAdapter mtEpisodeAdapter; + private EpisodePresenter mEpisodePresenter; + private View mOldView; private String getId() { return getIntent().getStringExtra("id"); @@ -57,34 +64,53 @@ public class DetailActivity extends BaseActivity { } private void setRecyclerView() { + mBinding.flag.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.flag.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.flag.setAdapter(new ItemBridgeAdapter(mFlagAdapter = new ArrayObjectAdapter(new FlagPresenter()))); + mBinding.episode.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.episode.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.episode.setAdapter(new ItemBridgeAdapter(mtEpisodeAdapter = new ArrayObjectAdapter(mEpisodePresenter = new EpisodePresenter()))); + mBinding.group.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.group.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.flag.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { + @Override + public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) { + if (mOldView != null) mOldView.setActivated(false); + if (child == null) return; + mOldView = child.itemView; + mOldView.setActivated(true); + setEpisode((Vod.Flag) mFlagAdapter.get(position)); + } + }); + } + private void getDetail() { + mSiteViewModel.detailContent(getId()); + } + + private void getPlayer(String flag, String id) { + mSiteViewModel.playerContent(flag, id); } private void setViewModel() { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mSiteViewModel.mResult.observe(this, result -> { - Vod item = result.getList().get(0); - mBinding.progress.showContent(); - mBinding.name.setText(item.getVodName()); - setText(mBinding.year, R.string.detail_year, item.getVodYear()); - setText(mBinding.area, R.string.detail_area, item.getVodArea()); - setText(mBinding.type, R.string.detail_type, item.getTypeName()); - setText(mBinding.actor, R.string.detail_actor, item.getVodActor()); - setText(mBinding.content, R.string.detail_content, item.getVodContent()); - setText(mBinding.director, R.string.detail_director, item.getVodDirector()); - setText(mBinding.site, R.string.detail_site, ApiConfig.get().getHome().getName()); - mBinding.from.setHorizontalSpacing(ResUtil.dp2px(16)); - mBinding.from.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ItemPresenter()); - adapter.addAll(0, Arrays.asList(item.getVodPlayFrom().split("\\$\\$\\$"))); - ItemBridgeAdapter bridgeAdapter = new ItemBridgeAdapter(adapter); - mBinding.from.setAdapter(bridgeAdapter); - FocusHighlightHelper.setupBrowseItemFocusHighlight(bridgeAdapter, FocusHighlight.ZOOM_FACTOR_MEDIUM, false); + if (result.getList().isEmpty()) mBinding.progress.showErrorText(); + else setDetail(result.getList().get(0)); }); } - private void setPlayer() { - + private void setDetail(Vod item) { + mBinding.progress.showContent(); + mBinding.name.setText(item.getVodName()); + setText(mBinding.year, R.string.detail_year, item.getVodYear()); + setText(mBinding.area, R.string.detail_area, item.getVodArea()); + setText(mBinding.type, R.string.detail_type, item.getTypeName()); + setText(mBinding.actor, R.string.detail_actor, item.getVodActor()); + setText(mBinding.content, R.string.detail_content, item.getVodContent()); + setText(mBinding.director, R.string.detail_director, item.getVodDirector()); + setText(mBinding.site, R.string.detail_site, ApiConfig.get().getHome().getName()); + setFlag(item.getVodFlags()); } private void setText(TextView view, int resId, String text) { @@ -92,11 +118,13 @@ public class DetailActivity extends BaseActivity { else view.setText(ResUtil.getString(resId, text)); } - private void getDetail() { - mSiteViewModel.detailContent(getId()); + private void setFlag(List items) { + mFlagAdapter.addAll(0, items); + setEpisode((Vod.Flag) mFlagAdapter.get(0)); } - private void getPlayer(String flag, String id) { - mSiteViewModel.playerContent(flag, id); + private void setEpisode(Vod.Flag item) { + mtEpisodeAdapter.clear(); + mtEpisodeAdapter.addAll(0, item.getEpisodes()); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java index 7c27a057f..767c6b5ed 100644 --- a/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java +++ b/app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java @@ -144,6 +144,7 @@ public class VodFragment extends Fragment implements Scroller.Callback, VodPrese @Override public void onResume() { super.onResume(); + //TODO NEED FIX BUG mBinding.recycler.moveToTop(); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/ItemPresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java similarity index 82% rename from app/src/main/java/com/fongmi/bear/ui/presenter/ItemPresenter.java rename to app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java index 54e6379b6..05aa98b8c 100644 --- a/app/src/main/java/com/fongmi/bear/ui/presenter/ItemPresenter.java +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java @@ -6,15 +6,15 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.leanback.widget.Presenter; -import com.fongmi.bear.bean.Class; +import com.fongmi.bear.bean.Vod; import com.fongmi.bear.databinding.AdapterItemBinding; -public class ItemPresenter extends Presenter { +public class EpisodePresenter extends Presenter { private OnClickListener mListener; public interface OnClickListener { - void onItemClick(Class item); + void onItemClick(Vod.Flag.Episode item); } public void setOnClickListener(OnClickListener listener) { @@ -28,8 +28,9 @@ public class ItemPresenter extends Presenter { @Override public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + Vod.Flag.Episode item = (Vod.Flag.Episode) object; ViewHolder holder = (ViewHolder) viewHolder; - holder.binding.text.setText(object.toString()); + holder.binding.text.setText(item.getName()); } @Override diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/FlagPresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/FlagPresenter.java new file mode 100644 index 000000000..6ab49a968 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/FlagPresenter.java @@ -0,0 +1,39 @@ +package com.fongmi.bear.ui.presenter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.bear.bean.Vod; +import com.fongmi.bear.databinding.AdapterItemBinding; + +public class FlagPresenter extends Presenter { + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + return new ViewHolder(AdapterItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + Vod.Flag item = (Vod.Flag) object; + ViewHolder holder = (ViewHolder) viewHolder; + holder.binding.text.setText(item.getFlag()); + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + private final AdapterItemBinding binding; + + public ViewHolder(@NonNull AdapterItemBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index ecd053cb1..bce608710 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -130,7 +130,7 @@ tools:text="簡介:" /> @@ -147,8 +147,11 @@ android:id="@+id/episode" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@+id/from" - android:layout_marginTop="16dp" + android:layout_below="@+id/flag" + android:paddingStart="24dp" + android:paddingTop="8dp" + android:paddingEnd="24dp" + android:paddingBottom="8dp" android:clipChildren="false" android:clipToPadding="false" app:focusOutEnd="true"