@@ -180,13 +180,18 @@ public final class Player implements PlaybackListener, Listener {
180180 //////////////////////////////////////////////////////////////////////////*/
181181
182182 // play queue might be null e.g. while player is starting
183- @ Nullable private PlayQueue playQueue ;
183+ @ Nullable
184+ private PlayQueue playQueue ;
184185
185- @ Nullable private MediaSourceManager playQueueManager ;
186+ @ Nullable
187+ private MediaSourceManager playQueueManager ;
186188
187- @ Nullable private PlayQueueItem currentItem ;
188- @ Nullable private MediaItemTag currentMetadata ;
189- @ Nullable private Bitmap currentThumbnail ;
189+ @ Nullable
190+ private PlayQueueItem currentItem ;
191+ @ Nullable
192+ private MediaItemTag currentMetadata ;
193+ @ Nullable
194+ private Bitmap currentThumbnail ;
190195
191196 /*//////////////////////////////////////////////////////////////////////////
192197 // Player
@@ -195,12 +200,17 @@ public final class Player implements PlaybackListener, Listener {
195200 private ExoPlayer simpleExoPlayer ;
196201 private AudioReactor audioReactor ;
197202
198- @ NonNull private final DefaultTrackSelector trackSelector ;
199- @ NonNull private final LoadController loadController ;
200- @ NonNull private final DefaultRenderersFactory renderFactory ;
203+ @ NonNull
204+ private final DefaultTrackSelector trackSelector ;
205+ @ NonNull
206+ private final LoadController loadController ;
207+ @ NonNull
208+ private final DefaultRenderersFactory renderFactory ;
201209
202- @ NonNull private final VideoPlaybackResolver videoResolver ;
203- @ NonNull private final AudioPlaybackResolver audioResolver ;
210+ @ NonNull
211+ private final VideoPlaybackResolver videoResolver ;
212+ @ NonNull
213+ private final AudioPlaybackResolver audioResolver ;
204214
205215 private final PlayerService service ; //TODO try to remove and replace everything with context
206216
@@ -225,24 +235,32 @@ public final class Player implements PlaybackListener, Listener {
225235
226236 private BroadcastReceiver broadcastReceiver ;
227237 private IntentFilter intentFilter ;
228- @ Nullable private PlayerServiceEventListener fragmentListener = null ;
229- @ Nullable private PlayerEventListener activityListener = null ;
238+ @ Nullable
239+ private PlayerServiceEventListener fragmentListener = null ;
240+ @ Nullable
241+ private PlayerEventListener activityListener = null ;
230242
231- @ NonNull private final SerialDisposable progressUpdateDisposable = new SerialDisposable ();
232- @ NonNull private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable ();
243+ @ NonNull
244+ private final SerialDisposable progressUpdateDisposable = new SerialDisposable ();
245+ @ NonNull
246+ private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable ();
233247
234248 // This is the only listener we need for thumbnail loading, since there is always at most only
235249 // one thumbnail being loaded at a time. This field is also here to maintain a strong reference,
236250 // which would otherwise be garbage collected since Picasso holds weak references to targets.
237- @ NonNull private final Target currentThumbnailTarget ;
251+ @ NonNull
252+ private final Target currentThumbnailTarget ;
238253
239254 /*//////////////////////////////////////////////////////////////////////////
240255 // Utils
241256 //////////////////////////////////////////////////////////////////////////*/
242257
243- @ NonNull private final Context context ;
244- @ NonNull private final SharedPreferences prefs ;
245- @ NonNull private final HistoryRecordManager recordManager ;
258+ @ NonNull
259+ private final Context context ;
260+ @ NonNull
261+ private final SharedPreferences prefs ;
262+ @ NonNull
263+ private final HistoryRecordManager recordManager ;
246264
247265
248266 /*//////////////////////////////////////////////////////////////////////////
@@ -334,15 +352,15 @@ public void handleIntent(@NonNull final Intent intent) {
334352 isAudioOnly = audioPlayerSelected ();
335353
336354 if (intent .hasExtra (PLAYBACK_QUALITY )) {
337- setPlaybackQuality (intent .getStringExtra (PLAYBACK_QUALITY ));
355+ videoResolver . setPlaybackQuality (intent .getStringExtra (PLAYBACK_QUALITY ));
338356 }
339357
340358 // Resolve enqueue intents
341359 if (intent .getBooleanExtra (ENQUEUE , false ) && playQueue != null ) {
342360 playQueue .append (newQueue .getStreams ());
343361 return ;
344362
345- // Resolve enqueue next intents
363+ // Resolve enqueue next intents
346364 } else if (intent .getBooleanExtra (ENQUEUE_NEXT , false ) && playQueue != null ) {
347365 final int currentIndex = playQueue .getIndex ();
348366 playQueue .append (newQueue .getStreams ());
@@ -914,7 +932,7 @@ public void triggerProgressUpdate() {
914932
915933 private Disposable getProgressUpdateDisposable () {
916934 return Observable .interval (PROGRESS_LOOP_INTERVAL_MILLIS , MILLISECONDS ,
917- AndroidSchedulers .mainThread ())
935+ AndroidSchedulers .mainThread ())
918936 .observeOn (AndroidSchedulers .mainThread ())
919937 .subscribe (ignored -> triggerProgressUpdate (),
920938 error -> Log .e (TAG , "Progress update failure: " , error ));
@@ -923,7 +941,6 @@ private Disposable getProgressUpdateDisposable() {
923941 //endregion
924942
925943
926-
927944 /*//////////////////////////////////////////////////////////////////////////
928945 // Playback states
929946 //////////////////////////////////////////////////////////////////////////*/
@@ -1247,7 +1264,7 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player,
12471264 .flatMap (MediaItemTag ::getMaybeStreamInfo ).orElse (null );
12481265 final MediaItemTag .AudioTrack previousAudioTrack =
12491266 Optional .ofNullable (currentMetadata )
1250- .flatMap (MediaItemTag ::getMaybeAudioTrack ).orElse (null );
1267+ .flatMap (MediaItemTag ::getMaybeAudioTrack ).orElse (null );
12511268 currentMetadata = tag ;
12521269
12531270 if (!currentMetadata .getErrors ().isEmpty ()) {
@@ -1270,9 +1287,9 @@ public void onEvents(@NonNull final com.google.android.exoplayer2.Player player,
12701287 updateMetadataWith (info );
12711288 } else if (previousAudioTrack == null
12721289 || tag .getMaybeAudioTrack ()
1273- .map (t -> t .getSelectedAudioStreamIndex ()
1274- != previousAudioTrack .getSelectedAudioStreamIndex ())
1275- .orElse (false )) {
1290+ .map (t -> t .getSelectedAudioStreamIndex ()
1291+ != previousAudioTrack .getSelectedAudioStreamIndex ())
1292+ .orElse (false )) {
12761293 notifyAudioTrackUpdateToListeners ();
12771294 }
12781295 });
@@ -1361,6 +1378,7 @@ public void onCues(@NonNull final CueGroup cueGroup) {
13611378 // Errors
13621379 //////////////////////////////////////////////////////////////////////////*/
13631380 //region Errors
1381+
13641382 /**
13651383 * Process exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}.
13661384 * <p>There are multiple types of errors:</p>
@@ -1387,8 +1405,9 @@ public void onCues(@NonNull final CueGroup cueGroup) {
13871405 * For any error above that is <b>not</b> explicitly <b>catchable</b>, the player will
13881406 * create a notification so users are aware.
13891407 * </ul>
1408+ *
13901409 * @see com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException)
1391- * * /
1410+ */
13921411 // Any error code not explicitly covered here are either unrelated to NewPipe use case
13931412 // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should
13941413 // shutdown.
@@ -2141,7 +2160,7 @@ private boolean playQueueManagerReloadingNeeded(final SourceType sourceType,
21412160 // because the stream source will be probably the same as the current played
21422161 if (sourceType == SourceType .VIDEO_WITH_SEPARATED_AUDIO
21432162 || (sourceType == SourceType .VIDEO_WITH_AUDIO_OR_AUDIO_ONLY
2144- && isNullOrEmpty (streamInfo .getAudioStreams ()))) {
2163+ && isNullOrEmpty (streamInfo .getAudioStreams ()))) {
21452164 // It's not needed to reload the play queue manager only if the content's stream type
21462165 // is a video stream, a live stream or an ended live stream
21472166 return !StreamTypeUtil .isVideo (streamType );
@@ -2203,12 +2222,18 @@ private boolean isLive() {
22032222 }
22042223
22052224 public void setPlaybackQuality (@ Nullable final String quality ) {
2225+ saveStreamProgressState ();
2226+ setRecovery ();
22062227 videoResolver .setPlaybackQuality (quality );
2228+ reloadPlayQueueManager ();
22072229 }
22082230
22092231 public void setAudioTrack (@ Nullable final String audioTrackId ) {
2232+ saveStreamProgressState ();
2233+ setRecovery ();
22102234 videoResolver .setAudioTrack (audioTrackId );
22112235 audioResolver .setAudioTrack (audioTrackId );
2236+ reloadPlayQueueManager ();
22122237 }
22132238
22142239
@@ -2286,7 +2311,7 @@ public PlayerUiList UIs() {
22862311
22872312 /**
22882313 * Get the video renderer index of the current playing stream.
2289- *
2314+ * <p>
22902315 * This method returns the video renderer index of the current
22912316 * {@link MappingTrackSelector.MappedTrackInfo} or {@link #RENDERER_UNAVAILABLE} if the current
22922317 * {@link MappingTrackSelector.MappedTrackInfo} is null or if there is no video renderer index.
0 commit comments