Fix switch to full screen problem

pull/5/head
FongMi 4 years ago
parent a70534a9bc
commit 3ae4c8ee7f
  1. 5
      app/src/main/AndroidManifest.xml
  2. 20
      app/src/main/java/com/fongmi/bear/player/Players.java
  3. 144
      app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java
  4. 212
      app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java
  5. 16
      app/src/main/res/layout/activity_detail.xml
  6. 31
      app/src/main/res/layout/activity_play.xml
  7. 2
      app/src/main/res/layout/view_controller_bottom.xml

@ -73,11 +73,6 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="sensorLandscape" />
<activity
android:name=".ui.activity.PlayActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="sensorLandscape" />
<activity
android:name=".ui.activity.SettingActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

@ -27,7 +27,6 @@ public class Players implements Player.Listener {
private Formatter formatter;
private ExoPlayer exoPlayer;
private Handler handler;
private String videoKey;
private static class Loader {
static volatile Players INSTANCE = new Players();
@ -50,14 +49,6 @@ public class Players implements Player.Listener {
return exoPlayer;
}
public String getVideoKey() {
return videoKey;
}
public void setVideoKey(String videoKey) {
this.videoKey = videoKey;
}
public String getSpeed() {
return String.format(Locale.getDefault(), "%.2f", exoPlayer.getPlaybackParameters().speed);
}
@ -70,18 +61,17 @@ public class Players implements Player.Listener {
return getSpeed();
}
public String getTime(int time) {
return Util.getStringForTime(builder, formatter, exoPlayer.getCurrentPosition() + time);
public String getTime(long time) {
time = exoPlayer.getCurrentPosition() + time;
if (time > 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();
}

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

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

@ -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" />
<include
@ -33,12 +35,21 @@
layout="@layout/view_progress"
android:visibility="gone" />
<include
android:id="@+id/center"
layout="@layout/view_controller_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
</FrameLayout>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="24dp"
android:layout_toEndOf="@+id/frame"
@ -152,6 +163,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/frame"
android:layout_marginTop="12dp"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingStart="24dp"

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:keepScreenOn="true">
<com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:animation_enabled="false"
app:auto_show="false"
app:controller_layout_id="@layout/view_controller_bottom"
app:resize_mode="fit" />
<include
android:id="@+id/progress"
layout="@layout/view_progress"
android:visibility="gone" />
<include
android:id="@+id/center"
layout="@layout/view_controller_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
</FrameLayout>

@ -51,7 +51,7 @@
android:textColor="@color/white" />
<TextView
android:id="@+id/replay"
android:id="@+id/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"

Loading…
Cancel
Save