## Description
Creates a `CompositionLocal` which tracks the current time in a single
place and is usable anywhere in the app.
Can be used such as:
```kotlin
val now = LocalClock.current.now
val details = remember(item, now) {
// Create detail strings based the item and current time
// This will be recomposed/updated whenever the time changes
}
```
### Related issues
Related to #475
- Switch to tv.material3.Button with ButtonDefaults for better styling
- Add opacity changes based on focus (0.85f focused, 0.2f unfocused)
- Keep selected letter fully visible when picker is unfocused
- Reduce button size from 24.dp to 14.dp to fit all letters
- Reduce spacing between letters (1.1.dp vertical, 2.dp horizontal)
- Use transparent backgrounds for unfocused letters
- Use border color for selected letter when focused, tertiary when
unfocused
- Add Box with CircleShape clip to prevent focus indicator overflow
- Reduce font size by 15%
- Add 16.dp end padding to push picker away from screen edge
When using the 'Show details' view option, the alphabet picker will
still overflow the bottom edge of the screen. I find this an acceptable
option though, as the backdrop pushes the card grid further down the
page.
Closes https://github.com/damontecres/Wholphin/issues/386
>[!NOTE]
> AI was used in the making of this PR
---------
Co-authored-by: Damontecres <damontecres@gmail.com>
Redesign Select Server and Select User screens with horizontal card
layout, similar to traditional streaming services
- Replace vertical lists with horizontal list of icons
- Center align text in Quick Connect and Username/Password modals
- Display Jellyfin profile images
- Fallback to first letter of username if no image is available
- Filter out duplicate server entries in the auto-discovery list
---------
Co-authored-by: Damontecres <damontecres@gmail.com>
## Description
This PR adjust the logic for audio & subtitle track selection for TV
series. Instead of only saving for future episodes if the newly selected
track is a different language than the user's preferred, always save it.
Basically this means if you change the audio or subtitle language for an
episode, the same audio or subtitle language will be used for future
episodes (if available).
Also, fixes the "default" subtitle mode to take the user's preferred
language into consideration.
## Issues
Follow up to https://github.com/damontecres/Wholphin/issues/378 &
https://github.com/damontecres/Wholphin/issues/427Fixes#469
**This is for MPV playback backend only!** Since this only works in MPV
for now, the option is not shown if using ExoPlayer.
Adds a setting (the gear icon during playback) to adjust the subtitle
delay.
A negative delay shows subtitles sooner. A positive delay shows them
later. For example, if a subtitle is supposed to show between
1000ms-2000ms, a negative 250ms delay will show it at 750ms-1750ms
instead.
The delay is persisted between plays of the same media & subtitle track.
Ref: #12

Moves the clipping of trickplay images from the image loading layer to
the composition/graphics layer.
Effectively, this PR loads and renders the entire trickplay image which
is then moved around to the right position and finally is clipped so
only a single tile is shown. Since moving the image around on screen
plsu clipping is 1) very fast and 2) done during recompositions, this
means it is _much_ faster at rendering each trickplay tile image and
Coil only has to load the image once.
Fixes#432
Use the SDK to get the device name since it handles older Android
versions and has a fallback.
This should not change the device ID or name if the device was working
before this change.
Maybe related to #454
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
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
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 #250Closes#288Fixes#439
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.
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
- 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
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
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#62Closes#379
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
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.

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

Dev note: the ExoPlayer implementation is bad code, don't write code
like this. It works though
- 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