Commit graph

140 commits

Author SHA1 Message Date
Damontecres
fa5cc99c3b
De-duplicate string resource keys (#1560)
## Description
Ensures that all string & plural resource keys are unique. This should
help make sure all of the strings are shown in weblate's translation.

### Related issues
Related to #1551

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-12 01:24:24 -04:00
Damontecres
38b4a8c4de
Play or shuffle series, season, collections, & playlists from context menu (#1544)
## Description
Adds options to the context menu to play or shuffle items in a series,
season, collection, or playlist. So you can long click a TV show and
play it directly.

Playing a TV show will play the next up episode (same as the play button
on the series detail page).

Playing a season, collection, or playlist will start from the beginning.

Also, removes the green play arrows and uses the same neutral color as
other icons.

### Related issues
Closes #1451
Closes #1507

### Testing
Emulator from library pages & series detail pages

## Screenshots
N/A

## AI or LLM usage
None
2026-06-10 19:30:07 -04:00
Damontecres
f7f0ea9cca
Fixes missing parental ratings & focus loss when changing filters (#1559)
## Description
- Ensures all parent ratings are shown in the filter drop down
- Fixes focus loss after filtering library and there are no results

### Related issues
Fixes #1535 (along w/ #1529)
Fixes #1534

### Testing
Emulator w/ a UK movie library

## Screenshots
N/A

## AI or LLM usage
None
2026-06-10 19:29:49 -04:00
Damontecres
b49926f80b
Store remembered tabs in app database instead of preferences (#1541)
## Description
Moves storing the remembered tabs from app preferences to the app
database. This means deleting the user will remove the remembered tabs
and the app preferences file is smaller and faster to load.

The remembered tabs are migrated automatically when the app is updated.

There are no significant user facing changes in this PR.

### Related issues
N/A

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-08 13:45:38 -04:00
Damontecres
a4ee1e5175
Only show relevant parental ratings when filtering (#1529)
## Description
Updates the parental rating filter so it only shows the relevant options
instead of all of them. This is now the same behavior as the web UI.

Additionally, the filter options are cached for a short time so the UI
doesn't need to load them every time the menu is opened.

Dev note: Refactors `FilterUtils` into a service which allows for the
caching

### Related issues
Closes #410

### Testing
Emulator with movie & tv show libraries

## Screenshots
N/A

## AI or LLM usage
None
2026-06-07 07:15:40 -04:00
Damontecres
e2a6ae6be4
Two more bug fixes (#1521)
## Description
Fixes bugs:
- Follow up to #1487 since the 404 exception can be ignored in some
cases
- Fixes a only-on-main-thread exception when clearing the secure flag in
some cases

### Related issues
Related to #1469

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-05 10:01:08 -04:00
Damontecres
a1b372667b
Fix highlighting the wrong 'more' nav drawer item (#1515)
## Description
Fixes an issue where the wrong nav drawer item would be highlighted in
the "More" section

Previously, displaying the discover nav item was partially handled in
the view model state and partially within the UI code which caused this
bug. This PR moves it all into the view model state.

### Related issues
N/A

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-03 20:46:57 -04:00
Damontecres
471dbd62db
Fixes a crash during playback (#1514)
## Description
Fixes a crash that could occur during the beginning of playback

Also adds better handling for clicking next extremely fast

### Technical details

The playlist objects would be created on the IO thread and it had a
`mutableIntStateOf` to track the current index. This meant that there is
a race conditions for the IO thread to commit the snapshot for the main
thread to see them. If the main thread is faster, it will crash.

To fix that, this PR moves the mutable state in `Playlist` into the
`PlaybackState` flow in the view model. This enures both the background
threads and re-compositions have the right state.

### Related issues
Fixes #1509 

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-06-03 12:41:13 -04:00
Damontecres
5ae452155e
Fix showing live tv programs on home page (#1504)
## Description
Fixes the inconsistent live tv programs shown on the home page by using
a different API endpoint & filtering.

Also some UI fixes:
- Use the "Watch live" string consistently for the row instead of it
sometimes switching to "Live TV"
- Adjust the "Ends at" in the home page header to show the actual end
time
- Show the channel name in "quick details"
- Show season & episode number, if applicable, in "quick details"

### Related issues
Fixes #1080

### Testing
Nvidia shield w/ fake EPG data

## Screenshots
N/A, just UI fixes, nothing new

## AI or LLM usage
None
2026-06-03 12:40:53 -04:00
Damontecres
6c64470c28
Only show view more card if row has more items (#1493)
## Description
Only show the view more card at the end of row if there are actually
more items (or at the limit).

Also reduces the size of the arrow a bit

### Related issues
Related to #1392 

### Testing
Emulator with different max items setting

## Screenshots
N/A

## AI or LLM usage
None
2026-05-30 17:41:44 -04:00
Damontecres
273a6138c6
Add more sort options to different types (#1488)
## Description
Adds more sorting options, notably premier date & ratings, to different
media types.

### Related issues
Closes #1417
Closes #1429
Replaces #1420

### Testing
Emulator on movie genre's items and music video libraries

## Screenshots
N/A

## AI or LLM usage
None
2026-05-30 16:56:33 -04:00
Damontecres
8ea6bbbfca
Improvements to home page customization (#1458)
## Description
Adds a few enhancements to home page customization:
- Add option to combined continue watching & next up to split it
- Add option to continue watching and next up rows to combine them
- Add option for sorting playlist or collections
- Show suggestions (recently updated) when searching for a playlist or
collection to add
- Better handling for loading vs unsupported types for suggestions

Also, the old toggle for combining continue watching & next up in
advanced settings is removed. Now by default the rows will be combined
unless changed in the home page customization settings.

### Related issues
Closes #340
Closes #1383
Closes #1350

### Testing
Just on the emulator so far

## Screenshots
N/A

## AI or LLM usage
None
2026-05-26 13:30:00 -04:00
Damontecres
510160aceb
Fix issue with local trailers, cinema mode, prerolls, & next up (#1460)
## Description
Fixes an issue where local trailers wouldn't play (or show in the queue)
if Cinema Mode is enabled and the server has a preroll/intro.

Also fix building the playback queue when "Show next up" is "Never". The
queue is shown, but not automatically played and next item dialog popup
is never shown. But to indicate playback is over, the controller show.

### Related issues
Fixes #1348
Fixes #1303

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-25 16:54:58 -04:00
Damontecres
656393fa1d
Prefer thumb art for movies for Watch Next (#1456)
## Description
Prefer using thumb image types for movies when adding to Watch Next
android OS channel. The primary/poster image will be used if there is no
thumb.

### Related issues
Fixes #1425 
Fixes #1403

### Testing
Emulator, verified a movie was showing its primary image, then ran this
PR

## Screenshots
N/A

## AI or LLM usage
None
2026-05-25 13:27:24 -04:00
Damontecres
ebcc2f324a
Several small fixes (#1455)
## Description
- Fix crash on license info page for release builds (#1437)
- Fix configuring which ratings to show by default (#1407)
- When re-ordering nav drawer items, ensure the one that was just moved
is always visible (#886 )
- Fix app losing focus when switching between list layout types (#1428)
- If the version doesn't have any additional commits, don't show the git
hash info (ie `v0.6.4-0-gabc1234` shows as `v0.6.4`)
- Adds tests for Version comparisons & toString

### Related issues
See above

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-25 13:27:04 -04:00
Damontecres
0b450fc0ff
Remove dependency on livedata libraries (#1453)
## Description
Refactors all usages of `LiveData` into flows in keeping with best
practices. This also includes refactoring several `ViewModel`s to
combine multiple `LiveData` into a new single `StateFlow`.

There are no user facing changes

### Related issues
None

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-25 08:27:19 -04:00
Damontecres
903c45dfb8
Support configuring interface language per user (#1406)
## Description
Adds a setting to configure the app's language/locale. It is configured
per user. This settings has no impact on audio or subtitles language
choices.

Only languages Wholphin has translations for can be used. If you would
like to contribute new translations, check out
https://translate.codeberg.org/projects/wholphin/!

Dev notes: This doesn't exactly follow Android's recommendations because
the [guidelines are for
per-app](https://developer.android.com/guide/topics/resources/app-languages)
and not users within the app.

### Related issues
Closes #513
Closes #669

### Testing
- Emulator API 34
- Nvidia shield API 30
- Fire TV OS 7 API 28

## Screenshots
<img width="1280" height="720" alt="language Large"
src="https://github.com/user-attachments/assets/bf1c0962-8a36-4012-aed9-eab564fc1114"
/>

## AI or LLM usage
None
2026-05-24 09:55:08 -04:00
Damontecres
086badf2e2
Fix theme song playing over video (#1442)
## Description
There was an issue if when opening a page with theme music and quickly
changing pages, usually playback, the theme music might play on the new
page. This is because the call to stop the theme music could potentially
happen _before_ the song was loaded or had started playing.

This PR fixes this race condition by tracking the job that's fetching
the theme song and by adding a mutex to ensure the play function
completes before the stop function can begin.

### Related issues
Fixes #938

### Testing
Emulator w/ fake delay to increase the odds of the issue occurring

## Screenshots
N/A

## AI or LLM usage
None
2026-05-23 13:38:59 -04:00
Damontecres
c68ab33f38
Filter out future content for recently released rows (#1436)
## Description
Don't show future content (episodes, etc) on recently released rows in
recommended tabs or home page rows.

### Related issues
Closes #262
Replaces #1262

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
The original PR #1262 author used claude. Some of that code that was
retained in this PR was reviewed & tested.

---------

Co-authored-by: ADT95 <turner7@outlook.com>
2026-05-22 15:48:11 -04:00
Justin Caveda
df2dd3e7ca
Fix: suggestions get stuck on loading for hours/days (#1364)
## Description

This should fix the issue where suggestions would sometimes get stuck
loading. My best guess is that they were getting stuck because the app
thought it was still loading, even though the background job was just
waiting.

This should fix that by making each library kick off its own suggestions
job when needed.

  ### Related issues

  Fixes #1065

  ### Testing

Emulator and nvidia shield

  ## Screenshots

N/A no ui changes

  ## AI or LLM usage

Used codex to help diagnosis the bug. Also added unit tests and more
debug logging for the suggestions system using ai. Wrote the fix myself.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-22 12:19:26 -04:00
JustinZeus
fa914845f4
Add option to hide the voice search button (#1423)
## Description

Adds a "Show voice search button" toggle to the search page's view
options dialog, alongside the existing "Combined search results" toggle.
When disabled, the voice search button is hidden from the search row,
taking it out of the D-pad focus path.

The new field `show_voice_search_button` is added to `SearchPreferences`
(default `true`). The serializer applies the default for new installs,
and a new entry in `AppUpgradeHandler` sets it to `true` for users
upgrading from earlier versions so existing behaviour is preserved.

### Related issues

Discussion: https://github.com/damontecres/Wholphin/discussions/1419

### Testing

Tested on an Android TV (1080p) AVD running API 34:

- Toggle on (default): voice search button visible at the top of the
search row.
- Toggle off: button disappears; only the search text field remains.
- Toggle back on: button reappears.
- Upgrade handler verified by spoofing `version.current.name` to an
older value in SharedPreferences and force-restarting the app; after
`needUpgrade()` fired, the toggle was on as expected.

The upgrade-handler entry currently uses `0.6.4-8-g0` (based on current
`main` HEAD); happy to bump this if you'd prefer a different target
version on merge.

## Screenshots

<img width="1920" height="1080" alt="pr1-01-home"
src="https://github.com/user-attachments/assets/0d5cdad0-5547-44f3-b4a5-5d15f71dddc0"
/>
<img width="1920" height="1080" alt="pr1-02-toggled-off"
src="https://github.com/user-attachments/assets/1e574229-0838-487d-b943-83d394a8193d"
/>

## AI or LLM usage

I used Claude to scaffold the proto/serializer/upgrade-handler/dialog
changes, mirroring the existing `combined_search_results` pattern. I
reviewed each diff before committing and tested the toggle manually on
the emulator, including the upgrade-handler simulation.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-21 15:31:17 -04:00
Damontecres
f4bdb8446e
View more from home page & recommended rows (#1392)
## Description
Adds a card at the end of the rows on the home page and recommended tabs
to "View More" which goes to a grid of the items in the row.

The grid will endlessly scroll all of the available items except for a
few cases where the first 1000 are shown because the server does not
(yet) support pagination: genres, studios, people (added in v12), and
latest grouped tv shows.

Dev notes: This PR also rewrites the `RecommendedViewModel` and
consolidates the previous multiple view models into one.

### Related issues
Closes #1371
Closes #1035
Similar to #1198

### Testing
Emulator

## Screenshots
N/A, see #1198

## AI or LLM usage
None
2026-05-16 11:35:11 -04:00
dudecuda
96f94feac2
libass-android lifecycle issue: Fixes #1049 (much of it) (#1362)
Fixed a bug with libass integration where the background thread
responsible for drawing the ASS subtitles (AssRenderThread) has been
shut down, but ExoPlayer is still actively running and trying to push
video time updates to it. Added fallback for software rendering on older
android versions that can have broken OpenGl implementation.This should
address much of issue #1049.

## Description
Essentially, debug logs showed repeated:
3145 3920 W MessageQueue: Handler (android.os.Handler) {4ba3c72} sending
message to a Handler on a dead thread
3145 3920 W MessageQueue: java.lang.IllegalStateException: Handler
(android.os.Handler) {4ba3c72} sending message to a Handler on a dead
thread

Essentially this was a lifecycle bug where the libass-android thread was
created, but was detaching from the window, shutting down when it does
so. It was still registered to ExoPlayer, but since there was no thread
to send to, it just repeatedly kept failing, never spinning back up to
display any subtitles. It seems just about any ui change can cause this
detachment, but in this case it seems it was right from the moment the
loading spinner shows up (making libass-android fail before video starts
playing).

Fixed by ensuring TextureView's visibility wasn't changed to invisible,
which ends up destroying the canvas that libass-android attaches itself
to. Hid the canvas using graphicsLayer (so the user can't see it, but
it's still alive and active). Also changed resizing logic to prevent
Android from seeing a 0x0 TextureView as "destroyed".

Since I discovered in testing how terribly my TV's OpenGl was handling
this, I added an additional fallback for Android versions < 9. Older
TV's can fallback to software rendering when using libass-android.

### Related issues
#### Issue #1049 : 
**Fixes:**
- the issue where libass-android (when enabled) fails to load any
subtitles in ExoPlayer DirectPlay.

**Not Fixed from issue #1049 :**
- Issues around accented characters.
- Any issues surrounding MPV (I have no way of testing, MPV never worked
on any player for me)
- Fallback mode (libass-android disabled) where subtitles aren't
rendering properly

**Added:**
- While testing, discovered older Android versions have trouble with
reliable OpenGl rendering. Thus I added a fallback for older Android
versions to use libass-android in software rendering mode
(AssRenderType.OVERLAY_CANVAS)

### Testing
- Tested and confirmed flawlessly to work on Android 9 TCL Smart TV
(AssRenderType.OVERLAY_CANVAS)
- Tested on Android 14 Chromecast (AssRenderType.OVERLAY_OPEN_GL).
Slightly less perfect (font not always a match, less fancy shadows) but
most ASS/SSA effects work well. May be worth testing other AssRenderType
options to compare features and performance on other machines.

## AI or LLM usage
Google Gemini Pro in tracing down the cause and fine-tuning the fixes.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-11 17:49:08 -04:00
Damontecres
4928c1156d
Fix cleaning up APKs on debug builds (#1373)
## Description
Directly use "Wholphin" when searching for older APKs to clean up.

On debug builds, the `app_name` string is "Wholphin (Debug)" but the APK
file names is always "Wholphin.apk", so I think the debug build won't
clean them up.

### Related issues
Fixes #1368

### Testing
Testing downloading a few times without this change, applied the change,
and clean up worked

## Screenshots
N/A

## AI or LLM usage
None
2026-05-11 11:12:05 -04:00
Damontecres
8107a82a6b
Fixes/improves showing delete button (#1353)
## Description
Fixes the delete button not showing on the movie detail page. Also fixes
some edge cases where button may not appear when toggling on the media
management setting.

Adds the delete button to album & artist pages. Previously, it was only
in the context menu.

### Related issues
Fixes #1343

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-06 11:49:27 -04:00
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
0dca02b919
Fix race condition when updating preferences (#1078)
## 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
2026-03-10 18:10:14 -04:00
Ray
7bb47bf329
Photo/slideshow fixes & Seerr server removal fix (#1076)
## 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 #835
Fixes #1069
Addresses
https://github.com/damontecres/Wholphin/issues/634#issuecomment-4018580518

### Testing
Emulator mostly

## Screenshots
N/A

## AI or LLM usage
None
2026-03-10 14:16:19 -04:00