diff --git a/app/build.gradle b/app/build.gradle index b7f804c9e..730473600 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/src/main/java/com/fongmi/bear/event/PlayerEvent.java b/app/src/main/java/com/fongmi/bear/event/PlayerEvent.java new file mode 100644 index 000000000..690ef019f --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/event/PlayerEvent.java @@ -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; + } +} diff --git a/app/src/main/java/com/fongmi/bear/player/Player.java b/app/src/main/java/com/fongmi/bear/player/Players.java similarity index 72% rename from app/src/main/java/com/fongmi/bear/player/Player.java rename to app/src/main/java/com/fongmi/bear/player/Players.java index ba0a2177e..0a355ea6c 100644 --- a/app/src/main/java/com/fongmi/bear/player/Player.java +++ b/app/src/main/java/com/fongmi/bear/player/Players.java @@ -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)); } } 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 192d8371e..0c065bc83 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 @@ -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); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java index 05bbfcc26..e650829ae 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/HomeActivity.java @@ -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(); + } } \ No newline at end of file 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 index 9ea5e4ec5..0c1a85131 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java @@ -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); + } } diff --git a/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java b/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java index 438cef445..3d94a9337 100644 --- a/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java +++ b/app/src/main/java/com/fongmi/bear/ui/custom/CustomWebView.java @@ -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); }