@@ -1695,26 +1695,25 @@ private void registerStreamViewed() {
16951695 }
16961696
16971697 private void saveStreamProgressState (final long progressMillis ) {
1698- //noinspection SimplifyOptionalCallChains
1699- if (!getCurrentStreamInfo ().isPresent ()
1700- || !prefs .getBoolean (context .getString (R .string .enable_watch_history_key ), true )) {
1701- return ;
1702- }
1703- if (DEBUG ) {
1704- Log .d (TAG , "saveStreamProgressState() called with: progressMillis=" + progressMillis
1705- + ", currentMetadata=[" + getCurrentStreamInfo ().get ().getName () + "]" );
1706- }
1698+ getCurrentStreamInfo ().ifPresent (info -> {
1699+ if (!prefs .getBoolean (context .getString (R .string .enable_watch_history_key ), true )) {
1700+ return ;
1701+ }
1702+ if (DEBUG ) {
1703+ Log .d (TAG , "saveStreamProgressState() called with: progressMillis=" + progressMillis
1704+ + ", currentMetadata=[" + info .getName () + "]" );
1705+ }
17071706
1708- databaseUpdateDisposable
1709- . add ( recordManager . saveStreamState ( getCurrentStreamInfo (). get (), progressMillis )
1710- . observeOn ( AndroidSchedulers . mainThread ())
1711- . doOnError ( e -> {
1712- if ( DEBUG ) {
1713- e . printStackTrace ();
1714- }
1715- } )
1716- . onErrorComplete ()
1717- . subscribe () );
1707+ databaseUpdateDisposable . add ( recordManager . saveStreamState ( info , progressMillis )
1708+ . observeOn ( AndroidSchedulers . mainThread () )
1709+ . doOnError ( e -> {
1710+ if ( DEBUG ) {
1711+ e . printStackTrace ();
1712+ }
1713+ })
1714+ . onErrorComplete ( )
1715+ . subscribe ());
1716+ } );
17181717 }
17191718
17201719 public void saveStreamProgressState () {
@@ -1876,23 +1875,16 @@ public void disablePreloadingOfCurrentTrack() {
18761875 loadController .disablePreloadingOfCurrentTrack ();
18771876 }
18781877
1879- @ Nullable
1880- public VideoStream getSelectedVideoStream () {
1881- @ Nullable final MediaItemTag .Quality quality = Optional .ofNullable (currentMetadata )
1878+ public Optional <VideoStream > getSelectedVideoStream () {
1879+ return Optional .ofNullable (currentMetadata )
18821880 .flatMap (MediaItemTag ::getMaybeQuality )
1883- .orElse (null );
1884- if (quality == null ) {
1885- return null ;
1886- }
1887-
1888- final List <VideoStream > availableStreams = quality .getSortedVideoStreams ();
1889- final int selectedStreamIndex = quality .getSelectedVideoStreamIndex ();
1890-
1891- if (selectedStreamIndex >= 0 && availableStreams .size () > selectedStreamIndex ) {
1892- return availableStreams .get (selectedStreamIndex );
1893- } else {
1894- return null ;
1895- }
1881+ .filter (quality -> {
1882+ final int selectedStreamIndex = quality .getSelectedVideoStreamIndex ();
1883+ return selectedStreamIndex >= 0
1884+ && selectedStreamIndex < quality .getSortedVideoStreams ().size ();
1885+ })
1886+ .map (quality -> quality .getSortedVideoStreams ()
1887+ .get (quality .getSelectedVideoStreamIndex ()));
18961888 }
18971889 //endregion
18981890
@@ -2036,40 +2028,36 @@ public void useVideoSource(final boolean videoEnabled) {
20362028 // in livestreams) so we will be not able to execute the block below.
20372029 // Reload the play queue manager in this case, which is the behavior when we don't know the
20382030 // index of the video renderer or playQueueManagerReloadingNeeded returns true.
2039- final Optional <StreamInfo > optCurrentStreamInfo = getCurrentStreamInfo ();
2040- if (!optCurrentStreamInfo .isPresent ()) {
2041- reloadPlayQueueManager ();
2042- setRecovery ();
2043- return ;
2044- }
2045-
2046- final StreamInfo info = optCurrentStreamInfo .get ();
2047-
2048- // In the case we don't know the source type, fallback to the one with video with audio or
2049- // audio-only source.
2050- final SourceType sourceType = videoResolver .getStreamSourceType ().orElse (
2051- SourceType .VIDEO_WITH_AUDIO_OR_AUDIO_ONLY );
2031+ getCurrentStreamInfo ().ifPresentOrElse (info -> {
2032+ // In the case we don't know the source type, fallback to the one with video with audio
2033+ // or audio-only source.
2034+ final SourceType sourceType = videoResolver .getStreamSourceType ()
2035+ .orElse (SourceType .VIDEO_WITH_AUDIO_OR_AUDIO_ONLY );
20522036
2053- if (playQueueManagerReloadingNeeded (sourceType , info , getVideoRendererIndex ())) {
2054- reloadPlayQueueManager ();
2055- } else {
2056- if (StreamTypeUtil .isAudio (info .getStreamType ())) {
2057- // Nothing to do more than setting the recovery position
2058- setRecovery ();
2059- return ;
2060- }
2037+ if (playQueueManagerReloadingNeeded (sourceType , info , getVideoRendererIndex ())) {
2038+ reloadPlayQueueManager ();
2039+ } else {
2040+ if (StreamTypeUtil .isAudio (info .getStreamType ())) {
2041+ // Nothing to do more than setting the recovery position
2042+ setRecovery ();
2043+ return ;
2044+ }
20612045
2062- final DefaultTrackSelector .Parameters .Builder parametersBuilder =
2063- trackSelector .buildUponParameters ();
2046+ final var parametersBuilder = trackSelector .buildUponParameters ();
20642047
2065- // Enable/disable the video track and the ability to select subtitles
2066- parametersBuilder .setTrackTypeDisabled (C .TRACK_TYPE_TEXT , !videoEnabled );
2067- parametersBuilder .setTrackTypeDisabled (C .TRACK_TYPE_VIDEO , !videoEnabled );
2048+ // Enable/disable the video track and the ability to select subtitles
2049+ parametersBuilder .setTrackTypeDisabled (C .TRACK_TYPE_TEXT , !videoEnabled );
2050+ parametersBuilder .setTrackTypeDisabled (C .TRACK_TYPE_VIDEO , !videoEnabled );
20682051
2069- trackSelector .setParameters (parametersBuilder );
2070- }
2052+ trackSelector .setParameters (parametersBuilder );
2053+ }
20712054
2072- setRecovery ();
2055+ setRecovery ();
2056+ }, () -> {
2057+ // This is executed when the current stream info is not available.
2058+ reloadPlayQueueManager ();
2059+ setRecovery ();
2060+ });
20732061 }
20742062
20752063 /**
0 commit comments