Add play controller - part 3

pull/3/head
FongMi 4 years ago
parent 63ba729456
commit 3df1701a33
  1. 21
      app/src/main/java/com/fongmi/bear/bean/Vod.java
  2. 4
      app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java
  3. 18
      app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java
  4. 62
      app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java
  5. 9
      app/src/main/java/com/fongmi/bear/ui/presenter/EpisodePresenter.java
  6. 4
      app/src/main/java/com/fongmi/bear/ui/presenter/VodPresenter.java
  7. 10
      app/src/main/java/com/fongmi/bear/utils/KeyDown.java
  8. 12
      app/src/main/res/layout/view_controller.xml
  9. 11
      app/src/main/res/values-zh-rCN/strings.xml
  10. 11
      app/src/main/res/values-zh-rTW/strings.xml
  11. 11
      app/src/main/res/values/strings.xml

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

@ -4,7 +4,9 @@ public interface KeyDownImpl {
void onSeek(boolean forward);
void onKeyVertical(boolean up);
void onKeyUp();
void onKeyDown();
void onKeyLeft();

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

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

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

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

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

@ -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" />
<TextView
@ -45,7 +45,7 @@
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="上一集"
android:text="@string/play_prev"
android:textColor="@color/white" />
<TextView
@ -55,14 +55,14 @@
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="重播本集"
android:text="@string/play_reset"
android:textColor="@color/white" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="倍速"
android:text="@string/play_speed"
android:textColor="@color/grey_700"
android:textSize="16sp" />
@ -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" />

@ -24,6 +24,15 @@
<string name="detail_actor">演员:<xliff:g name="name">%s</xliff:g></string>
<string name="detail_content">简介:<xliff:g name="name">%s</xliff:g></string>
<!-- Play -->
<string name="play_play">播放</string>
<string name="play_next">下一集</string>
<string name="play_prev">上一集</string>
<string name="play_ready">准备播放:<xliff:g name="name">%s</xliff:g></string>
<string name="play_reset">重播本集</string>
<string name="play_speed">倍速</string>
<string name="play_scale">缩放</string>
<!-- Setting -->
<string name="setting_site">首页</string>
<string name="setting_url">配置</string>
@ -37,5 +46,7 @@
<!-- Error -->
<string name="error_config_get">配置取得失败</string>
<string name="error_config_parse">配置解析失败</string>
<string name="error_play_next">已经是最后一集了!</string>
<string name="error_play_prev">已经是第一集了!</string>
</resources>

@ -24,6 +24,15 @@
<string name="detail_actor">演員:<xliff:g name="name">%s</xliff:g></string>
<string name="detail_content">簡介:<xliff:g name="name">%s</xliff:g></string>
<!-- Play -->
<string name="play_play">播放</string>
<string name="play_next">下一集</string>
<string name="play_prev">上一集</string>
<string name="play_ready">準備播放:<xliff:g name="name">%s</xliff:g></string>
<string name="play_reset">重播本集</string>
<string name="play_speed">倍速</string>
<string name="play_scale">縮放</string>
<!-- Setting -->
<string name="setting_site">首頁</string>
<string name="setting_url">配置</string>
@ -37,5 +46,7 @@
<!-- Error -->
<string name="error_config_get">配置取得失敗</string>
<string name="error_config_parse">配置解析失敗</string>
<string name="error_play_next">已經是最後一集了!</string>
<string name="error_play_prev">已經是第一集了!</string>
</resources>

@ -24,6 +24,15 @@
<string name="detail_actor">Actor: <xliff:g name="name">%s</xliff:g></string>
<string name="detail_content">Summary: <xliff:g name="name">%s</xliff:g></string>
<!-- Play -->
<string name="play_play">Play</string>
<string name="play_next">Next</string>
<string name="play_prev">Prev</string>
<string name="play_ready">Ready to play: <xliff:g name="name">%s</xliff:g></string>
<string name="play_reset">Replay</string>
<string name="play_speed">Speed</string>
<string name="play_scale">Scale</string>
<!-- Setting -->
<string name="setting_site">Home site</string>
<string name="setting_url">Configure</string>
@ -37,5 +46,7 @@
<!-- Error -->
<string name="error_config_get">Configuration get failed</string>
<string name="error_config_parse">Configuration parse failed</string>
<string name="error_play_next">It\'s the last episode!</string>
<string name="error_play_prev">It\'s the first episode!</string>
</resources>
Loading…
Cancel
Save