diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 86ad11c2e..c4f164e75 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -4,23 +4,25 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.Html; +import android.text.TextUtils; import android.view.View; import android.widget.TextView; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; -import androidx.media3.common.util.Log; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Episode; import com.fongmi.android.tv.bean.Flag; +import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.ActivityDetailBinding; import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; import com.fongmi.android.tv.ui.adapter.FlagAdapter; @@ -29,14 +31,16 @@ import com.fongmi.android.tv.ui.base.ViewType; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.utils.ImgUtil; import com.fongmi.android.tv.utils.Notify; -import com.google.gson.Gson; -public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnClickListener { +import java.util.List; + +public class DetailActivity extends BaseActivity implements FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener { private ActivityDetailBinding mBinding; private EpisodeAdapter mEpisodeAdapter; private SiteViewModel mViewModel; private FlagAdapter mFlagAdapter; + private History mHistory; public static void start(Activity activity, String key, String id, String name) { start(activity, key, id, name, null, null); @@ -104,6 +108,7 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli @Override protected void initView(Bundle savedInstanceState) { mBinding.progressLayout.showProgress(); + setRecyclerView(); setViewModel(); getDetail(); } @@ -113,14 +118,14 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli } private void setRecyclerView() { - //mBinding.flag.setHasFixedSize(true); - //mBinding.flag.setItemAnimator(null); - //mBinding.flag.addItemDecoration(new SpaceItemDecoration(8)); - //mBinding.flag.setAdapter(mFlagAdapter = new FlagAdapter(this)); + mBinding.flag.setHasFixedSize(true); + mBinding.flag.setItemAnimator(null); + mBinding.flag.addItemDecoration(new SpaceItemDecoration(8)); + mBinding.flag.setAdapter(mFlagAdapter = new FlagAdapter(this)); mBinding.episode.setHasFixedSize(true); mBinding.episode.setItemAnimator(null); - mBinding.episode.addItemDecoration(new SpaceItemDecoration(8)); - mBinding.episode.setAdapter(mEpisodeAdapter = new EpisodeAdapter(this, ViewType.LIST)); + mBinding.episode.addItemDecoration(new SpaceItemDecoration(1,8)); + mBinding.episode.setAdapter(mEpisodeAdapter = new EpisodeAdapter(this, ViewType.VERT)); } private void setViewModel() { @@ -139,8 +144,6 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli } private void setDetail(Result result) { - mBinding.swipeLayout.setRefreshing(false); - Log.e("DDD", new Gson().toJson(result)); if (result.getList().isEmpty()) setEmpty(); else setDetail(result.getList().get(0)); Notify.show(result.getMsg()); @@ -155,7 +158,6 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli } private void showEmpty() { - mBinding.swipeLayout.setEnabled(true); mBinding.progressLayout.showEmpty(); } @@ -166,10 +168,10 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli setText(mBinding.content, 0, Html.fromHtml(item.getVodContent()).toString()); setText(mBinding.director, R.string.detail_director, Html.fromHtml(item.getVodDirector()).toString()); ImgUtil.load(item.getVodPic(getPic()), mBinding.pic); - //mFlagAdapter.addAll(item.getVodFlags()); - //checkHistory(item); - //checkFlag(item); - //checkKeepImg(); + mFlagAdapter.addAll(item.getVodFlags()); + checkHistory(item); + checkFlag(item); + checkKeepImg(); } private void setText(TextView view, int resId, String text) { @@ -178,6 +180,56 @@ public class DetailActivity extends BaseActivity implements EpisodeAdapter.OnCli view.setTag(text); } + private void checkHistory(Vod item) { + mHistory = History.find(getHistoryKey()); + mHistory = mHistory == null ? createHistory(item) : mHistory; + if (!TextUtils.isEmpty(getMark())) mHistory.setVodRemarks(getMark()); + } + + private History createHistory(Vod item) { + History history = new History(); + history.setKey(getHistoryKey()); + history.setCid(ApiConfig.getCid()); + history.setVodPic(item.getVodPic()); + history.setVodName(item.getVodName()); + history.findEpisode(item.getVodFlags()); + return history; + } + + private void checkFlag(Vod item) { + boolean empty = item.getVodFlags().isEmpty(); + mBinding.flag.setVisibility(empty ? View.GONE : View.VISIBLE); + if (empty) { + ErrorEvent.episode(); + } else { + onItemClick(mHistory.getFlag(), true); + if (mHistory.isRevSort()) reverseEpisode(true); + } + } + + private void reverseEpisode(boolean scroll) { + mFlagAdapter.reverse(); + setEpisodeAdapter(getFlag().getEpisodes()); + if (scroll) mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()); + } + + private void setEpisodeAdapter(List items) { + mBinding.episode.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); + mEpisodeAdapter.addAll(items); + } + + private void checkKeepImg() { + //mBinding.keep.setImageResource(Keep.find(getHistoryKey()) == null ? R.drawable.ic_control_keep_off : R.drawable.ic_control_keep_on); + } + + @Override + public void onItemClick(Flag item, boolean force) { + if (item.isActivated()) return; + mFlagAdapter.setActivated(item); + mBinding.flag.scrollToPosition(mFlagAdapter.getPosition()); + setEpisodeAdapter(item.getEpisodes()); + } + @Override public void onItemClick(Episode item) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 2db630425..2eb3b37c8 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -337,7 +337,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mBinding.episode.setHasFixedSize(true); mBinding.episode.setItemAnimator(null); mBinding.episode.addItemDecoration(new SpaceItemDecoration(8)); - mBinding.episode.setAdapter(mEpisodeAdapter = new EpisodeAdapter(this, ViewType.LIST)); + mBinding.episode.setAdapter(mEpisodeAdapter = new EpisodeAdapter(this, ViewType.HORI)); mBinding.quality.setHasFixedSize(true); mBinding.quality.setItemAnimator(null); mBinding.quality.addItemDecoration(new SpaceItemDecoration(8)); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpisodeAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpisodeAdapter.java index 37e376e79..9db8084bb 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpisodeAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpisodeAdapter.java @@ -2,24 +2,27 @@ package com.fongmi.android.tv.ui.adapter; import android.view.LayoutInflater; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.fongmi.android.tv.Product; import com.fongmi.android.tv.bean.Episode; import com.fongmi.android.tv.databinding.AdapterEpisodeGridBinding; -import com.fongmi.android.tv.databinding.AdapterEpisodeListBinding; +import com.fongmi.android.tv.databinding.AdapterEpisodeHoriBinding; +import com.fongmi.android.tv.databinding.AdapterEpisodeVertBinding; +import com.fongmi.android.tv.ui.base.BaseEpisodeHolder; import com.fongmi.android.tv.ui.base.ViewType; +import com.fongmi.android.tv.ui.holder.EpisodeGridHolder; +import com.fongmi.android.tv.ui.holder.EpisodeHoriHolder; +import com.fongmi.android.tv.ui.holder.EpisodeVertHolder; import java.util.ArrayList; import java.util.List; -public class EpisodeAdapter extends RecyclerView.Adapter { +public class EpisodeAdapter extends RecyclerView.Adapter { - private final List mItems; private final OnClickListener mListener; + private final List mItems; private final int viewType; public EpisodeAdapter(OnClickListener listener, int viewType) { @@ -79,41 +82,21 @@ public class EpisodeAdapter extends RecyclerView.Adapter mListener.onItemClick(item)); + public BaseEpisodeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + switch (viewType) { + case ViewType.HORI: + return new EpisodeHoriHolder(AdapterEpisodeHoriBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener); + case ViewType.VERT: + return new EpisodeVertHolder(AdapterEpisodeVertBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener); + default: + return new EpisodeGridHolder(AdapterEpisodeGridBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false), mListener); } } } \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseEpisodeHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseEpisodeHolder.java new file mode 100644 index 000000000..32559409e --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseEpisodeHolder.java @@ -0,0 +1,17 @@ +package com.fongmi.android.tv.ui.base; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.bean.Episode; + +public abstract class BaseEpisodeHolder extends RecyclerView.ViewHolder { + + public BaseEpisodeHolder(@NonNull View itemView) { + super(itemView); + } + + public abstract void initView(Episode item); +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/base/ViewType.java b/app/src/mobile/java/com/fongmi/android/tv/ui/base/ViewType.java index b04054511..3472d491c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/base/ViewType.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/base/ViewType.java @@ -7,6 +7,9 @@ public class ViewType { public static final int LIST = 2; public static final int GRID = 3; + public static final int HORI = 0; + public static final int VERT = 1; + public static final int DARK = 0; public static final int LIGHT = 1; } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeGridHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeGridHolder.java new file mode 100644 index 000000000..9fe6ebbff --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeGridHolder.java @@ -0,0 +1,28 @@ +package com.fongmi.android.tv.ui.holder; + +import androidx.annotation.NonNull; + +import com.fongmi.android.tv.bean.Episode; +import com.fongmi.android.tv.databinding.AdapterEpisodeGridBinding; +import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; +import com.fongmi.android.tv.ui.base.BaseEpisodeHolder; + +public class EpisodeGridHolder extends BaseEpisodeHolder { + + private final EpisodeAdapter.OnClickListener listener; + private final AdapterEpisodeGridBinding binding; + + public EpisodeGridHolder(@NonNull AdapterEpisodeGridBinding binding, EpisodeAdapter.OnClickListener listener) { + super(binding.getRoot()); + this.binding = binding; + this.listener = listener; + } + + @Override + public void initView(Episode item) { + binding.text.setSelected(item.isActivated()); + binding.text.setActivated(item.isActivated()); + binding.text.setText(item.getDesc().concat(item.getName())); + binding.text.setOnClickListener(v -> listener.onItemClick(item)); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeHoriHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeHoriHolder.java new file mode 100644 index 000000000..30958b757 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeHoriHolder.java @@ -0,0 +1,30 @@ +package com.fongmi.android.tv.ui.holder; + +import androidx.annotation.NonNull; + +import com.fongmi.android.tv.Product; +import com.fongmi.android.tv.bean.Episode; +import com.fongmi.android.tv.databinding.AdapterEpisodeHoriBinding; +import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; +import com.fongmi.android.tv.ui.base.BaseEpisodeHolder; + +public class EpisodeHoriHolder extends BaseEpisodeHolder { + + private final EpisodeAdapter.OnClickListener listener; + private final AdapterEpisodeHoriBinding binding; + + public EpisodeHoriHolder(@NonNull AdapterEpisodeHoriBinding binding, EpisodeAdapter.OnClickListener listener) { + super(binding.getRoot()); + this.binding = binding; + this.listener = listener; + } + + @Override + public void initView(Episode item) { + binding.text.setMaxEms(Product.getEms()); + binding.text.setSelected(item.isActivated()); + binding.text.setActivated(item.isActivated()); + binding.text.setText(item.getDesc().concat(item.getName())); + binding.text.setOnClickListener(v -> listener.onItemClick(item)); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeVertHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeVertHolder.java new file mode 100644 index 000000000..06691e744 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/EpisodeVertHolder.java @@ -0,0 +1,28 @@ +package com.fongmi.android.tv.ui.holder; + +import androidx.annotation.NonNull; + +import com.fongmi.android.tv.bean.Episode; +import com.fongmi.android.tv.databinding.AdapterEpisodeVertBinding; +import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; +import com.fongmi.android.tv.ui.base.BaseEpisodeHolder; + +public class EpisodeVertHolder extends BaseEpisodeHolder { + + private final EpisodeAdapter.OnClickListener listener; + private final AdapterEpisodeVertBinding binding; + + public EpisodeVertHolder(@NonNull AdapterEpisodeVertBinding binding, EpisodeAdapter.OnClickListener listener) { + super(binding.getRoot()); + this.binding = binding; + this.listener = listener; + } + + @Override + public void initView(Episode item) { + binding.text.setSelected(item.isActivated()); + binding.text.setActivated(item.isActivated()); + binding.text.setText(item.getDesc().concat(item.getName())); + binding.text.setOnClickListener(v -> listener.onItemClick(item)); + } +} diff --git a/app/src/mobile/res/layout/activity_detail.xml b/app/src/mobile/res/layout/activity_detail.xml index 787ef04a9..d4a346539 100644 --- a/app/src/mobile/res/layout/activity_detail.xml +++ b/app/src/mobile/res/layout/activity_detail.xml @@ -1,123 +1,121 @@ - + android:fitsSystemWindows="true" + android:orientation="vertical"> - + android:layout_height="match_parent" + android:fillViewport="true"> - - - + android:layout_height="match_parent"> - + - + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:layout_toEndOf="@+id/pic" + android:gravity="center_vertical" + android:minHeight="168dp" + android:orientation="vertical"> + + + + + + + + - - - - + tools:text="相傳22年前,在一個童話般的世界裡,曾經擁有一切的海賊王在走上斷頭台的時候對人們狂笑道:“想要我的財寶是嗎,想要就給你們!去找吧,全世界的寶藏都在那裡!”……自此開始,全世界勇敢的男人都離開了平庸的生活,走向了大海,向著埋藏海賊王寶藏的偉大航道挺進!世界簡直成為了大海賊時代!在某個村子的小孩莫奇。 D.路飛對“海賊王”甚為仰慕,立志要成為新一代的海賊王。因此他希望駐紮在村子的海盜團能帶他出海,可是遭船長紅發撒古斯拒絕。有一天路飛不小心偷吃了撒古斯帶來的戰利品-惡魔果實,成為了永遠不能游泳的橡皮人,令他的海盜夢想泡湯。後來路飛被一群討厭撒古斯的人捉了,在被海獸吃掉之際,被撒古斯救走,而撒古斯的手也犧牲了。撒古斯臨行前將草帽送給路飛,使他重燃起當海賊王的決心。事隔十年,苦練一身橡皮絕技的少年路飛揚帆出發,開始找尋One Piece的冒險…… 傳說開始了! !大家帶著新的誓言,終到達了“偉大航道”的入口。路飛他們攀山、過海,眼看就要闖進去了,面前郤出現了一個黑團? !圍繞著“大秘寶one piece”而展開的海洋冒險故事現在開始!" /> - + android:layout_below="@+id/content" + android:layout_marginTop="16dp" + android:clipChildren="false" + android:clipToPadding="false" + android:orientation="horizontal" + android:paddingStart="16dp" + android:paddingEnd="16dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/adapter_flag" /> - - - - - - - + android:layout_below="@+id/flag" + android:layout_marginTop="16dp" + android:layout_marginBottom="16dp" + android:clipChildren="false" + android:clipToPadding="false" + android:nestedScrollingEnabled="false" + android:orientation="vertical" + android:paddingStart="16dp" + android:paddingEnd="16dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/adapter_episode_vert" /> - - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/adapter_episode_list.xml b/app/src/mobile/res/layout/adapter_episode_hori.xml similarity index 100% rename from app/src/mobile/res/layout/adapter_episode_list.xml rename to app/src/mobile/res/layout/adapter_episode_hori.xml diff --git a/app/src/mobile/res/layout/adapter_episode_vert.xml b/app/src/mobile/res/layout/adapter_episode_vert.xml new file mode 100644 index 000000000..79b43ccd4 --- /dev/null +++ b/app/src/mobile/res/layout/adapter_episode_vert.xml @@ -0,0 +1,11 @@ + + \ No newline at end of file