## 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
## 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
## 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
## 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
## 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#1371Closes#1035
Similar to #1198
### Testing
Emulator
## Screenshots
N/A, see #1198
## AI or LLM usage
None
## 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.
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>
## 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
## 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
## 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>
## Description
Show the public users (ie "Hide this user from login screens" is
unchecked) if the server has any. Previously, all users had to be
explicitly added by username or quick connect.
This PR also refactors the server & user pages to use modern state flows
and deletes some unused code.
### Related issues
Closes#600
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
Instead of adding/removing the `SubtitleView` from composition
sometimes, instead toggle its visibility. This is technically slightly
more efficient. There's also a couple other minor tweaks that make the
subtitles style a little more efficient.
This should also help prevent crash caused by possible a race condition
in libass-android
(https://github.com/peerless2012/libass-android/issues/75).
### Related issues
I think this fixes#1322
### Testing
Emulator mostly
## Screenshots
N/A
## AI or LLM usage
None
## Description
Just a lot of dependency bumps. There are no user facing changes.
Switches to the new Android gradle DSL now that the protobuf plugin is
compatible.
### Related issues
None
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## 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
## Description
Fixes an issue when changing subtitles during playback if you had
previously explicitly chosen subtitles for that item but not chosen an
audio track.
### Related issues
I don't think there is a specific issue for this
### Testing
Emulator
## Screenshots
N/A
## AI or LLM usage
None
## Description
This PR simply enables the `largeHeap` flag to request more memory from
the OS.
I am a bit embarrassed that I haven't added this before now, but I had
read that using `largeHeap` was a bandaid, not a solution. So I assumed
Wholphin was doing something incorrect memory-wise. But after crawling
through many, many heap dumps to analyze Wholphin's memory usage, and
after further research, enabling this does make sense for handling high
bitrate, high resolution videos. Furthermore, many other Jellyfin
clients and other video apps like Plex and Prime Video have this
enabled.
So since I am pretty confident that Wholphin doesn't have any memory
leaks, I feel good about enabling this.
### Related issues
I believe this will fix many of the bug reports about crashes during 4K
playback, but it's not a cure-all since it is up the device & OS to
allocate the max memory.
Fixes#333Fixes#826Fixes#1189
### Testing
Shield 2019, Fire 4k Max
## Screenshots
N/A
## AI or LLM usage
None
## Description
Preload ~6 rows worth of images on library grid pages. So depending on
device CPU & memory, most cards do not show a placeholder image when
scrolling unless you press and hold up/down to scroll as fast as
possible.
There's a couple other minor optimizations on the grid code as well, but
nothing huge.
### Dev notes
This PR makes the `cacheWindow` for pre-rendering cards applicable to
their images. Previously, images would not be fetched until the card is
laid out within the window. This was to get the width/height to pass to
the server request. This PR instead calculates the card widths when the
grid itself is laid out and then passes this width into the cards'
composables.
### Related issues
Related to #1246
### Testing
Tested with emulator, shield, fire stick 4k max
## Screenshots
N/A
## AI or LLM usage
None