Fix widget buttons on new playback service (#8510)

### Description

Fix widget buttons on new playback service
Closes #8454

### Checklist
<!-- 
To help us keep the issue tracker clean and work as efficient as
possible,
  please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
This commit is contained in:
Hans-Peter Lehmann
2026-06-04 20:49:10 +02:00
committed by GitHub
parent 0207527d9d
commit ca86fec2c2
3 changed files with 33 additions and 5 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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);
}