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