Use event bus to fix bug

pull/4/head^2
FongMi 3 years ago
parent 197b0056ac
commit afe8ce9dc5
  1. 1
      app/build.gradle
  2. 14
      app/src/main/java/com/fongmi/bear/event/PlayerEvent.java
  3. 37
      app/src/main/java/com/fongmi/bear/player/Players.java
  4. 35
      app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java
  5. 7
      app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java
  6. 35
      app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java
  7. 4
      app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java

@ -46,6 +46,7 @@ dependencies {
implementation 'com.google.android.exoplayer:exoplayer:2.18.0'
implementation 'com.google.android.exoplayer:extension-rtmp:2.18.0'
implementation 'com.google.code.gson:gson:2.9.0'
implementation 'org.greenrobot:eventbus:3.3.1'
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'org.nanohttpd:nanohttpd:2.3.1'
implementation 'com.orhanobut:logger:2.2.0'

@ -0,0 +1,14 @@
package com.fongmi.bear.event;
public class PlayerEvent {
private int state;
public PlayerEvent(int state) {
this.state = state;
}
public int getState() {
return state;
}
}

@ -3,37 +3,39 @@ package com.fongmi.bear.player;
import android.app.Activity;
import com.fongmi.bear.App;
import com.fongmi.bear.event.PlayerEvent;
import com.fongmi.bear.ui.custom.CustomWebView;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Player;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.greenrobot.eventbus.EventBus;
import java.util.HashMap;
import java.util.Map;
public class Player implements com.google.android.exoplayer2.Player.Listener {
public class Players implements Player.Listener {
private final ExoPlayer exoPlayer;
private CustomWebView webView;
private Activity activity;
private Callback callback;
private static class Loader {
static volatile Player INSTANCE = new Player();
static volatile Players INSTANCE = new Players();
}
public static Player get() {
public static Players get() {
return Loader.INSTANCE;
}
public Player() {
public Players() {
webView = new CustomWebView(App.get());
exoPlayer = new ExoPlayer.Builder(App.get()).build();
exoPlayer.addListener(this);
}
public Player callback(Activity activity) {
this.callback = (Callback) activity;
public Players callback(Activity activity) {
this.activity = activity;
return this;
}
@ -81,6 +83,7 @@ public class Player implements com.google.android.exoplayer2.Player.Listener {
public void stop() {
if (exoPlayer != null) {
exoPlayer.stop();
exoPlayer.seekTo(0);
}
}
@ -98,24 +101,6 @@ public class Player implements com.google.android.exoplayer2.Player.Listener {
@Override
public void onPlaybackStateChanged(int state) {
switch (state) {
case com.google.android.exoplayer2.Player.STATE_BUFFERING:
callback.onBuffering();
break;
case com.google.android.exoplayer2.Player.STATE_READY:
callback.onReady();
break;
case com.google.android.exoplayer2.Player.STATE_ENDED:
break;
case com.google.android.exoplayer2.Player.STATE_IDLE:
break;
}
}
public interface Callback {
void onBuffering();
void onReady();
EventBus.getDefault().post(new PlayerEvent(state));
}
}

@ -19,17 +19,23 @@ 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.event.PlayerEvent;
import com.fongmi.bear.model.SiteViewModel;
import com.fongmi.bear.player.Player;
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.ResUtil;
import com.google.android.exoplayer2.Player;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public class DetailActivity extends BaseActivity implements Player.Callback {
public class DetailActivity extends BaseActivity {
private ActivityDetailBinding mBinding;
private ArrayObjectAdapter mFlagAdapter;
@ -57,7 +63,7 @@ public class DetailActivity extends BaseActivity implements Player.Callback {
@Override
protected void initView() {
mBinding.progressLayout.showProgress();
mBinding.video.setPlayer(Player.get().callback(this).exo());
mBinding.video.setPlayer(Players.get().callback(this).exo());
setRecyclerView();
setViewModel();
getDetail();
@ -65,6 +71,7 @@ public class DetailActivity extends BaseActivity implements Player.Callback {
@Override
protected void initEvent() {
EventBus.getDefault().register(this);
mBinding.flag.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
@Override
public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) {
@ -110,7 +117,7 @@ public class DetailActivity extends BaseActivity implements Player.Callback {
private void setViewModel() {
mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class);
mSiteViewModel.player.observe(this, object -> Player.get().setMediaSource(object));
mSiteViewModel.player.observe(this, object -> Players.get().setMediaSource(object));
mSiteViewModel.result.observe(this, result -> {
if (result.getList().isEmpty()) mBinding.progressLayout.showErrorText();
else setDetail(result.getList().get(0));
@ -167,25 +174,21 @@ public class DetailActivity extends BaseActivity implements Player.Callback {
mGroupAdapter.addAll(0, items);
}
@Override
public void onBuffering() {
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
}
@Override
public void onReady() {
mBinding.progress.getRoot().setVisibility(View.GONE);
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlaybackStateChanged(PlayerEvent event) {
mBinding.progress.getRoot().setVisibility(event.getState() == Player.STATE_BUFFERING ? View.VISIBLE : View.GONE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mBinding.video.setPlayer(Player.get().exo());
mBinding.video.setPlayer(Players.get().exo());
}
@Override
public void onBackPressed() {
Player.get().stop();
super.onBackPressed();
protected void onDestroy() {
super.onDestroy();
Players.get().stop();
EventBus.getDefault().unregister(this);
}
}

@ -17,6 +17,7 @@ import com.fongmi.bear.bean.Result;
import com.fongmi.bear.bean.Vod;
import com.fongmi.bear.databinding.ActivityHomeBinding;
import com.fongmi.bear.model.SiteViewModel;
import com.fongmi.bear.player.Players;
import com.fongmi.bear.ui.custom.CustomRowPresenter;
import com.fongmi.bear.ui.custom.CustomSelector;
import com.fongmi.bear.ui.presenter.FuncPresenter;
@ -128,4 +129,10 @@ public class HomeActivity extends BaseActivity implements VodPresenter.OnClickLi
if (resultCode != RESULT_OK) return;
getVideo();
}
@Override
protected void onDestroy() {
super.onDestroy();
Players.get().release();
}
}

@ -8,12 +8,18 @@ import android.view.View;
import androidx.viewbinding.ViewBinding;
import com.fongmi.bear.databinding.ActivityPlayBinding;
import com.fongmi.bear.event.PlayerEvent;
import com.fongmi.bear.impl.KeyDownImpl;
import com.fongmi.bear.player.Player;
import com.fongmi.bear.player.Players;
import com.fongmi.bear.utils.KeyDown;
import com.fongmi.bear.utils.Utils;
import com.google.android.exoplayer2.Player;
public class PlayActivity extends BaseActivity implements Player.Callback, KeyDownImpl {
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class PlayActivity extends BaseActivity implements KeyDownImpl {
private ActivityPlayBinding mBinding;
private KeyDown mKeyDown;
@ -30,27 +36,22 @@ public class PlayActivity extends BaseActivity implements Player.Callback, KeyDo
@Override
protected void initView() {
mKeyDown = KeyDown.create(this);
mBinding.video.setPlayer(Player.get().callback(this).exo());
mBinding.video.setPlayer(Players.get().callback(this).exo());
}
@Override
protected void initEvent() {
EventBus.getDefault().register(this);
}
@Override
public void onBuffering() {
mBinding.progress.getRoot().setVisibility(View.VISIBLE);
}
@Override
public void onReady() {
mBinding.progress.getRoot().setVisibility(View.GONE);
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlaybackStateChanged(PlayerEvent event) {
mBinding.progress.getRoot().setVisibility(event.getState() == Player.STATE_BUFFERING ? View.VISIBLE : View.GONE);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (!mBinding.video.isControllerVisible() && Utils.hasEvent(event)) return mKeyDown.onKeyDown(event);
if (!mBinding.video.isControllerFullyVisible() && Utils.hasEvent(event)) return mKeyDown.onKeyDown(event);
else return super.dispatchKeyEvent(event);
}
@ -96,10 +97,16 @@ public class PlayActivity extends BaseActivity implements Player.Callback, KeyDo
@Override
public void onBackPressed() {
if (mBinding.video.isControllerVisible()) {
if (mBinding.video.isControllerFullyVisible()) {
mBinding.video.hideController();
} else {
super.onBackPressed();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}

@ -15,7 +15,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.fongmi.bear.ApiConfig;
import com.fongmi.bear.player.Player;
import com.fongmi.bear.player.Players;
import com.fongmi.bear.utils.Utils;
import java.io.ByteArrayInputStream;
@ -67,7 +67,7 @@ public class CustomWebView extends WebView {
String url = request.getUrl().toString();
String host = request.getUrl().getHost();
if (ads.contains(host)) return empty;
if (Utils.isVideoFormat(url)) Player.get().setMediaSource(request.getRequestHeaders(), url);
if (Utils.isVideoFormat(url)) Players.get().setMediaSource(request.getRequestHeaders(), url);
return super.shouldInterceptRequest(view, request);
}

Loading…
Cancel
Save