Commit graph

626 commits

Author SHA1 Message Date
damontecres
43703436c5
Switch back to older text input (#459)
Revert some of the changes to input text fields from #327. This PR
switches back to using the `value/onValueChange` variants for single
line input.

Fixes #413
2025-12-13 21:03:41 -05:00
damontecres
a386028b6b
Fix possible NPE during refresh rate switch (#448)
Use current thread's looper or fallback to the main looper for the
display change callback.

This is the behavior in newer versions of Android whereas older versions
assumed a non-null looper.

Fixes #446
2025-12-13 17:58:30 -05:00
damontecres
d2e1c4683d
Only use server provided aspect ratios if >0 (#453)
Fixes #451
2025-12-13 16:43:49 -05:00
damontecres
6edcfb1067
Customize TV guide display (#443)
Adds a view options button for the TV guide to allow some basic
customization:
* Show details header
* Adjust how channels are sorted
* Toggle color coding for programs

Related to #250 
Closes #288 
Fixes #439
2025-12-12 22:05:01 -05:00
damontecres
0d8800863b
Prefetch trickplay images (#445)
Prefetch trickplay images and cache them so that quick scrolling doesn't
require network calls and images will appear significantly faster

Fixes #432
2025-12-12 22:04:52 -05:00
Damontecres
652becd685
Disable pin check 2025-12-12 19:16:43 -05:00
Amar Sandhu
c3f6fd7f60
Add media information dialog. (#416)
Addresses #414

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2025-12-12 11:49:30 -05:00
damontecres
e381df0295
Add batch of translations (#425)
Update translations from
https://translate.codeberg.org/projects/wholphin/

---------

Co-authored-by: damontecres <damontecres@noreply.codeberg.org>
Co-authored-by: n8llcaster <n8llcaster@noreply.codeberg.org>
Co-authored-by: RabSsS <rabsss@noreply.codeberg.org>
Co-authored-by: Vistaus <vistaus@noreply.codeberg.org>
Co-authored-by: Priit Jõerüüt <jrtcdbrg@noreply.codeberg.org>
Co-authored-by: sarjona98 <sarjona98@noreply.codeberg.org>
Co-authored-by: SimonHung <simonhung@noreply.codeberg.org>
Co-authored-by: arcker95 <arcker95@noreply.codeberg.org>
Co-authored-by: streamyfinchris <streamyfinchris@noreply.codeberg.org>
Co-authored-by: opakholis <opakholis@noreply.codeberg.org>
Co-authored-by: Tellos <tellos@noreply.codeberg.org>
Co-authored-by: SuperCool <supercool@noreply.codeberg.org>
Co-authored-by: Pawsi <pawsi@noreply.codeberg.org>
Co-authored-by: American_Jesus <american_jesus@noreply.codeberg.org>
Co-authored-by: ictu <ictu@noreply.codeberg.org>
Co-authored-by: adambibor <adambibor@noreply.codeberg.org>
2025-12-11 13:03:27 -05:00
damontecres
2403a44c18
Add view option for hiding card titles (#422)
Adds a view option for grids to show/hide titles. It is enabled by
default.

Closes #403
2025-12-11 13:03:16 -05:00
damontecres
c5c0dff705
Fix subtitle smart mode to check chosen audio language (#420)
Fixes how the smart subtitle mode logic works

Fixes #406
2025-12-11 12:52:21 -05:00
damontecres
319b46983f
Play item directly when clicking play button on remote (#424)
On the home page or any grid, if focused on a "playable" item (movie,
episode, etc), pressing the Play or Play-Pause button on the remote will
immediately start playback.

Dev note: Also guards against an edge case where an item passed into
playback doesn't have media sources due to more limited item fields in
the query.
2025-12-11 12:52:13 -05:00
damontecres
c97553f82a
Support login for users without passwords (#421)
Just requires a username to be entered to enable the login button.

Fixes #419
2025-12-11 10:40:32 -05:00
damontecres
0f4254c6ec
Persist audio & subtitle track changes for series if in different language (#405)
This only applies if the user has set a preferred audio and/or subtitle
language on the web UI!

If the user chooses an audio/subtitle track that is a different language
than their preferred, it will be remembered for that series. Playback of
future episodes of the series will pick a matching language.

The audio & subtitle selections are independent. You can make the choice
before playback or during playback.

Closes #378
2025-12-11 10:16:45 -05:00
damontecres
7644b4c586
Minor UI changes (#407)
- Semi-bold the movies or series title on the details pages to match
home page
- Shows total subtitle track count if subtitles disabled
- Remove the springy animations from the play/watch/favorite/more
buttons
- Go back a page when playback finishes and there's nothing left in the
queue

Closes #393
2025-12-09 14:00:06 -05:00
damontecres
82927d1968
Remove PIN & sign-in auto settings (#397)
Unfortunately, I think the PIN and automatic sign-in features require
more thought before it should be rolled out as a stable feature.

This PR disables the two settings and removes them from the UI.

See discussions in #321 and will reopen #268
2025-12-08 10:13:51 -05:00
damontecres
fa141adc60
Ignore auto sign in if user has PIN (#392)
If the current user has a PIN, the sign in automatically setting is
ignored if the app is put in the background or restarted.

Follow up to #356 &
https://github.com/damontecres/Wholphin/issues/321#issuecomment-3621312496

I think the PIN protection needs some more thought overall.
2025-12-07 17:48:46 -05:00
damontecres
e0d50baf15
Fix bugs in #380 & #381 (#391)
Just a few minor bugs fixes introduced in recent PRs
2025-12-06 21:28:29 -05:00
damontecres
9e7742034a
Update style for ktlint 1.8 (#390)
Updated `ktlint`, so lots of code style changes, no user facing changes
2025-12-06 18:11:07 -05:00
damontecres
20bef8fb6a
Automatic refresh rate switching setting (#382)
Adds an advanced playback setting to enable automatic refresh rate
switching during playback

When enabled, the app looks at the available display modes, chooses the
best candidate, and attempts to switch to it. After playback ends, the
display is switched back to the original mode.

Closes #62
Closes #379
2025-12-06 16:35:43 -05:00
damontecres
e669f3ad59
Fix combining continue/next-up for new episode premieres (#381)
Better handling for combining continue/next-up by considering the
premiere date of the episode. So episodes will use the previously
watched one's last played date or the episode's premiere date, whichever
is newer.

This means when a new season comes out or the show returns from a break,
the new episodes will show earlier in the list like the next up rows
shows when not combined.

Fixes #377
2025-12-06 15:35:29 -05:00
damontecres
793f9802e4
Resize & reshape buttons (#380)
Adds a new button implementation which allows for icon buttons to be
circular. Overall the buttons are reduced in size.

Also, the playback controls are are reduced in size, buttons are smaller
and vertical padding is reduced.

![buttons
Large](https://github.com/user-attachments/assets/2211d00f-60a7-4a61-be51-a09046fc7433)
2025-12-06 15:35:17 -05:00
damontecres
ac10517028
Add setting for subtitle outline size (#375)
Adds a settings allowing for adjusting the thickness of unstyled
subtitle outlines, if outline is enabled.

This is applied for both ExoPlayer & MPV

Closes #179

![outline
Large](https://github.com/user-attachments/assets/dfef74a5-a4d4-49db-a8d2-231e46ab151e)

Dev note: the ExoPlayer implementation is bad code, don't write code
like this. It works though
2025-12-05 16:55:46 -05:00
damontecres
a197f6911b
Fixes to user interface (#374)
- Fixes a crash if the same person has multiple roles in an item
- Better tab focus behavior, especially on series pages
- Use consistent series production years on all pages
- Slightly decrease size and increase space on home page
2025-12-05 11:35:50 -05:00
damontecres
887b7b597e
Show people in epsisodes on series overview page (#373)
On the series overview page, show rows below the play/watch/favorite
buttons for cast & crew and guest stars in the episode


![episode_people](https://github.com/user-attachments/assets/2d469369-82d8-4338-9d56-325d4e49addf)
2025-12-04 21:12:53 -05:00
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
d0bfdac3bd
Fix version name from #350 2025-11-30 22:24:34 -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
arcker95
117d67240a
Translated using Weblate (Italian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2025-11-28 20:57:15 +00:00
Vistaus
dcfe0086c1
Translated using Weblate (Dutch)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/nl/
2025-11-28 20:57:15 +00:00
streamyfinchris
ffa423f4f2
Translated using Weblate (Swedish)
Currently translated at 85.1% (207 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sv/
2025-11-28 20:57:15 +00:00
damontecres
90db5820ba
Translated using Weblate (Spanish)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2025-11-28 20:57:15 +00:00
rcv11x
5ad66a1783
Translated using Weblate (Spanish)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2025-11-28 20:57:15 +00:00
damontecres
f1bcc57726
Translated using Weblate (Spanish)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2025-11-28 20:57:15 +00:00
Vistaus
0bef9045d4
Added translation using Weblate (Dutch) 2025-11-28 20:57:15 +00:00
arcker95
dd198de152
Translated using Weblate (Italian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2025-11-28 20:57:15 +00:00
arcker95
0e4f214f7a
Translated using Weblate (Italian)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2025-11-28 20:57:15 +00:00
SimonHung
e59cc30db0
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 99.1% (241 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2025-11-28 20:57:15 +00:00
RabSsS
aa67a15f29
Translated using Weblate (French)
Currently translated at 100.0% (243 of 243 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2025-11-28 20:57:15 +00:00