Add vod detail - part 3

pull/3/head
FongMi 3 years ago
parent beb46cb6cd
commit ffba2b2d94
  1. 60
      app/src/main/java/com/fongmi/bear/bean/Vod.java
  2. 82
      app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java
  3. 1
      app/src/main/java/com/fongmi/bear/ui/fragment/VodFragment.java
  4. 9
      app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java
  5. 39
      app/src/main/java/com/fongmi/bear/ui/presenter/FlagPresenter.java
  6. 11
      app/src/main/res/layout/activity_detail.xml

@ -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<Flag> getVodFlags() {
List<Flag> 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<Episode> episodes;
public Flag(String flag) {
this.flag = flag;
this.episodes = new ArrayList<>();
}
public String getFlag() {
return flag;
}
public List<Episode> 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;
}
}
}
}

@ -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<Vod.Flag> 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());
}
}

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

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

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

@ -130,7 +130,7 @@
tools:text="簡介:" />
<androidx.leanback.widget.HorizontalGridView
android:id="@+id/from"
android:id="@+id/flag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/video"
@ -139,7 +139,7 @@
android:paddingStart="24dp"
android:paddingTop="12dp"
android:paddingEnd="24dp"
android:paddingBottom="16dp"
android:paddingBottom="8dp"
app:focusOutEnd="true"
app:focusOutFront="true" />
@ -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"

Loading…
Cancel
Save