Commit graph

480 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
01bd3249fa
Fixes two row bouncing UI issues (#1543)
## Description

Fixes row bounce using `SeasonCard` when are two exactly two items. This
was done by calculating the y-offset in the `layout` modifier instead of
`offset`. This has the side effect of probably being very slightly more
efficient since only 1 animation state is needed now.

Fixes row bounce on the second row of the home page if the first row is
empty and not shown.

### Related issues
Fixes #1528
Fixes #1271

### Testing
Emulator in different situations. Also checked the layout inspector to
make sure the optimizations from #1184 weren't affected

## Screenshots
N/A

## AI or LLM usage
None
2026-06-08 17:23:09 -04:00
Damontecres
93d601e7bf
Improvements to debug page (#1538)
## Description
Makes some improvements to the debug page. Also adds some audio device
listing for debugging.

### Related issues
N/A

### Testing
Emulator & shield

## Screenshots
N/A

## AI or LLM usage
None
2026-06-08 13:45:48 -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
d1b8c09615
Add a shortcut to chosing the version of an item (#1522)
## Description
Based on feedback from users, many felt it was difficult to 1) tell if
multiple version of an item existed and 2) choose the version they want

So this PR adds a new expandable button next to Play/Resume/Restart to
choose the version. It is a shortcut to the More->Choose Version dialog,
but also serves as a more prominent indicator that there are multiple
versions. The button is only shown if there are 2+ versions to choose
from.

Also adds displaying the bitrate in the choose version dialog just in
case there are identically named versions with the same resolution.

Dev note: I also added some docs for classes & functions related to
choosing a version

### Related issues
Related to #652

### Testing
Emulator

## Screenshots
<img width="1280" height="720" alt="choose_version_button_unfocused
Large"
src="https://github.com/user-attachments/assets/4f6051ef-b6ae-4fad-9d54-3840523350ed"
/>

<img width="1280" height="720" alt="choose_version_button Large"
src="https://github.com/user-attachments/assets/0e8412bc-2d18-4c6c-987a-2f067363ad2c"
/>

## AI or LLM usage
None
2026-06-07 07:15:30 -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
Justin Caveda
0842c35e34
Fix combined search results losing keyboard focus when typing (#1524)
## Description
Minor tweak to prevent the keyboard from losing focus when typing search
queries when "combine search results" is enabled

### Related issues
Fixes #1523

### Testing
Emulator only

## Screenshots
N/A

## AI or LLM usage
None

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-06-05 09:54:06 -04:00
Damontecres
a0869ca6e4
Several minor fixes (#1505)
## Description
Collecting some minor fixes together:

- Adds error handling when submitting a discover/seerr request,
previously there was no visual feedback if the request failed
- Fix MpvPlayer reporting that it was buffering forever
- Fix discover results row on regular search page not being clickable
- Fix focus loss when returning to movie details after playback advanced
enough to switch the button from Play to Resume
- Fix some focus issues when returning to the TV guide page

### Related issues
Related to #1503 for MPV
Fixes #1500
Fixes #1508
Fixes #1501

### Testing
Emulator & nvidia shield

## Screenshots
N/A

## AI or LLM usage
None
2026-06-03 20:47:07 -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
68836bb834
Fix click/long click issues on some view more grid pages (#1486)
## Description
On a library recommended tab, if you clicked View More, clicking a card
on the grid would directly play the item instead of the regular
behavior.

This PR fixes that and simplifies the code required to support simple
context menus.

### Related issues
Fixes #1480

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-30 17:41:27 -04:00
Damontecres
7660c53e3a
Don't show home row w/ 404 Not Found (#1487)
## Description
If a home page row returns 404 Not Found, treat it as empty and don't
show it.

It will still show as an error on home row settings, since this page
doesn't hide empty rows.

Also fixes a bug where you can't scroll up if there are 3+ empty rows
before the current row.

### Related issues
Closes #1469

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-30 16:56:52 -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
33161d4d6d
Several bug fixes & minor UI changes (#1466)
## Description
### Bug fixes
- Fixes a race condition crash when configuring subtitle styling before
libmpv is initialized
- Save the clicked item position on grid pages (#1428 & #1462)
- Fix querying the server every 3 seconds for transcode reason if the
video is direct playing


### UI changes
- Makes the title on grid pages slightly smaller
- Makes adjustments to the song list item on now playing so that no
space is used if there's no artist
- Use settings icon instead of triple dots on now playing page

### Related issues
See above

### Testing
Emulator, nvidia shield & google streamer

## Screenshots
### Song list item
Before & after
<img width="199" height="119" alt="image"
src="https://github.com/user-attachments/assets/7fd3636a-d1e4-4b1f-8379-8599068d6309"
/>


## AI or LLM usage
None
2026-05-26 18:36:56 -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
23856ffcf8
Fixes favorites page not loading (#1462)
## Description
- Fixes a bug introduced in #1453 which broke the favorite page
- Follow up to #1428 to refactor the collection folder code to hoist
state up another level
- Fixes resuming playback from series details play button

### Related issues
Fixes #1313
Fixes #1461
Follow up to #1453 & #1428 

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-25 20:05:44 -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
9eff22e939
Fix several issues with right-to-left locales (#1404)
## Description
Fix several issues when the current locale is right-to-left

- Fixes the backdrop dynamic colors
- Fixes mirroring of playback controls, including seeking

### Related issues
Fixes #1397
Fixes #1398

### Testing
Emulator w/ forced RTL in developer options

## Screenshots
<img width="1280" height="720" alt="rtl_backdrop Large"
src="https://github.com/user-attachments/assets/3e3b14ec-32cc-42c0-a224-d1d859a55acd"
/>
<img width="1280" height="720" alt="rtl_controls Large"
src="https://github.com/user-attachments/assets/79983bb9-e1d0-4712-a5c6-da3d0721db96"
/>


## AI or LLM usage

None
2026-05-25 13:27:34 -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
982d9e6fe8
Add list view for libraries (#1428)
## Description
Adds an option to display libraries in a list layout

The list can be regular showing 6-7 items or compact showing ~11 items.
Can also toggle showing the details on the left side. Movies, tv shows,
& albums have type-specific layouts and other types like videos, music
videos, etc use a generic one similar to movies.

Another change is that showing the backdrop is now a separate toggle
from showing details for both grid & list layouts.

Sorting, filtering, & jumping to a letter all work as expected!

### Related issues
Closes #1101

### Testing
Emulator mostly

## Screenshots
<details><summary>Click for screenshots</summary>
<p>

### TV shows list
<img width="1280" height="720" alt="series_list Large"
src="https://github.com/user-attachments/assets/f8f9b801-e537-4cdf-b992-f2f1259457fa"
/>

### TV shows compact list
<img width="1280" height="720" alt="series_list_compact Large"
src="https://github.com/user-attachments/assets/747e5929-90d7-4d59-a179-bc3210ac01b9"
/>

### Movie list
<img width="1280" height="720" alt="movie_list Large"
src="https://github.com/user-attachments/assets/ee3e1c6c-fb25-438a-a11e-522d30fbaabf"
/>

### Album list
<img width="1280" height="720" alt="music_list Large"
src="https://github.com/user-attachments/assets/9b1f59ec-c237-4ab2-9b51-6cb519f5327c"
/>


</p>
</details> 

## AI or LLM usage
None
2026-05-24 18:07:56 -04:00
Damontecres
8177700e23
Show loading indicator when video is buffering (#1441)
## Description
Shows a loading indicator and slightly dim the screen when playback is
buffering.

Showing the indicator is delayed in case the buffering doesn't take very
long.

Dev note: the changes to `MpvPlayer` need to be ported to
wholphin-extensions as well.

### Related issues
Closes #1411

### Testing
Emulator

## Screenshots

[buffering.webm](https://github.com/user-attachments/assets/dd848696-d6de-4f68-94e4-901bb5db1185)

## AI or LLM usage
None
2026-05-24 10:11:59 -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
Damontecres
c3ba14557c
Search fixes & improvements (#1435)
## Description
Fixes showing the discover search result row

Also adds a Search tab to the discover page. You can already search
discover results from the regular search page, so the new tab is just
for convenience.

### Related issues
Related to #709 

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-22 11:54:38 -04:00
Damontecres
6f11a3711f
Few minor fixes (#1427)
## Description
- Fix always showing the user list on app cold start even with auto sign
in enabled
- Ignore unknown JSON keys when restoring view options or filters from
the database making them more backward compatible for devs switching
branches
- Don't show a view more card on collection detail page rows, it's not
necessary

### Related issues
First bug was introduced by #1367

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-21 17:06:46 -04:00
Damontecres
223d2d1f71
Show extras for music albums (#1426)
## Description
Adds the standard extras row to the album detail page if there are any
extras

I also tried to get Jellyfin to recognize artist extras, but it did not
work, so this just adds extras for albums

### Related issues
Closes #1409 

### Testing
Emulator

## Screenshots
N/A, same extras row

## AI or LLM usage
None
2026-05-21 15:31:43 -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
JustinZeus
c82d36794f
Fix bottom padding in playback controls (#1422)
Fixes #1396.

The else branch of `when (nextState)` in PlaybackController added a 32dp
Spacer that left empty space below the controls when there were no
chapters or queue.

Possible follow-up: Pentaphon's idea of a "similar items" row in that
empty slot. Happy to put up a separate PR if useful.

## Testing

Verified on an Android TV (1080p) AVD running API 34 by playing a movie
with no chapters and no next-up item. With the fix, the bottom of the
control overlay sits the expected 8dp from the screen edge (the existing
parent padding). Also rebuilt without the fix and compared back-to-back
to confirm the Spacer was the cause.

The CHAPTERS and QUEUE branches were not modified.

## Screenshot
<img width="1920" height="1080" alt="case1-controls"
src="https://github.com/user-attachments/assets/18f50a87-a373-4f48-a9d4-f3c2a5cb2c00"
/>

## AI or LLM usage

I used Claude to help identify the file containing the bug and to
suggest the fix. I reviewed the diff before committing.
2026-05-21 12:43:49 -04:00
Damontecres
366483599c
Customize which ratings to display (#1407)
## Description
Adds a setting, Settings->Advanced->"Customize which ratings to
display", which allows for toggling parental, community, or critic
ratings to be displayed in the quick details.

This doesn't apply to discover yet.

### Related issues
Related to #1020

### Testing
Emulator

## Screenshots

### Just community rating
<img width="1280" height="720" alt="ratings Large"
src="https://github.com/user-attachments/assets/d6f9ad8a-6cc5-4680-9d2f-66d16a44b41e"
/>


## AI or LLM usage
None
2026-05-20 12:40:58 -04:00
Damontecres
45d466d76f
Add option to require server login for user profile (#1367)
## Description
This PR adds a new method of protecting a user profile when switching to
it: server login. When enabled, switching to the user requires
authenticating with the server again via Quick Connect or username &
password. This is basically the same as the official client.

### Related issues
Closes #321
Related to #1330 - might cause merge conflicts
Related to #1287 - definitely causes merge conflicts

### Testing
Emulator with various uses cases including auto sign-in, switching
between server login & PIN protection, and removing the protection

## Screenshots
N/A, the login looks identical as adding a new user

## AI or LLM usage
None
2026-05-20 12:00:02 -04:00
Damontecres
da7f7048e2
Enhancements to live TV guide/EPG (#1393)
## Description
This PR has some UI/UX updates for live tv epg/guide.

- Show program images, if provided by the EPG source
- Show channel name under logo
- Show & set favorite channels
- Adjusts the header to match the rest of the app (font, padding, etc)

Additionally, navigation around the guide has been rewritten. It is more
efficient and feels a bit more smooth to scroll around.

### Related issues
Closes #529

### Testing
Emulator mostly

## Screenshots
<img width="1280" height="720" alt="epg_new Large"
src="https://github.com/user-attachments/assets/c53c01be-9209-4c59-82cb-47f268811d3e"
/>


## AI or LLM usage
None
2026-05-19 14:11:55 -04:00
Damontecres
87a109c6b6
Add option for click to play continue watching/next up rows (#1405)
## Description
Adds an option under Settings->Customize home page->Settings, "Continue
watching/Next up click behavior":
- When disabled (the default), clicking goes to the item's details page
- When enabled, clicking starts playback for the item from its resume
position

This only applies to the continue watching, next up, or combined rows.
All other rows go to the details page no matter what.

### Related issues
Closes #1007

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-19 14:11:40 -04:00
Damontecres
59ccce9d54
Fix small UI issue with long stream labels (#1388)
## Description
Fixes a small UI glitch when the subtitle label is too long, it would
slightly increase the high of the labels. This is especially noticeable
on series details if some episodes have the long label and some don't
because the episode row will bounce up and down a few pixels.

Also moves the labels closer together and changes "Disabled" to "None"
when subtitles are turned off.

### Related issues
None

### Testing
Emulator & compose previews

## Screenshots
### Before
The subtitle label is slightly taller than the others
<img width="528" height="36" alt="image"
src="https://github.com/user-attachments/assets/32d322bc-11cc-4238-840c-03ae41b069d3"
/>


### After
The ellipse doesn't look great, but there's limited space and looks
better than being cut off.
<img width="510" height="37" alt="image"
src="https://github.com/user-attachments/assets/40af707c-3121-40c0-a978-60781d9704d6"
/>


## AI or LLM usage
None
2026-05-16 11:35:21 -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
Justin Caveda
98ffaf51ac
Search page improvements (#709)
## Description

Improves how search results are displayed:

- Reorders search categories to Movies → TV Shows → Episodes →
Collections, surfacing the most commonly searched content types at the
top.
- Adds a new "Combined search results" preference in Advanced settings →
Search. When enabled, shows all results in a single list instead of
separate categories.
- When Seerr is active, adds Library/Discover tabs to switch between
local library results and Seerr discovery results.
- Hides empty result categories instead of showing "No results"
placeholders.

### Screenshots

<img width="1935" height="1100" alt="Screenshot_20260116_113656"
src="https://github.com/user-attachments/assets/1e29aa3a-3ba2-4f86-ab61-fed683490474"
/>

<img width="1934" height="1095" alt="image"
src="https://github.com/user-attachments/assets/8b93fa38-d4c9-4e72-a997-caa82b4949f0"
/>

<img width="1921" height="1094" alt="image"
src="https://github.com/user-attachments/assets/82aed1a5-810c-413f-a266-6d78490a1534"
/>

### AI/LLM usage
Code auditing and PR description drafting with Claude Code. Also used
Claude Code for the regex.
2026-05-13 10:02:33 -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
8b9b0ddec8
Fix two home row focus bugs (#1376)
## Description
1. Fixes when moving from nav drawer to home page content, focus would
sometimes move up a row
2. Fixes when moving up/down between rows, focus would sometimes move to
the later card (usually the last visible)

The second above is fixed by downgrading `tv-material` to
`1.0.1-alpha01`. Switching to
[`1.0.1-beta01`](https://developer.android.com/jetpack/androidx/releases/tv#tv-material-1.1.0-beta01)
or newer causes the bug. Not clear if its a bug in the library or
Wholphin though.

### Related issues
Fixes #1359

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-11 17:48:38 -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
Brian Gunter
08db2b0efc
Accept digits in the PIN field in addition to l/r/u/d (#1330)
## Description
This enhances the PIN entry system by allowing users to input digits
using the numbers 0-9. This is useful for those using a keyboard or
universal remote with a number pad.

### Testing
Tested on Nvidia Shield Pro and Onn 4k Pro

## Screenshots
<img width="3840" height="2160" alt="Screenshot_20260429_083041"
src="https://github.com/user-attachments/assets/9e603bda-f1d3-4268-a04c-b077297fdfac"
/>

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-11 10:23:02 -04:00
Damontecres
cb46aa4159
Rearrange playback controller buttons (#1366)
## Description
- Moves the audio track selection out of the menu as a button
- Combines the settings & more buttons into one dialog

All functionality works the same, this is just UI changes

### Related issues
Related to #528

### Testing
Emulator, it's just UI changes

## Screenshots

### Before
<img width="1280" height="720" alt="controller_before Large"
src="https://github.com/user-attachments/assets/40430408-2108-4eda-9f05-d5f8c22a8b01"
/>

### After
<img width="1280" height="720" alt="controller_update Large"
src="https://github.com/user-attachments/assets/d2623a7c-9c05-4b0f-ae57-fed1c37e6cbc"
/>


## AI or LLM usage
None
2026-05-11 10:22:27 -04:00
Damontecres
df71baccea
Fix remove series from next up (#1369)
## Description
Fixes the "Remove series from next up" context menu item not working at
all.

Looks like after the refactoring in #1302, I missed [adding back the
function
call](https://github.com/damontecres/Wholphin/pull/1302/changes#diff-440f67bfe7be2011418c2f90e3a8ae2af05795a5161edd1a8bda14bc3b962cdcL175).

### Related issues
Fixes #1363

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-10 18:00:09 -04:00