diff --git a/app/src/main/java/com/fongmi/bear/player/Player.java b/app/src/main/java/com/fongmi/bear/player/Player.java index b4803356b..557d1f111 100644 --- a/app/src/main/java/com/fongmi/bear/player/Player.java +++ b/app/src/main/java/com/fongmi/bear/player/Player.java @@ -7,9 +7,10 @@ import com.google.gson.JsonParser; import java.util.HashMap; -public class Player { +public class Player implements com.google.android.exoplayer2.Player.Listener { - private ExoPlayer mPlayer; + private ExoPlayer player; + private Callback callback; private static class Loader { static volatile Player INSTANCE = new Player(); @@ -19,8 +20,11 @@ public class Player { return Loader.INSTANCE; } - public static ExoPlayer exo() { - return get().mPlayer = get().mPlayer == null ? new ExoPlayer.Builder(App.get()).build() : get().mPlayer; + public ExoPlayer exo(Callback callback) { + if (player == null) player = new ExoPlayer.Builder(App.get()).build(); + player.addListener(this); + this.callback = callback; + return player; } public void setMediaSource(JsonObject object) { @@ -30,8 +34,24 @@ public class Player { JsonObject header = JsonParser.parseString(object.get("header").getAsString()).getAsJsonObject(); for (String key : header.keySet()) headers.put(key, header.get(key).getAsString()); } - mPlayer.setMediaSource(ExoUtil.getSource(headers, url)); - mPlayer.prepare(); - mPlayer.play(); + player.setMediaSource(ExoUtil.getSource(headers, url)); + player.prepare(); + player.play(); + } + + public void stop() { + if (player != null && player.isPlaying()) { + player.stop(); + } + } + + @Override + public void onPlaybackStateChanged(int state) { + if (state != com.google.android.exoplayer2.Player.STATE_READY) return; + callback.onPrepared(); + } + + public interface Callback { + void onPrepared(); } } 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 58e59482a..e7728d331 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 @@ -29,7 +29,7 @@ import com.fongmi.bear.utils.ResUtil; import java.util.ArrayList; import java.util.List; -public class DetailActivity extends BaseActivity { +public class DetailActivity extends BaseActivity implements Player.Callback { private ActivityDetailBinding mBinding; private ArrayObjectAdapter mFlagAdapter; @@ -56,8 +56,8 @@ public class DetailActivity extends BaseActivity { @Override protected void initView() { - mBinding.progress.showProgress(); - mBinding.video.setPlayer(Player.exo()); + mBinding.progressLayout.showProgress(); + mBinding.video.setPlayer(Player.get().exo(this)); setRecyclerView(); setViewModel(); getDetail(); @@ -114,13 +114,13 @@ public class DetailActivity extends BaseActivity { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mSiteViewModel.player.observe(this, object -> Player.get().setMediaSource(object)); mSiteViewModel.result.observe(this, result -> { - if (result.getList().isEmpty()) mBinding.progress.showErrorText(); + if (result.getList().isEmpty()) mBinding.progressLayout.showErrorText(); else setDetail(result.getList().get(0)); }); } private void setDetail(Vod item) { - mBinding.progress.showContent(); + mBinding.progressLayout.showContent(); mBinding.name.setText(item.getVodName()); setText(mBinding.year, R.string.detail_year, item.getVodYear()); setText(mBinding.area, R.string.detail_area, item.getVodArea()); @@ -151,4 +151,15 @@ public class DetailActivity extends BaseActivity { mBinding.group.setVisibility(View.VISIBLE); mGroupAdapter.addAll(0, items); } + + @Override + public void onPrepared() { + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + Player.get().stop(); + } } diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 79b3fa229..ec6ddb6dc 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -2,12 +2,12 @@ - + android:focusableInTouchMode="true"> + + + +