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;
|
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.annotation.SuppressLint;
|
||||||
|
import android.app.PendingIntent;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ServiceInfo;
|
import android.content.pm.ServiceInfo;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.DrawableRes;
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.StringRes;
|
|
||||||
import androidx.core.app.NotificationCompat;
|
import androidx.core.app.NotificationCompat;
|
||||||
import androidx.core.app.NotificationManagerCompat;
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
import androidx.core.app.PendingIntentCompat;
|
import androidx.core.app.PendingIntentCompat;
|
||||||
|
@ -29,19 +32,6 @@ import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
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.
|
* This is a utility class for player notifications.
|
||||||
*/
|
*/
|
||||||
|
@ -238,115 +228,21 @@ public final class NotificationUtil {
|
||||||
|
|
||||||
private void addAction(final NotificationCompat.Builder builder,
|
private void addAction(final NotificationCompat.Builder builder,
|
||||||
@NotificationConstants.Action final int slot) {
|
@NotificationConstants.Action final int slot) {
|
||||||
final NotificationCompat.Action action = getAction(slot);
|
@Nullable final NotificationActionData data =
|
||||||
if (action != null) {
|
NotificationActionData.fromNotificationActionEnum(player, slot);
|
||||||
builder.addAction(action);
|
if (data == null) {
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
final PendingIntent intent;
|
||||||
private NotificationCompat.Action getAction(
|
if (data.action() == null) {
|
||||||
@NotificationConstants.Action final int selectedAction) {
|
intent = null;
|
||||||
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 {
|
} else {
|
||||||
return getAction(R.drawable.exo_controls_rewind,
|
intent = PendingIntentCompat.getBroadcast(player.getContext(), NOTIFICATION_ID,
|
||||||
R.string.exo_controls_rewind_description, ACTION_FAST_REWIND);
|
new Intent(data.action()), FLAG_UPDATE_CURRENT, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
case NotificationConstants.SMART_FORWARD_NEXT:
|
builder.addAction(new NotificationCompat.Action(data.icon(), data.name(), intent));
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent getIntentForNotification() {
|
private Intent getIntentForNotification() {
|
||||||
|
|
Loading…
Reference in a new issue