Package com.google.android.exoplayer2.ui

## Class PlayerNotificationManager

- java.lang.Object
- - com.google.android.exoplayer2.ui.PlayerNotificationManager

-     public class PlayerNotificationManager
      extends Object

  Starts, updates and cancels a media style notification reflecting the player state. The actions included in the notification can be customized along with their drawables, as described below.

  The notification is cancelled when `null` is passed to `setPlayer(Player)` or when the notification is dismissed by the user.

  If the player is released it must be removed from the manager by calling `setPlayer(null)`.

  ## Action customization

  Playback actions can be included or omitted as follows:
  - `usePlayPauseActions` - Sets whether the play and pause actions are used.
    - Corresponding setter: `setUsePlayPauseActions(boolean)`
    - Default: `true`
  - `useRewindAction` - Sets whether the rewind action is used.
    - Corresponding setter: `setUseRewindAction(boolean)`
    - Default: `true`
  - `useRewindActionInCompactView` - If `useRewindAction` is `true`, sets whether the rewind action is also used in compact view (including the lock screen notification). Else does nothing.
    - Corresponding setter: `setUseRewindActionInCompactView(boolean)`
    - Default: `false`
  - `useFastForwardAction` - Sets whether the fast forward action is used.
    - Corresponding setter: `setUseFastForwardAction(boolean)`
    - Default: `true`
  - `useFastForwardActionInCompactView` - If `useFastForwardAction` is `true`, sets whether the fast forward action is also used in compact view (including the lock screen notification). Else does nothing.
    - Corresponding setter: `setUseFastForwardActionInCompactView(boolean)`
    - Default: `false`
  - `usePreviousAction` - Whether the previous action is used.
    - Corresponding setter: `setUsePreviousAction(boolean)`
    - Default: `true`
  - `usePreviousActionInCompactView` - If `usePreviousAction` is `true`, sets whether the previous action is also used in compact view (including the lock screen notification). Else does nothing.
    - Corresponding setter: `setUsePreviousActionInCompactView(boolean)`
    - Default: `false`
  - `useNextAction` - Whether the next action is used.
    - Corresponding setter: `setUseNextAction(boolean)`
    - Default: `true`
  - `useNextActionInCompactView` - If `useNextAction` is `true`, sets whether the next action is also used in compact view (including the lock screen notification). Else does nothing.
    - Corresponding setter: `setUseNextActionInCompactView(boolean)`
    - Default: `false`
  - `useStopAction` - Sets whether the stop action is used.
    - Corresponding setter: `setUseStopAction(boolean)`
    - Default: `false`

  ## Overriding drawables

  The drawables used by PlayerNotificationManager can be overridden by drawables with the same names defined in your application. The drawables that can be overridden are:
  - `exo_notification_small_icon` - The icon passed by default to `NotificationCompat.Builder.setSmallIcon(int)`. A different icon can also be specified programmatically by calling `setSmallIcon(int)`.
  - `exo_notification_play` - The play icon.
  - `exo_notification_pause` - The pause icon.
  - `exo_notification_rewind` - The rewind icon.
  - `exo_notification_fastforward` - The fast forward icon.
  - `exo_notification_previous` - The previous icon.
  - `exo_notification_next` - The next icon.
  - `exo_notification_stop` - The stop icon.

  Alternatively, the action icons can be set programatically by using the `PlayerNotificationManager.Builder`.

  Unlike the drawables above, the large icon (i.e. the icon passed to `NotificationCompat.Builder.setLargeIcon(Bitmap)` cannot be overridden in this way. Instead, the large icon is obtained from the `PlayerNotificationManager.MediaDescriptionAdapter` passed to `Builder(Context, int, String, MediaDescriptionAdapter)`.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `class` | `PlayerNotificationManager.BitmapCallback` | Receives a `Bitmap`.
    `static class` | `PlayerNotificationManager.Builder` | A builder for `PlayerNotificationManager` instances.
    `static interface` | `PlayerNotificationManager.CustomActionReceiver` | Defines and handles custom actions.
    `static interface` | `PlayerNotificationManager.MediaDescriptionAdapter` | An adapter to provide content assets of the media currently playing.
    `static interface` | `PlayerNotificationManager.NotificationListener` | A listener for changes to the notification.
    `static interface` | `PlayerNotificationManager.Priority` | Priority of the notification (required for API 25 and lower).
    `static interface` | `PlayerNotificationManager.Visibility` | Visibility of notification on the lock screen.

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static String` | `ACTION_FAST_FORWARD` | The action which fast forwards.
    `static String` | `ACTION_NEXT` | The action which skips to the next window.
    `static String` | `ACTION_PAUSE` | The action which pauses playback.
    `static String` | `ACTION_PLAY` | The action which starts playback.
    `static String` | `ACTION_PREVIOUS` | The action which skips to the previous window.
    `static String` | `ACTION_REWIND` | The action which rewinds.
    `static String` | `ACTION_STOP` | The action which stops playback.
    `static String` | `EXTRA_INSTANCE_ID` | The extra key of the instance id of the player notification manager.

  - ### Constructor Summary

    Constructors
    Modifier | Constructor | Description
    --- | --- | ---
    `protected` | `PlayerNotificationManager​(Context context, String channelId, int notificationId, PlayerNotificationManager.MediaDescriptionAdapter mediaDescriptionAdapter, PlayerNotificationManager.NotificationListener notificationListener, PlayerNotificationManager.CustomActionReceiver customActionReceiver, int smallIconResourceId, int playActionIconResourceId, int pauseActionIconResourceId, int stopActionIconResourceId, int rewindActionIconResourceId, int fastForwardActionIconResourceId, int previousActionIconResourceId, int nextActionIconResourceId, String groupKey)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods Deprecated Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `protected androidx.core.app.NotificationCompat.Builder` | `createNotification​(Player player, androidx.core.app.NotificationCompat.Builder builder, boolean ongoing, Bitmap largeIcon)` | Creates the notification given the current player state.
    `protected int[]` | `getActionIndicesForCompactView​(List<String> actionNames, Player player)` | Gets an array with the indices of the buttons to be shown in compact mode.
    `protected List<String>` | `getActions​(Player player)` | Gets the names and order of the actions to be included in the notification at the current player state.
    `protected boolean` | `getOngoing​(Player player)` | Returns whether the generated notification should be ongoing.
    `void` | `invalidate()` | Forces an update of the notification if already started.
    `void` | `setBadgeIconType​(int badgeIconType)` | Sets the badge icon type of the notification.
    `void` | `setColor​(int color)` | Sets the accent color of the notification.
    `void` | `setColorized​(boolean colorized)` | Sets whether the notification should be colorized.
    `void` | `setControlDispatcher​(ControlDispatcher controlDispatcher)` | Deprecated. Use a `ForwardingPlayer` and pass it to `setPlayer(Player)` instead.
    `void` | `setDefaults​(int defaults)` | Sets the defaults.
    `void` | `setMediaSessionToken​(android.support.v4.media.session.MediaSessionCompat.Token token)` | Sets the `MediaSessionCompat.Token`.
    `void` | `setPlayer​(Player player)` | Sets the `Player`.
    `void` | `setPriority​(int priority)` | Sets the priority of the notification required for API 25 and lower.
    `void` | `setSmallIcon​(int smallIconResourceId)` | Sets the small icon of the notification which is also shown in the system status bar.
    `void` | `setUseChronometer​(boolean useChronometer)` | Sets whether the elapsed time of the media playback should be displayed.
    `void` | `setUseFastForwardAction​(boolean useFastForwardAction)` | Sets whether the fast forward action should be used.
    `void` | `setUseFastForwardActionInCompactView​(boolean useFastForwardActionInCompactView)` | Sets whether the fast forward action should also be used in compact view.
    `void` | `setUseNextAction​(boolean useNextAction)` | Sets whether the next action should be used.
    `void` | `setUseNextActionInCompactView​(boolean useNextActionInCompactView)` | If `useNextAction` is `true`, sets whether the next action should also be used in compact view.
    `void` | `setUsePlayPauseActions​(boolean usePlayPauseActions)` | Sets whether the play and pause actions should be used.
    `void` | `setUsePreviousAction​(boolean usePreviousAction)` | Sets whether the previous action should be used.
    `void` | `setUsePreviousActionInCompactView​(boolean usePreviousActionInCompactView)` | If `usePreviousAction` is `true`, sets whether the previous action should also be used in compact view.
    `void` | `setUseRewindAction​(boolean useRewindAction)` | Sets whether the rewind action should be used.
    `void` | `setUseRewindActionInCompactView​(boolean useRewindActionInCompactView)` | Sets whether the rewind action should also be used in compact view.
    `void` | `setUseStopAction​(boolean useStopAction)` | Sets whether the stop action should be used.
    `void` | `setVisibility​(int visibility)` | Sets the visibility of the notification which determines whether and how the notification is shown when the device is in lock screen mode.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### ACTION_PLAY

          public static final String ACTION_PLAY

      The action which starts playback.
      See Also:
        Constant Field Values

    - #### ACTION_PAUSE

          public static final String ACTION_PAUSE

      The action which pauses playback.
      See Also:
        Constant Field Values

    - #### ACTION_PREVIOUS

          public static final String ACTION_PREVIOUS

      The action which skips to the previous window.
      See Also:
        Constant Field Values

    - #### ACTION_NEXT

          public static final String ACTION_NEXT

      The action which skips to the next window.
      See Also:
        Constant Field Values

    - #### ACTION_FAST_FORWARD

          public static final String ACTION_FAST_FORWARD

      The action which fast forwards.
      See Also:
        Constant Field Values

    - #### ACTION_REWIND

          public static final String ACTION_REWIND

      The action which rewinds.
      See Also:
        Constant Field Values

    - #### ACTION_STOP

          public static final String ACTION_STOP

      The action which stops playback.
      See Also:
        Constant Field Values

    - #### EXTRA_INSTANCE_ID

          public static final String EXTRA_INSTANCE_ID

      The extra key of the instance id of the player notification manager.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### PlayerNotificationManager

          protected PlayerNotificationManager​(Context context,
                                              String channelId,
                                              int notificationId,
                                              PlayerNotificationManager.MediaDescriptionAdapter mediaDescriptionAdapter,
                                              @Nullable
                                              PlayerNotificationManager.NotificationListener notificationListener,
                                              @Nullable
                                              PlayerNotificationManager.CustomActionReceiver customActionReceiver,
                                              int smallIconResourceId,
                                              int playActionIconResourceId,
                                              int pauseActionIconResourceId,
                                              int stopActionIconResourceId,
                                              int rewindActionIconResourceId,
                                              int fastForwardActionIconResourceId,
                                              int previousActionIconResourceId,
                                              int nextActionIconResourceId,
                                              @Nullable
                                              String groupKey)

  - ### Method Detail

    - #### setPlayer

          public final void setPlayer​(@Nullable
                                      Player player)

      Sets the `Player`.

      Setting the player starts a notification immediately unless the player is in `Player.STATE_IDLE`, in which case the notification is started as soon as the player transitions away from being idle.

      If the player is released it must be removed from the manager by calling `setPlayer(null)`. This will cancel the notification.

      Parameters:
        `player` - The `Player` to use, or `null` to remove the current player. Only players which are accessed on the main thread are supported (`player.getApplicationLooper() == Looper.getMainLooper()`).

    - #### setControlDispatcher

          @Deprecated
          public final void setControlDispatcher​(ControlDispatcher controlDispatcher)

      Deprecated.
      Use a `ForwardingPlayer` and pass it to `setPlayer(Player)` instead. You can also customize some operations when configuring the player (for example by using `SimpleExoPlayer.Builder.setSeekBackIncrementMs(long)`), or configure whether the rewind and fast forward actions should be used with {`setUseRewindAction(boolean)`} and `setUseFastForwardAction(boolean)`.

    - #### setUseNextAction

          public final void setUseNextAction​(boolean useNextAction)

      Sets whether the next action should be used.
      Parameters:
        `useNextAction` - Whether to use the next action.

    - #### setUsePreviousAction

          public final void setUsePreviousAction​(boolean usePreviousAction)

      Sets whether the previous action should be used.
      Parameters:
        `usePreviousAction` - Whether to use the previous action.

    - #### setUseNextActionInCompactView

          public final void setUseNextActionInCompactView​(boolean useNextActionInCompactView)

      If `useNextAction` is `true`, sets whether the next action should also be used in compact view. Has no effect if `useNextAction` is `false`.

      If set to `true`, `setUseFastForwardActionInCompactView` is set to false.

      Parameters:
        `useNextActionInCompactView` - Whether to use the next action in compact view.

    - #### setUsePreviousActionInCompactView

          public final void setUsePreviousActionInCompactView​(boolean usePreviousActionInCompactView)

      If `usePreviousAction` is `true`, sets whether the previous action should also be used in compact view. Has no effect if `usePreviousAction` is `false`.

      If set to `true`, `setUseRewindActionInCompactView` is set to false.

      Parameters:
        `usePreviousActionInCompactView` - Whether to use the previous action in compact view.

    - #### setUseFastForwardAction

          public final void setUseFastForwardAction​(boolean useFastForwardAction)

      Sets whether the fast forward action should be used.
      Parameters:
        `useFastForwardAction` - Whether to use the fast forward action.

    - #### setUseRewindAction

          public final void setUseRewindAction​(boolean useRewindAction)

      Sets whether the rewind action should be used.
      Parameters:
        `useRewindAction` - Whether to use the rewind action.

    - #### setUseFastForwardActionInCompactView

          public final void setUseFastForwardActionInCompactView​(boolean useFastForwardActionInCompactView)

      Sets whether the fast forward action should also be used in compact view. Has no effect if `ACTION_FAST_FORWARD` is not enabled, for instance if the media is not seekable.

      If set to `true`, `setUseNextActionInCompactView` is set to false.

      Parameters:
        `useFastForwardActionInCompactView` - Whether to use the fast forward action in compact view.

    - #### setUseRewindActionInCompactView

          public final void setUseRewindActionInCompactView​(boolean useRewindActionInCompactView)

      Sets whether the rewind action should also be used in compact view. Has no effect if `ACTION_REWIND` is not enabled, for instance if the media is not seekable.

      If set to `true`, `setUsePreviousActionInCompactView` is set to false.

      Parameters:
        `useRewindActionInCompactView` - Whether to use the rewind action in compact view.

    - #### setUsePlayPauseActions

          public final void setUsePlayPauseActions​(boolean usePlayPauseActions)

      Sets whether the play and pause actions should be used.
      Parameters:
        `usePlayPauseActions` - Whether to use play and pause actions.

    - #### setUseStopAction

          public final void setUseStopAction​(boolean useStopAction)

      Sets whether the stop action should be used.
      Parameters:
        `useStopAction` - Whether to use the stop action.

    - #### setMediaSessionToken

          public final void setMediaSessionToken​(android.support.v4.media.session.MediaSessionCompat.Token token)

      Sets the `MediaSessionCompat.Token`.
      Parameters:
        `token` - The `MediaSessionCompat.Token`.

    - #### setBadgeIconType

          public final void setBadgeIconType​(int badgeIconType)

      Sets the badge icon type of the notification.

      See `NotificationCompat.Builder.setBadgeIconType(int)`.

      Parameters:
        `badgeIconType` - The badge icon type.

    - #### setColorized

          public final void setColorized​(boolean colorized)

      Sets whether the notification should be colorized. When set, the color set with `setColor(int)` will be used as the background color for the notification.

      See `NotificationCompat.Builder.setColorized(boolean)`.

      Parameters:
        `colorized` - Whether to colorize the notification.

    - #### setDefaults

          public final void setDefaults​(int defaults)

      Sets the defaults.

      See `NotificationCompat.Builder.setDefaults(int)`.

      Parameters:
        `defaults` - The default notification options.

    - #### setColor

          public final void setColor​(int color)

      Sets the accent color of the notification.

      See `NotificationCompat.Builder.setColor(int)`.

      Parameters:
        `color` - The color, in ARGB integer form like the constants in `Color`.

    - #### setPriority

          public final void setPriority​(@Priority
                                        int priority)

      Sets the priority of the notification required for API 25 and lower.

      See `NotificationCompat.Builder.setPriority(int)`.

      To set the priority for API levels above 25, you can create your own `NotificationChannel` with a given importance level and pass the id of the channel to `Builder(Context, int, String, MediaDescriptionAdapter)`.

      Parameters:
        `priority` - The priority which can be one of `NotificationCompat.PRIORITY_DEFAULT`, `NotificationCompat.PRIORITY_MAX`, `NotificationCompat.PRIORITY_HIGH`, `NotificationCompat.PRIORITY_LOW` or `NotificationCompat.PRIORITY_MIN`. If not set `NotificationCompat.PRIORITY_LOW` is used by default.

    - #### setSmallIcon

          public final void setSmallIcon​(@DrawableRes
                                         int smallIconResourceId)

      Sets the small icon of the notification which is also shown in the system status bar.

      See `NotificationCompat.Builder.setSmallIcon(int)`.

      Parameters:
        `smallIconResourceId` - The resource id of the small icon.

    - #### setUseChronometer

          public final void setUseChronometer​(boolean useChronometer)

      Sets whether the elapsed time of the media playback should be displayed.

      Note that this setting only works if all of the following are true:

      - The media is `actively playing`.
      - The media is not `dynamically changing its duration` (like for example a live stream).
      - The media is not `interrupted by an ad`.
      - The media is played at `regular speed`.
      - The device is running at least API 21 (Lollipop).

      See `NotificationCompat.Builder.setUsesChronometer(boolean)`.

      Parameters:
        `useChronometer` - Whether to use chronometer.

    - #### setVisibility

          public final void setVisibility​(@Visibility
                                          int visibility)

      Sets the visibility of the notification which determines whether and how the notification is shown when the device is in lock screen mode.

      See `NotificationCompat.Builder.setVisibility(int)`.

      Parameters:
        `visibility` - The visibility which must be one of `NotificationCompat.VISIBILITY_PUBLIC`, `NotificationCompat.VISIBILITY_PRIVATE` or `NotificationCompat.VISIBILITY_SECRET`.

    - #### invalidate

          public final void invalidate()

      Forces an update of the notification if already started.

    - #### createNotification

          @Nullable
          protected androidx.core.app.NotificationCompat.Builder createNotification​(Player player,
                                                                                    @Nullable
                                                                                    androidx.core.app.NotificationCompat.Builder builder,
                                                                                    boolean ongoing,
                                                                                    @Nullable
                                                                                    Bitmap largeIcon)

      Creates the notification given the current player state.
      Parameters:
        `player` - The player for which state to build a notification.
        `builder` - The builder used to build the last notification, or `null`. Re-using the builder when possible can prevent notification flicker when `Util#SDK_INT` < 21.
        `ongoing` - Whether the notification should be ongoing.
        `largeIcon` - The large icon to be used.
      Returns:
        The `NotificationCompat.Builder` on which to call `NotificationCompat.Builder.build()` to obtain the notification, or `null` if no notification should be displayed.

    - #### getActions

          protected List<String> getActions​(Player player)

      Gets the names and order of the actions to be included in the notification at the current player state.

      The playback and custom actions are combined and placed in the following order if not omitted:

             +------------------------------------------------------------------------+
             | prev | << | play/pause | >> | next | custom actions | stop |
             +------------------------------------------------------------------------+

      This method can be safely overridden. However, the names must be of the playback actions `ACTION_PAUSE`, `ACTION_PLAY`, `ACTION_FAST_FORWARD`, `ACTION_REWIND`, `ACTION_NEXT` or `ACTION_PREVIOUS`, or a key contained in the map returned by `PlayerNotificationManager.CustomActionReceiver.createCustomActions(Context, int)`. Otherwise the action name is ignored.

    - #### getActionIndicesForCompactView

          protected int[] getActionIndicesForCompactView​(List<String> actionNames,
                                                         Player player)

      Gets an array with the indices of the buttons to be shown in compact mode.

      This method can be overridden. The indices must refer to the list of actions passed as the first parameter.

      Parameters:
        `actionNames` - The names of the actions included in the notification.
        `player` - The player for which a notification is being built.

    - #### getOngoing

          protected boolean getOngoing​(Player player)

      Returns whether the generated notification should be ongoing.