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
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
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#268Closes#321
## 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
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.
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#225Closes#178
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
Experimental MPV player backend
Related to #14, #22, & #85
You can switch to MPV in advanced settings and toggle using hardware
decoding or not.
This uses code and buildscripts from
https://github.com/mpv-android/mpv-android, plus other third party
libraries to build MPV
Closes#152
Adds a setting to enable one-click-pausing via the D-Pad center button.
It is disabled by default.
If enabled, when the video is playing, it will be pause and show the
controls which is just like pressing the Pause or Play/Pause button.
If enable, when the video is paused and controls is not showing, it will
resume playback including using the skip back on resume setting.
Closes#154
Adds a settings to show the current time in the upper right corner.
If enabled, it will also show the end time for the playback on the
overlay.
Adds an option to the show the next up during the end credits (outro)
instead of at the very end of the video.
The next up pushes up from the bottom and the video scales down to fit
above.
Still a WIP though
### Sample screenshot
<img width="1280" height="771" alt="next_up_credits Large"
src="https://github.com/user-attachments/assets/9a03d0ec-325d-4efe-a28e-51270ddaaa89"
/>
Closes#95
Adds a setting (defaults to enabled) to automatically go to a page when
the navigation drawer item is focused after a brief delay.
Basically, if you open the left nav drawer, and scroll down to "Movies"
after a brief delay (600ms), the app will switch to the Movies page
without having to click.
It can be disabled in advanced settings.
Related to #103
Adds ffmpeg decoder module to support a few extra audio formats such as
AC3, EAC3, DTS, & TrueHD.
This increases the apk size by about 5.4mb (release 17.4mb->22.8mb), but
definitely worth it for the added support.
Adds ability to send app crash reports to the last connected server. The
app prompts you before sending. There is an advanced settings to disable
this as well.
Additionally, there is an advanced settings button to send the app logs
to the current server.
The resulting reports can be found on the server's web UI under
Dashboard->Logs
If sharing the logs, make sure there's no private information present!
Adds a setting to configure pass out protection which, when enabled,
will stop auto playing next up episodes if the user hasn't interacted
with the app within the configurable 1-3 hours.
Fixes#10
Adds toggles to disable direct play of AC3 audio, ASS subtitles, and PGS
subtitles. Also a toggle to force down mixing audio to stereo.
This copies the behavior from the official client. I'm not sure if there
is a way to determine if direct playing AC3 is possible because it can
depend on devices other than the Android TV device such as a sound bar.
So it's up to the user to toggle off support if necessary.
Attribution: This PR uses on [code from the official
client](c775603df4/app/src/main/java/org/jellyfin/androidtv/util/profile/deviceProfile.kt).