### Description
Move store metadata out of source tree. Running Triple-T publisher
always complains about our custom folders (screenshot creator script).
Move everything out of the actual Triple-T metadata folder and symlink
only the necessary ones instead.
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Possible fixes for some crashes 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
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Don't swallow PlayerStatusEvent if media changed. We only checked the
status, but if we directly started a new episode without going through
pause/play, we skipped sending the PlayerStatusEvent incorrectly.
Closes#8548Closes#8516Closes#8530
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix undo snackbar showing placeholders
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix crash when speed dialog gets closed while handler is running. This
seems super hard to trigger, but apparently some of our beta testers
managed to do it.
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix notification buttons: Fix sleep timer button not getting displayed
and chapter button not seeing any chapters.
Closes#8473
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Reduce padding of currently playing item background
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix pressing cover to start playing in new playback service
Closes#8492
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix chapter buttons in new playback service. They still tried to use the
old service controls.
Closes#8483
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix clicking position links in shownotes with 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`
- [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
### Description
Fix two issues with deleting episodes from local folder subscriptions:
1. **#8425**: The Delete action button was missing from the
single-episode detail screen for local folder items. In
`ItemFragment.java`, `actionButton2` was only set to
`DeleteActionButton` when `media.isDownloaded()` — but local feed media
is never "downloaded" in the traditional sense, so the button was never
shown. Added `item.getFeed().isLocalFeed()` to the condition.
2. **#8424**: The multi-select Delete action silently did nothing for
local folder items. The `performMultiSelectAction` method runs on a
`Schedulers.computation()` background thread, but
`LocalDeleteModal.showLocalFeedDeleteWarningIfNecessary` needs to show a
dialog on the main thread. Wrapped the call in
`activity.runOnUiThread()` in `EpisodeMultiSelectActionHandler` so the
confirmation dialog is shown (or deletion proceeds directly for
non-local items).
Both fixes ensure the local-folder delete warning dialog is still shown
when appropriate.
Closes: #8424Closes: #8425
### 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
- [ ] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [ ] 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>
Co-authored-by: ByteHamster <info@bytehamster.com>
### Description
Fix dismissing miniplayer on media3 service. To make this super nice, we
would need resumption support at runtime, but media3 does not support
that: https://github.com/androidx/media/issues/770Closes#8446
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Fix trying to load local files over http.
Closes#8449
```
E java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but was 'content'
at okhttp3.HttpUrl$Builder.parse$okhttp(HttpUrl.kt:1254)
at okhttp3.HttpUrl$Companion.get(HttpUrl.kt:1634)
at okhttp3.Request$Builder.url(Request.kt:184)
at de.danoeh.antennapod.ui.episodeslist.MediaSizeLoader.lambda$getFeedMediaSizeObservable$0(MediaSizeLoader.java:46)
at de.danoeh.antennapod.ui.episodeslist.MediaSizeLoader$$ExternalSyntheticLambda0.subscribe(D8$$SyntheticClass:0)
at io.reactivex.rxjava3.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:40)
at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
at java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:348)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1154)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:652)
at java.lang.Thread.run(Thread.java:1564)
```
### Checklist
<!--
To help us keep the issue tracker clean and work as efficient as
possible,
please make sure that you have done all of the following.
You can tick the boxes below by placing an x inside the brackets like
this: [x]
-->
- [x] I have read the contribution guidelines:
https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request
- [x] I have performed a self-review of my code, going through my
changes line by line and carefully considering why this line change is
necessary
- [x] I have run the automated code checks using `./gradlew checkstyle
lint`
- [x] My code follows the style guidelines of the AntennaPod project:
https://antennapod.org/contribute/develop/app/code-style
- [x] I have mentioned the corresponding issue and the relevant keyword
(e.g., "Closes: #xy") in the description (see
https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
- [x] If it is a core feature, I have added automated tests
### Description
Remove 'pause on focus loss' setting. The setting is non-functional with
the new playback service, which always pauses (and never ducks) when on
media type speech. This aligns with the Android system defaults and
media3 behavior.
Closes#8390
### 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
### 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
### 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
### 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
### 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
### 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
### 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).
### 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
### 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.
### 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
### 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
### 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
### 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
### 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
### 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>
### 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>
### 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
### 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>
### 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>
### Description
JitPack was down a couple of times recently. We can easily switch the
last remaining dependencies to mvn central.
### 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
### Description
Remove fyydlin and connect directly. JitPack is not reliable. Because
the fyydlin library is so simple, we don't really need it and can just
connect directly to fyyd. This makes it possible to remove one library
hosted on JitPack. Also taking the chance to make `PodcastSearchResult`
independent from actual providers, so it becomes more of an
interface/model class.
### 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