private void prepareNewMedia()

in LeanbackShowcase/app/src/main/java/androidx/leanback/leanbackshowcase/app/media/MusicPlaybackService.java [266:321]


    private void prepareNewMedia() {
        reset();
        try {
            mPlayer.setDataSource(getApplicationContext(),
                    mCurrentMediaItem.getMediaSourceUri());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override public void onPrepared(MediaPlayer mp) {
                updateMediaSessionMetaData();
                mInitialized = true;
                play();
            }
        });
        mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
                Log.e(TAG, "Error: what=" + what + ", extra=" + extra);
                return true;
            }
        });

        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override public void onCompletion(MediaPlayer mp) {
                updateMediaSessionPlayState();
                if (mRepeatState == MEDIA_ACTION_REPEAT_ALL &&
                        mCurrentMediaPosition == mMediaItemList.size() - 1) {
                    // The last media item is played and repeatAll action is enabled;
                    // start over the media list from the beginning
                    mCurrentMediaPosition = 0;
                    notifyMediaItemChanged(mMediaItemList.get(mCurrentMediaPosition));
                    prepareNewMedia();
                } else if (mRepeatState == MEDIA_ACTION_REPEAT_ONE) {
                    // repeat playing the same media item
                    prepareNewMedia();
                } else if (mCurrentMediaPosition < mMediaItemList.size() - 1) {
                    // Move on to playing the next media item in the list
                    mCurrentMediaPosition++;
                    notifyMediaItemChanged(mMediaItemList.get(mCurrentMediaPosition));
                    prepareNewMedia();
                } else {
                    // Last media item is reached, and the service is no longer necessary;
                    // Stop the service after some delay, since the service might need to stay alive
                    // for some time for the cleanup (such as updating the progress bar during the
                    // final seconds).
                    notifyMediaStateChanged(MediaUtils.MEDIA_STATE_MEDIALIST_COMPLETED);
                    stopServiceIfNeeded();

                }
            }
        });
        mPlayer.prepareAsync();
        notifyMediaStateChanged(MediaUtils.MEDIA_STATE_PREPARING);
    }