From 3df1701a33694a39182bf230d6f9e35fd10f5ced Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 18 Jul 2022 19:00:54 +0800 Subject: [PATCH] Add play controller - part 3 --- .../main/java/com/fongmi/bear/bean/Vod.java | 21 +++++++ .../com/fongmi/bear/impl/KeyDownImpl.java | 4 +- .../bear/ui/activity/DetailActivity.java | 18 +++--- .../fongmi/bear/ui/activity/PlayActivity.java | 62 ++++++++++++++++++- .../bear/ui/presenter/EpisodePresenter.java | 9 --- .../bear/ui/presenter/VodPresenter.java | 4 +- .../java/com/fongmi/bear/utils/KeyDown.java | 10 +-- app/src/main/res/layout/view_controller.xml | 12 ++-- app/src/main/res/values-zh-rCN/strings.xml | 11 ++++ app/src/main/res/values-zh-rTW/strings.xml | 11 ++++ app/src/main/res/values/strings.xml | 11 ++++ 11 files changed, 140 insertions(+), 33 deletions(-) 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 c2b598206..464ea85ff 100644 --- a/app/src/main/java/com/fongmi/bear/bean/Vod.java +++ b/app/src/main/java/com/fongmi/bear/bean/Vod.java @@ -3,6 +3,8 @@ package com.fongmi.bear.bean; import android.text.TextUtils; import android.view.View; +import androidx.annotation.NonNull; + import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; @@ -104,9 +106,15 @@ public class Vod { public static class Flag { + @SerializedName("flag") private final String flag; + @SerializedName("episodes") private final List episodes; + public static Flag objectFrom(String str) { + return new Gson().fromJson(str, Flag.class); + } + public Flag(String flag) { this.flag = flag; this.episodes = new ArrayList<>(); @@ -128,10 +136,19 @@ public class Vod { for (Episode item : getEpisodes()) item.setActivated(episode); } + @NonNull + @Override + public String toString() { + return new Gson().toJson(this); + } + public static class Episode { + @SerializedName("name") private final String name; + @SerializedName("url") private final String url; + @SerializedName("activated") private boolean activated; public Episode(String name, String url) { @@ -151,6 +168,10 @@ public class Vod { return activated; } + public void setActivated(boolean activated) { + this.activated = activated; + } + private void deactivated() { this.activated = false; } diff --git a/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java b/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java index 7d4b2946f..6a46adf14 100644 --- a/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java +++ b/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java @@ -4,7 +4,9 @@ public interface KeyDownImpl { void onSeek(boolean forward); - void onKeyVertical(boolean up); + void onKeyUp(); + + void onKeyDown(); void onKeyLeft(); 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 0c065bc83..c86f2e2d6 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 @@ -49,6 +49,10 @@ public class DetailActivity extends BaseActivity { return getIntent().getStringExtra("id"); } + private Vod.Flag getVodFlag() { + return (Vod.Flag) mFlagAdapter.get(mBinding.flag.getSelectedPosition()); + } + public static void start(Activity activity, String id) { Intent intent = new Intent(activity, DetailActivity.class); intent.putExtra("id", id); @@ -86,11 +90,11 @@ public class DetailActivity extends BaseActivity { }); mEpisodePresenter.setOnClickListener(item -> { setEpisodeActivated(item); - getPlayer(mEpisodePresenter.getFlag(), item.getUrl()); + getPlayer(item.getUrl()); }); mBinding.frame.setOnClickListener(view -> { mBinding.video.setPlayer(null); - PlayActivity.newInstance(getActivity()); + PlayActivity.newInstance(getActivity(), getVodFlag()); }); } @@ -110,9 +114,9 @@ public class DetailActivity extends BaseActivity { mSiteViewModel.detailContent(getId()); } - private void getPlayer(String flag, String id) { + private void getPlayer(String id) { mBinding.progress.getRoot().setVisibility(View.VISIBLE); - mSiteViewModel.playerContent(flag, id); + mSiteViewModel.playerContent(getVodFlag().getFlag(), id); } private void setViewModel() { @@ -161,16 +165,16 @@ public class DetailActivity extends BaseActivity { private void setEpisode(Vod.Flag item) { mEpisodeAdapter.clear(); - mEpisodePresenter.setFlag(item.getFlag()); mEpisodeAdapter.addAll(0, item.getEpisodes()); - if (item.getEpisodes().size() > 20) setGroup(item.getEpisodes().size()); + setGroup(item.getEpisodes().size()); } private void setGroup(int size) { List items = new ArrayList<>(); 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(View.VISIBLE); + mBinding.group.setVisibility(itemSize > 1 ? View.VISIBLE : View.GONE); + mGroupAdapter.clear(); mGroupAdapter.addAll(0, items); } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java index a349ee352..15a6833bc 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java @@ -5,13 +5,19 @@ import android.content.Intent; import android.view.KeyEvent; import android.view.View; +import androidx.lifecycle.ViewModelProvider; import androidx.viewbinding.ViewBinding; +import com.fongmi.bear.R; +import com.fongmi.bear.bean.Vod; import com.fongmi.bear.databinding.ActivityPlayBinding; import com.fongmi.bear.event.PlayerEvent; import com.fongmi.bear.impl.KeyDownImpl; +import com.fongmi.bear.model.SiteViewModel; import com.fongmi.bear.player.Players; import com.fongmi.bear.utils.KeyDown; +import com.fongmi.bear.utils.Notify; +import com.fongmi.bear.utils.ResUtil; import com.fongmi.bear.utils.Utils; import com.google.android.exoplayer2.Player; @@ -22,10 +28,19 @@ import org.greenrobot.eventbus.ThreadMode; public class PlayActivity extends BaseActivity implements KeyDownImpl { private ActivityPlayBinding mBinding; + private SiteViewModel mSiteViewModel; + private Vod.Flag mVodFlag; private KeyDown mKeyDown; + private int mCurrent; - public static void newInstance(Activity activity) { - activity.startActivityForResult(new Intent(activity, PlayActivity.class), 1000); + private String getFlag() { + return getIntent().getStringExtra("flag"); + } + + public static void newInstance(Activity activity, Vod.Flag flag) { + Intent intent = new Intent(activity, PlayActivity.class); + intent.putExtra("flag", flag.toString()); + activity.startActivityForResult(intent, 1000); } @Override @@ -36,12 +51,48 @@ public class PlayActivity extends BaseActivity implements KeyDownImpl { @Override protected void initView() { mKeyDown = KeyDown.create(this); + mVodFlag = Vod.Flag.objectFrom(getFlag()); mBinding.video.setPlayer(Players.get().callback(this).exo()); + setViewModel(); + findCurrent(); } @Override protected void initEvent() { EventBus.getDefault().register(this); + mBinding.video.findViewById(R.id.next).setOnClickListener(view -> { + int max = mVodFlag.getEpisodes().size() - 1; + mCurrent = ++mCurrent > max ? max : mCurrent; + if (mVodFlag.getEpisodes().get(mCurrent).isActivated()) Notify.show(R.string.error_play_next); + else getPlayer(); + }); + mBinding.video.findViewById(R.id.prev).setOnClickListener(view -> { + mCurrent = --mCurrent < 0 ? 0 : mCurrent; + if (mVodFlag.getEpisodes().get(mCurrent).isActivated()) Notify.show(R.string.error_play_prev); + else getPlayer(); + }); + } + + private void setViewModel() { + mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); + mSiteViewModel.player.observe(this, object -> Players.get().setMediaSource(object)); + } + + private void findCurrent() { + for (int i = 0; i < mVodFlag.getEpisodes().size(); i++) { + if (mVodFlag.getEpisodes().get(i).isActivated()) { + mCurrent = i; + break; + } + } + } + + private void getPlayer() { + Vod.Flag.Episode episode = mVodFlag.getEpisodes().get(mCurrent); + mVodFlag.setActivated(episode); + mBinding.progress.getRoot().setVisibility(View.VISIBLE); + mSiteViewModel.playerContent(mVodFlag.getFlag(), episode.getUrl()); + Notify.show(ResUtil.getString(R.string.play_ready, episode.getName())); } @Subscribe(threadMode = ThreadMode.MAIN) @@ -61,8 +112,13 @@ public class PlayActivity extends BaseActivity implements KeyDownImpl { } @Override - public void onKeyVertical(boolean up) { + public void onKeyUp() { + + } + @Override + public void onKeyDown() { + mBinding.video.showController(); } @Override diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java index 8e0a69d96..cfe2ad455 100644 --- a/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java @@ -12,7 +12,6 @@ import com.fongmi.bear.databinding.AdapterEpisodeBinding; public class EpisodePresenter extends Presenter { private OnClickListener mListener; - private String flag; public interface OnClickListener { void onItemClick(Vod.Flag.Episode item); @@ -22,14 +21,6 @@ public class EpisodePresenter extends Presenter { this.mListener = listener; } - public String getFlag() { - return flag; - } - - public void setFlag(String flag) { - this.flag = flag; - } - @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { return new ViewHolder(AdapterEpisodeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); diff --git a/app/src/main/java/com/fongmi/bear/ui/presenter/VodPresenter.java b/app/src/main/java/com/fongmi/bear/ui/presenter/VodPresenter.java index 9b43547ea..9909e1057 100644 --- a/app/src/main/java/com/fongmi/bear/ui/presenter/VodPresenter.java +++ b/app/src/main/java/com/fongmi/bear/ui/presenter/VodPresenter.java @@ -31,8 +31,8 @@ public class VodPresenter extends Presenter { @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); - holder.binding.getRoot().getLayoutParams().width = ResUtil.getScreenWidthPx() / mCount - mCount * ResUtil.dp2px(4); - holder.binding.getRoot().getLayoutParams().height = (int) (holder.binding.getRoot().getLayoutParams().width / 0.75f); + holder.binding.getRoot().getLayoutParams().width = ResUtil.dp2px(mCount == 5 ? 150 : 144); + holder.binding.getRoot().getLayoutParams().height = ResUtil.dp2px(mCount == 5 ? 200 : 192); return holder; } diff --git a/app/src/main/java/com/fongmi/bear/utils/KeyDown.java b/app/src/main/java/com/fongmi/bear/utils/KeyDown.java index a8be317e3..b9a9cdf48 100644 --- a/app/src/main/java/com/fongmi/bear/utils/KeyDown.java +++ b/app/src/main/java/com/fongmi/bear/utils/KeyDown.java @@ -18,14 +18,14 @@ public class KeyDown { } public boolean onKeyDown(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) { - mKeyDown.onKeyVertical(true); - } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) { - mKeyDown.onKeyVertical(false); - } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) { + if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) { mKeyDown.onSeek(false); } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) { mKeyDown.onSeek(true); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isUpKey(event)) { + mKeyDown.onKeyUp(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDownKey(event)) { + mKeyDown.onKeyDown(); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) { mKeyDown.onKeyLeft(); } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) { diff --git a/app/src/main/res/layout/view_controller.xml b/app/src/main/res/layout/view_controller.xml index 42bb48439..4b1f527b1 100644 --- a/app/src/main/res/layout/view_controller.xml +++ b/app/src/main/res/layout/view_controller.xml @@ -22,7 +22,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" - android:text="播放" + android:text="@string/play_play" android:textColor="@color/grey_700" android:textSize="16sp" /> @@ -34,7 +34,7 @@ android:background="@drawable/selector_text" android:focusable="true" android:focusableInTouchMode="true" - android:text="下一集" + android:text="@string/play_next" android:textColor="@color/white" /> @@ -80,7 +80,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" - android:text="縮放比例" + android:text="@string/play_scale" android:textColor="@color/grey_700" android:textSize="16sp" /> diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index d8e7c708d..bc582525d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -24,6 +24,15 @@ 演员:%s 简介:%s + + 播放 + 下一集 + 上一集 + 准备播放:%s + 重播本集 + 倍速 + 缩放 + 首页 配置 @@ -37,5 +46,7 @@ 配置取得失败 配置解析失败 + 已经是最后一集了! + 已经是第一集了! \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 62e9b274d..3b11075dd 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -24,6 +24,15 @@ 演員:%s 簡介:%s + + 播放 + 下一集 + 上一集 + 準備播放:%s + 重播本集 + 倍速 + 縮放 + 首頁 配置 @@ -37,5 +46,7 @@ 配置取得失敗 配置解析失敗 + 已經是最後一集了! + 已經是第一集了! \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8a23733fa..b540e5088 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,15 @@ Actor: %s Summary: %s + + Play + Next + Prev + Ready to play: %s + Replay + Speed + Scale + Home site Configure @@ -37,5 +46,7 @@ Configuration get failed Configuration parse failed + It\'s the last episode! + It\'s the first episode! \ No newline at end of file