diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 88e8a22768..d0b266507a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,8 @@ ### dev-v2 (not yet released) ### +* MediaSession extension: + * Allow apps to set custom errors. * Allow apps to pass a `CacheKeyFactory` for setting custom cache keys when creating a `CacheDataSource`. * Turned on Java 8 compiler support for the ExoPlayer library. Apps that depend diff --git a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java index 87b5859966..6db58a2e3b 100644 --- a/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java +++ b/extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java @@ -308,6 +308,7 @@ public final class MediaSessionConnector { private CustomActionProvider[] customActionProviders; private Map customActionMap; private @Nullable ErrorMessageProvider errorMessageProvider; + private @Nullable Pair customError; private PlaybackPreparer playbackPreparer; private QueueNavigator queueNavigator; private QueueEditor queueEditor; @@ -488,6 +489,31 @@ public final class MediaSessionConnector { } } + /** + * Sets a custom error on the session. + * + *

This sets the error code via {@link PlaybackStateCompat.Builder#setErrorMessage(int, + * CharSequence)}. By default, the error code will be set to {@link + * PlaybackStateCompat#ERROR_CODE_APP_ERROR}. + * + * @param message The error string to report or {@code null} to clear the error. + */ + public void setCustomErrorMessage(@Nullable CharSequence message) { + int code = (message == null) ? 0 : PlaybackStateCompat.ERROR_CODE_APP_ERROR; + setCustomErrorMessage(message, code); + } + + /** + * Sets a custom error on the session. + * + * @param message The error string to report or {@code null} to clear the error. + * @param code The error code to report. Ignored when {@code message} is {@code null}. + */ + public void setCustomErrorMessage(@Nullable CharSequence message, int code) { + customError = (message == null) ? null : new Pair<>(code, message); + invalidateMediaSessionPlaybackState(); + } + /** * Updates the metadata of the media session. * @@ -527,11 +553,14 @@ public final class MediaSessionConnector { int playbackState = player.getPlaybackState(); ExoPlaybackException playbackError = playbackState == Player.STATE_IDLE ? player.getPlaybackError() : null; + boolean reportError = playbackError != null || customError != null; int sessionPlaybackState = - playbackError != null + reportError ? PlaybackStateCompat.STATE_ERROR : mapPlaybackState(player.getPlaybackState(), player.getPlayWhenReady()); - if (playbackError != null && errorMessageProvider != null) { + if (customError != null) { + builder.setErrorMessage(customError.first, customError.second); + } else if (playbackError != null && errorMessageProvider != null) { Pair message = errorMessageProvider.getErrorMessage(playbackError); builder.setErrorMessage(message.first, message.second); }