96 Commits

Author SHA1 Message Date
f42bf67289 [media3] Add volume adaptation (boost/reduction) to Media3PlaybackService (#8354)
### Description

Re-add volume adaption setting to new playback service

Closes #8324

### Checklist
- [ ] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [ ] 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
- [ ] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [ ] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [ ] 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)
- [ ] If it is a core feature, I have added automated tests

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-20 10:33:59 +01:00
43b6f7a752 Set user agent in new playback service (#8353)
### Description

Set user agent in new playback service
Contributes to #6608

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-03-20 08:38:32 +01:00
47f921065b Add mobile data streaming confirmation to Media3PlaybackService (#8317)
### Description

Implements mobile data streaming confirmation (allow once/always
notification) in Media3PlaybackService, matching the legacy
PlaybackService behavior. Includes pre-Oreo PendingIntent compatibility,
stale notification cleanup on new media load, and a streaming guard for
queue auto-advance.

Fixes #8301 

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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

---------

Co-authored-by: ByteHamster <info@bytehamster.com>
2026-03-18 21:55:11 +01:00
94ad42b600 Add skip intro/ending support to Media3PlaybackService (#8331)
### Description

Re-add skip intro/ending support to new playback service
Closes #8323

### Checklist
- [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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-13 23:26:52 +01:00
516f4cf00f Load notification covers using Glide (#8332)
### Description

Load media icon using Glide, respecting caches and supporting local
embedded covers.

### Checklist
- [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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-13 22:37:51 +01:00
95d3f37d25 Build media item stub on main thread and full item on background thread (#8321)
### Description

Build media item stub in main thread and full item in background thread.
We later plan to add more things to load to the main item creation code,
which should not run on the main thread.
Contributes to #8261

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-03-08 08:38:59 +01:00
ab96ad5988 Fix crash when device does not support loudness enhancer (#8322)
### Description

Fix crash when device does not support loudness enhancer. This fixes the
old playback service, which is mostly non-functional by now. This still
documents how to fix the loudness enhancer in case it is ported to the
new service at some point.
Closes #8294

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-03-07 17:25:30 +01:00
e130dff21c Re-implement sleep timer for Media3PlaybackService (#8315)
### Description

Restores full sleep timer functionality that was removed during the
Media3 migration (#8232).

The existing timer classes (`ClockSleepTimer`, `EpisodeSleepTimer`,
`ShakeListener`) were already
implemented but not wired into `Media3PlaybackService`. This PR
integrates them via `SessionCommand`
and adds the necessary plumbing between `SleepTimerDialog` →
`PlaybackController` → `Media3PlaybackService`.

**Changes:**

- **`MediaLibrarySessionCallback`**: Added `SessionCommand`s for
set/disable/extend sleep timer with
  `Bundle` helpers for passing long values
- **`Media3PlaybackService`**: Integrated sleep timer lifecycle (create,
start, stop),
`SleepTimerUpdatedEvent` handler with volume fade and restore on
cancel/reset, auto-enable support
based on time range preferences, and episode transition check in
`startNextInQueue()`
- **`PlaybackController`**: Routed `setSleepTimer()`,
`disableSleepTimer()`, and `extendSleepTimer()`
through `sendCustomCommand` when using Media3. Fixed
`getMedia()`/`getPosition()`/`getDuration()`
  to avoid I/O on main thread crash
- **`SleepTimerDialog`**: Added null safety in `onStart()` for Media3
compatibility, fixed playback
  status check for the "Set timer" button

**Supported features:**
- Time-based sleep timer (minutes countdown)
- Episode-based sleep timer (stop after N episodes)
- Shake-to-reset via accelerometer
- Vibration notification before expiry
- Gradual volume fade in last 10 seconds, with volume restore on
cancel/reset/extend
- Timer extend/disable controls
- Auto-enable within configured time range

**Tested manually on a physical device:**
- Set time-based timer → playback pauses when timer expires
- Set episode-based timer → stops after N episodes
- Volume fades in last ~10 seconds
- Cancel timer while volume is fading → volume restores immediately
- Shake to reset while volume is fading → volume restores, timer resets
- Extend timer while volume is fading → volume restores
- Auto-enable enabled → timer starts automatically on playback
- Sleep timer dialog opens without crash
- Changed settings mid-playback → values picked up immediately

Closes #8264

### Checklist

- [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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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)
- [ ] If it is a core feature, I have added automated tests

---------

Co-authored-by: ByteHamster <info@bytehamster.com>
2026-02-28 09:58:43 +01:00
07f9f0146d Fix headphone double-tap skip for media3 playback service (#8309)
After the migration to media3 (#8232), the headphone button multi-tap
stopped working — double/triple pressing the headset button no longer
fast-forwards or rewinds.

I found that media3 already handles HEADSETHOOK multi-tap internally
and translates it before reaching the callback:
- double-tap → KEYCODE_MEDIA_NEXT
- triple-tap → KEYCODE_MEDIA_PREVIOUS

So instead of reimplementing the click-counting logic from the old
PlaybackService, I override `onMediaButtonEvent` in
`MediaLibrarySessionCallback` to catch these translated keycodes
and redirect them to seek operations using the user-configured
duration from `UserPreferences`.

I also updated `onCustomCommand` for REWIND/FAST_FORWARD to read
from `UserPreferences` at each press rather than relying on the
fixed seek intervals set at player creation. Without this, changing
the skip duration in settings had no effect until the app was
restarted.

While testing with a 60s fast-forward setting, I also hit a crash
in `ExoPlayerUtils.buildPlayer()`: the `minBufferMs` is set to
`FastForwardSecs * 1000` (to ensure enough audio is buffered for
instant seeking), but `maxBufferMs` was hardcoded to
`DEFAULT_MAX_BUFFER_MS` (50000ms). When fast-forward exceeds 50s,
`minBufferMs > maxBufferMs` and `DefaultLoadControl` throws an
`IllegalArgumentException`. Fixed by wrapping `maxBufferMs` in
`Math.max(DEFAULT_MAX_BUFFER_MS, minBufferMs)`.

Tested manually on a physical device with bluetooth headphones:
- Single tap: play/pause works as before
- Double tap: seeks forward by the configured amount
- Triple tap: seeks back by the configured amount
- Changed skip duration in settings mid-playback: new values
  are picked up immediately without restarting
- Set fast-forward to 60s: no more crash on playback start

Closes: #8260

### Checklist
- [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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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)
- [ ] If it is a core feature, I have added automated tests
2026-02-26 20:17:41 +01:00
4cc6a755eb Re-add skip silence setting to new playback service (#8308)
### Description

Re-add skip silence setting to new playback service
Closes #8266

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-25 13:30:33 +01:00
7751704aa5 Small ExoPlayer tweaks (#8305)
### Description

Small ExoPlayer tweaks:
- Cache backwards and forwards
- Fix getting stuck when dragging playback speed bar
- Exact seeking
- Code cleanup
- +/- speed buttons increment by 0.05 like the seekbar

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-22 21:56:09 +01:00
5ee4012160 Re-implement delete after playback (#8299)
### Description

Re-implement delete after playback in the new playback service. To avoid
a race condition (that we already had in the old playback service), we
have to replace `setMedia` in `deleteFeedMediaSynchronous` with a new
`setMediaDownloadInformation`. Otherwise, we might reset the position
but then it gets overwritten again by deletion setting all attributes.

Closes #8285

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-21 17:46:08 +01:00
1706aee565 Fix completing the last episode in the queue keeps it active (#8292)
### Description

Closes: #8284 

### 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
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-20 19:11:46 +01:00
5c0bb2e33c Re-add widget to media3 player (#8278)
### Description

Add widget update sender again.
Closes #8263

### 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
- [x] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-17 22:15:25 +01:00
96213f0625 Add back Chromecast support (#8275)
### Description

Add back Chromecast support. This is so easy with media3 now :)
Closes #8265

### 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
- [x] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-17 21:13:14 +01:00
04d2f22712 Avoid duplicate media notification when casting (#8279)
### Description

Tell the cast options provider that we manage the notification
ourselves.
Closes #5728
Contributes to #8265

### 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
- [x] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-15 10:45:25 +01:00
5cc83fc842 Show buffering state as playing (#8277)
### Description

While an episode is buffering, ExoPlayer does not consider it playing.
However, we still want to show it as playing so that the user (1) sees a
reaction when pressing the play button and (2) does not see it toggling
back to paused when the wifi is unstable. Media3 already has a utility
function for that.

Closes #8259

### 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
- [x] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-15 00:13:54 +01:00
1562188546 Remove Android 5 support (#8276)
### Description

Remove Android 5 support. For supporting Chromecast playback via media3,
we need to upgrade the media3 library. This library no longer supports
Android 5, so we need to bump our minimum version as well. Only 0.13% of
our Google Play users are still on this ancient Android version released
in 2014. Dropping support seems okay now, especially considering that no
one should expose such an old device to the internet anymore. The app
will continue to work on Android 5 but will not receive updates anymore.

### 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
- [x] I have run the automated code checks using `./gradlew checkstyle
spotbugsPlayDebug spotbugsDebug :app:lintPlayDebug`
- [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
2026-02-14 22:06:08 +01:00
c28463c735 Fix media session browsing (#8273)
Fix media session browsing:

- Show only subscribed feeds
- Fix crash when image is null or cannot be loaded
- Re-add "current" section to main screen
- Fix trying to show items without media
2026-02-13 08:04:16 +01:00
787a866db0 Playback service rewrite (#8232) 2026-02-08 15:12:33 +01:00
1ad2af18a5 Simplify playback statistics tracking (#8244) 2026-01-28 19:26:27 +01:00
d4717bca10 Migrate more fragments to event-based architecture instead of keeping the service bound (#8242) 2026-01-25 13:36:30 +01:00
e709128b57 Fix multi select actions to match single select action (#8233) 2026-01-19 22:19:51 +01:00
15fe243cc3 Fix issue where sleep timer is marked as active after events are fired (#8231) 2026-01-18 18:50:56 +01:00
dafbf16cf8 Fix status showing as playing when skipping last episode in queue (#8181) 2025-12-27 14:40:35 +01:00
35f24316e0 Merge branch 'master' into develop 2025-12-21 12:34:55 +01:00
0658ca2a2d Attempt to fix uncancelable sleep timers (#8154)
Try to disable the sleep timer in onDestroy too and disable the sleep timer as long as it's available, regardless of whether it's active or not.
2025-12-14 11:21:13 +01:00
0842bf14c6 Show message when skipping last episode in the queue (#8149) 2025-12-10 22:34:54 +01:00
9b78c586df Reset interrupted state on InterruptedException (#8120)
This resets the interrupted state for the thread, because it is checked in the calling method.

If you catch a InterruptedException and do not call Thread.currentThread().interrupt(), the interrupt state of the thread is not set anymore and the calling method has no information about it. Without the correction the if (!Thread.currentThread().isInterrupted()) will always be true. Neither Thread.currentThread().interrupt() is called nor the exception is rethrown which can result in unexpected behavior.
2025-11-30 15:31:05 +01:00
ba03d16e1c Merge branch 'master' into develop 2025-11-17 20:40:10 +01:00
a0894b567c When shaking to reset a sleep timer about to expire also reset volume back to full (#8074) 2025-11-05 21:04:04 +01:00
27d9d0ca9b Merge branch 'master' into develop 2025-10-31 21:18:08 +01:00
0debbc3973 Add episode count sleep timers (#7841) 2025-10-30 22:51:03 +01:00
26e8c9e1bd Disable current sleep timer if there are no more episodes in the queue. (#8071) 2025-10-30 19:27:35 +01:00
f097b64acb Revert "Make Media Controls work better after battery eviction (#7141)" (#8062)
This reverts commit b4a6762bd6.

The PR caused a significant increase in crashes due to I/O on the main thread.
2025-10-25 16:46:36 +02:00
23d862185d Add more explicit feature to archive feeds (#8022) 2025-10-11 13:48:08 +02:00
b4a6762bd6 Make Media Controls work better after battery eviction (#7141)
The patch allows to restart AntennaPod after being removed by the battery saver from the Media Control. It doesn't start the media, but restores the interface in Media Control to then to start playing.
2025-08-24 10:45:04 +02:00
77888a12cc Properly update widget state when stopped (#7938) 2025-08-23 20:51:29 +02:00
e539479f2c Upgrade dependencies (#7936) 2025-08-18 20:24:58 +02:00
cfd9e1f886 Fix playback position not saved after being changed, when episode is paused (#7911) 2025-08-04 08:39:00 +02:00
b9014b64e0 Android Auto: Grid view for subscriptions (#7889) 2025-07-20 16:42:09 +02:00
55d3b743d1 Rework sleep timer so it no longer uses threads and clean up PlaybackServiceTaskManager (#7713)
Reworked sleep timer to no longer use threads, instead uses PlaybackService PlaybackPositionEvent which is fired while media is playing. We use this to calculate how much time is left of the sleep timer and send the proper events.
2025-07-20 16:27:17 +02:00
c5cec07b0e Android Auto: Current tab icon and visibility fixes (#7888)
* Use same play state detection for tab visibility as content

* Add suitably-styled play icon for current tab
2025-07-20 10:45:40 +02:00
f489a07f16 Fix 'all episodes' on Android Auto not respecting filter (#7884) 2025-07-17 17:44:26 +02:00
b65062d18d Remove duplicate custom feed title in subtitle field (#7855) 2025-06-28 15:40:58 +02:00
c2f7dabc8b Add incompletely played episodes to playback history (#7815) 2025-05-27 22:52:43 +02:00
d95e03b51b Fix back stack being cleared after searching (#7757) 2025-04-13 22:20:42 +02:00
7c7863f2ea Fix crash in PlaybackService (#7751)
When service is quickly stopped again due to a playback error,
background tasks might not have delivered their result yet.
In this case, the service objects already get cleaned up.
Now, if the result gets delivered, the service is in an invalid state.
2025-04-12 00:12:00 +02:00
699b96b174 Added a small vibration when the phone is shaken to reset the sleep timer (#7714) 2025-04-05 16:04:26 +02:00
3ed5b0bfa4 Add option to automatically download queue (#7627)
We already added the queue to the auto-download candidates.
Now that auto-download was rewritten to not be a "master switch",
the code is called even if auto-download is turned off for all subscriptions.
This lead to queued episodes being downloaded for users who had auto-download disabled.

Convert the feature to an explicit setting to avoid behavior changes for users.
Also, this implements a setting to auto-download the queue,
which users have requested because they did not know that AntennaPod already does this.
Finally, it should solve user confusion where they automatically add episodes to the queue
but set the auto-download filter to ignore specific episodes.
2025-02-02 19:28:23 +01:00