mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	Extract NotificationActionData from NotificationUtil
This commit is contained in:
		| @@ -0,0 +1,168 @@ | ||||
| package org.schabi.newpipe.player.notification; | ||||
|  | ||||
| import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; | ||||
| import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; | ||||
|  | ||||
| import android.content.Context; | ||||
|  | ||||
| import androidx.annotation.DrawableRes; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
|  | ||||
| import org.schabi.newpipe.R; | ||||
| import org.schabi.newpipe.player.Player; | ||||
|  | ||||
| public final class NotificationActionData { | ||||
|     @Nullable | ||||
|     private final String action; | ||||
|     @NonNull | ||||
|     private final String name; | ||||
|     @DrawableRes | ||||
|     private final int icon; | ||||
|  | ||||
|     public NotificationActionData(@Nullable final String action, @NonNull final String name, | ||||
|                                   @DrawableRes final int icon) { | ||||
|         this.action = action; | ||||
|         this.name = name; | ||||
|         this.icon = icon; | ||||
|     } | ||||
|  | ||||
|     @Nullable | ||||
|     public String action() { | ||||
|         return action; | ||||
|     } | ||||
|  | ||||
|     @NonNull | ||||
|     public String name() { | ||||
|         return name; | ||||
|     } | ||||
|  | ||||
|     @DrawableRes | ||||
|     public int icon() { | ||||
|         return icon; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Nullable | ||||
|     public static NotificationActionData fromNotificationActionEnum( | ||||
|             @NonNull final Player player, | ||||
|             @NotificationConstants.Action final int selectedAction | ||||
|     ) { | ||||
|  | ||||
|         final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; | ||||
|         final Context ctx = player.getContext(); | ||||
|  | ||||
|         switch (selectedAction) { | ||||
|             case NotificationConstants.PREVIOUS: | ||||
|                 return new NotificationActionData(ACTION_PLAY_PREVIOUS, | ||||
|                         ctx.getString(R.string.exo_controls_previous_description), baseActionIcon); | ||||
|  | ||||
|             case NotificationConstants.NEXT: | ||||
|                 return new NotificationActionData(ACTION_PLAY_NEXT, | ||||
|                         ctx.getString(R.string.exo_controls_next_description), baseActionIcon); | ||||
|  | ||||
|             case NotificationConstants.REWIND: | ||||
|                 return new NotificationActionData(ACTION_FAST_REWIND, | ||||
|                         ctx.getString(R.string.exo_controls_rewind_description), baseActionIcon); | ||||
|  | ||||
|             case NotificationConstants.FORWARD: | ||||
|                 return new NotificationActionData(ACTION_FAST_FORWARD, | ||||
|                         ctx.getString(R.string.exo_controls_fastforward_description), | ||||
|                         baseActionIcon); | ||||
|  | ||||
|             case NotificationConstants.SMART_REWIND_PREVIOUS: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { | ||||
|                     return new NotificationActionData(ACTION_PLAY_PREVIOUS, | ||||
|                             ctx.getString(R.string.exo_controls_previous_description), | ||||
|                             R.drawable.exo_notification_previous); | ||||
|                 } else { | ||||
|                     return new NotificationActionData(ACTION_FAST_REWIND, | ||||
|                             ctx.getString(R.string.exo_controls_rewind_description), | ||||
|                             R.drawable.exo_controls_rewind); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.SMART_FORWARD_NEXT: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { | ||||
|                     return new NotificationActionData(ACTION_PLAY_NEXT, | ||||
|                             ctx.getString(R.string.exo_controls_next_description), | ||||
|                             R.drawable.exo_notification_next); | ||||
|                 } else { | ||||
|                     return new NotificationActionData(ACTION_FAST_FORWARD, | ||||
|                             ctx.getString(R.string.exo_controls_fastforward_description), | ||||
|                             R.drawable.exo_controls_fastforward); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.PLAY_PAUSE_BUFFERING: | ||||
|                 if (player.getCurrentState() == Player.STATE_PREFLIGHT | ||||
|                         || player.getCurrentState() == Player.STATE_BLOCKED | ||||
|                         || player.getCurrentState() == Player.STATE_BUFFERING) { | ||||
|                     // null intent action -> show hourglass icon that does nothing when clicked | ||||
|                     return new NotificationActionData(null, | ||||
|                             ctx.getString(R.string.notification_action_buffering), | ||||
|                             R.drawable.ic_hourglass_top); | ||||
|                 } | ||||
|  | ||||
|                 // fallthrough | ||||
|             case NotificationConstants.PLAY_PAUSE: | ||||
|                 if (player.getCurrentState() == Player.STATE_COMPLETED) { | ||||
|                     return new NotificationActionData(ACTION_PLAY_PAUSE, | ||||
|                             ctx.getString(R.string.exo_controls_pause_description), | ||||
|                             R.drawable.ic_replay); | ||||
|                 } else if (player.isPlaying() | ||||
|                         || player.getCurrentState() == Player.STATE_PREFLIGHT | ||||
|                         || player.getCurrentState() == Player.STATE_BLOCKED | ||||
|                         || player.getCurrentState() == Player.STATE_BUFFERING) { | ||||
|                     return new NotificationActionData(ACTION_PLAY_PAUSE, | ||||
|                             ctx.getString(R.string.exo_controls_pause_description), | ||||
|                             R.drawable.exo_notification_pause); | ||||
|                 } else { | ||||
|                     return new NotificationActionData(ACTION_PLAY_PAUSE, | ||||
|                             ctx.getString(R.string.exo_controls_play_description), | ||||
|                             R.drawable.exo_notification_play); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.REPEAT: | ||||
|                 if (player.getRepeatMode() == REPEAT_MODE_ALL) { | ||||
|                     return new NotificationActionData(ACTION_REPEAT, | ||||
|                             ctx.getString(R.string.exo_controls_repeat_all_description), | ||||
|                             R.drawable.exo_media_action_repeat_all); | ||||
|                 } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { | ||||
|                     return new NotificationActionData(ACTION_REPEAT, | ||||
|                             ctx.getString(R.string.exo_controls_repeat_one_description), | ||||
|                             R.drawable.exo_media_action_repeat_one); | ||||
|                 } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { | ||||
|                     return new NotificationActionData(ACTION_REPEAT, | ||||
|                             ctx.getString(R.string.exo_controls_repeat_off_description), | ||||
|                             R.drawable.exo_media_action_repeat_off); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.SHUFFLE: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { | ||||
|                     return new NotificationActionData(ACTION_SHUFFLE, | ||||
|                             ctx.getString(R.string.exo_controls_shuffle_on_description), | ||||
|                             R.drawable.exo_controls_shuffle_on); | ||||
|                 } else { | ||||
|                     return new NotificationActionData(ACTION_SHUFFLE, | ||||
|                             ctx.getString(R.string.exo_controls_shuffle_off_description), | ||||
|                             R.drawable.exo_controls_shuffle_off); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.CLOSE: | ||||
|                 return new NotificationActionData(ACTION_CLOSE, ctx.getString(R.string.close), | ||||
|                         R.drawable.ic_close); | ||||
|  | ||||
|             case NotificationConstants.NOTHING: | ||||
|             default: | ||||
|                 // do nothing | ||||
|                 return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,16 +1,19 @@ | ||||
| package org.schabi.newpipe.player.notification; | ||||
|  | ||||
| import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; | ||||
| import static androidx.media.app.NotificationCompat.MediaStyle; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; | ||||
|  | ||||
| import android.annotation.SuppressLint; | ||||
| import android.app.PendingIntent; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.ServiceInfo; | ||||
| import android.graphics.Bitmap; | ||||
| import android.os.Build; | ||||
| import android.util.Log; | ||||
|  | ||||
| import androidx.annotation.DrawableRes; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.annotation.StringRes; | ||||
| import androidx.core.app.NotificationCompat; | ||||
| import androidx.core.app.NotificationManagerCompat; | ||||
| import androidx.core.app.PendingIntentCompat; | ||||
| @@ -29,19 +32,6 @@ import java.util.List; | ||||
| import java.util.Objects; | ||||
| import java.util.Optional; | ||||
|  | ||||
| import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; | ||||
| import static androidx.media.app.NotificationCompat.MediaStyle; | ||||
| import static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL; | ||||
| import static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT; | ||||
| import static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE; | ||||
|  | ||||
| /** | ||||
|  * This is a utility class for player notifications. | ||||
|  */ | ||||
| @@ -238,115 +228,21 @@ public final class NotificationUtil { | ||||
|  | ||||
|     private void addAction(final NotificationCompat.Builder builder, | ||||
|                            @NotificationConstants.Action final int slot) { | ||||
|         final NotificationCompat.Action action = getAction(slot); | ||||
|         if (action != null) { | ||||
|             builder.addAction(action); | ||||
|         @Nullable final NotificationActionData data = | ||||
|                 NotificationActionData.fromNotificationActionEnum(player, slot); | ||||
|         if (data == null) { | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Nullable | ||||
|     private NotificationCompat.Action getAction( | ||||
|             @NotificationConstants.Action final int selectedAction) { | ||||
|         final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction]; | ||||
|         switch (selectedAction) { | ||||
|             case NotificationConstants.PREVIOUS: | ||||
|                 return getAction(baseActionIcon, | ||||
|                         R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); | ||||
|  | ||||
|             case NotificationConstants.NEXT: | ||||
|                 return getAction(baseActionIcon, | ||||
|                         R.string.exo_controls_next_description, ACTION_PLAY_NEXT); | ||||
|  | ||||
|             case NotificationConstants.REWIND: | ||||
|                 return getAction(baseActionIcon, | ||||
|                         R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); | ||||
|  | ||||
|             case NotificationConstants.FORWARD: | ||||
|                 return getAction(baseActionIcon, | ||||
|                         R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); | ||||
|  | ||||
|             case NotificationConstants.SMART_REWIND_PREVIOUS: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { | ||||
|                     return getAction(R.drawable.exo_notification_previous, | ||||
|                             R.string.exo_controls_previous_description, ACTION_PLAY_PREVIOUS); | ||||
|                 } else { | ||||
|                     return getAction(R.drawable.exo_controls_rewind, | ||||
|                             R.string.exo_controls_rewind_description, ACTION_FAST_REWIND); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.SMART_FORWARD_NEXT: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { | ||||
|                     return getAction(R.drawable.exo_notification_next, | ||||
|                             R.string.exo_controls_next_description, ACTION_PLAY_NEXT); | ||||
|                 } else { | ||||
|                     return getAction(R.drawable.exo_controls_fastforward, | ||||
|                             R.string.exo_controls_fastforward_description, ACTION_FAST_FORWARD); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.PLAY_PAUSE_BUFFERING: | ||||
|                 if (player.getCurrentState() == Player.STATE_PREFLIGHT | ||||
|                         || player.getCurrentState() == Player.STATE_BLOCKED | ||||
|                         || player.getCurrentState() == Player.STATE_BUFFERING) { | ||||
|                     // null intent -> show hourglass icon that does nothing when clicked | ||||
|                     return new NotificationCompat.Action(R.drawable.ic_hourglass_top, | ||||
|                             player.getContext().getString(R.string.notification_action_buffering), | ||||
|                             null); | ||||
|                 } | ||||
|  | ||||
|                 // fallthrough | ||||
|             case NotificationConstants.PLAY_PAUSE: | ||||
|                 if (player.getCurrentState() == Player.STATE_COMPLETED) { | ||||
|                     return getAction(R.drawable.ic_replay, | ||||
|                             R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); | ||||
|                 } else if (player.isPlaying() | ||||
|                         || player.getCurrentState() == Player.STATE_PREFLIGHT | ||||
|                         || player.getCurrentState() == Player.STATE_BLOCKED | ||||
|                         || player.getCurrentState() == Player.STATE_BUFFERING) { | ||||
|                     return getAction(R.drawable.exo_notification_pause, | ||||
|                             R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); | ||||
|                 } else { | ||||
|                     return getAction(R.drawable.exo_notification_play, | ||||
|                             R.string.exo_controls_play_description, ACTION_PLAY_PAUSE); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.REPEAT: | ||||
|                 if (player.getRepeatMode() == REPEAT_MODE_ALL) { | ||||
|                     return getAction(R.drawable.exo_media_action_repeat_all, | ||||
|                             R.string.exo_controls_repeat_all_description, ACTION_REPEAT); | ||||
|                 } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { | ||||
|                     return getAction(R.drawable.exo_media_action_repeat_one, | ||||
|                             R.string.exo_controls_repeat_one_description, ACTION_REPEAT); | ||||
|                 } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { | ||||
|                     return getAction(R.drawable.exo_media_action_repeat_off, | ||||
|                             R.string.exo_controls_repeat_off_description, ACTION_REPEAT); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.SHUFFLE: | ||||
|                 if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { | ||||
|                     return getAction(R.drawable.exo_controls_shuffle_on, | ||||
|                             R.string.exo_controls_shuffle_on_description, ACTION_SHUFFLE); | ||||
|                 } else { | ||||
|                     return getAction(R.drawable.exo_controls_shuffle_off, | ||||
|                             R.string.exo_controls_shuffle_off_description, ACTION_SHUFFLE); | ||||
|                 } | ||||
|  | ||||
|             case NotificationConstants.CLOSE: | ||||
|                 return getAction(R.drawable.ic_close, | ||||
|                         R.string.close, ACTION_CLOSE); | ||||
|  | ||||
|             case NotificationConstants.NOTHING: | ||||
|             default: | ||||
|                 // do nothing | ||||
|                 return null; | ||||
|         final PendingIntent intent; | ||||
|         if (data.action() == null) { | ||||
|             intent = null; | ||||
|         } else { | ||||
|             intent = PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, | ||||
|                     new Intent(data.action()), FLAG_UPDATE_CURRENT, false); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private NotificationCompat.Action getAction(@DrawableRes final int drawable, | ||||
|                                                 @StringRes final int title, | ||||
|                                                 final String intentAction) { | ||||
|         return new NotificationCompat.Action(drawable, player.getContext().getString(title), | ||||
|                 PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID, | ||||
|                         new Intent(intentAction), FLAG_UPDATE_CURRENT, false)); | ||||
|         builder.addAction(new NotificationCompat.Action(data.icon(), data.name(), intent)); | ||||
|     } | ||||
|  | ||||
|     private Intent getIntentForNotification() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Stypox
					Stypox