From 3ae4c8ee7f1ca10527c47e11988568abea36137a Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 27 Jul 2022 00:32:45 +0800 Subject: [PATCH] Fix switch to full screen problem --- app/src/main/AndroidManifest.xml | 5 - .../java/com/fongmi/bear/player/Players.java | 20 +- .../bear/ui/activity/DetailActivity.java | 144 ++++++++++-- .../fongmi/bear/ui/activity/PlayActivity.java | 212 ------------------ app/src/main/res/layout/activity_detail.xml | 16 +- app/src/main/res/layout/activity_play.xml | 31 --- .../res/layout/view_controller_bottom.xml | 2 +- 7 files changed, 140 insertions(+), 290 deletions(-) delete mode 100644 app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java delete mode 100644 app/src/main/res/layout/activity_play.xml 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" />