Support recent - part 2

pull/21/head
FongMi 4 years ago
parent 6ea5566903
commit f0844fb4ac
  1. 110
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  3. 6
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  4. 7
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/EpisodePresenter.java
  5. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/FlagPresenter.java
  6. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java
  7. 9
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  8. 19
      app/src/main/java/com/fongmi/android/tv/bean/History.java
  9. 32
      app/src/main/java/com/fongmi/android/tv/bean/Vod.java
  10. 2
      app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java
  11. 3
      app/src/main/java/com/fongmi/android/tv/db/dao/HistoryDao.java
  12. 24
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  13. 3
      app/src/main/java/com/fongmi/android/tv/player/Players.java

@ -3,6 +3,7 @@ package com.fongmi.android.tv.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.text.Html;
import android.view.KeyEvent;
import android.view.View;
@ -55,19 +56,19 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
private ArrayObjectAdapter mGroupAdapter;
private ArrayObjectAdapter mEpisodeAdapter;
private EpisodePresenter mEpisodePresenter;
private FlagPresenter mFlagPresenter;
private SiteViewModel mSiteViewModel;
private boolean mFullscreen;
private KeyDown mKeyDown;
private History mHistory;
private View mOldView;
private Handler mHandler;
private int mCurrent;
private String getId() {
return getIntent().getStringExtra("id");
private String getKey() {
return getIntent().getStringExtra("key");
}
private String getVodKey() {
return ApiConfig.get().getHome().getKey() + "_" + getVodFlag().getFlag() + "_" + getId();
private String getId() {
return getIntent().getStringExtra("id");
}
private Vod.Flag getVodFlag() {
@ -84,7 +85,12 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
}
public static void start(Activity activity, String id) {
start(activity, ApiConfig.get().getHome().getKey(), id);
}
public static void start(Activity activity, String key, String id) {
Intent intent = new Intent(activity, DetailActivity.class);
intent.putExtra("key", key);
intent.putExtra("id", id);
activity.startActivity(intent);
}
@ -96,8 +102,8 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
@Override
protected void initView() {
mHistory = new History();
mKeyDown = KeyDown.create(this);
mHandler = new Handler(Looper.getMainLooper());
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
setRecyclerView();
@ -112,12 +118,12 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
mControl.next.setOnClickListener(view -> onNext());
mControl.prev.setOnClickListener(view -> onPrev());
mControl.scale.setOnClickListener(view -> onScale());
mControl.reset.setOnClickListener(view -> getPlayer(getEpisode()));
mControl.reset.setOnClickListener(view -> getPlayer());
mControl.speed.setOnClickListener(view -> mControl.speed.setText(Players.get().addSpeed()));
mBinding.flag.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
@Override
public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) {
setFlagActivated(child, position);
setFlagActivated((Vod.Flag) mFlagAdapter.get(position));
}
});
mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
@ -127,13 +133,14 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
}
});
mBinding.video.setOnClickListener(view -> enterFullscreen());
mEpisodePresenter.setOnClickListener(this::getPlayer);
mFlagPresenter.setOnClickListener(this::setFlagActivated);
mEpisodePresenter.setOnClickListener(this::setEpisodeActivated);
}
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.flag.setAdapter(new ItemBridgeAdapter(mFlagAdapter = new ArrayObjectAdapter(mFlagPresenter = new FlagPresenter())));
mBinding.episode.setHorizontalSpacing(ResUtil.dp2px(8));
mBinding.episode.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mBinding.episode.setAdapter(new ItemBridgeAdapter(mEpisodeAdapter = new ArrayObjectAdapter(mEpisodePresenter = new EpisodePresenter())));
@ -151,14 +158,15 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
}
private void getDetail() {
mSiteViewModel.detailContent(getId());
mSiteViewModel.detailContent(getKey(), getId());
}
private void getPlayer(Vod.Flag.Episode item) {
setEpisodeActivated(item);
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
mSiteViewModel.playerContent(getVodFlag().getFlag(), item.getUrl());
private void getPlayer() {
Vod.Flag.Episode item = getEpisode();
if (mFullscreen) Notify.show(ResUtil.getString(R.string.play_ready, item.getName()));
mSiteViewModel.playerContent(getKey(), getVodFlag().getFlag(), item.getUrl());
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
addHistory(item);
}
private void setViewModel() {
@ -177,14 +185,16 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
mBinding.progressLayout.showContent();
mBinding.video.setTag(item.getVodPic());
mBinding.name.setText(item.getVodName());
setText(mBinding.site, R.string.detail_site, ApiConfig.get().getHome().getName());
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.site, R.string.detail_site, ApiConfig.getSiteName(getKey()));
setText(mBinding.director, R.string.detail_director, item.getVodDirector());
setText(mBinding.content, R.string.detail_content, Html.fromHtml(item.getVodContent()).toString());
mFlagAdapter.addAll(0, item.getVodFlags());
mBinding.video.requestFocus();
checkHistory();
}
private void setText(TextView view, int resId, String text) {
@ -192,12 +202,29 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
else view.setText(ResUtil.getString(resId, text));
}
private void setFlagActivated(RecyclerView.ViewHolder child, int position) {
if (mOldView != null) mOldView.setActivated(false);
if (child == null) return;
mOldView = child.itemView;
mOldView.setActivated(true);
setEpisode((Vod.Flag) mFlagAdapter.get(position));
private void checkHistory() {
History history = AppDatabase.get().getHistoryDao().find(getKey() + "_" + getId());
if (history != null) {
setFlagActivated(history.getFlag());
setEpisodeActivated(history.getEpisode());
} else {
setFlagActivated((Vod.Flag) mFlagAdapter.get(0));
setEpisodeActivated((Vod.Flag.Episode) mEpisodeAdapter.get(0));
}
}
private void setFlagActivated(Vod.Flag item) {
if (mBinding.flag.isComputingLayout()) return;
for (int i = 0; i < mFlagAdapter.size(); i++) {
Vod.Flag flag = (Vod.Flag) mFlagAdapter.get(i);
flag.setActivated(flag.equals(item));
if (flag.isActivated()) {
mBinding.flag.setSelectedPosition(i);
mEpisodeAdapter.setItems(flag.getEpisodes(), null);
setGroup(flag.getEpisodes().size());
}
}
mFlagAdapter.notifyArrayItemRangeChanged(0, mFlagAdapter.size());
}
private void setEpisodeActivated(Vod.Flag.Episode item) {
@ -208,13 +235,8 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
else flag.deactivated();
}
mEpisodeAdapter.notifyArrayItemRangeChanged(0, mEpisodeAdapter.size());
}
private void setEpisode(Vod.Flag item) {
mEpisodeAdapter.clear();
mEpisodeAdapter.addAll(0, item.getEpisodes());
if (mEpisodeAdapter.size() > 0) mEpisodePresenter.performClick((Vod.Flag.Episode) mEpisodeAdapter.get(0));
setGroup(item.getEpisodes().size());
mHandler.post(() -> mBinding.episode.setSelectedPosition(getEpisodePosition()));
getPlayer();
}
private void setGroup(int size) {
@ -222,14 +244,13 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
int itemSize = (int) Math.ceil(size / 20.0f);
for (int i = 0; i < itemSize; i++) items.add(String.valueOf(i * 20 + 1));
mBinding.group.setVisibility(itemSize > 1 ? View.VISIBLE : View.GONE);
mGroupAdapter.clear();
mGroupAdapter.addAll(0, items);
mGroupAdapter.setItems(items, null);
}
private void enterFullscreen() {
mBinding.video.setForeground(null);
mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
new Handler().postDelayed(() -> mBinding.video.setUseController(true), 250);
mHandler.postDelayed(() -> mBinding.video.setUseController(true), 250);
mBinding.flag.setSelectedPosition(mCurrent);
mFullscreen = true;
}
@ -247,7 +268,7 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
current = ++current > max ? max : current;
Vod.Flag.Episode item = (Vod.Flag.Episode) mEpisodeAdapter.get(current);
if (item.isActivated()) Notify.show(R.string.error_play_next);
else getPlayer(item);
else setEpisodeActivated(item);
}
private void onPrev() {
@ -255,7 +276,7 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
current = --current < 0 ? 0 : current;
Vod.Flag.Episode item = (Vod.Flag.Episode) mEpisodeAdapter.get(current);
if (item.isActivated()) Notify.show(R.string.error_play_prev);
else getPlayer(item);
else setEpisodeActivated(item);
}
private void onScale() {
@ -265,14 +286,16 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
Prefers.putScale(scale);
}
private void newHistory() {
mHistory.setKey(getVodKey());
mHistory.setEpisodeUrl(getEpisode().getUrl());
mHistory.setVodRemarks(getEpisode().getName());
mHistory.setCreateTime(System.currentTimeMillis());
mHistory.setVodPic(mBinding.video.getTag().toString());
mHistory.setVodName(mBinding.name.getText().toString());
AppDatabase.get().getHistoryDao().insertOrUpdate(mHistory);
private void addHistory(Vod.Flag.Episode item) {
History history = new History();
history.setKey(getKey() + "_" + getId());
history.setVodFlag(getVodFlag().getFlag());
history.setEpisodeUrl(item.getUrl());
history.setVodRemarks(item.getName());
history.setCreateTime(System.currentTimeMillis());
history.setVodPic(mBinding.video.getTag().toString());
history.setVodName(mBinding.name.getText().toString());
AppDatabase.get().getHistoryDao().insertOrUpdate(history);
EventBus.getDefault().post(RefreshEvent.recent());
}
@ -280,7 +303,6 @@ public class DetailActivity extends BaseActivity implements KeyDown.Listener {
public void onPlaybackStateChanged(PlayerEvent event) {
mBinding.progress.getRoot().setVisibility(event.getState() == Player.STATE_BUFFERING ? View.VISIBLE : View.GONE);
if (event.getState() == -1) Notify.show(R.string.error_play_parse);
if (event.getState() == Player.STATE_READY) newHistory();
}
@Override

@ -178,12 +178,12 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi
@Override
public void onItemClick(Vod item) {
DetailActivity.start(getActivity(), item.getVodId());
DetailActivity.start(this, item.getVodId());
}
@Override
public void onItemClick(History item) {
DetailActivity.start(this, item.getSiteKey(), item.getVodId());
}
@Subscribe(threadMode = ThreadMode.MAIN)

@ -55,7 +55,7 @@ public class SettingActivity extends BaseActivity {
@Override
protected void initView() {
mBinding.url.setText(Prefers.getUrl());
mBinding.home.setText(ApiConfig.get().getHome().getName());
mBinding.home.setText(ApiConfig.getHomeName());
mBinding.compress.setText(ResUtil.getStringArray(R.array.select_thumbnail)[Prefers.getThumbnail()]);
}
@ -98,7 +98,7 @@ public class SettingActivity extends BaseActivity {
ApiConfig.get().clear().loadConfig(new Callback() {
@Override
public void success() {
mBinding.home.setText(ApiConfig.get().getHome().getName());
mBinding.home.setText(ApiConfig.getHomeName());
EventBus.getDefault().post(RefreshEvent.recent());
EventBus.getDefault().post(RefreshEvent.video());
Notify.dismiss();
@ -106,7 +106,7 @@ public class SettingActivity extends BaseActivity {
@Override
public void error(int resId) {
mBinding.home.setText(ApiConfig.get().getHome().getName());
mBinding.home.setText(ApiConfig.getHomeName());
EventBus.getDefault().post(RefreshEvent.recent());
EventBus.getDefault().post(RefreshEvent.video());
Notify.dismiss();

@ -12,7 +12,6 @@ import com.fongmi.android.tv.databinding.AdapterEpisodeBinding;
public class EpisodePresenter extends Presenter {
private OnClickListener mListener;
private boolean firstOpen;
public interface OnClickListener {
void onItemClick(Vod.Flag.Episode item);
@ -27,12 +26,6 @@ public class EpisodePresenter extends Presenter {
return new ViewHolder(AdapterEpisodeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
public void performClick(Vod.Flag.Episode item) {
if (firstOpen) return;
firstOpen = true;
mListener.onItemClick(item);
}
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) {
Vod.Flag.Episode item = (Vod.Flag.Episode) object;

@ -11,6 +11,16 @@ import com.fongmi.android.tv.databinding.AdapterFlagBinding;
public class FlagPresenter extends Presenter {
private OnClickListener mListener;
public interface OnClickListener {
void onItemClick(Vod.Flag item);
}
public void setOnClickListener(OnClickListener listener) {
this.mListener = listener;
}
@Override
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
return new ViewHolder(AdapterFlagBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
@ -21,6 +31,8 @@ public class FlagPresenter extends Presenter {
Vod.Flag item = (Vod.Flag) object;
ViewHolder holder = (ViewHolder) viewHolder;
holder.binding.text.setText(item.getFlag());
holder.binding.text.setActivated(item.isActivated());
setOnClickListener(holder, view -> mListener.onItemClick(item));
}
@Override

@ -52,7 +52,7 @@ public class HistoryPresenter extends Presenter {
ViewHolder holder = (ViewHolder) viewHolder;
holder.binding.name.setText(item.getVodName());
holder.binding.site.setVisibility(View.VISIBLE);
holder.binding.site.setText(ApiConfig.get().getSite(item.getSiteKey()).getName());
holder.binding.site.setText(ApiConfig.getSiteName(item.getSiteKey()));
holder.binding.remark.setText(ResUtil.getString(R.string.vod_last, item.getVodRemarks()));
ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image);
setOnClickListener(holder, view -> mListener.onItemClick(item));

@ -22,7 +22,6 @@ import com.google.gson.stream.JsonReader;
import org.json.JSONObject;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
@ -51,6 +50,14 @@ public class ApiConfig {
return Loader.INSTANCE;
}
public static String getHomeName() {
return get().getHome().getName();
}
public static String getSiteName(String key) {
return get().getSite(key).getName();
}
public ApiConfig init() {
this.ads = new ArrayList<>();
this.sites = new ArrayList<>();

@ -12,6 +12,7 @@ public class History {
private String key;
private String vodPic;
private String vodName;
private String vodFlag;
private String vodRemarks;
private String episodeUrl;
private long createTime;
@ -45,6 +46,14 @@ public class History {
this.vodName = vodName;
}
public String getVodFlag() {
return vodFlag;
}
public void setVodFlag(String vodFlag) {
this.vodFlag = vodFlag;
}
public String getVodRemarks() {
return vodRemarks;
}
@ -81,11 +90,15 @@ public class History {
return getKey().split("_")[0];
}
public String getFlag() {
public String getVodId() {
return getKey().split("_")[1];
}
public String getVodId() {
return getKey().split("_")[2];
public Vod.Flag getFlag() {
return new Vod.Flag(getVodFlag());
}
public Vod.Flag.Episode getEpisode() {
return new Vod.Flag.Episode(getEpisodeUrl());
}
}

@ -156,6 +156,8 @@ public class Vod {
@SerializedName("episodes")
private List<Episode> episodes;
private boolean activated;
public static Flag objectFrom(String str) {
return new Gson().fromJson(str, Flag.class);
}
@ -190,6 +192,14 @@ public class Vod {
}
}
public boolean isActivated() {
return activated;
}
public void setActivated(boolean activated) {
this.activated = activated;
}
public void deactivated() {
for (Episode item : getEpisodes()) item.deactivated();
}
@ -198,6 +208,14 @@ public class Vod {
for (Episode item : getEpisodes()) item.setActivated(episode);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Flag)) return false;
Flag it = (Flag) obj;
return getFlag().equals(it.getFlag());
}
@NonNull
@Override
public String toString() {
@ -210,9 +228,13 @@ public class Vod {
private final String name;
@SerializedName("url")
private final String url;
@SerializedName("activated")
private boolean activated;
public Episode(String url) {
this("", url);
}
public Episode(String name, String url) {
this.name = name;
this.url = url;
@ -237,6 +259,14 @@ public class Vod {
private void setActivated(Episode item) {
this.activated = item.equals(this);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Episode)) return false;
Episode it = (Episode) obj;
return getUrl().equals(it.getUrl());
}
}
}
}

@ -13,7 +13,7 @@ import com.fongmi.android.tv.db.dao.HistoryDao;
@Database(entities = {History.class}, version = AppDatabase.VERSION, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public static final int VERSION = 1;
public static final int VERSION = 2;
private static volatile AppDatabase instance;

@ -13,6 +13,9 @@ public abstract class HistoryDao extends BaseDao<History> {
@Query("SELECT * FROM history ORDER BY createTime DESC")
public abstract List<History> getAll();
@Query("SELECT * FROM history WHERE `key` = :key")
public abstract History find(String key);
@Query("DELETE FROM history")
public abstract void delete();
}

@ -79,23 +79,23 @@ public class SiteViewModel extends ViewModel {
});
}
public void detailContent(String id) {
Site home = ApiConfig.get().getHome();
public void detailContent(String key, String id) {
Site site = ApiConfig.get().getSite(key);
execute(result, () -> {
if (home.getType() == 3) {
Spider spider = ApiConfig.get().getCSP(home);
if (site.getType() == 3) {
Spider spider = ApiConfig.get().getCSP(site);
String detailContent = spider.detailContent(List.of(id));
SpiderDebug.log(detailContent);
Result result = Result.fromJson(detailContent);
if (!result.getList().isEmpty()) result.getList().get(0).setVodFlags();
return result;
} else {
HttpUrl url = HttpUrl.parse(home.getApi()).newBuilder().addQueryParameter("ac", home.getType() == 0 ? "videolist" : "detail").addQueryParameter("ids", id).build();
HttpUrl url = HttpUrl.parse(site.getApi()).newBuilder().addQueryParameter("ac", site.getType() == 0 ? "videolist" : "detail").addQueryParameter("ids", id).build();
String body = OKHttp.newCall(url).execute().body().string();
SpiderDebug.log(body);
Result result;
if (home.getType() == 0) result = Result.fromXml(body);
else if (home.getType() == 1) result = Result.fromJson(body);
if (site.getType() == 0) result = Result.fromXml(body);
else if (site.getType() == 1) result = Result.fromJson(body);
else result = new Result();
if (!result.getList().isEmpty()) result.getList().get(0).setVodFlags();
return result;
@ -103,11 +103,11 @@ public class SiteViewModel extends ViewModel {
});
}
public void playerContent(String flag, String id) {
Site home = ApiConfig.get().getHome();
public void playerContent(String key, String flag, String id) {
Site site = ApiConfig.get().getSite(key);
execute(player, () -> {
if (home.getType() == 3) {
Spider spider = ApiConfig.get().getCSP(home);
if (site.getType() == 3) {
Spider spider = ApiConfig.get().getCSP(site);
String playerContent = spider.playerContent(flag, id, ApiConfig.get().getFlags());
SpiderDebug.log(playerContent);
JsonObject object = JsonParser.parseString(playerContent).getAsJsonObject();
@ -117,7 +117,7 @@ public class SiteViewModel extends ViewModel {
JsonObject object = new JsonObject();
object.addProperty("url", id);
object.addProperty("flag", flag);
object.addProperty("playUrl", home.getPlayerUrl());
object.addProperty("playUrl", site.getPlayerUrl());
object.addProperty("parse", Utils.isVideoFormat(id) ? "0" : "1");
return object;
}

@ -126,6 +126,9 @@ public class Players implements Player.Listener {
exoPlayer.seekTo(0);
exoPlayer.setPlaybackSpeed(1.0f);
}
if (webView != null) {
webView.stop();
}
}
public void play() {

Loading…
Cancel
Save