diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d5cef0bb088..1919d857669 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,7 @@ * MediaSession extension: * Allow handling of custom commands via `registerCustomCommandReceiver`. + * Add ability to include an extras `Bundle` when reporting a custom error. ### 2.10.0 ### 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 9a1f38c10b7..35990573ad7 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 @@ -373,6 +373,7 @@ public interface MediaMetadataProvider { @Nullable private Player player; @Nullable private ErrorMessageProvider errorMessageProvider; @Nullable private Pair customError; + @Nullable private Bundle customErrorExtras; @Nullable private PlaybackPreparer playbackPreparer; @Nullable private QueueNavigator queueNavigator; @Nullable private QueueEditor queueEditor; @@ -581,7 +582,20 @@ public void setCustomErrorMessage(@Nullable CharSequence message) { * @param code The error code to report. Ignored when {@code message} is {@code null}. */ public void setCustomErrorMessage(@Nullable CharSequence message, int code) { + setCustomErrorMessage(message, code, /* extras= */ null); + } + + /** + * 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}. + * @param extras Extras to include in reported {@link PlaybackStateCompat}. + */ + public void setCustomErrorMessage( + @Nullable CharSequence message, int code, @Nullable Bundle extras) { customError = (message == null) ? null : new Pair<>(code, message); + customErrorExtras = (message == null) ? null : extras; invalidateMediaSessionPlaybackState(); } @@ -654,6 +668,7 @@ public final void invalidateMediaSessionPlaybackState() { customActionMap = Collections.unmodifiableMap(currentActions); int playbackState = player.getPlaybackState(); + Bundle extras = new Bundle(); ExoPlaybackException playbackError = playbackState == Player.STATE_IDLE ? player.getPlaybackError() : null; boolean reportError = playbackError != null || customError != null; @@ -663,6 +678,9 @@ public final void invalidateMediaSessionPlaybackState() { : mapPlaybackState(player.getPlaybackState(), player.getPlayWhenReady()); if (customError != null) { builder.setErrorMessage(customError.first, customError.second); + if (customErrorExtras != null) { + extras.putAll(customErrorExtras); + } } else if (playbackError != null && errorMessageProvider != null) { Pair message = errorMessageProvider.getErrorMessage(playbackError); builder.setErrorMessage(message.first, message.second); @@ -671,7 +689,6 @@ public final void invalidateMediaSessionPlaybackState() { queueNavigator != null ? queueNavigator.getActiveQueueItemId(player) : MediaSessionCompat.QueueItem.UNKNOWN_ID; - Bundle extras = new Bundle(); extras.putFloat(EXTRAS_PITCH, player.getPlaybackParameters().pitch); builder .setActions(buildPrepareActions() | buildPlaybackActions(player))