## Description
- Add indicator to mark the chosen version on the choose version dialog
- Add an option for album's context menu to add it to the now playing
queue
- Fix how season cards refresh on the series detail page so the images
don't glitch
### Related issues
Related to #1220
### Testing
Emulator mostly
## Screenshots
The indicator shows which version will play, whether explicitly chosen
by the user or implicitly picked by Wholphin.

## AI or LLM usage
None
## Description
Adds context menu options for "Remove from continue watching" and
"Remove series from next up"
### Remove from continue watching
This marks the item as unplayed so it will not be shown on the Continue
Watching row anymore. It may still show on a Next Up or combined row
though.
### Remove series from next up
This first does the same as "Remove from continue watching" above. But
it also stores the series' ID in your display preferences as removed.
Wholphin will filter out this series from appearing in the Next Up row
until you watch _any_ episode in the series in the future.
This only works for Wholphin clients!
There's a dialog to view which series have been removed and to re-add
them manually. Settings->Customize Home->Settings->View removed next up
### Related issues
Closes#906
### Testing
Mostly emulator testing
## Screenshots
## AI or LLM usage
None
## Description
Adds a tab for Studios (TV networks) to TV libraries. This displays a
grid of all of the studios. Clicking one displays the series produced by
the studio.
Additionally, adds a filter to the library tab to filter by studio. You
can select multiple studios, but its not the best UX since there will
likely be many studios (I have almost 200).
Finally, you can add a home row for studios in a library.
### Related issues
Closes#1002
### Testing
Mostly manual testing via emulator
## Screenshots
### Studios tab for a library

### Filter drop down for studios

### Updates series details
Shows the studio above the genres

