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