Commit graph

375 commits

Author SHA1 Message Date
damontecres
8ea84b3efe
Add setting to protect a user profile with a PIN (#356)
Allows for setting a per-user profile PIN that must be entered to switch
to the user. The PIN is a sequence of directional buttons, ie D-Pad
left/right/up/down.

This PIN is per device per user per server. The PIN is stored locally
and not sent nor shared with the server. If you forget your PIN, can
still access the app using server credentials which also removes the
PIN.

Additionally, there is another setting to disable automatically sign in.
When enabled (default) the last user is automatically restored, even if
there is a PIN. If disabled, a server & user must always be selected
when opening the app.

Closes #268
Closes #321
2025-12-04 14:37:27 -05:00
damontecres
a294661520
Support custom mpv.conf (#327)
Part of #235 
Closes #305

Adds a preference for specifying a custom `mpv.conf`

Also adds a preference to toggle between `vo=gpu` and `vo=gpu-next`, see
https://github.com/mpv-player/mpv/wiki/GPU-Next-vs-GPU

There are some caveats:
* Multi-line text entry via a remote is rough
* [Track selection
options](https://mpv.io/manual/stable/#track-selection) may not work as
expected because Wholphin manages this itself
* Bad settings will crash the app hard

Dev note: This rewrites the text field inputs to use the [state based
implementations](https://developer.android.com/develop/ui/compose/text/migrate-state-based)
2025-12-04 13:21:40 -05:00
damontecres
384401a72c
Customize display of library grid pages (#368)
## Details

Adds options to customize how grid pages are displayed. Every grid page
can be individually customized.

The options are saved per user on the device and restored when
navigating back to the page. The pages that support it have a new button
next to the sort/filter buttons and changes are updated live.

The options are:
* Primary or Thumb image
* Aspect ratio
* Show details header w/ backdrop (similar to the one on the home page)
* Number of columns
* Spacing between cards
* Card image content scale (eg Fit, Fill, Crop, etc)

Note: the Genre tabs' grids cannot be customized yet

### Other changes
- Nav drawer now opens over top of content instead of pushing it
- Images for most cards are fetched with actual fill size

### Possible future work
* Customize Genre grids
* Add more image types, banners?
* Add similar customization options to pages with rows, eg Home page and
Recommended tabs

## Example

For example, this is a movie library using thumb images with 8 columns
and reduced spacing. It also shows the details header

## Issues
Closes #186
Related to #72
2025-12-04 12:20:50 -05:00
damontecres
bddf51e076
Fix some threading issues (#364)
Fixes thread used by changes from #359 

Also create the device direct play profile lazily-ish off of the main
thread because this can take some time to create.

Should help address some of the "too much work" reported in #363, and
also fixes the network-on-main exception in the logs on #363
2025-12-02 19:17:28 -05:00
damontecres
56bf3cb7a0
Optimizes recommended content & image caching (#359)
## Details
This PR contains a number of optimizations

### Images
Updates to request images with maximum sizes

The max sizes are estimates on the maximum number of pixels that will be
actually displayed. This means the server is downscaling large images
which means 1) better quality downscaling and 2) smaller images sent
over the network and cached

This should mean slightly better quality images and more images that can
be cached locally

### Paging
Reduces network calls when fetching paginated data, ie grid pages and
some rows. This PR combines the total record count & first page queries
which slightly reduces total time to load paginated data.

Additionally, on movies/tv show recommended pages, the rows now only
fetch a limited number of items (same as number on home page). While
they previously fetched using pagination, there is an overhead required
to paginate requests, so this is slightly faster.

### Async recommended fetching
On movies/tv show recommended pages, the rows are now fetched completely
separately from each other. Previously, the rows were requested
separtely, but each was only added to the UI in order as each completed.
Now they will add as the data arrived.

Note: Top unwatched TV shows is still very slow on `10.11.x`, see #204


### Image cache

The local, on-disk image cache size is increased from 100mb to 200mb.
Combined with the smaller images, this covers about 1500-2000 poster
images, but will vary by server.

The cache size is now also configurable in advanced settings from 25mb
to 1000mb. Additionally, you can see how much of both the disk and
memory caches are in use.

## Issues
Closes #330 
Related to #120
2025-12-02 16:00:21 -05:00
damontecres
10233eb459
Support VC-1 direct play if device supports it (#362)
Adds VC-1 to ExoPlayer direct play profile, if the device supports it.

Also proposed to add this to the official app in
https://github.com/jellyfin/jellyfin-androidtv/pull/5208
2025-12-02 10:56:39 -05:00
damontecres
8b33dd6d1f
Updates series details, adds movie genres, & adds critic rating (#358)
## Details

Updates the series details page to match style & layout of the new movie
details page (from #279 & #327)

Adds genre list to movie details, it was already on series details

Adds critic rating using fresh or rotten tomato icons, if available

## Screenshots
### Movie

![movie](https://github.com/user-attachments/assets/9bb9cb2e-921c-4f4b-8ea1-a1e73b1842f1)
### TV Show

![series](https://github.com/user-attachments/assets/542989da-bf39-46a4-aefb-7728613a97b1)

## Issues
Closes #357
Closes #347

## Attribution
The fresh & rotten tomato images were sourced from:
- https://commons.wikimedia.org/wiki/File:Rotten_Tomatoes.svg
- https://commons.wikimedia.org/wiki/File:Rotten_Tomatoes_rotten.svg
Credit: Emily Oberman from Pentagram, modified by Throast, Public
domain, via Wikimedia Commons
2025-12-01 18:04:40 -05:00
damontecres
fc330a3400
Improve search keyboard dismissal (#317)
I need to test this more

Fixes the imeAction for search

Initiating the search will move focus down if results are available

Pressing back while focused on the search text box will move focus to
either the results or the nav drawer. I think will will help devices
that do not dismiss on the soft keyboard on back.

Might fix #311
2025-12-01 10:44:39 -05:00
damontecres
258c50a95e
Add support for Android TV 6 & 7.0 (#350)
Adds support for Android TV 6.0 & 7.0 by reduce the min SDK to 23. Going
below 23 isn't practical since new releases of Jetpack libs require 23+.

Also includes some clean up for better gradle syncs & actually use the
datetime APIs available from desugaring on older versions.

Needs more testing before merge

Closes #341
2025-11-30 20:26:42 -05:00
damontecres
eca3268a7d
Add setting to increase logging verbosity (#354)
Adds a toggle to increase the verbosity of the app logs for
release/production builds

Most users won't need to use this, but it can be helpful when [gathering
app
logs](https://github.com/damontecres/Wholphin/wiki/Gathering-app-logs)
to report an issue.
2025-11-30 17:27:41 -05:00
Damontecres
ef20dad993
Fix settings changes needing a restart to apply 2025-11-29 19:39:23 -05:00
damontecres
8a2481362d
Fix live tv being unplayable (#346)
Fixes issue with playing live TV

Fixes #344
2025-11-28 23:58:05 -05:00
damontecres
f4c602ef3f
Fix broken scroll on home page (#345)
Fixes an edge case on the home page where having at least two rows that
don't have any latest items (such as collections or playlists) in
between two regular libraries (as configured on your home profile
settings) would prevent scrolling up from the second regular library
2025-11-28 23:38:29 -05:00
damontecres
ff91fa87e2
Few minor UI fixes (#343)
- Keep the currently selected nav drawer item in view and focus on when
entering
- Adjust star rating height so that the row is consistent preventing
resizing when moving between episodes with & without a rating
- Simplify checks when switching to a new server and use more specific
keys to prevent needing to switch servers twice
2025-11-28 21:31:02 -05:00
damontecres
296d7b9226
Setting for subtitle margin & fix subtitle opacity settings (#338)
Adds a subtitle style option to set the margin below unstyled subtitles.
This is roughly the percent of the screen below the subtitles. It
applies to both ExoPlayer & MPV.

Also fixes font & background opacity not being applied in some cases.

Fixes #225
Closes #178
2025-11-28 15:57:11 -05:00
damontecres
7f50cd83ee
Add default sort option for collections (#337)
Adds a "default" sort option for collections/boxsets. This makes the app
request no sort at all and leaves it up to the server to order the
items.

Fixes #83
2025-11-28 15:33:03 -05:00
damontecres
8bc6fce0cb
Show time on playback overlay (#336)
If enable, show the current time in the upper right corner of the
playback overlay/controls

Closes #219
2025-11-28 13:03:41 -05:00
damontecres
babfe011a1
Filter out invalid TV guide programs (#334)
Filters out TV programs that end before the guide start time. In theory,
the server shouldn't return these, but it seems to for some users.

Related to #276
2025-11-28 10:36:12 -05:00
damontecres
10c08c5515
Display episode even if season metadata is missing (#329)
Adds a simple fallback page to show an episode in cases when it doesn't
have an associated season due to missing metadata,see #280.

The missing metadata is probably a server bug, but it's good to have a
fallback anyway.
2025-11-28 09:41:09 -05:00
damontecres
c0237a6123
Few UI tweaks (#325)
- Move loading indicator to center of grid when changing filters so it's
more obvious
- Move 'remove' filter to top for the first filter dropdown for
consistency
- Use theme color for download progress indicator
- Show playback controls at the end of playing a video if there's
nothing up next
2025-11-25 16:36:33 -05:00
damontecres
0bfe3d2653
Move stream labels to top of description (#323)
Follow up to #279
Closes #162

Move the stream labels to the top under the dot-separated details. Also
move the rating up to the dot-separated details line and add it to home
page.
2025-11-25 15:51:30 -05:00
damontecres
5b96be6662
Updates to details pages including videos' stream details display (#279)
## Details

This PR updates the detail pages for Movies & TV Shows.

- Increase backdrop image size & brightness (now matches home page)
- Increase max width for titles
- Decrease max width for detail text
- Switch to using a customized display labels for video, audio, &
subtitle streams

Additional change for movie pages:

- Don't dim movie details text
- Move video stream details below play buttons
- Move first row up higher

### Labels

Instead of using the server provided `DisplayTitle`, create display
labels in-app. In general, this shortens the text without losing
significant detail. It is similar to the official app.

Some of the changes:
- Don't show "SDR", only "HDR"
- Simplify audio channel info, eg "Surround 5.1" => "5.1"
- Show chosen subtitle language
- Show chosen subtitle codec
- Show "(+#)" if there are additional audio or subtitle tracks
- Use gray background slightly tinted by the theme color

## Issues
Closes #239
2025-11-24 15:35:55 -05:00
damontecres
7be4fb5fdf
Fix possible TV guide crash & update Play All libraries (#315)
- Fixes a possible crash if the server has Live TV enabled, but no
channels
- Disable Play All/Shuffle for Collections "library"
2025-11-24 11:40:15 -05:00
damontecres
6004687deb
Fix black theme playback button highlighting (#314)
On the playback buttons, inverts the icon color when highlighted for
contrast.

Closes #295

<img width="518" height="109" alt="image"
src="https://github.com/user-attachments/assets/d689f347-a395-40e4-89e2-3122ab2a9e13"
/>
2025-11-24 10:01:19 -05:00
damontecres
7e21033f58
Adjust theme colors (#302)
Adjusts some theme colors for various controls

Fixes #295
2025-11-23 19:50:28 -05:00
damontecres
5fbe12e6cf
Fix crash when go backing too quickly (#309)
Fixes #306 

Also fixes network-on-main and potential concurrency issues
2025-11-23 17:19:01 -05:00
damontecres
78e7eb421f
Add ability to filter libraries, collection, etc (#308)
Adds a button to filter contents next to the sort button on grid pages

The filters are saved and restored you return to the page. It works with
#278, playing the filtered items in the sorted order.

The drop down menus for both sorting & filtering are updated to closer
match the overall look.

Filters for:
- Played or unplayed
- Favorite or not
- Genres
- Community (star) rating
- Parental rating
- Video type (HD vs SD, etc)
- Release year and/or decade
2025-11-23 10:40:18 -05:00
damontecres
50dc4b9a35
Play all or shuffle libraries, shows, collections, etc (#278)
Adds ability to play all (or shuffle play) most libraries, collections,
folders, TV series, TV seasons, etc

This adds buttons to play all or shuffle play at the top of grid pages
that support. Additionally, a shuffle button is added to TV Series
details. And play all or shuffle play is added when long clicking TV
seasons.

Note: Until #42 is completed, only the first 100 items will play
back-to-back

Closes #197
2025-11-22 18:40:08 -05:00
damontecres
9a3a33fdd3
Use full phases for skip buttons for better translations (#304)
Changes the skip segment button text to use a single phrase instead of
concatenating two strings. This allows correct context when translating.

Follow up from #292
2025-11-22 18:39:58 -05:00
Damontecres
eea650bb39
Fix debug page crash on Android <11 2025-11-22 14:07:52 -05:00
damontecres
78e6304571
Prep work for play store distribution (#301)
Allows for disabling in-app updates and more flexible tag/version codes
2025-11-22 12:57:47 -05:00
damontecres
df78b42bac
Easier initial setup for server URLs (#300)
Use the server scoring API when adding a new server. This allows just
entering a hostname or IP address without the scheme (`http`/`https`) or
port in most cases.

Note: non-standard ports would still need to be provided

Closes #5 
Closes #296
2025-11-22 12:48:39 -05:00
damontecres
20ab146c97
Update device profile for Jellyfin 10.11 (#293)
## Details

This PR updates the device profile used by ExoPlayer. It should more
accurately report support for HDR formats.

## Acknowledgements
This PR contains a commit (cd6351912af72d274b0baf50af4d777b986f0f46)
that has code copied and slightly modified from
https://github.com/jellyfin/jellyfin-androidtv `v0.19.4`.

Major acknowledgement & credit to the Jellyfin Android TV developers for
this code!

## Issues
Related to #15
2025-11-21 20:16:49 -05:00
damontecres
c600d2eb28
Few dev related fixes (#291) 2025-11-21 16:05:27 -05:00
damontecres
4bd202e013
Add two new themes (#266)
Adds "Bold Blue" and Black/OLED themes

Also tweaks Orange & Green a bit to make the borders stronger and
backgrounds darker/less colored

Related to #91
2025-11-21 15:18:43 -05:00
damontecres
ccc900cee7
Don't query for Live TV info if user does not have access (#286)
Fixes #281
2025-11-21 13:15:52 -05:00
damontecres
99e8b69c0e
Fix nav drawer focus when pressing back on home page (#274)
Fixes the nav drawer not being focused on when pressing back to open it
on the home page

Dev notes: I think the bug was introduced in #228 due to the new
`Column` not being focusable, but we don't need it to be since we want
to focus on the selected page.
2025-11-20 18:04:45 -05:00
damontecres
45567bf4eb
Variety of UI changes for grids, home page order, & tv guide (#272)
## Details
This PR ended up being larger than I meant. It contains some UI changes
and code organization.

## TV & DVR
- Uses the "Recordings" library position to order "Recently added in
Recordings" instead of Live TV position
- The times at the top of the TV guide are more distinguishable from
each other
- Removes the duplicate title on the Live TV->Recordings tab

## Other libraries
- Bare-bone support for "Music Video" libraries. Full support for "Music
Video" is work-in-progress in #267, but the libraries should be
browseable now.
- Bare-bone support for "Other" (aka Mixed Movies & TV Shows) libraries.
Note: this type of library is considered [broken and
deprecated](https://jellyfin.org/docs/general/server/media/mixed-movies-and-shows),
so this won't be expanded any further


## Grids
Updates various grid types to use poster vs wide cards. For example,
Favorite TV Episodes will use episode images in a wide card now.

## Issues
Closes #249 
Closes #271
2025-11-20 17:00:11 -05:00
damontecres
1f1d3443e3
Handle more remote & controller buttons during playback (#269)
## Details
Adds support for a few more media remote buttons

Adds support for common controller buttons

### Dev notes
Lifts the playback dialogs to the top level allowing them to be called
from anywhere during playback

## Issues
Closes #260
2025-11-20 12:29:17 -05:00
damontecres
d3a3a2093a
Fix a couple issues with transcoding (#261)
If playing with transcoding, changing tracks during playback will
continue to transcode instead of possibly switching to direct play.

Also support embedded subtitles that are being delivered externally.


Fixes #256
Fixes #257
2025-11-20 09:15:47 -05:00
damontecres
59fc88f395
Updates to TV guide UI (#263)
Reduces the size of the rows on the TV guide allowing for 7-8 rows to
show. Also hide the tab row if scrolled down on the guide.

Move the "watch live" button to be initially focused

Channels are sorted with favorites appearing first

Back button behavior is tweaked to move to start of row first, then top
of the guide, then normal back behavior

Closes #259 
Related to #250
2025-11-19 17:06:00 -05:00
damontecres
461fbe846c
Add extra debug info to overlay (#258)
Adds some extra info to the playback debug info overlay such as
ExoPlayer decoder names and transcode info
2025-11-19 14:58:57 -05:00
damontecres
4517dcd0cf
Simplify PlaybackViewModel (#252)
`PlaybackViewModel` was becoming very unwieldy at over 1,300 LOC. This
PR breaks it up and simplifies some fields so it's easier to work with.

There are no user facing changes
2025-11-18 19:18:38 -05:00
damontecres
1fd497d18c
Add playlist & collection specific grid layout UIs (#246)
Adds grid layouts specifically for playlists and collections/boxsets
instead of falling back to the generic grid.

In #238, the generic grid was updated to show 4 columns of 16x9 cards.
Now, collections will use 2x3 (poster) cards (like Movies) and playlists
will use square cards.

This also means collections & playlists have more relevant sort options.

Fixes #243
Closes #226
2025-11-18 17:20:28 -05:00
damontecres
cda5b118a3
Option to combine continue watching & next up rows (#192)
A real implementation for combining the `Continue Watching` and `Next
Up` rows on the home page.

It requires a query for every next up item, so it could become slow
especially for many items and larger servers. The app makes a best
effort to cache the information.

The order is determined by querying each episode in next up to associate
it to its immediately previous episode's last played date. Then both
continue watching & next up items are reversed sorted by the last played
data. So this only makes sense if you watch series in order.

Closes #19
2025-11-18 15:21:50 -05:00
Damontecres
2111699abc
Smaller maximum size for logo 2025-11-18 11:48:04 -05:00
damontecres
90956bd0e2
Fix several playback issues (#240)
Fixes issues introduced in #222:
- Switching tracks
- Downloading subtitles
- Trickplay
2025-11-17 22:08:26 -05:00
Damontecres
037e846599
Revert "Use useSeriesForPrimary"
This reverts commit f5f75f9e9e8f3316c689b85d3b8781c932a7c0ff.
2025-11-17 16:12:59 -05:00
damontecres
a9f2e684f1
Add logo to playback overlay (#172)
## Details

Adds the logo (if available) to the upper left corner of the playback
controls overlay.

I am still experimenting with how logos can be used on the details
pages. It's problematic because of the variety of colors, eg dark logos
can be hard to see on the dark background.

## Issues
Related to #92

## Screenshot
<img width="1280" height="771" alt="logo_playback Large"
src="https://github.com/user-attachments/assets/c6cb43fe-f3bc-42a4-9ef4-0397267e3073"
/>
2025-11-17 14:14:35 -05:00
damontecres
98fde1b65e
Better video grid, poster images, & home page images (#238)
- General video library grid now shows 16:9 cards
- Ensures the posters on Movie/TV show grid pages fill the bounds (TVDB
posters are often very slightly wider than 2x3)
- Always crossfade home page backdrop image

Related to #66
2025-11-17 13:44:03 -05:00