Extract NotificationActionData from NotificationUtil
This commit is contained in:
parent
9fb8125655
commit
2c4c283099
2 changed files with 184 additions and 120 deletions
|
@ -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() {
|
||||
|
|
Loading…
Reference in a new issue