Commit graph

423 commits

Author SHA1 Message Date
Damontecres
5571654a22
Show overlay for extra items (#1320)
## Description
Shows the overlay (watched, progress bar) for extras appearing as single
items. Grouped extras individually show the overlay when clicking into.
If all of the grouped are played, the group is show with the watched
indicator.

Also very slightly optimizations the UI by offloading the
title/subtitle/imageUrl to object creation time instead of when they're
shown on screen.

### Related issues
Closes #1311

### Testing
Shield testing with different extras

## Screenshots
N/A

## AI or LLM usage
None
2026-04-26 17:52:57 -04:00
Damontecres
8cf99900e5
Fix index error on home page refresh with empty rows (#1318)
## Description
Fixes an bug caused when the home page has an empty row before the last
row and there are non-empty rows later, an `IndexOutOfBoundsException`
would be thrown.

Also removes the loading indicator if an unknown error occurs during a
refresh.

### Related issues
Fixes #1314

### Testing
Emulator & shield

## Screenshots
N/A

## AI or LLM usage
None
2026-04-26 16:09:19 -04:00
Damontecres
edb37f5d69
Add support for cinema mode (#1305)
## Description
Adds support for cinema mode, which is enabled by default.

When enabled and if starting playback from the beginning, the server is
queried for any "intros", ie prerolls or trailers, to play first. These
are shown in the queue and can be skipped if desired.

The server has to provide the intros, so a plugin like
https://github.com/jellyfin/jellyfin-plugin-intros or
https://github.com/CherryFloors/jellyfin-plugin-cinemamode is required
server-side.

### Related issues
Closes #418
Closes #1180

### Testing
Emulator and server w/
https://github.com/CherryFloors/jellyfin-plugin-cinemamode

## Screenshots
N/A

## AI or LLM usage
None
2026-04-26 10:16:26 -04:00
Damontecres
3f0613f5f4
Fix play/shuffle buttons on music library tabs (#1307)
## Description
Fixes the play & shuffle buttons on music library tabs.

They previously attempted to play the audio via the video playback
method. This PR adds the ability to override the buttons and does so for
music libraries.

### Related issues
Fixes #1304

### Testing
Emulator, compared results against the web UI

## Screenshots
N/A

## AI or LLM usage
None
2026-04-25 10:35:12 -04:00
Damontecres
50174db22e
Updates to the playback debug overlay (#1290)
## Description
Lots of minor changes to the debug overlay

- Adjusts the size and layout 
- Smaller font size
- Only shows selected tracks by default
- Expanding tracks are scrollable and don't cover controls
- Show (estimated) network bitrate
- Show heap memory usage
- Better controls/chapters/queue animations
- Minor optimizations

Dev note: There's lots of code reorganization too

### Related issues
Related to #1216
Related to https://github.com/damontecres/Wholphin/issues/528

### Testing
Emulator & nvidia shield

## Screenshots
### Selected tracks
<img width="1280" height="720" alt="overlay1 Large"
src="https://github.com/user-attachments/assets/e6ef71f5-73ef-4947-8b2a-0f41f64ef019"
/>

### Expanded tracks, scrolled down
<img width="1280" height="720" alt="overlay2 Large"
src="https://github.com/user-attachments/assets/2e655f7e-7331-42dd-a572-0173b06563a8"
/>

### Transcode info
<img width="1280" height="720" alt="overlay3 Large"
src="https://github.com/user-attachments/assets/3081e2ec-bb9e-422c-b833-c22785c649bf"
/>

## AI or LLM usage
None
2026-04-24 15:51:43 -04:00
Damontecres
8dd396b777
Move skip segments settings to their own page (#1306)
## Description
Moves the five skip segment settings to their own page. So there's now a
single "Skip behavior" that you click to bring up the settings for the
five. I doubt many people change these frequently, so moving them to a
new page de-clutters the settings page.

### Related issues
N/A

### Testing
Emulator

## Screenshots

### Advanced settings
<img width="1280" height="720" alt="single_setting Large"
src="https://github.com/user-attachments/assets/673555d5-109c-4c43-9073-f51572bb949d"
/>

### Skip segment specific settings
<img width="1280" height="720" alt="skip_settings Large"
src="https://github.com/user-attachments/assets/dae9d0bd-7340-4731-b561-b7b4e74d9d4f"
/>

## AI or LLM usage
None
2026-04-24 14:50:23 -04:00
Damontecres
ab5c884072
External player follow up fixes (#1294)
## Description
Fixes some issues when using an external player:
- Send playback started before launching so the last played date is
updated
- Only use VLC's position if >0 since it returns 0 when playback
completes

### Related issues
Follow up to #1256 

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-04-23 15:08:25 -04:00
Damontecres
0e37084a16
Fix always listing next up/continue watching rows first (#1288)
## Description
Previously the home page always tried to load the "watching rows" (Next
up, Continue watching, or combined) first. This meant that even if the
user's customized home page did not put these rows at the top, they
would always be listed first anyway.

This PR fixes this so rows on the home page are always listed in the
right order.

### Related issues
Fixes #1275

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-04-22 13:34:43 -04:00
Damontecres
c9cab7a5c2
Show season extras row on series overview (#1286)
## Description
Adds a row for season level extras on the series overview page below the
people rows. The extras will update when switching between season tabs.

Like elsewhere in the app, an single extra of a type is show inline and
multiple extras of the same type open a grid when clicked.

### Related issues
Closes #504

### Testing
Emulator

## Screenshots
<img width="1280" height="720" alt="season_extras Large"
src="https://github.com/user-attachments/assets/bc62bef4-66c8-4412-9eca-ec0105d0d0fa"
/>


## AI or LLM usage
None
2026-04-21 17:34:38 -04:00
Ray
d373b32da5
Fix crash when OS screensaver started before opening Wholphin (#1285)
## Description
If the Wholphin OS screensaver starts before Wholphin (the app) is
opened, a default image loader is used. Then when Wholphin is opened, it
will crash when trying to set the app's image loader.

This PR adds configuring the image loader to the screensaver as well. It
is safe to do this multiple times. It's only an error to try to replace
the default image loader.

### Related issues
None

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-04-20 17:41:24 -04:00
Ray
36b7390c4e
Fix crash when screensaver networks errors out (#1279)
## Description
Fixes a crash if there is a network error when starting the screensaver.

Instead, a black screen with an error message shows. The error message
fades in/out to different parts of the screen. This applies to both
in-app and OS screensavers.

### Related issues
Fixes #1247

### Testing
Emulator w/ simulated errors

## Screenshots
N/A

## AI or LLM usage
None
2026-04-20 17:30:56 -04:00
Ray
61afe6ba86
Port two changes to ExoPlayer device profile from the official app (#1263)
## Description
Ports two changes in the official jellyfin android TV app here:
- https://github.com/jellyfin/jellyfin-androidtv/pull/5240
- https://github.com/jellyfin/jellyfin-androidtv/pull/5186

The code changes are copied under GPL-2.0 from the above pull requests.

### Related issues
Closes #1260

### Testing
Emulator mostly

## Screenshots
N/A

## AI or LLM usage
None

---------

Co-authored-by: Niels van Velzen <git@ndat.nl>
Co-authored-by: clams4shoes <prestidgeandrew@gmail.com>
2026-04-19 15:20:46 -04:00
Ray
08836e3c5d
Update ExoPlayer with better audio configuration (#1258)
## Description
Makes some changes when building ExoPlayer to help improve pass through
audio.

The major changes are enabled constant bitrate seeking and audio
offloading.

Documentation is thin on these features, but [this blog
post](https://www.qualcomm.com/developer/blog/2023/08/audio-offload-support-exoplayer)
while focused on ExoPlayer2 and power usage, does explain a bit about
audio offloading.

Small section on constant bitrate seeking:
https://developer.android.com/media/media3/exoplayer/customization#enabling-constant-bitrate-seeking

### Related issues
N/A

### Testing
Emulator, nvidia shield w/ AVR to check pass through

## Screenshots
N/A

## AI or LLM usage
None
2026-04-19 15:10:15 -04:00
Ray
790069d818
Add support for external player playback (#1256)
## Description
Adds a new playback "backend" to play media in another app such as VLC.

By default, Wholphin will use the system default app. Typically if you
haven't chosen one, a dialog will show to pick which app. You can also
set a specific external app to use in Wholphin independent of the system
default.

Currently, this only support single item playback, ie playing next up
episodes is not supported yet.

Also since there is no standardized way to send resume position,
external subtitle info, etc, Wholphin makes a best effort. VLC,
mpv-android, & MX-Player are specifically tested/supported.

### Related issues
Closes #85

### Testing
Emulator & nvidia shield w/ VLC, mpv-android, & MX-player

## Screenshots
<img width="543" height="407" alt="image"
src="https://github.com/user-attachments/assets/ab37d41e-2909-40ed-b537-191ebb54d979"
/>

## AI or LLM usage
None
2026-04-19 14:41:54 -04:00
dudecuda
5050b087e1
Fix trickplay image grid Y-coordinate calculation (#943) (#1259)
## Description
Issue 943 where trickplay images were misaligned with seek preview
mages. I made a post in issues but figured i'd go ahead and make the
pull request.

per gemini:
In SeekPreviewImage.kt, the code calculates which tile in the grid to
display based on the current timestamp:

val x = (tileIndex % trickPlayInfo.tileWidth) // x position within tile
grid
val y = (tileIndex / trickPlayInfo.tileHeight) // y position <-- BUG IS
HERE
To find the correct row (y) in a grid, you are supposed to divide the
current index by the width of the row (the number of columns), not the
height.

Why this breaks: Let's assume a standard trickplay grid that is 10
images wide (tileWidth = 10) and 5 images tall (tileHeight = 5).

If you are looking at the 12th image (tileIndex = 11), it should be on
Row 1 (the second row).

The code calculates y = 11 / 5 = 2. It skips to Row 2!

Because it divides by the smaller height value, the y coordinate
increases much faster than it should. This causes the preview to
visually "jump" down to future rows prematurely, and then snap back as
the x coordinate resets, causing the exact "flashing back and forth" you
saw with the credits and intros.

### Related issue
Fixes #943

### Testing
Tested in Android TV (Android 9) and it does indeed display proper seek
previews using trickplay images.


## AI or LLM usage
Gemini Pro was used to find and fix this bug.
2026-04-18 17:07:18 -04:00
Ray
b3d630f272
Add option to never show next up episodes (#1257)
## Description
Adds an option to never show next up. This means when an episode
completes, the app always returns to the previous page instead of
suggesting the next episode.

### Related issues
Closes #1100

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-04-16 17:28:02 -04:00
Ray
b5422fe82b
Show last played date on overview dialog (#1248)
## Description
Adds a line to the overview/media info dialog with the date when the
item was last played.

### Related issues
N/A

### Testing
Emulator

## Screenshots
<img width="1280" height="720" alt="last_played Large"
src="https://github.com/user-attachments/assets/1c38141d-1000-43d0-bf28-a0845edfacc2"
/>

## AI or LLM usage
None
2026-04-16 00:26:57 -04:00
Ray
b18416c954
Integrate with libass-android to support SSA/ASS subtitles in ExoPlayer (#1052)
## 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
Replaces reverted #569
Fixes #1107
2026-04-15 17:50:34 -04:00
Ray
95859be3c6
Add a small glow effect to the segment skip button (#1228)
## Description
Adds a small glow to the border of the segment skip buttons, ie "Skip
Intro", etc. Since this button appears as focused immediately, there's
no contrast and it can be missed sometimes. So this glowing border draws
the eye a bit better.

Also a small change to reduce the minimum skip forward amount to 5
seconds .

### Related issues
Skip forward: #1203

### Testing
Emulator. But this needs some "real world" testing on a TV, too, so this
may need tweaking

## Screenshots


https://github.com/user-attachments/assets/5488d468-aee4-4448-a823-6326ccb003da

## AI or LLM usage
None
2026-04-15 17:49:54 -04:00
Ray
287a7b0c69
Create FireTV specific app variant (#1230)
## Description
Adds a variant of Wholphin targeted for the Amazon Fire TV App store.

### Related issues
See #1192 for more details

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-04-11 19:30:23 -04:00
Ray
97e10f57ca
Few UI improvments & fixes (#1229)
## 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.
![choose_version_indicator
Large](https://github.com/user-attachments/assets/7440ee1a-b9eb-4b34-ac39-86206c2eca09)

## AI or LLM usage
None
2026-04-10 14:56:43 -04:00
Ray
4eabaa9a52
Add option to remove item from Continue Watching and Next Up rows (#1140)
## 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
2026-04-07 16:04:21 -04:00
Ray
ade564d907
Add studio tab & filtering to TV show libraries (#1211)
## 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
![studios_grid
Large](https://github.com/user-attachments/assets/d51e6d20-3768-4bd5-8a09-45cd491064b2)
### Filter drop down for studios
![filter_by_studios
Large](https://github.com/user-attachments/assets/7dbd4c13-4194-4674-b272-d42257368ce2)
### Updates series details
Shows the studio above the genres
![series_details_studio
Large](https://github.com/user-attachments/assets/745caa9b-838c-4e8b-b0f8-69d5f316287a)


## AI or LLM usage
None
2026-04-07 16:03:58 -04:00
Ray
edaf06afd0
Show music video watch status on artist & album pages (#1209)
## 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
2026-04-06 18:17:04 -04:00
Ray
31465051ff
Dev: use build product flavors for app store release (#1205)
## 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
2026-04-06 15:24:20 -04:00
Ray
9a3af225a4
View more discover results (#1198)
## 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

![discover_view_more
Large](https://github.com/user-attachments/assets/180aa7a5-45c3-4544-b3f8-e3d394859178)
![discover_grid
Large](https://github.com/user-attachments/assets/ae5e8fbf-0fa4-4a2e-96ac-629ae688c05d)

## AI or LLM usage
None
2026-04-06 13:18:55 -04:00
Leon Omelan
1366ee744d
perfomance: Reduce recompositions in SeriesOverviewContent when navigating (#1185)
<!-- 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
2026-04-06 11:23:54 -04:00
Leon Omelan
5ab4bb712b
performance: reduce recompositons in PersonCard and SeasonCard (#1184)
<!-- 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 -->
related docs:
https://developer.android.com/develop/ui/compose/performance/bestpractices#defer-reads
Removed setting padding with animated value, instead moved to lambda
offset and layout modifiers to increase performance and reduce
recompositions when focusing those cards

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 emulato
## Screenshots
<!-- Please include screenshots if the PR alters any UI elements -->
|Component | Pre | Post |
|---|--------|--------|
|Person Card|<img width="404" height="366" alt="Screenshot 2026-04-02 at
08 19 18"
src="https://github.com/user-attachments/assets/73b38c75-040b-401e-88d6-4bfc9ffc0cc9"
/> | <img width="407" height="346" alt="Screenshot 2026-04-02 at 08 22
06"
src="https://github.com/user-attachments/assets/add473f7-dea6-4e33-97b8-6954149a81e2"
/> |
|Season Card| <img width="404" height="341" alt="Screenshot 2026-04-02
at 08 18 31"
src="https://github.com/user-attachments/assets/eec594ee-6701-4f99-8fb3-339ed8559ec4"
/> |<img width="408" height="299" alt="Screenshot 2026-04-02 at 08 24
06"
src="https://github.com/user-attachments/assets/8de445a6-dcb8-4c7e-a5f6-a25bf822c822"
/> |



## 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
2026-04-06 10:11:01 -04:00
Ray
44d1ac484f
Refactor movie page to use use state flow (#1183)
## 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
2026-04-03 12:44:59 -04:00
Ray
feb8c31791
Show toast & add option to fetch release notes when app updates (#1182)
## 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
![release_notes
Large](https://github.com/user-attachments/assets/2c03eb74-abb2-4b45-8d6f-01e8ef72116c)

## AI or LLM usage
None
2026-04-03 12:44:39 -04:00
Ray
46beee00bb
Fix supported audio types (#1173)
## 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
2026-04-01 01:05:24 -04:00
Ray
7ccef6f802
Fix card overlays showing, fix home page refresh indicator (#1178)
## 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
2026-03-31 23:45:00 -04:00
Leon Omelan
762a5e6dcc
Optimize recompositions on focus change (#1138)
<!-- 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
2026-03-31 18:39:02 -04:00
Ray
1334bb3f03
Don't recursively query collections on home page (#1160)
## 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/1148
Fixes #1147

### Testing
Emulator & API

## Screenshots
N/A

## AI or LLM usage
None
2026-03-30 14:11:25 -04:00
Ray
66f060dccb
Add a lot of code documentation (#1145)
## 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
2026-03-29 10:52:25 -04:00
Ray
2485d2c644
Add prefer logos instead of text titles setting (#1151)
## Description
Adds an advanced settings to prefer logos for titles instead of text. It
is enabled by default.

### Related issues
Closes #383

### Testing
Emulator & onn

## Screenshots
<details><summary>Click to show</summary>
<p>

### Home page
![logo_1
Large](https://github.com/user-attachments/assets/629a65ab-cf43-4050-af4c-5925763a5f4f)

### Series overview
![logo_2
Large](https://github.com/user-attachments/assets/13ca2d28-cc61-4f4e-abaa-61a310b5c707)

### Movie Page
![logo_movie
Large](https://github.com/user-attachments/assets/a590e6cf-452d-4313-b6a3-35c6f59dc1ff)

### Square-ish logo
![logo_square
Large](https://github.com/user-attachments/assets/7d1340c2-4a3e-42c3-b7bd-ae1114cb6645)

</p>
</details> 


## AI or LLM usage
None
2026-03-29 10:38:23 -04:00
Ray
bd21c2c46e
Fix pause indicator color on some devices (#1150)
## 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
2026-03-28 13:13:28 -04:00
Ray
c35b5cdd0a
Better collection pages including more view options (#1137)
## Description
This is a large update to the collection page!

- Show the collection's details including overview & backdrop
- Separate collection by type (Movies, TV, etc) into rows
- View options are now shared across all collections
- Filter & sort are still saved per collection

By default, the collection will be separated by type, but there is a
view option to restore the combined grid.

### Related issues
Closes #527 
Closes #1088
Fixes
https://github.com/damontecres/Wholphin/issues/877#issuecomment-3889013124
Related to #737

### Testing
Emulator mostly

## Screenshots
![collection_page
Large](https://github.com/user-attachments/assets/2b9a8740-5610-491a-b139-018dabd5f2f1)

### Separated types into rows
![collection_rows
Large](https://github.com/user-attachments/assets/34556f64-6089-4d65-b243-6df01bae5423)

### Combined type into grid
![collection_grid
Large](https://github.com/user-attachments/assets/feea14ef-2b7a-4c09-bba7-d146ec92eb83)

## AI or LLM usage
None
2026-03-28 10:31:03 -04:00
Ray
c92de3c33e
Fix some UI preference changes not being reflected immediately (#1146) 2026-03-25 21:55:00 -04:00
Ray
2d863e9c32
Don't show full playback overlay when pausing (#1144)
## 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
2026-03-25 13:59:48 -04:00
Ray
8f9b9813b7
Better date, time, & bitrate formatting, other small UI improvements (#1139)
## 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
2026-03-24 17:48:48 -04:00
Ray
f2570d4ab0
Add support for music (#1059)
## Description
Adds support for music playback

### Features
- Adds a "Now Playing" page which is accessible from the nav drawer
while music is playing
- Manage the playback queue, add/remove/re-order songs
- Supports synced & non-synced lyrics
- Scroll through lyrics
- Click on line for synced lyrics to seek to that position

### User interface
- Customize what's shown on the "Now Playing" page
- Show album cover art, backdrops, and lyrics
- Show a basic bar visualizer
- Search for albums, artists, & songs
- Links between albums, artists, playlists, & music videos when metadata
is available
- Throughout the app, see which song is playing and which ones are in
the queue

Note: lyrics are synced by line. `10.11` added support for syncing by
word, but Wholphin still supports `10.10`

### Related issues
Closes #2 
Closes #267 

### Testing
Emulator & shield testing

## Screenshots
<details><summary>Click to see screenshots</summary>
<p>

### Album grid
![music_album_grid
Large](https://github.com/user-attachments/assets/4573ad32-0cd7-49db-94db-de37ceb6f641)

### Artist page
![music_artist
Large](https://github.com/user-attachments/assets/fdf3b7b9-5c40-434d-867d-7d56e0b3430e)

### Album details
![music_album_details
Large](https://github.com/user-attachments/assets/494d1a76-9581-4a07-a8ee-5c0957f542e0)

### Album is playing/queued
![music_album_queued
Large](https://github.com/user-attachments/assets/55c72cd2-10a9-411d-8bae-b232150db506)

### Now playing page
![now_playing
Large](https://github.com/user-attachments/assets/b773b1bc-71fd-4789-8509-cebfc0d0ffe5)

### Now playing queue
![now_playing_queue
Large](https://github.com/user-attachments/assets/db244462-e33d-452a-93dc-dd2123a4862d)

</p>
</details> 

## AI or LLM usage
None

## Try it out

See instructions at
https://github.com/damontecres/Wholphin/releases/tag/develop-music
2026-03-24 13:42:18 -04:00
Ray
8a37d63d09
Better playback overlay appearance animations (#1130)
## 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
2026-03-23 18:04:11 -04:00
Ray
920733075b
Better error handling for errors on home page rows (#1128)
## 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
2026-03-21 19:17:43 -04:00
Ray
dac0b7208c
Refresh seasons on series details page (#1123)
## 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
2026-03-20 12:07:28 -04:00
Ray
f9ff04c5b7
Fix issues when the system kills the app during playback (#1116)
## 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
2026-03-18 18:09:13 -04:00
Ray
9057dceef6
Various fixes to screensaver, subtitle order, & playlist modifications (#1104)
## 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
2026-03-15 19:31:18 -04:00
Ray
23e5225c19
Debug installs should use same when updating (#1103)
## 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
2026-03-14 18:35:32 -04:00
Ray
627b89f1db
Updates to Seerr image fetching (#1086)
## 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
2026-03-14 16:47:08 -04:00
Ray
8bc3384094
Simplify series overview page refresh (#1092)
## 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
2026-03-12 21:16:56 -04:00