Fix toggle decode crash

release
FongMi 1 week ago
parent 07c7fc3539
commit f001598e56
  1. 4
      app/src/main/java/com/fongmi/android/tv/player/PlayerManager.java
  2. 24
      app/src/main/java/com/fongmi/android/tv/service/PlaybackService.java
  3. 15
      app/src/main/java/com/fongmi/android/tv/ui/base/PlaybackActivity.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);
}

@ -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<NavigationCallback> 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) {
}
}

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

Loading…
Cancel
Save