Completely close player when changing stream w/o autoplay

This commit is contained in:
Stypox 2021-08-31 11:10:52 +02:00
parent 1d935b46f9
commit cf9b482be2
No known key found for this signature in database
GPG Key ID: 4BDF1B40A49FDD23
2 changed files with 23 additions and 15 deletions

View File

@ -201,7 +201,7 @@ public final class VideoDetailFragment
@Nullable @Nullable
private MainPlayer playerService; private MainPlayer playerService;
private Player player; private Player player;
private PlayerHolder playerHolder = PlayerHolder.getInstance(); private final PlayerHolder playerHolder = PlayerHolder.getInstance();
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// Service management // Service management
@ -762,7 +762,7 @@ public final class VideoDetailFragment
private void setupFromHistoryItem(final StackItem item) { private void setupFromHistoryItem(final StackItem item) {
setAutoPlay(false); setAutoPlay(false);
hideMainPlayer(); hideMainPlayerOnLoadingNewStream();
setInitialData(item.getServiceId(), item.getUrl(), setInitialData(item.getServiceId(), item.getUrl(),
item.getTitle() == null ? "" : item.getTitle(), item.getPlayQueue()); item.getTitle() == null ? "" : item.getTitle(), item.getPlayQueue());
@ -882,7 +882,7 @@ public final class VideoDetailFragment
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> { .subscribe(result -> {
isLoading.set(false); isLoading.set(false);
hideMainPlayer(); hideMainPlayerOnLoadingNewStream();
if (result.getAgeLimit() != NO_AGE_LIMIT && !prefs.getBoolean( if (result.getAgeLimit() != NO_AGE_LIMIT && !prefs.getBoolean(
getString(R.string.show_age_restricted_content), false)) { getString(R.string.show_age_restricted_content), false)) {
hideAgeRestrictedContent(); hideAgeRestrictedContent();
@ -1174,7 +1174,14 @@ public final class VideoDetailFragment
ContextCompat.startForegroundService(activity, playerIntent); ContextCompat.startForegroundService(activity, playerIntent);
} }
private void hideMainPlayer() { /**
* When the video detail fragment is already showing details for a video and the user opens a
* new one, the video detail fragment changes all of its old data to the new stream, so if there
* is a video player currently open it should be hidden. This method does exactly that. If
* autoplay is enabled, the underlying player is not stopped completely, since it is going to
* be reused in a few milliseconds and the flickering would be annoying.
*/
private void hideMainPlayerOnLoadingNewStream() {
if (!isPlayerServiceAvailable() if (!isPlayerServiceAvailable()
|| playerService.getView() == null || playerService.getView() == null
|| !player.videoPlayerSelected()) { || !player.videoPlayerSelected()) {
@ -1182,8 +1189,12 @@ public final class VideoDetailFragment
} }
removeVideoPlayerView(); removeVideoPlayerView();
playerService.stop(isAutoplayEnabled()); if (isAutoplayEnabled()) {
playerService.getView().setVisibility(View.GONE); playerService.stopForImmediateReusing();
playerService.getView().setVisibility(View.GONE);
} else {
playerHolder.stopService();
}
} }
private PlayQueue setupPlayQueueForIntent(final boolean append) { private PlayQueue setupPlayQueueForIntent(final boolean append) {
@ -1832,7 +1843,7 @@ public final class VideoDetailFragment
|| error.type == ExoPlaybackException.TYPE_UNEXPECTED) { || error.type == ExoPlaybackException.TYPE_UNEXPECTED) {
// Properly exit from fullscreen // Properly exit from fullscreen
toggleFullscreenIfInFullscreenMode(); toggleFullscreenIfInFullscreenMode();
hideMainPlayer(); hideMainPlayerOnLoadingNewStream();
} }
} }

View File

@ -133,32 +133,29 @@ public final class MainPlayer extends Service {
return START_NOT_STICKY; return START_NOT_STICKY;
} }
public void stop(final boolean autoplayEnabled) { public void stopForImmediateReusing() {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "stop() called"); Log.d(TAG, "stopForImmediateReusing() called");
} }
if (!player.exoPlayerIsNull()) { if (!player.exoPlayerIsNull()) {
player.saveWasPlaying(); player.saveWasPlaying();
// Releases wifi & cpu, disables keepScreenOn, etc. // Releases wifi & cpu, disables keepScreenOn, etc.
if (!autoplayEnabled) {
player.pause();
}
// We can't just pause the player here because it will make transition // We can't just pause the player here because it will make transition
// from one stream to a new stream not smooth // from one stream to a new stream not smooth
player.smoothStopPlayer(); player.smoothStopPlayer();
player.setRecovery(); player.setRecovery();
// Android TV will handle back button in case controls will be visible // Android TV will handle back button in case controls will be visible
// (one more additional unneeded click while the player is hidden) // (one more additional unneeded click while the player is hidden)
player.hideControls(0, 0); player.hideControls(0, 0);
player.closeItemsList(); player.closeItemsList();
// Notification shows information about old stream but if a user selects // Notification shows information about old stream but if a user selects
// a stream from backStack it's not actual anymore // a stream from backStack it's not actual anymore
// So we should hide the notification at all. // So we should hide the notification at all.
// When autoplay enabled such notification flashing is annoying so skip this case // When autoplay enabled such notification flashing is annoying so skip this case
if (!autoplayEnabled) {
NotificationUtil.getInstance().cancelNotificationAndStopForeground(this);
}
} }
} }