Commit Graph

9363 Commits

Author SHA1 Message Date
5fe70196eb Basic WearOS app (#8396)
### Description

An initial minimal implementation for a Wear OS app. So far, the wear
app can only display episodes and start them on the phone. No standalone
features available yet.

Contributes to #4264

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 14:17:54 +02:00
c39cfc9719 Shorten queue subtitle (#8432)
### Description

Shorten queue subtitle. In German, it sometimes broke to two lines,
which looked super messy

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 14:01:43 +02:00
188d756911 Tweak button design on home page (#8434)
### Description

Tweak button design on home page. We used text-based "arrows" (`»`).
Those don't work well depending on the language. Instead, use an actual
arrow icon.

Before/After:

<img width="200" alt="Screenshot_20260514-125712"
src="https://github.com/user-attachments/assets/da8c37c4-64c4-4904-986d-4df5020e7bc4"
/> <img width="200" alt="Screenshot_20260514-130130"
src="https://github.com/user-attachments/assets/3f527b42-b9cb-4aff-8eea-16c96e961661"
/>


### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 13:48:41 +02:00
9e18b674b2 Support password protected media streams in new playback service (#8430)
### Description

Support password protected media streams in new playback service

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 12:19:23 +02:00
7281fb1fc0 Animate subscription selection (#8431)
### Description

Animate subscription selection. Instead of jumping to the larger margin,
animate to it. Feels much more natural

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 12:15:41 +02:00
ec4f9a255f Fix two bugs in the new playback service (#8429)
### Description

Fix two bugs in the new playback service
- Play button sometimes not working because it checks the wrong ID
- Errors getting the player stuck because it thinks it is still playing

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 11:33:50 +02:00
e0f5f278a0 Add support for searching queue only (#8419)
### Description

The search icon in the queue now searches the queue only. A chip
indicates that this is the case. This lays the groundwork for adding
other filters as well.

Contributes to #4374

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-14 09:57:18 +02:00
e1ce785d58 Show "Import error" instead of "Export error" for import failures (#8427)
### Description

Fix a bug where import errors re-used the "export error" dialog, causing
user confusion.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-13 19:22:18 +02:00
78594ecd85 Fix sleep timer hint text wrapping (#8420)
### Description

Closes: #8199

Updates the sleep timer dialog hint text so it uses `wrap_content`
height instead of a weighted zero-height layout. This lets the
disabled-continuous-playback warning expand to its full text instead of
being constrained to a single line.

This follows the layout cleanup suggested by the maintainer in the issue
thread.

### Checklist

- [x] I have read the contribution guidelines
- [x] I have performed a self-review of my code
- [ ] I have run the automated code checks using `./gradlew checkstyle
lint spotbugsPlayDebug spotbugsDebug`
- [x] My code follows the style guidelines of the AntennaPod project
- [x] I have mentioned the corresponding issue and the relevant keyword
in the description
- [x] If it is a core feature, I have added automated tests

Validation performed:

- `xmllint --noout app/src/main/res/layout/time_dialog.xml`
- `git diff --check`

Gradle validation attempted:

- `./gradlew :app:lintPlayDebug` could not run because the Android SDK
is not configured in this environment (`ANDROID_HOME` / `sdk.dir`
missing).
2026-05-09 07:48:50 +02:00
d9e258155c Add unit tests for opml import/export (#8418)
### Description

Adds Robolectric unit tests for `OpmlReader` and `OpmlWriter`, which
previously had no coverage.

### 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
lint spotbugsPlayDebug spotbugsDebug`
- [ ] 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)
- [x] 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-05-09 07:47:07 +02:00
d3364aa085 Remove EventBus annotation processor (#8410)
### Description

Remove EventBus annotation processor. This breaks reproducible builds
without really helping with performance.

See also https://verification.f-droid.org/packages/de.danoeh.antennapod/

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-05-04 22:18:28 +02:00
6c44611c25 Clarify what the auto-delete-local setting does (#8409)
### Description

It looks like users do not understand the setting, clarify it.

Mastodon conversation:
https://fosstodon.org/@Diogenes@fuerth.social/116357209491352791

> the check mark for "Automatically delete from local folders" was
probably missing

> then I also have to check the box. But I wonder where else they should
be stored. In my opinion, it makes no sense to store them in a cloud
storage.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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: Keunes <11229646+keunes@users.noreply.github.com>
2026-05-02 20:03:45 +02:00
e839f25c84 Hide persistent playback controls preference on Android 11+ (#8398)
### Description

Hides the "Persistent playback controls" preference from the User
Interface settings screen when running on Android 11 (API 30) or newer.
Starting with Android 11, notification persistence for media sessions is
handled system-wide, so the app-level toggle is a no-op on modern
devices and can be confusing to users.

The change follows the existing pattern used for
`PREF_EXPANDED_NOTIFICATION`, which is hidden on API 26+ for the same
reason (notification channels superseded it).

On Android < 11 the preference remains visible and functional. On
Android 11+, `isPersistNotify()` continues to return its default
(`true`), so no behavioral regression for existing users.

One incidental change: `PREF_PERSISTENT_NOTIFICATION` was previously
`private` in `UserPreferences`; I changed it to `public` so
`UserInterfacePreferencesFragment` can reference it for visibility
control (matches the visibility of the adjacent
`PREF_EXPANDED_NOTIFICATION` constant).

Closes: #6809

### 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
lint spotbugsPlayDebug spotbugsDebug\`
- [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 — N/A,
visibility-only change based on `Build.VERSION.SDK_INT`; behavior is
framework-gated and not meaningfully unit-testable.
2026-04-19 15:40:43 +02:00
9a4a50ad7a Reduce number of feed item events (#8393)
### Description

Reduce number of feed item events. Only have one type of event, instead
of item update AND unread update AND favorite update. This means that on
most screens, instead of receiving 2 events when marking something as
favorite, we receive only one event with that episode. This means we
query the database less frequently.

Additionally, for multi-select and similar batch tasks, instead of
sending one event per episode, send one combined event for all episodes
together. Again, this reduces the number of events we send and therefore
the number of database calls we make. Using multi-select to remove/add
all favorites feels noticeably faster.

Initial prototype: Claude, $2.59

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-19 15:38:24 +02:00
fd54ca62a2 Tweak agent instructions (#8400)
### Description

Tweak agent instructions, with special focus on Claude.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-19 15:11:38 +02:00
d8623ecf09 Fix some lint warnings and suppress the others (#8395)
### Description

Fix some lint warnings and suppress the others. This makes builds easier
because IntelliJ no longer jumps to those warnings (and it prevents more
from showing up).

Initial prototype: Claude, $1.99

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-14 23:03:48 +02:00
825bfb76b9 Show feed covers more reliably in media session callback (#8392)
### Description

Show feed covers more reliably in media session callback. Similarly to
the episode covers, we can use our cache and pass it as bitmap to ensure
that the receiving application can show them even if it does not have
network connection.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-12 23:17:33 +02:00
3b87d14084 Faster media session item list loading (#8391)
### Description

Loading all items from network needed too long, especially if one of the
servers is broken and times out, and the calling application requests
too many episodes at once.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-12 22:29:04 +02:00
557dfe7154 Implement mini rewind after interruption (#8389)
### Description

This PR adds a short (800ms) rewind after audio focus is lost. Fixes
https://github.com/AntennaPod/AntennaPod/issues/2739.

The value of 800ms was chosen by actually driving in my car with a
podcast playing and trying different values. At 800ms I can comfortably
understand the word being spoken, but it doesn't feel like I'm hopping
back unnecessarily. Crucially, 800ms is short enough to not cause
problems in [Adarma's
scenario](https://github.com/AntennaPod/AntennaPod/issues/2739#issuecomment-2521352493).
At most after multiple interruptions you wind up back a couple words.

I have added a unit test to RewindAfterPauseUtils, but I don't see any
existing tests for Media3PlaybackService, so I have not added any tests
there. I have run the code checks etc as indicated below.

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-04-12 22:20:21 +02:00
c01be5573a Add Android Auto "For You" recommendations with recency filter (#8365)
### Description

Shows the same "Continue listening" list from the Home screen in Android
Auto's "For You" tab, instead of only the single currently-playing
episode. Uses `DBReader.getPausedQueue(8)` - up to 8 episodes, with
in-progress items sorted by last played time first, then remaining queue
items in queue order.

In Android Auto within the AntennaPod app, this appears as the first tab
labeled "Current", and is also surfaced in the "For You" tab.

No new settings or UI added - this reuses the existing Home screen logic
and keeps behavior predictable and aligned with the app.

Also fixes a pre-existing bug in `onAddMediaItems` where only the first
item in the media list was enriched, causing the wrong episode to play
when a user selected any item other than the first from a multi-item
browse list.

Closes: #8326

### 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
- [ ] If it is a core feature, I have added automated tests
2026-04-12 21:49:25 +02:00
8419a7796f Merge branch 'master' into develop 2026-04-11 11:19:14 +02:00
0374fc7378 Implement auto-rewind on resume in Media3PlaybackService (#8363)
### Description

This PR fixes the missing auto-rewind feature after the Media3
migration.
To solve this, I used the existing
`RewindAfterPauseUtils.calculatePositionWithRewind()` to get the correct
rewind time based on the user's settings and pause duration.

Closes #8268

### Checklist
- [x] 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` *(Note: local build
was successful)*
- [ ] 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)

---------

Co-authored-by: ByteHamster <info@bytehamster.com>
2026-04-09 23:56:52 +02:00
00f533f366 Filter out non-subscribed feeds from GPodder subscription sync (#8380)
### Description

Previewed feeds (with `STATE_NOT_SUBSCRIBED`) were being synced to
GPodder-compatible servers as though they were real subscriptions. This
caused previewed feeds to appear as subscribed on other devices after
sync.

The fix adds a `subscribedOnly` parameter to `getFeedListDownloadUrls`
and `getFeedCursorDownloadUrls`. The sync service passes `true` so only
actually subscribed feeds are uploaded.

Closes: #8361

### 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
lint spotbugsPlayDebug spotbugsDebug`
- [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-04-07 21:09:35 +02:00
e43eeb5579 Add workflows to ping about play reviews (#7177)
### Description

* Set up workflow which checks each new and edited comment for Google
Play review links and applies the 'Needs: Review reply' label to the
issue if such link is present.
* Update script to create release notes file using GraphQL API, and
include issue numbers of those with Google Play review links.
* Set up workflow to run the changelog creation script manually and save
the output as artifact.
* Set up workflow which runs on [each new
release](https://docs.github.com/en/webhooks/webhook-events-and-payloads?actionType=released#release)
and posts a comment on issues which are fixed or addressed in that
release (using the changelog script). It tags an the 'review-replyers'
team, so that we can flexibly adjust who should be informed. When tagged
the group should ping all team members.

Once replied, we ideally remove the label to avoid confusion. However,
the workflow will only comment on issues relevant to the new release.

### 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
- [ ] 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://github.com/AntennaPod/AntennaPod/wiki/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: GitHub Copilot <github-copilot[bot]@users.noreply.github.com>
2026-04-04 22:18:27 +02:00
0aba014583 Fix crash when opening Sleep Timer dialog due to main-thread DB access (#8366)
### Description

Fix a crash when opening the Sleep Timer dialog caused by main-thread
database access.

`SleepTimerDialog.refreshUiState()` reads playback timing via
`PlaybackController.getDuration()` and `getPosition()`. These methods
can
fall back to `getMedia()`, which lazily loads media from the database.

This results in disk I/O on the main thread and triggers a crash in
debug builds ("I/O on main thread").

Load the currently playing media asynchronously when the dialog opens
and use it for remaining-time validation instead of triggering a lazy
DB lookup.

Closes: #8360

### 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
- [ ] If it is a core feature, I have added automated tests
2026-04-04 21:25:39 +02:00
aa2358b086 Bump version to 3.11.3 2026-03-30 23:06:18 +02:00
97416e0458 Move database calls from Schedulers.io to Schedulers.computation (#8374)
### Description

Move database calls from `Schedulers.io` to `Schedulers.computation`.
The io scheduler is unbounded, starting an arbitrary number of threads.
This might be a reason for the lock inflation failing. In contrast, the
`compute` scheduler is limited by the number of available threads.

Contributes to #8338

### 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 spotbugsPlayDebug spotbugsDebug`
- [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-30 22:51:36 +02:00
70b075a090 Lint all modules (#8371)
### Description

Run Lint check on all modules, not just on app, and fix the violations

### 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-28 20:48:25 +01:00
6e6732f370 Run checkstyle in parallel (#8367)
### Description

Make `./gradlew checkstyle` much faster by registering a task for each
module and letting Gradle run those in parallel.

Before: 27 seconds, every time you run it (no caching)
After: 18 seconds, 2s on subsequent runs (if only a few code files were
touched)

Also, upgrade checkstyle version

### 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-28 17:12:33 +01:00
5e3e3b78a5 CONTRIBUTING.md - update unit test section (#8369)
### Description

there doesn't seem to be a `core` project...

```
./gradlew :core:testPlayDebugUnitTest

FAILURE: Build failed with an exception.

* What went wrong:
Cannot locate tasks that match ':core:testPlayDebugUnitTest' as project 'core' not found in root project 'AntennaPod'.
```

### 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-28 16:51:24 +01:00
98712dca38 Bump version to 3.11.2 3.11.2 2026-03-24 23:24:09 +01:00
5de8d4b73f Merge branch 'master' into develop 2026-03-22 19:43:30 +01:00
292320ffee Make sure to close all streams and cursors, enable spotbugs (#8357)
### Description

Make sure to close all streams and cursors, enable spotbugs

### 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-22 19:39:14 +01:00
786b06b9e3 Translations update from Hosted Weblate (#8359)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for
[AntennaPod/App](https://hosted.weblate.org/projects/antennapod/app/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/antennapod/app/horizontal-auto.svg)

Co-authored-by: Ander Romero <anderromeroaldana@gmail.com>
Co-authored-by: Arif Budiman <arifpedia@gmail.com>
Co-authored-by: Bora Atıcı <boratici.acc@gmail.com>
Co-authored-by: Eder Etxebarria Rojo <eder@betxepare.eus>
Co-authored-by: EdoAug <edvardhaaland@gmail.com>
Co-authored-by: F Bausch <florian+weblate@fbausch.de>
Co-authored-by: Filipe Mota (BlackSpirits) <blackspirits@gmail.com>
Co-authored-by: Flowerlywind <tuanhoangnguyen25019@gmail.com>
Co-authored-by: Francisco Serrador <fserrador@gmail.com>
Co-authored-by: Iago <translate@delthia.com>
Co-authored-by: Jairo García <woodensnake@gmail.com>
Co-authored-by: Joan De Genover Miquel <joandegenover@protonmail.com>
Co-authored-by: Joel A <joeax910@student.liu.se>
Co-authored-by: Kaboom <kaboom083@gmail.com>
Co-authored-by: KhubsuratInsaan <weblate.duration189@passinbox.com>
Co-authored-by: Kjetil Sørlund <kjetil@sorlund.no>
Co-authored-by: Lilli <kauhanen.johannes20@gmail.com>
Co-authored-by: Luca <loucasal@users.noreply.hosted.weblate.org>
Co-authored-by: Marcin P <mmr21@wp.pl>
Co-authored-by: Martin Bergström <brgstrmm@gmail.com>
Co-authored-by: Matth78 <3684177+Matth7878@users.noreply.github.com>
Co-authored-by: Mozart Michael <michael.mozart@protonmail.com>
Co-authored-by: Pablo Arango <pabloaran17@gmail.com>
Co-authored-by: Padraic S <padraic@users.noreply.hosted.weblate.org>
Co-authored-by: Sketch6580 <sketch6580@users.noreply.hosted.weblate.org>
Co-authored-by: Slava <471mashina@gmail.com>
Co-authored-by: Therese Nordgren <theresenordgren@live.se>
Co-authored-by: Uncle-1roh <github.daniel@proton.me>
Co-authored-by: VfBFan <drop0815@posteo.de>
Co-authored-by: Xin Z <xin.z.stahli@gmail.com>
Co-authored-by: Yatu <pararegistros@gmail.com>
Co-authored-by: Yurt Page <yurtpage+weblate@gmail.com>
Co-authored-by: Zoran Jeremić <batajeremiccc@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: drpt <drupter@gmail.com>
Co-authored-by: josé m. <correoxm@disroot.org>
Co-authored-by: rimasx <riks_12@hot.ee>
Co-authored-by: samko5sam <sam930903@gmail.com>
Co-authored-by: عمار <amaromar88@gmail.com>
2026-03-22 11:24:23 +01:00
a6899a43b2 Reduce number of database queries (#8358)
### Description

Reduce number of database queries. Instead of loading queue and
favorites lists in separate queries, let sqlite do the join

### 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-22 10:57:38 +01:00
f246b6d38c Add predictive back for main activity exit (#8356)
### Description

`OpenDefaultPageBackPressedCallback` was always enabled (`super(true)`),
meaning it intercepted every back gesture including the final app-exit
one, preventing the system from running its predictive back animation on
Android 13+.

The fix: disable the callback when no custom back action applies, so the
system owns the final exit gesture entirely.

- **`updateMainBackCallbackEnabledState()`** — new method that enables
the callback iff any of these hold:
  - fragment back stack has entries (pop)
- current page ≠ default page and default page isn't
`DEFAULT_PAGE_REMEMBER` (navigate home)
- `backButtonOpensDrawer` is set, drawer is present, bottom nav is
absent, **and drawer is currently closed** (open drawer)
- **Constructor** changed from `super(true)` → `super(false)`; state is
computed on first navigation call
- **`FragmentManager.OnBackStackChangedListener`** registered in
`onCreate()` to update on back stack changes
- **`DrawerLayout.SimpleDrawerListener`** added in `onCreate()` to
update when drawer opens/closes
- **Call sites**: `loadFragment(Fragment)`, `loadChildFragment(Fragment,
TransitionEffect, String)`, `handleNavIntent()` each call
`updateMainBackCallbackEnabledState()` after applying navigation

The existing `finish()` fallback in `handleOnBackPressed()` is retained
as a safety net but should never be reached when the callback is
properly disabled at exit-ready state.

### 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

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

Implement predictive-back-friendly final-exit behavior in AntennaPod by
making MainActivity’s OpenDefaultPageBackPressedCallback conditionally
enabled.

Goal
- Ensure the *final* back gesture that closes the app is handled by the
system (predictive back animation) by having **no enabled
OnBackPressedCallback** at that point.
- Keep existing subtle back behavior intact for all other states
(fragment back stack popping, navigating to default page, opening
drawer, bottom sheet collapsing).
- No custom UI progress handling is required; rely on system animation.

Repository
- AntennaPod/AntennaPod (base branch: develop)

Current behavior
- MainActivity registers `openDefaultPageBackPressedCallback` in
`onStart()` and it is always enabled (constructor calls `super(true)`),
and its `handleOnBackPressed()` ends with `finish()`.
- Because the callback is always enabled, it intercepts back even when
the next back should simply exit, preventing the system-owned predictive
back animation for the exit gesture.

Desired behavior
- Keep `OpenDefaultPageBackPressedCallback` registered but enable it
only when pressing back would perform a custom action:
  1) Pop fragment back stack (back stack entry count > 0)
2) Navigate to default page (when last nav fragment != default page and
default page is not DEFAULT_PAGE_REMEMBER)
3) Open the drawer (when UserPreferences.backButtonOpensDrawer() is
true, drawer is present, bottomNavigation is null, and drawer is
currently closed)
- When none of the above conditions apply (i.e., exit-ready root state),
disable `openDefaultPageBackPressedCallback` so back exits via default
system behavior.

Implementation details
- Add a method on MainActivity, e.g.
`updateMainBackCallbackEnabledState()` (name is flexible but should be
clear and localized) that computes the conditions above and calls
`openDefaultPageBackPressedCallback.setEnabled(...)`.
- Add a method or inline logic to check whether the drawer is
open/closed (prefer using existing `isDrawerOpen()` if suitable;
otherwise use `drawerLayout.isDrawerOpen(navDrawer)` guard).
- Keep the existing `finish()` branch in `handleOnBackPressed()` as a
conservative fallback (should not be reached when callback disabled, but
avoids behavior regressions if an edge case fails to update the enabled
state).

Where to call update
- Ensure correct state immediately after navigation/intent handling:
- Call update at the end of `handleNavIntent()` (MainActivity) after all
navigation actions (loadFragment/loadChildFragment/open drawer/open
player etc.) have been applied.
- Ensure correct state when fragment back stack changes:
- Register
`getSupportFragmentManager().addOnBackStackChangedListener(...)` once
(in `onCreate()` after fragment manager is available) to call the update
method.
- Also call update after explicit navigation helpers if necessary for
correctness (keep minimal and avoid redundant calls unless needed):
  - After `loadFragment(String, Bundle)`
  - After `loadFeedFragmentById(...)`
  - After `loadFragment(Fragment)`
  - After `loadChildFragment(...)`
(It’s acceptable if some calls are redundant; correctness is more
important.)
- Optionally (recommended for correctness) add a DrawerListener to
update enabled state on drawer open/close; but keep changes small and
avoid behavior regressions.

Acceptance criteria
- When MainActivity is at root state where back should exit,
`openDefaultPageBackPressedCallback.isEnabled()` must be false.
- Back gesture from that state closes the activity via system default
(predictive back enabled on Android 13+ when supported), not via app
callback interception.
- In all other states, existing behavior remains unchanged:
  - back stack pops as before
  - navigating to default page works as before
  - opening drawer works as before
- bottom sheet back behavior continues to work (and remain independently
enabled/disabled)

Files likely involved
- app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java

Testing notes
- Manual test scenarios:
1) Launch app to default page with no back stack: back should exit with
system predictive back.
2) Navigate to a child fragment (back stack > 0): back pops back stack.
  3) Navigate to non-default tab/page: back returns to default page.
4) With drawer mode (bottom navigation disabled) and preference
backButtonOpensDrawer enabled: back opens drawer when closed; when
already at default/root and drawer closed, ensure callback is enabled;
once drawer is open, ensure back closes drawer via DrawerLayout default
or existing behavior without breaking.
5) Bottom sheet expanded: back collapses bottom sheet; then when at
root, next back exits.


The following is the prior conversation context from the user's chat
exploration (may be truncated):

User: Figure out how to support predictive back button handling for the
very last back button press that closes the app

Assistant: To support **predictive back** for the *very last back action
that closes the app*...

</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

*This pull request was created from Copilot chat.*
>

<!-- START COPILOT CODING AGENT TIPS -->
---

 Quickly spin up Copilot coding agent tasks from anywhere on your macOS
or Windows machine with [Raycast](https://gh.io/cca-raycast-docs).

---------

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-22 10:28:27 +01:00
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
0847435f5e Bump version to 3.11.1 2026-03-17 00:28:46 +01:00
7c27f12b79 Fix some NPEs reported through Google Play (#8349)
### Description

Fix some NPEs reported through Google Play

### 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-17 00:27:50 +01:00
b07b9d249b Fix "Too many inflation attempts" crash from SQLite lock contention (#8346)
### Description

Remove the explicit disableWriteAheadLogging() call in
PodDBAdapter.openDb(). Without WAL, SQLite allows only one connection at
a time, forcing all threads to serialize on a single lock. When multiple
UI fragments (ExternalPlayerFragment, CoverFragment,
ItemDescriptionFragment, PlaybackHistoryFragment) simultaneously query
the database on separate RxJava IO threads, the resulting lock
contention on the same monitor exhausts the ART monitor inflation limit,
causing a fatal crash (monitor.cc:1125).

Fixes #8338

### 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-17 00:13:40 +01:00
17a9bc1b47 Flush WAL and verify temp copy before database export (#8347)
### Description

We don't have WAL enabled right now, but before we can, we have to make
sure that imports/exports handle WAL properly by flushing the file
before exporting. Also, copy the file to a temporary location and fail
if it is invalid to ensure that what we are exporting is actually a
proper backup.

Contributes to #8338
Closes: #5099

### 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

<!-- START COPILOT CODING AGENT TIPS -->
---

📍 Connect Copilot coding agent with [Jira](https://gh.io/cca-jira-docs),
[Azure Boards](https://gh.io/cca-azure-boards-docs) or
[Linear](https://gh.io/cca-linear-docs) to delegate work to Copilot in
one click without leaving your project management tool.

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
Co-authored-by: pc-bert <88080348+pc-bert@users.noreply.github.com>
2026-03-16 23:29:28 +01:00
88ee76cfcf Move favorites to a dedicated screen (#8339)
### Description

Favorites were only reachable via a hidden filter on the Episodes
screen. This adds FavoritesFragment as a proper navigation destination,
mirrors the pattern of PlaybackHistoryFragment, and removes the
now-redundant star quick-filter button from the Episodes toolbar.

Closes #8253

### 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

<!-- START COPILOT CODING AGENT TIPS -->
---

📱 Kick off Copilot coding agent tasks wherever you are with [GitHub
Mobile](https://gh.io/cca-mobile-docs), available on iOS and Android.

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-15 16:07:44 +00:00
476ead8adc Add missing multi-select episode actions (#8340)
### Description

Multi-select episodes was missing four actions available in
single-select: add to favorites, remove from favorites,, share, and
reset playback position. Additionally, the two favorites actions must be
mutually exclusive in the speed dial — only one should appear depending
on the collective state of selected items.

### 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

<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/AntennaPod/AntennaPod/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-15 16:50:56 +01:00
2dbf28be0e Add agent instructions about PR updates (#8344)
### Description

More instructions for agent on how to handle PRs.

### 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-15 15:48:56 +00:00
1204ee7877 Add deprecation warning when disabling bottom navigation (#8341)
### Description

When users toggle off bottom navigation in settings, show a dialog
warning them that side navigation is deprecated and will be removed in a
future release.

- **`strings.xml`**: Added `bottom_navigation_deprecation_warning`
explaining: volunteer-maintained project, too much overhead to support
both nav styles, side nav incompatible with Android gesture navigation
(hence the default change), and advice to disable auto-updates if they
depend on it.
- **`UserInterfacePreferencesFragment`**: Intercepts the
`PREF_BOTTOM_NAVIGATION` toggle-off action to show a
`MaterialAlertDialogBuilder` confirmation dialog before applying the
change.

### 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

> [!WARNING]
>
> <details>
> <summary>Firewall rules blocked me from connecting to one or more
addresses (expand for details)</summary>
>
> #### I tried to connect to the following addresses, but was blocked by
firewall rules:
>
> - `checkstyle.org`
> - Triggering command:
`/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java
/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java
-jar
/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/xml/tools/xml-extractor.jar
--fileList=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/working/files-to-index16081311042563234079.list
--sourceArchiveDir=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/src
--outputDir=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/trap/java`
(dns block)
> - `www.puppycrawl.com`
> - Triggering command:
`/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java
/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/tools/linux64/java/bin/java
-jar
/opt/hostedtoolcache/CodeQL/2.24.3/x64/codeql/xml/tools/xml-extractor.jar
--fileList=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/working/files-to-index16081311042563234079.list
--sourceArchiveDir=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/src
--outputDir=/tmp/codeql-scratch-a65ebc7048e6a0db/dbs/java/trap/java`
(dns block)
>
> If you need me to access, download, or install something from one of
these locations, you can either:
>
> - Configure [Actions setup
steps](https://gh.io/copilot/actions-setup-steps) to set up my
environment, which run before the firewall is enabled
> - Add the appropriate URLs or hosts to the custom allowlist in this
repository's [Copilot coding agent
settings](https://github.com/AntennaPod/AntennaPod/settings/copilot/coding_agent)
(admins only)
>
> </details>

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 Send tasks to Copilot coding agent from
[Slack](https://gh.io/cca-slack-docs) and
[Teams](https://gh.io/cca-teams-docs) to turn conversations into code.
Copilot posts an update in your thread when it's finished.

---------

Co-authored-by: Hans-Peter Lehmann <ByteHamster@users.noreply.github.com>
2026-03-15 15:06:59 +00:00
00f99776b8 Require at least 10 non-whitespace chars in PR description (#8342)
### Description

Replace the fragile line-counting heuristic (anchored on
https://antennapod.org URLs, counting trailing lines) with a single
regex that captures text between `### Description` and `### Checklist`
and fails if that region is empty. This is robust to any content
GitHub/Copilot appends after the checklist (promo footers, "Original
prompt" sections, etc.).

### 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
- [ ] 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
- [ ] 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

<!-- START COPILOT CODING AGENT TIPS -->
---

📍 Connect Copilot coding agent with [Jira](https://gh.io/cca-jira-docs),
[Azure Boards](https://gh.io/cca-azure-boards-docs) or
[Linear](https://gh.io/cca-linear-docs) to delegate work to Copilot in
one click without leaving your project management tool.

---------

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-15 08:44:38 +01:00
535a0adaab Add Copilot coding agent setup file (#8336)
### Description

Add Copilot coding agent setup file and tweak PR conventions check for
agents.

### 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)
- [ ] If it is a core feature, I have added automated tests

<!-- START COPILOT CODING AGENT TIPS -->
---

🔒 GitHub Advanced Security automatically protects Copilot coding agent
pull requests. You can protect all pull requests by enabling Advanced
Security for your repositories. [Learn more about Advanced
Security.](https://gh.io/cca-advanced-security)

---------

Co-authored-by: ByteHamster <5811634+ByteHamster@users.noreply.github.com>
2026-03-14 09:15:08 +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