diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index da5aef35c..fc3720d29 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -73,11 +73,6 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="sensorLandscape" />
-
-
exoPlayer.getDuration()) time = exoPlayer.getDuration();
+ else if (time < 0) time = 0;
+ return Util.getStringForTime(builder, formatter, time);
}
public void seekTo(int time) {
exoPlayer.seekTo(exoPlayer.getCurrentPosition() + time);
}
- public boolean isIdle() {
- return exoPlayer.getPlaybackState() == Player.STATE_IDLE;
- }
-
public boolean isPlaying() {
return exoPlayer.isPlaying();
}
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 f279f3c30..0ffd81551 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
@@ -3,8 +3,10 @@ package com.fongmi.bear.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.text.Html;
+import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
@@ -20,12 +22,15 @@ import com.fongmi.bear.ApiConfig;
import com.fongmi.bear.R;
import com.fongmi.bear.bean.Vod;
import com.fongmi.bear.databinding.ActivityDetailBinding;
+import com.fongmi.bear.databinding.ViewControllerBottomBinding;
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.ui.presenter.EpisodePresenter;
import com.fongmi.bear.ui.presenter.FlagPresenter;
import com.fongmi.bear.ui.presenter.GroupPresenter;
+import com.fongmi.bear.utils.KeyDown;
import com.fongmi.bear.utils.Notify;
import com.fongmi.bear.utils.Prefers;
import com.fongmi.bear.utils.ResUtil;
@@ -38,14 +43,18 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
-public class DetailActivity extends BaseActivity {
+public class DetailActivity extends BaseActivity implements KeyDownImpl {
+ private ViewControllerBottomBinding mControl;
+ private ViewGroup.LayoutParams mFrameParams;
private ActivityDetailBinding mBinding;
private ArrayObjectAdapter mFlagAdapter;
private ArrayObjectAdapter mGroupAdapter;
private ArrayObjectAdapter mEpisodeAdapter;
private EpisodePresenter mEpisodePresenter;
private SiteViewModel mSiteViewModel;
+ private boolean mFullscreen;
+ private KeyDown mKeyDown;
private View mOldView;
private String getId() {
@@ -56,6 +65,10 @@ public class DetailActivity extends BaseActivity {
return (Vod.Flag) mFlagAdapter.get(mBinding.flag.getSelectedPosition());
}
+ private Vod.Flag.Episode getEpisode() {
+ return getVodFlag().getEpisodes().get(mBinding.episode.getSelectedPosition());
+ }
+
public static void start(Activity activity, String id) {
Intent intent = new Intent(activity, DetailActivity.class);
intent.putExtra("id", id);
@@ -69,10 +82,11 @@ public class DetailActivity extends BaseActivity {
@Override
protected void initView() {
+ mKeyDown = KeyDown.create(this);
+ mFrameParams = mBinding.frame.getLayoutParams();
mBinding.progressLayout.showProgress();
- mBinding.video.setPlayer(Players.get().exo());
- mBinding.video.setResizeMode(Prefers.getScale());
setRecyclerView();
+ setVideoView();
setViewModel();
getDetail();
}
@@ -80,6 +94,11 @@ public class DetailActivity extends BaseActivity {
@Override
protected void initEvent() {
EventBus.getDefault().register(this);
+ mControl.next.setOnClickListener(view -> onNext());
+ mControl.prev.setOnClickListener(view -> onPrev());
+ mControl.scale.setOnClickListener(view -> onScale());
+ mControl.reset.setOnClickListener(view -> getPlayer(getEpisode()));
+ 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) {
@@ -92,15 +111,8 @@ public class DetailActivity extends BaseActivity {
if (mEpisodeAdapter.size() > 20) mBinding.episode.setSelectedPosition(position * 20);
}
});
- mEpisodePresenter.setOnClickListener(item -> {
- setEpisodeActivated(item);
- if (Players.get().isPlaying()) mBinding.frame.performClick();
- else getPlayer(item.getUrl());
- });
- mBinding.frame.setOnClickListener(view -> {
- mBinding.video.setPlayer(null);
- PlayActivity.newInstance(getActivity(), getVodFlag());
- });
+ mBinding.frame.setOnClickListener(view -> enterFullscreen());
+ mEpisodePresenter.setOnClickListener(this::getPlayer);
}
private void setRecyclerView() {
@@ -115,14 +127,22 @@ public class DetailActivity extends BaseActivity {
mBinding.group.setAdapter(new ItemBridgeAdapter(mGroupAdapter = new ArrayObjectAdapter(new GroupPresenter())));
}
+ private void setVideoView() {
+ mControl = ViewControllerBottomBinding.bind(mBinding.video.findViewById(com.google.android.exoplayer2.ui.R.id.exo_controller));
+ mControl.scale.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getScale()]);
+ mControl.speed.setText(Players.get().getSpeed());
+ mBinding.video.setResizeMode(Prefers.getScale());
+ mBinding.video.setPlayer(Players.get().exo());
+ }
+
private void getDetail() {
mSiteViewModel.detailContent(getId());
}
- private void getPlayer(String id) {
+ private void getPlayer(Vod.Flag.Episode item) {
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
- mSiteViewModel.playerContent(getVodFlag().getFlag(), id);
- Players.get().setVideoKey(id);
+ mSiteViewModel.playerContent(getVodFlag().getFlag(), item.getUrl());
+ setEpisodeActivated(item);
}
private void setViewModel() {
@@ -188,6 +208,44 @@ public class DetailActivity extends BaseActivity {
mGroupAdapter.addAll(0, items);
}
+ private void enterFullscreen() {
+ mBinding.frame.setFocusable(false);
+ mBinding.video.setUseController(true);
+ mBinding.frame.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
+ mFullscreen = true;
+ }
+
+ private void exitFullscreen() {
+ mBinding.frame.setFocusable(true);
+ mBinding.video.setUseController(false);
+ mBinding.frame.setLayoutParams(mFrameParams);
+ mFullscreen = false;
+ }
+
+ private void onNext() {
+ int max = getVodFlag().getEpisodes().size() - 1;
+ int current = mBinding.episode.getSelectedPosition();
+ current = ++current > max ? max : current;
+ Vod.Flag.Episode item = getVodFlag().getEpisodes().get(current);
+ if (item.isActivated()) Notify.show(R.string.error_play_next);
+ else getPlayer(item);
+ }
+
+ private void onPrev() {
+ int current = mBinding.episode.getSelectedPosition();
+ current = --current < 0 ? 0 : current;
+ Vod.Flag.Episode item = getVodFlag().getEpisodes().get(current);
+ if (item.isActivated()) Notify.show(R.string.error_play_prev);
+ else getPlayer(item);
+ }
+
+ private void onScale() {
+ int scale = mBinding.video.getResizeMode();
+ mBinding.video.setResizeMode(scale = scale >= 4 ? 0 : scale + 1);
+ mControl.scale.setText(ResUtil.getStringArray(R.array.select_scale)[scale]);
+ Prefers.putScale(scale);
+ }
+
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlaybackStateChanged(PlayerEvent event) {
mBinding.progress.getRoot().setVisibility(event.getState() == Player.STATE_BUFFERING ? View.VISIBLE : View.GONE);
@@ -195,17 +253,55 @@ public class DetailActivity extends BaseActivity {
}
@Override
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- mBinding.video.setResizeMode(Prefers.getScale());
- mBinding.video.setPlayer(Players.get().exo());
- if (data != null) checkResult(data);
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ if (mFullscreen && !mBinding.video.isControllerFullyVisible() && mKeyDown.hasEvent(event)) return mKeyDown.onKeyDown(event);
+ else return super.dispatchKeyEvent(event);
+ }
+
+ @Override
+ public void onSeeking(int time) {
+ mBinding.center.exoDuration.setText(mControl.exoDuration.getText());
+ mBinding.center.exoPosition.setText(Players.get().getTime(time));
+ mBinding.center.action.setImageResource(time > 0 ? R.drawable.ic_forward : R.drawable.ic_rewind);
+ mBinding.center.getRoot().setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onSeekTo(int time) {
+ mBinding.center.action.setImageResource(R.drawable.ic_play);
+ mBinding.center.getRoot().setVisibility(View.GONE);
+ Players.get().seekTo(time);
+ mKeyDown.resetTime();
}
- private void checkResult(Intent data) {
- int current = data.getIntExtra("current", 0);
- setEpisodeActivated((Vod.Flag.Episode) mEpisodeAdapter.get(current));
- mBinding.episode.setSelectedPosition(current);
+ @Override
+ public void onKeyDown() {
+ mBinding.video.showController();
+ mControl.next.requestFocus();
+ }
+
+ @Override
+ public void onKeyCenter() {
+ if (Players.get().isPlaying()) {
+ Players.get().pause();
+ mBinding.center.getRoot().setVisibility(View.VISIBLE);
+ mBinding.center.exoPosition.setText(Players.get().getTime(0));
+ mBinding.center.exoDuration.setText(mControl.exoDuration.getText());
+ } else {
+ Players.get().play();
+ mBinding.center.getRoot().setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mBinding.video.isControllerFullyVisible()) {
+ mBinding.video.hideController();
+ } else if (mFullscreen) {
+ exitFullscreen();
+ } else {
+ super.onBackPressed();
+ }
}
@Override
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
deleted file mode 100644
index 868b51b60..000000000
--- a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package com.fongmi.bear.ui.activity;
-
-import android.app.Activity;
-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.databinding.ViewControllerBottomBinding;
-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.Prefers;
-import com.fongmi.bear.utils.ResUtil;
-import com.google.android.exoplayer2.Player;
-
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-public class PlayActivity extends BaseActivity implements KeyDownImpl {
-
- private ViewControllerBottomBinding mControl;
- private ActivityPlayBinding mBinding;
- private SiteViewModel mSiteViewModel;
- private Vod.Flag mVodFlag;
- private KeyDown mKeyDown;
- private int mCurrent;
-
- 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
- protected ViewBinding getBinding() {
- return mBinding = ActivityPlayBinding.inflate(getLayoutInflater());
- }
-
- @Override
- protected void initView() {
- mKeyDown = KeyDown.create(this);
- mVodFlag = Vod.Flag.objectFrom(getFlag());
- mControl = ViewControllerBottomBinding.bind(mBinding.video.findViewById(com.google.android.exoplayer2.ui.R.id.exo_controller));
- mControl.scale.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getScale()]);
- mControl.speed.setText(Players.get().getSpeed());
- mBinding.video.setResizeMode(Prefers.getScale());
- mBinding.video.setControllerShowTimeoutMs(3000);
- if (Players.get().isIdle()) showProgress();
- setViewModel();
- findCurrent();
- }
-
- @Override
- protected void initEvent() {
- EventBus.getDefault().register(this);
- mControl.next.setOnClickListener(view -> onNext());
- mControl.prev.setOnClickListener(view -> onPrev());
- mControl.replay.setOnClickListener(view -> getPlayer());
- mControl.speed.setOnClickListener(view -> mControl.speed.setText(Players.get().addSpeed()));
- mControl.scale.setOnClickListener(view -> onScale());
- }
-
- private void setViewModel() {
- mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class);
- mSiteViewModel.player.observe(this, object -> {
- if (object != null) Players.get().setMediaSource(object);
- });
- }
-
- private void findCurrent() {
- for (int i = 0; i < mVodFlag.getEpisodes().size(); i++) {
- if (mVodFlag.getEpisodes().get(i).isActivated()) {
- mCurrent = i;
- checkVideoKey();
- mBinding.video.setPlayer(Players.get().exo());
- break;
- }
- }
- }
-
- private void checkVideoKey() {
- if (!mVodFlag.getEpisodes().get(mCurrent).getUrl().equals(Players.get().getVideoKey())) {
- Players.get().stop();
- getPlayer();
- }
- }
-
- private void showProgress() {
- if (mBinding.progress.getRoot().getVisibility() == View.GONE) {
- mBinding.progress.getRoot().setVisibility(View.VISIBLE);
- }
- }
-
- private void hideProgress() {
- if (mBinding.progress.getRoot().getVisibility() == View.VISIBLE) {
- mBinding.progress.getRoot().setVisibility(View.GONE);
- }
- }
-
- private void getPlayer() {
- Vod.Flag.Episode episode = mVodFlag.getEpisodes().get(mCurrent);
- mSiteViewModel.playerContent(mVodFlag.getFlag(), episode.getUrl());
- Notify.show(ResUtil.getString(R.string.play_ready, episode.getName()));
- Players.get().setVideoKey(episode.getUrl());
- mVodFlag.setActivated(episode);
- showProgress();
- }
-
- private void onNext() {
- 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();
- }
-
- private void onPrev() {
- mCurrent = --mCurrent < 0 ? 0 : mCurrent;
- if (mVodFlag.getEpisodes().get(mCurrent).isActivated()) Notify.show(R.string.error_play_prev);
- else getPlayer();
- }
-
- private void onScale() {
- int scale = mBinding.video.getResizeMode();
- mBinding.video.setResizeMode(scale = scale >= 4 ? 0 : scale + 1);
- mControl.scale.setText(ResUtil.getStringArray(R.array.select_scale)[scale]);
- Prefers.putScale(scale);
- }
-
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void onPlaybackStateChanged(PlayerEvent event) {
- if (event.getState() == -1) Notify.show(R.string.error_play_parse);
- if (event.getState() == Player.STATE_BUFFERING) showProgress();
- else hideProgress();
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- if (!mBinding.video.isControllerFullyVisible() && mKeyDown.hasEvent(event)) return mKeyDown.onKeyDown(event);
- else return super.dispatchKeyEvent(event);
- }
-
- @Override
- public void onSeeking(int time) {
- mBinding.center.exoDuration.setText(mControl.exoDuration.getText());
- mBinding.center.exoPosition.setText(Players.get().getTime(time));
- mBinding.center.action.setImageResource(time > 0 ? R.drawable.ic_forward : R.drawable.ic_rewind);
- mBinding.center.getRoot().setVisibility(View.VISIBLE);
- }
-
- @Override
- public void onSeekTo(int time) {
- mBinding.center.action.setImageResource(R.drawable.ic_play);
- mBinding.center.getRoot().setVisibility(View.GONE);
- Players.get().seekTo(time);
- mKeyDown.resetTime();
- }
-
- @Override
- public void onKeyDown() {
- mBinding.video.showController();
- mControl.next.requestFocus();
- }
-
- @Override
- public void onKeyCenter() {
- if (Players.get().isPlaying()) {
- Players.get().pause();
- mBinding.center.getRoot().setVisibility(View.VISIBLE);
- mBinding.center.exoPosition.setText(Players.get().getTime(0));
- mBinding.center.exoDuration.setText(mControl.exoDuration.getText());
- } else {
- Players.get().play();
- mBinding.center.getRoot().setVisibility(View.GONE);
- }
- }
-
- private void setResult() {
- Intent intent = new Intent();
- intent.putExtra("current", mCurrent);
- setResult(RESULT_OK, intent);
- }
-
- @Override
- public void onBackPressed() {
- if (mBinding.video.isControllerFullyVisible()) {
- mBinding.video.hideController();
- } else {
- setResult();
- super.onBackPressed();
- }
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- EventBus.getDefault().unregister(this);
- }
-}
diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml
index 8fbdfbef9..261f47474 100644
--- a/app/src/main/res/layout/activity_detail.xml
+++ b/app/src/main/res/layout/activity_detail.xml
@@ -13,8 +13,6 @@
android:layout_height="200dp"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
- android:layout_marginEnd="24dp"
- android:layout_marginBottom="12dp"
android:background="@color/black"
android:focusable="true"
android:focusableInTouchMode="true"
@@ -25,7 +23,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
+ app:animation_enabled="false"
+ app:auto_show="false"
+ app:controller_layout_id="@layout/view_controller_bottom"
app:resize_mode="fit"
+ app:surface_type="surface_view"
app:use_controller="false" />
+
+
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_controller_bottom.xml b/app/src/main/res/layout/view_controller_bottom.xml
index 0d5f8fa9f..403587119 100644
--- a/app/src/main/res/layout/view_controller_bottom.xml
+++ b/app/src/main/res/layout/view_controller_bottom.xml
@@ -51,7 +51,7 @@
android:textColor="@color/white" />