diff --git a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/Media3PlaybackService.java b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/Media3PlaybackService.java index 2569a8d3e..767649a00 100644 --- a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/Media3PlaybackService.java +++ b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/Media3PlaybackService.java @@ -161,6 +161,13 @@ public class Media3PlaybackService extends MediaLibraryService { seekTo(Math.min(getDuration(), getCurrentPosition() + UserPreferences.getFastForwardSecs() * 1000L)); } + @Override + public void seekToNextMediaItem() { + if (currentPlayable != null) { + startNextInQueue(currentPlayable.getItem()); + } + } + @Override public void seekTo(long positionMs) { super.seekTo(positionMs); @@ -186,9 +193,7 @@ public class Media3PlaybackService extends MediaLibraryService { setNextPlaybackSpeed(); return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); } else if (customCommand.customAction.equals(SESSION_COMMAND_SKIP_TO_NEXT.customAction)) { - if (currentPlayable != null) { - startNextInQueue(currentPlayable.getItem()); - } + session.getPlayer().seekToNextMediaItem(); return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_SUCCESS)); } else if (customCommand.customAction.equals(SESSION_COMMAND_NEXT_CHAPTER.customAction)) { seekToNextChapter(); diff --git a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java index 025245f42..0216eaa2a 100644 --- a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java +++ b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/internal/MediaLibrarySessionCallback.java @@ -33,6 +33,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.playback.base.MediaItemAdapter; import de.danoeh.antennapod.playback.base.RewindAfterPauseUtils; +import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter; import de.danoeh.antennapod.playback.service.R; import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.preferences.PlaybackPreferences; @@ -207,13 +208,24 @@ public class MediaLibrarySessionCallback implements MediaLibraryService.MediaLib KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (keyEvent != null && keyEvent.getAction() == KeyEvent.ACTION_DOWN && keyEvent.getRepeatCount() == 0) { + boolean fromWidget = MediaButtonStarter.MEDIA_BUTTON_SOURCE_WIDGET.equals( + intent.getStringExtra(MediaButtonStarter.EXTRA_MEDIA_BUTTON_SOURCE)); int keyCode = keyEvent.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_MEDIA_NEXT) { + if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { + session.getPlayer().seekForward(); + return true; + } else if (keyCode == KeyEvent.KEYCODE_MEDIA_REWIND) { + session.getPlayer().seekBack(); + return true; + } else if (fromWidget && keyCode == KeyEvent.KEYCODE_MEDIA_NEXT) { + session.getPlayer().seekToNextMediaItem(); + return true; + } else if (!fromWidget && keyCode == KeyEvent.KEYCODE_MEDIA_NEXT) { // Media3 translates HEADSETHOOK double-tap to MEDIA_NEXT. // Instead of skipping to the next episode, do a fast-forward. session.getPlayer().seekForward(); return true; - } else if (keyCode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { + } else if (!fromWidget && keyCode == KeyEvent.KEYCODE_MEDIA_PREVIOUS) { // Media3 translates HEADSETHOOK triple-tap to MEDIA_PREVIOUS. // Instead of going to the previous episode, do a rewind. session.getPlayer().seekBack(); diff --git a/ui/app-start-intent/src/main/java/de/danoeh/antennapod/ui/appstartintent/MediaButtonStarter.java b/ui/app-start-intent/src/main/java/de/danoeh/antennapod/ui/appstartintent/MediaButtonStarter.java index bd3def1cb..040703d2d 100644 --- a/ui/app-start-intent/src/main/java/de/danoeh/antennapod/ui/appstartintent/MediaButtonStarter.java +++ b/ui/app-start-intent/src/main/java/de/danoeh/antennapod/ui/appstartintent/MediaButtonStarter.java @@ -1,12 +1,17 @@ package de.danoeh.antennapod.ui.appstartintent; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.view.KeyEvent; public abstract class MediaButtonStarter { private static final String INTENT = "de.danoeh.antennapod.NOTIFY_BUTTON_RECEIVER"; + private static final String MEDIA3_PLAYBACK_SERVICE = + "de.danoeh.antennapod.playback.service.Media3PlaybackService"; + public static final String EXTRA_MEDIA_BUTTON_SOURCE = "media_button_source"; + public static final String MEDIA_BUTTON_SOURCE_WIDGET = "widget"; public static Intent createIntent(Context context, int eventCode) { KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, eventCode); @@ -18,6 +23,12 @@ public abstract class MediaButtonStarter { } public static PendingIntent createPendingIntent(Context context, int eventCode) { + if (BuildConfig.USE_MEDIA3_PLAYBACK_SERVICE) { + Intent intent = createIntent(context, eventCode) + .setComponent(new ComponentName(context, MEDIA3_PLAYBACK_SERVICE)) + .putExtra(EXTRA_MEDIA_BUTTON_SOURCE, MEDIA_BUTTON_SOURCE_WIDGET); + return PendingIntent.getService(context, eventCode, intent, PendingIntent.FLAG_IMMUTABLE); + } return PendingIntent.getBroadcast(context, eventCode, createIntent(context, eventCode), PendingIntent.FLAG_IMMUTABLE); }