## AI or LLM usage
None
## Description
Show the watched indicator and favorite icon on music videos on both the
artist or album detail pages.
### Related issues
Fixes#1206
### Testing
Quick emulator testing
## Screenshots
N/A, same indicators as the rest of the app
## AI or LLM usage
None
## Description
Instead of applying a code patch, this PR uses build time [product
flavors](https://developer.android.com/build/build-variants#product-flavors)
to define the existing default and an app store variant. This is more
robust than maintaining a patch file and making sure it is applied
before building.
The app store variant applies the same code changes (removing install
permission, requiring leanback, & setting `UpdateChecker.ACTIVE`), but
via manifest placeholders/merging and `BuildConfig` entries.
There are no user facing changes.
### Related issues
None
### Testing
Built the variants and verified manifest changes via aapt
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds a card at the end of the rows on the discover page/tab to view more
results. When clicking this card, it goes to a grid view of more results
starting focused on the next one.
### Dev notes
This PR modifies `ApiRequestPager` to move most of its functionality
into an abstract class, `RequestPager`. And then add a new concrete
class, `DiscoverRequestPager`, for Seerr API paging. `ApiRequestPager`
remains for Jellyfin paging.
### Related issues
Related to #1035
### Testing
Emulator
## Screenshots


## AI or LLM usage
None
<!-- By submitting this pull request, you acknowledge that you have read
the [contributing
guide](https://github.com/damontecres/Wholphin/blob/main/CONTRIBUTING.md,
including the AI/LLM policy, and [developer's
guide](https://github.com/damontecres/Wholphin/blob/main/DEVELOPMENT.md)
-->
## Description
<!-- Describe the changes in detail -->
Make alpha channel and background change in Banner Card more
recomposition friendly.
Split from #1152
### Related issues
<!-- If this is a new feature or a change, there must be a discussion in
an issue first, reference the issue here -->
<!-- If fixing a bug, reference the bug issue here, or describe the bug,
including steps to reproduce -->
### Testing
<!-- Describe how this change was tested and on what device(s) -->
Tested on a emulator
It's observed when moving from TV series episode card to EpisodeFooter
and back
## Screenshots
<!-- Please include screenshots if the PR alters any UI elements -->
| Pre | Post |
|--------|--------|
| <img width="395" height="152" alt="Screenshot 2026-04-02 at 08 41 40"
src="https://github.com/user-attachments/assets/b6554425-8af5-4e29-a866-3e4f6a7be473"
/> | <img width="406" height="296" alt="Screenshot 2026-04-02 at 08 44
56"
src="https://github.com/user-attachments/assets/511fc6df-c860-47eb-aec8-57c400dba83c"
/> |
## AI or LLM usage
<!-- If you used any AI or LLM assistance, please list where in the code
and how you tested it -->
Gemini in AS was used for repetitive code completion
## Description
Refactors the movie page & view model to use a `StateFlow` instead of
many `LiveData` objects. This is in keeping with best practices.
There are no user facing changes.
### Related issues
None
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
When Wholphin is updated, it will show a short toast message. This works
for both app store and side loaded installs.
You can now click on the "Installed version" in settings to fetch the
release notes for the current version.
### Related issues
Closes#1058
### Testing
Emulator
## Screenshots

## AI or LLM usage
None
## Description
Fixes the list of supported audio types when playing music.
This fixes allows for playback of audio formats like ALAC, PCM/WAV,
Vorbis, etc.
### Related issues
Fixes#1168
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
- Always show card overlays (ie Movie vs TV Show) for discover/Seerr
cards
- Show card overlays (ie favorite and watched status) for search result
cards
- Restore showing home page refresh indicator
### Related issues
Closes#1141
Closes
https://github.com/damontecres/Wholphin/issues/702#issuecomment-4114775539
### Testing
Emulator
## Screenshots
N/A, no new UIs, just adding existing ones
## AI or LLM usage
None
<!-- By submitting this pull request, you acknowledge that you have read
the [contributing
guide](https://github.com/damontecres/Wholphin/blob/main/CONTRIBUTING.md,
including the AI/LLM policy, and [developer's
guide](https://github.com/damontecres/Wholphin/blob/main/DEVELOPMENT.md)
-->
## Description
<!-- Describe the changes in detail -->
I've look at the app using Layout inspector to see if there are any
recompositions that shouldn't be happening while navigating normally in
the app. I've noticed two issues
1. Every BannerCard was being recomposed on every cursor move, which
added a lot of overhead to home screen navigation
2. Tab row in the Series View was being recomposed while navigating
across episodes in given season.
### Related issues
<!-- If this is a new feature or a change, there must be a discussion in
an issue first, reference the issue here -->
<!-- If fixing a bug, reference the bug issue here, or describe the bug,
including steps to reproduce -->
Performance on the home screen is lacking, especially on low end
devices, while this isn't a full fix, it will improve the navigation, as
the app will be making significantly less work.
Probably will fix https://github.com/damontecres/Wholphin/issues/1043
### Testing
<!-- Describe how this change was tested and on what device(s) -->
Using Layout Inspector built-in recomposition counter and highlights
it's easy to see components which recompose while they shouldn't. I've
tested it on a 4K TV emulator on my M1 Macbook Pro
## Screenshots
<!-- Please include screenshots if the PR alters any UI elements -->
main:
<img width="402" height="508" alt="image"
src="https://github.com/user-attachments/assets/6aaac6af-50d6-4f21-b465-e78bccf7e985"
/>
my branch:
<img width="401" height="563" alt="image"
src="https://github.com/user-attachments/assets/1034c0e2-9a40-4a05-8a07-f30b2e10301d"
/>
same navigation, on the same content. (down, right x4
## AI or LLM usage
<!-- If you used any AI or LLM assistance, please list where in the code
and how you tested it -->
Gemini built in to Android Studio helped me identify non-stable parts of
the code. It also helped me understand and implement fixes in the
HomePage code.
I've took the time to check manually that it didn't alter any behavior,
and verified the fixes using Layout Inspector and recomposition counter
## Description
Don't recursively query collections for the home page rows. This
prevents episodes within tv shows from being shown.
### Related issues
Fixes https://github.com/damontecres/Wholphin/issues/1148Fixes#1147
### Testing
Emulator & API
## Screenshots
N/A
## AI or LLM usage
None
## Description
A brain dump documenting many classes and functions throughout the app.
Definitely does not document everything, but covers most of the major
components. This should be useful for new contributors.
There is a small amount of code clean up too.
There are no user facing changes.
### Related issues
N/A
### Testing
N/A
## Screenshots
N/A
## AI or LLM usage
None
## Description
Ensure the new pause indicator from #1144 is the right color for all
devices.
### Related issues
Related to #1144
### Testing
Emulator & shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Instead of displaying the full playback overlay when pausing via a
button press, just show a short pause image in the center of the screen.
Any button press that will pause triggers this including a remote Pause,
Pause/Play, or one-click pause Enter.
I decided to make this the standard behavior instead of a toggle because
I think if the user intends to do something with the overlay (change
subtitles, audio, etc), it's still straightforward to open the overlay,
click the pause button (which is focused first), and then move to the
desired option versus assuming click-to-pause will open the overlay so
the user can move to the desired option.
### Related issues
Closes#990
### Testing
Emulator
## Screenshots
[pause_osd.webm](https://github.com/user-attachments/assets/8f908164-2a50-43f9-9e13-a463d2914e42)
## AI or LLM usage
None
## Description
Use localized date & time formatting such as using 24 hour clock or
Day-Month-Year date formatting. The localization is based on the
device's locale/language setting. Some pages require reloading if you
switch the locale while Wholphin is running.
Format bitrates using SI 1000 magnitudes instead of 1024. File size
still uses 1024 but formats with "MiB"/"GiB" suffixes now. This aligns
with the server web UI and is more in line with standard practices for
display as well.
Fixes the playback overlay layout being messed up by extremely long
episode names.
Finally, adds jumping by letter using keyboard letter keys on grids if
letter jumping is enabled. I doubt many users have a full keyboard
attached to their TV, but this saves me time using the emulator when I
need to repeatedly open the same item for testing.
### Related issues
Fixes#1132
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Updates the playback overlay so that individual component animate in
more deliberately.
For example, the logo & clock slide in from the top instead of the
middle of the screen. And the trick play preview now expands and shrinks
vertically.
### Related issues
I thought there was an issue about this, but I can't find it
### Testing
Emulator, nvidia shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds better error handling when loading home page rows. For example,
this fixes loading errors if a playlist row is configured, but the
playlist is deleted.
Also fixes an issue from #1116 where changing users doesn't go the home
page.
### Related issues
Related to #1124
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Simply fetches the tv show's seasons when returning the details page.
This ensures the unwatched counts are updated.
### Related issues
Mentioned as a bug in
https://github.com/damontecres/Wholphin/issues/767#issuecomment-4071852502
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
This fixes some issues restoring the app state after it is killed by the
system, such as to free up memory while the screensaver is showing.
### Dev notes
Reproduce:
1. Start playing media from beginning
2. Pause at 10 minute mark
3. Wait for screensaver to start
4. Press a button
5. Media starts from beginning
Note: It may take a few iterations of 2-4 before the OS destroys the
app.
If the app is killed during playback, ideally Wholphin restores state to
_previous_ page, not playback since restoring playback is complex.
Before this PR, the back stack was maintained by Compose's
`rememberSerializable` and would be restored _after_ the
`PlaybackLifecycleObserver` cleans up the playback destination.
This meant that the app would be restored, from scratch, to the playback
page. The `PlaybackViewModel` would be initialized from scratch as it
was originally called, ie play from beginning.
The fix is to save and restore the back stack outside of Compose.
### Related issues
Fixes#767
### Testing
Emulator & nvidia shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Several small tweaks:
- Always put screensaver logo on left instead of random
- Disable playback speed option if audio is being passed through
- When opening playback settings such as speed or scale, focus on the
current value instead of top of the list; doesn't apply to subtitles so
it's easy to toggle them off
- If the user has a preferred subtitle language, show tracks in that
language first/top
- Add toast message after creating or adding to a playlist
### Related issues
Playback speed audio pass through: #164
### Testing
Emulator & shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes debug install updates from trying to install the release APK and
use debug ones instead.
### Related issues
Fixes#1098
### Testing
Unit tests
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR makes changes to how images are fetched for discover/Seerr
items.
If the discovered item is available on the Jellyfin server, the images
will be fetched from the Jellyfin server.
Then if the Seerr server has image caching enabled, the images will be
fetched from the Seerr server. Otherwise, images are fetched from TMDB .
TMDB was the previous behavior for all images.
### Dev notes
This PR also updates the Seerr server URLs stored in the database, so
it's not backwards compatible.
### Related issues
Fixes#1079
### Testing
Emulator against Jellyseer 2.7.3 & Seerr 3.0.1
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR simplifies refreshing the episode data when returning to the
series overview page and reduces the number of queries.
Also fixes a race condition when refreshing a single item in the an
`ApiRequestPager`.
### Related issues
Related to #767
### Testing
Emulator, but will need more testing during actual usage
## Screenshots
N/A
## AI or LLM usage
None
## Description
During a slideshow of images, the viewpoint would resize to largest
image resolution and images with smaller dimensions would be scaled down
and centered with black bars.
This might be a Coil bug, but I'm not 100% sure yet. This PR works
around the issue by scaling all images to the display resolution instead
of using `Size.ORIGINAL`.
However, we want `Size.ORIGINAL` while zooming so it doesn't pixelate if
the original image's resolution is larger than the display's.
### Related issues
Fixes
https://github.com/damontecres/Wholphin/issues/835#issuecomment-4035005433
### Testing
Emulator with 1920x1080 & 800x1600 images
## Screenshots
N/A
## AI or LLM usage
None
<!-- By submitting this pull request, you acknowledge that you have read
the [contributing
guide](https://github.com/damontecres/Wholphin/blob/main/CONTRIBUTING.md,
including the AI/LLM policy, and [developer's
guide](https://github.com/damontecres/Wholphin/blob/main/DEVELOPMENT.md)
-->
## Description
The formatter for audio codecs did only match the profile of high
definition DTS streams against "DTS:HD" or "DTS:X". At least for DTS:HD
there are also cases where the profile contains "DTS-HD" with "-"
instead of ":".
Made the matcher more generic by allowing both "-"" or ":"" and also
checking if the profile contains "MA" for Master Audio tracks.
This will now correctly display the following high definition DTS types
in the UI:
- DTS:HD
- DTS:HD MA
- DTS:X
**Note:** This is my first public pull request ever, let me know if I
did it wrong :)
### Related issues
Relates to (but does not fix):
https://github.com/damontecres/Wholphin/issues/1057
### Testing
Tested on a Fire TV Cube Gen 3 with multiple files containing DTS HD
audio tracks.
---------
Co-authored-by: Damontecres <damontecres@gmail.com>
## Description
Fixes a race condition saving preferences. It would be triggered if you
have "Remember selected tabs" enabled and either: 1) changed settings
while on a library grid page or 2) changed settings on a page navigated
_from_ a library grid page and then returned to the grid
### Related issues
I think this will fix#1075
### Testing
Emulator following the steps above
## Screenshots
N/A
## AI or LLM usage
None
## Description
A few fixes
- Better crossfade for photo slideshow
- Fix "Go to" in context menu for photos
- Fix certain home video/photo libraries not working for photos
- Fix removing seerr server in some cases
### Related issues
Closes#835Fixes#1069
Addresses
https://github.com/damontecres/Wholphin/issues/634#issuecomment-4018580518
### Testing
Emulator mostly
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds a dialog to select individual seasons for a TV show when requesting
it via Discover/Jellyseerr
If a request is already pending, it can be updated. If there's more than
7 seasons, a second submit button is added at the bottom of the dialog
for easier access.
Also, adds a button from Jellyfin series details to its Discover
equivalent and added a request button for partially available series to
request more seasons.
### Related issues
Closes#961
### Testing
Emulator & Jellyseerr 2.7.3
## Screenshots

## AI or LLM usage
None
## Description
Fix a screensaver crash after the last item
Also adds some extra error checking
### Related issues
Fixes#1053
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
Unfortunately, there seem to be issues with switching to
`libass-android`, so reverting those changes so I can cut a release and
troubleshoot later.
Reverts damontecres/Wholphin#569
## Description
Fixes a few issues with the in-app & OS screensavers
- Make sure clock is updating for in-app screensaver
- Fix crash if app is force quit before the OS screensaver starts
### Related issues
Fixes#1045
### Testing
NVIDIA shield
## Screenshots
N/A
## AI or LLM usage
None
## Description
Add better ASS/SSA support to ExoPlayer by using
[`libass-android`](https://github.com/peerless2012/libass-android).
This is enabled with the "Use libass for ASS subtitles" advanced
settings for ExoPlayer. It is enabled by default.
### Related issues
Related to #22
## Description
This PR improves the logic used to choose a display mode when refresh
rate and resolution switching are enabled.
As before, matching the refresh rate is prioritized over picking the
resolution. For example, with the display modes of 1080@30 & 720@60 for
a 720@30 video, 1080@30 is used because the frame rate exactly matches.
### Related issues
Fixes#1036
### Testing
Unit tests, added test cases for more situations
## Screenshots
N/A
## AI or LLM usage
None
## Description
A follow up to #1014 to add the delete option in more context menus.
Also improves the "reaction" logic which updates previous pages from
deletions on later pages.
### Related issues
Addresses
https://github.com/damontecres/Wholphin/pull/1014#issuecomment-3987205355
Related to #104
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes some issues with Jellyseerr login. Also makes error message more
clear by showing the URLs that were tested and the error that occurred.
Also fixes an issue where you could not remove a Jellyseerr server if it
was previously configured but can no longer connect.
### Related issues
Fixes#1028
Should fix#1022
Related to #747
### Testing
Emulator, tested adding and removing valid & invalid IPs
## Screenshots
N/A
## AI or LLM usage
None
## Description
Fixes several small issues throughout the app
- Adds 1440p as a resolution option
- Removes the delay when d-pad seeking on the seek bar & reduces it
slightly when controls are hidden
- Fixes padding one home customize pages
- Adds a title to the search for dialog
### Related issues
Fixes#1017
### Testing
Emulator mostly
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR is mostly a proof-of-concept for setting up automated UI
testing. The tests use Roboelectric so they can run without an emulator.
There is also a sample instrumented test for running on emulators or
devices for future tests.
It adds two basic automated UI tests for adding a server. These are sort
integration tests because they use the actual implementations for the
view model and services like `ServerRepository` and `JellyfinServerDao`.
Also, moves the bulk of `MainActivity`'s compose code into a function
for future tests.
### Related issues
N/A
### Testing
Local testing
## Screenshots
N/A
## AI or LLM usage
None
## Description
Adds a setting to enable "Media management" which adds a context menu
item to delete media. This is accessible using either the More button or
long clicking.
You can delete episodes, seasons, series and movies/videos.
If order for the option to appear the current user must have server-side
settings for "Allow media deletion from" enabled for the library and the
in-app setting under Settings->Advanced Settings->"Show media management
options".
### Related issues
Closes#104
### Testing
Emulator
## Screenshots
### Context menu

### Confirmation

## AI or LLM usage
None
## Description
- Aims to further optimize performance for the suggestions fetching
### Related issues
Fixes#833
### Testing
Android Emulator
NVIDIA Shield Pro 2019
## Screenshots
N/A
## AI or LLM usage
AI being used to assist with updating/creating unit tests
## Description
- Adds hold-to-seek acceleration for left/right DPAD input during
playback skip handling.
- Reuses one shared, duration-aware acceleration profile for both
playback DPAD and seekbar skipping.
- Extracts acceleration logic into a shared helper to keep playback and
seekbar behavior consistent.
- Slows the acceleration ramp (about one-third) to improve control
during longer holds.
- Preserves tap-on-release behavior: single taps seek on key release,
while holds seek on repeated key-down without an extra release step.
- Normalizes unknown/unset duration values to use the shortest-content
acceleration profile.
- Added unit coverage for shared seek acceleration math to prevent
accidental regression in ramp thresholds.
### Related issues
Supersedes #846
Incorporates #784Closes#522
### Testing
Tested on Nvidia Shield Pro 2019.
- Quick left/right tap still performs normal skip behavior.
- Holding left/right seeks repeatedly with progressive acceleration.
- Seekbar hold uses the same acceleration profile as playback hold.
- Releasing after a hold does not trigger an extra seek step.
## AI or LLM usage
Codex 5.3 and Claude Opus 4.6 were used for implementation, debugging,
and cross-review. Changes were manually validated on device.
---------
Co-authored-by: Ray <154766448+damontecres@users.noreply.github.com>
## Description
Changes the animation for showing/hiding the header title/buttons on
grid pages.
This eliminates the awkward jump the grid does to fill the screen.
Instead it smoothly resizes.
### Related issues
Fixes the second item in #221
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
- Restores corner text for episode cards
- Always show end time on playback overlay instead of it being
controlled by the "Show Clock" setting
- Better logic to determine person's role in media
### Related issues
Fixes#1010Fixes#1004Fixes#975
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
- Catch network exceptions when querying to populate the nav drawer
- Perform screensaver work on IO thread
- Fix possible crash if screensaver service runs while regular activity
is destroyed
- Fix genre images & backdrop images not loading
This PR also adds an Jellyfin SDK `ApiClient` wrapper to push all
network calls onto the IO thread. And tries to use a more strict
network-on-main policy for debug builds.
### Related issues
Fixes#994Fixes#1001
Should fix#1003
### Testing
Emulator with simulated exception throws
## Screenshots
N/A
## AI or LLM usage
None