diff --git a/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java b/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java index 9e04f4322..eb19f608f 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java +++ b/app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java @@ -342,6 +342,8 @@ public class PlayerManager implements ParseCallback { } private void rebuildPlayer() { + callback.onPlayerRelease(); + exoPlayer.clearVideoSurface(); exoPlayer.release(); exoPlayer = ExoUtil.buildExoPlayer(decode, playerListener); if (danPlayer != null) danPlayer.attachPlayer(exoPlayer); @@ -461,6 +463,8 @@ public class PlayerManager implements ParseCallback { void onError(String msg); + void onPlayerRelease(); + void onPlayerRebuild(Player newPlayer); } diff --git a/app/src/main/java/com/fongmi/android/tv/service/PlaybackService.java b/app/src/main/java/com/fongmi/android/tv/service/PlaybackService.java index 5cbdb8deb..26d3297da 100644 --- a/app/src/main/java/com/fongmi/android/tv/service/PlaybackService.java +++ b/app/src/main/java/com/fongmi/android/tv/service/PlaybackService.java @@ -53,6 +53,7 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary private Runnable onNewBinding; private boolean externalBound; private PlayerManager player; + private String navigationKey; private Player exoPlayer; public static boolean isRunning() { @@ -228,8 +229,13 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary setSessionActivity(buildDefaultIntent()); } - public void setNavigationCallback(NavigationCallback navigationCallback) { + public void setNavigationCallback(NavigationCallback navigationCallback, String key) { this.navigationCallback = navigationCallback; + this.navigationKey = key; + } + + private boolean isNavigationOwner() { + return navigationKey == null || navigationKey.equals(player.getKey()); } public void addPlayerCallback(PlayerCallback callback) { @@ -253,12 +259,12 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary } private void dispatchNavigate(Consumer action, int delta) { - if (navigationCallback != null) dispatch(action); + if (hasNavigationCallback() && isNavigationOwner()) dispatch(action); else navigateItem(delta); } public void dispatchStop() { - if (navigationCallback != null) dispatch(NavigationCallback::onStop); + if (hasNavigationCallback() && isNavigationOwner()) dispatch(NavigationCallback::onStop); else player.stop(); } @@ -267,7 +273,7 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary } public void dispatchReplay() { - if (navigationCallback != null) dispatch(NavigationCallback::onReplay); + if (hasNavigationCallback() && isNavigationOwner()) dispatch(NavigationCallback::onReplay); else { exoPlayer.seekTo(0); exoPlayer.play(); @@ -410,11 +416,16 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary playerCallbacks.forEach(callback -> callback.onError(msg)); } + @Override + public void onPlayerRelease() { + playerCallbacks.forEach(PlayerCallback::onPlayerRelease); + } + @Override public void onPlayerRebuild(Player newPlayer) { exoPlayer = newPlayer; if (session != null) session.setPlayer(wrap(newPlayer)); - for (PlayerCallback callback : playerCallbacks) callback.onPlayerRebuild(newPlayer); + playerCallbacks.forEach(callback -> callback.onPlayerRebuild(newPlayer)); } @NonNull @@ -478,6 +489,9 @@ public class PlaybackService extends MediaLibraryService implements MediaLibrary default void onError(String msg) { } + default void onPlayerRelease() { + } + default void onPlayerRebuild(Player player) { } } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/base/PlaybackActivity.java b/app/src/main/java/com/fongmi/android/tv/ui/base/PlaybackActivity.java index a31ab2a60..74f0881dd 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/base/PlaybackActivity.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/base/PlaybackActivity.java @@ -50,7 +50,7 @@ public abstract class PlaybackActivity extends BaseActivity implements MediaCont protected void setRedirect(boolean redirect) { this.redirect = redirect; - if (mService != null) mService.setNavigationCallback(redirect ? null : getNavigationCallback()); + if (mService != null) mService.setNavigationCallback(redirect ? null : getNavigationCallback(), getPlaybackKey()); } protected boolean isAudioOnly() { @@ -136,8 +136,8 @@ public abstract class PlaybackActivity extends BaseActivity implements MediaCont } private void releaseService(boolean owner) { - if (owner) mService.setNavigationCallback(null); mService.removePlayerCallback(mPlayerCallback); + if (owner) mService.setNavigationCallback(null, null); if (mService.hasExternalClient() || mService.hasPlayerCallback()) mService.resetSessionActivity(); else if (owner) mService.shutdown(); } @@ -219,11 +219,14 @@ public abstract class PlaybackActivity extends BaseActivity implements MediaCont if (isOwner()) PlaybackActivity.this.onError(msg); } + @Override + public void onPlayerRelease() { + if (isOwner()) detachSurface(); + } + @Override public void onPlayerRebuild(Player player) { - if (!isOwner()) return; - detachSurface(); - attachSurface(); + if (isOwner()) attachSurface(); } }; @@ -249,7 +252,7 @@ public abstract class PlaybackActivity extends BaseActivity implements MediaCont mService = ((PlaybackService.LocalBinder) binder).getService(); mService.replaceBinding(this::closePiP); mService.setSessionActivity(buildSessionIntent()); - mService.setNavigationCallback(getNavigationCallback()); + mService.setNavigationCallback(getNavigationCallback(), getPlaybackKey()); mService.addPlayerCallback(mPlayerCallback); onServiceConnected(); }