Add in-app & Android TV screensaver (#946)

## Description
Adds both an optional in-app and Android TV OS (DreamService)
screensaver

Has settings for:
- Starting delay, options from 30s to 1 hour
- Duration to show each image, 30s to 2 minutes
- Show clock (separate from app-wide clock)
- Toggle animated zooming
- Set a max age rating to limit what content is shown
- Included media types: movies, tv shows, and/or photos

By default only Movies & TV Shows are included. But if you have like
family albums on your server, you could enable Photos too.

There's also an button to start the screensaver so you can see what it
looks like.

### Related issues
Closes #230

### Testing
Emulator, Onn 4k pro, nvidia shield using both in-app and OS
screensavers

## Screenshots
![screensaver_settings
Large](https://github.com/user-attachments/assets/9b3240dd-81cb-4c20-bc4e-b2bf38698b2f)

## AI or LLM usage
None

## Acknowledgements

Some of the skeleton code for setting up the `DreamService` with the
right lifecycle was copied and modified from the [official app's
implementation](https://github.com/jellyfin/jellyfin-androidtv/blob/master/app/src/main/java/org/jellyfin/androidtv/integration/dream/DreamServiceCompat.kt).
This commit is contained in:
Ray 2026-02-25 14:11:00 -05:00 committed by GitHub
parent 536e8d366c
commit a7e86fbc15
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 954 additions and 78 deletions

View file

@ -276,6 +276,11 @@
<item quantity="one">%d second</item>
<item quantity="other">%d seconds</item>
</plurals>
<plurals name="minutes">
<item quantity="zero">%s minutes</item>
<item quantity="one">%s minute</item>
<item quantity="other">%s minutes</item>
</plurals>
<plurals name="movies">
<item quantity="zero">Movies</item>
@ -522,6 +527,19 @@
<string name="display_presets">Display presets</string>
<string name="display_presets_description">Built-in presets to quickly style all rows</string>
<string name="customize_home_summary">Choose rows and images on the home page</string>
<string name="start_after">Start after</string>
<string name="animate">Animate</string>
<string name="max_age_rating">Max age rating</string>
<string name="no_max">No max</string>
<string name="for_all_ages">For all ages</string>
<string name="up_to_age">Up to age %s</string>
<string name="screensaver">Screensaver</string>
<string name="screensaver_settings">Screensaver settings</string>
<string name="start_screensaver">Start screensaver</string>
<string name="duration">Duration</string>
<string name="photos">Photos</string>
<string name="include_types">Include types</string>
<string name="include_types_summary">What types of items to show images for</string>
<string name="content_scale_fit">Fit</string>
<string name="content_scale_crop">Crop</string>
<string name="content_scale_fill">Fill</string>
@ -673,10 +691,17 @@
<string name="search_and_download_subtitles"><![CDATA[Search & download subtitles]]></string>
<string name="no_subtitles_found">No remote subtitles were found</string>
<string name="series_continueing">Present</string>
<string name="in_app_screensaver">Use in-app screensaver</string>
<string-array name="backdrop_style_options">
<item>@string/backdrop_style_dynamic</item>
<item>@string/backdrop_style_image</item>
<item>@string/none</item>
</string-array>
<string-array name="screensaver_item_types">
<item>@string/movies</item>
<item>@string/tv_shows</item>
<item>@string/photos</item>
</string-array>
</resources>