Commit graph

1382 commits

Author SHA1 Message Date
JustinZeus
fa914845f4
Add option to hide the voice search button (#1423)
## Description

Adds a "Show voice search button" toggle to the search page's view
options dialog, alongside the existing "Combined search results" toggle.
When disabled, the voice search button is hidden from the search row,
taking it out of the D-pad focus path.

The new field `show_voice_search_button` is added to `SearchPreferences`
(default `true`). The serializer applies the default for new installs,
and a new entry in `AppUpgradeHandler` sets it to `true` for users
upgrading from earlier versions so existing behaviour is preserved.

### Related issues

Discussion: https://github.com/damontecres/Wholphin/discussions/1419

### Testing

Tested on an Android TV (1080p) AVD running API 34:

- Toggle on (default): voice search button visible at the top of the
search row.
- Toggle off: button disappears; only the search text field remains.
- Toggle back on: button reappears.
- Upgrade handler verified by spoofing `version.current.name` to an
older value in SharedPreferences and force-restarting the app; after
`needUpgrade()` fired, the toggle was on as expected.

The upgrade-handler entry currently uses `0.6.4-8-g0` (based on current
`main` HEAD); happy to bump this if you'd prefer a different target
version on merge.

## Screenshots

<img width="1920" height="1080" alt="pr1-01-home"
src="https://github.com/user-attachments/assets/0d5cdad0-5547-44f3-b4a5-5d15f71dddc0"
/>
<img width="1920" height="1080" alt="pr1-02-toggled-off"
src="https://github.com/user-attachments/assets/1e574229-0838-487d-b943-83d394a8193d"
/>

## AI or LLM usage

I used Claude to scaffold the proto/serializer/upgrade-handler/dialog
changes, mirroring the existing `combined_search_results` pattern. I
reviewed each diff before committing and tested the toggle manually on
the emulator, including the upgrade-handler simulation.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-21 15:31:17 -04:00
renovate[bot]
3880e562f6
Update dependency com.google.devtools.ksp to v2.3.8 (#1385) 2026-05-21 13:35:59 -04:00
renovate[bot]
f6ec54fa8c
Update Gradle to v9.5.1 (#1326) 2026-05-21 13:35:26 -04:00
JustinZeus
c82d36794f
Fix bottom padding in playback controls (#1422)
Fixes #1396.

The else branch of `when (nextState)` in PlaybackController added a 32dp
Spacer that left empty space below the controls when there were no
chapters or queue.

Possible follow-up: Pentaphon's idea of a "similar items" row in that
empty slot. Happy to put up a separate PR if useful.

## Testing

Verified on an Android TV (1080p) AVD running API 34 by playing a movie
with no chapters and no next-up item. With the fix, the bottom of the
control overlay sits the expected 8dp from the screen edge (the existing
parent padding). Also rebuilt without the fix and compared back-to-back
to confirm the Spacer was the cause.

The CHAPTERS and QUEUE branches were not modified.

## Screenshot
<img width="1920" height="1080" alt="case1-controls"
src="https://github.com/user-attachments/assets/18f50a87-a373-4f48-a9d4-f3c2a5cb2c00"
/>

## AI or LLM usage

I used Claude to help identify the file containing the bug and to
suggest the fix. I reviewed the diff before committing.
2026-05-21 12:43:49 -04:00
Damontecres
366483599c
Customize which ratings to display (#1407)
## Description
Adds a setting, Settings->Advanced->"Customize which ratings to
display", which allows for toggling parental, community, or critic
ratings to be displayed in the quick details.

This doesn't apply to discover yet.

### Related issues
Related to #1020

### Testing
Emulator

## Screenshots

### Just community rating
<img width="1280" height="720" alt="ratings Large"
src="https://github.com/user-attachments/assets/d6f9ad8a-6cc5-4680-9d2f-66d16a44b41e"
/>


## AI or LLM usage
None
2026-05-20 12:40:58 -04:00
Damontecres
45d466d76f
Add option to require server login for user profile (#1367)
## Description
This PR adds a new method of protecting a user profile when switching to
it: server login. When enabled, switching to the user requires
authenticating with the server again via Quick Connect or username &
password. This is basically the same as the official client.

### Related issues
Closes #321
Related to #1330 - might cause merge conflicts
Related to #1287 - definitely causes merge conflicts

### Testing
Emulator with various uses cases including auto sign-in, switching
between server login & PIN protection, and removing the protection

## Screenshots
N/A, the login looks identical as adding a new user

## AI or LLM usage
None
2026-05-20 12:00:02 -04:00
Damontecres
1463480e26
Update media3 to 1.10.1 (#1414)
Updates media3 to v1.10.1 & wholphin-extensions to v0.1.3

Fixes #1189
Fixes #1399
Replaces #1380
2026-05-19 19:02:53 -04:00
Damontecres
da7f7048e2
Enhancements to live TV guide/EPG (#1393)
## Description
This PR has some UI/UX updates for live tv epg/guide.

- Show program images, if provided by the EPG source
- Show channel name under logo
- Show & set favorite channels
- Adjusts the header to match the rest of the app (font, padding, etc)

Additionally, navigation around the guide has been rewritten. It is more
efficient and feels a bit more smooth to scroll around.

### Related issues
Closes #529

### Testing
Emulator mostly

## Screenshots
<img width="1280" height="720" alt="epg_new Large"
src="https://github.com/user-attachments/assets/c53c01be-9209-4c59-82cb-47f268811d3e"
/>


## AI or LLM usage
None
2026-05-19 14:11:55 -04:00
Damontecres
87a109c6b6
Add option for click to play continue watching/next up rows (#1405)
## Description
Adds an option under Settings->Customize home page->Settings, "Continue
watching/Next up click behavior":
- When disabled (the default), clicking goes to the item's details page
- When enabled, clicking starts playback for the item from its resume
position

This only applies to the continue watching, next up, or combined rows.
All other rows go to the details page no matter what.

### Related issues
Closes #1007

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-19 14:11:40 -04:00
Damontecres
59ccce9d54
Fix small UI issue with long stream labels (#1388)
## Description
Fixes a small UI glitch when the subtitle label is too long, it would
slightly increase the high of the labels. This is especially noticeable
on series details if some episodes have the long label and some don't
because the episode row will bounce up and down a few pixels.

Also moves the labels closer together and changes "Disabled" to "None"
when subtitles are turned off.

### Related issues
None

### Testing
Emulator & compose previews

## Screenshots
### Before
The subtitle label is slightly taller than the others
<img width="528" height="36" alt="image"
src="https://github.com/user-attachments/assets/32d322bc-11cc-4238-840c-03ae41b069d3"
/>


### After
The ellipse doesn't look great, but there's limited space and looks
better than being cut off.
<img width="510" height="37" alt="image"
src="https://github.com/user-attachments/assets/40af707c-3121-40c0-a978-60781d9704d6"
/>


## AI or LLM usage
None
2026-05-16 11:35:21 -04:00
Damontecres
f4bdb8446e
View more from home page & recommended rows (#1392)
## Description
Adds a card at the end of the rows on the home page and recommended tabs
to "View More" which goes to a grid of the items in the row.

The grid will endlessly scroll all of the available items except for a
few cases where the first 1000 are shown because the server does not
(yet) support pagination: genres, studios, people (added in v12), and
latest grouped tv shows.

Dev notes: This PR also rewrites the `RecommendedViewModel` and
consolidates the previous multiple view models into one.

### Related issues
Closes #1371
Closes #1035
Similar to #1198

### Testing
Emulator

## Screenshots
N/A, see #1198

## AI or LLM usage
None
2026-05-16 11:35:11 -04:00
Justin Caveda
98ffaf51ac
Search page improvements (#709)
## Description

Improves how search results are displayed:

- Reorders search categories to Movies → TV Shows → Episodes →
Collections, surfacing the most commonly searched content types at the
top.
- Adds a new "Combined search results" preference in Advanced settings →
Search. When enabled, shows all results in a single list instead of
separate categories.
- When Seerr is active, adds Library/Discover tabs to switch between
local library results and Seerr discovery results.
- Hides empty result categories instead of showing "No results"
placeholders.

### Screenshots

<img width="1935" height="1100" alt="Screenshot_20260116_113656"
src="https://github.com/user-attachments/assets/1e29aa3a-3ba2-4f86-ab61-fed683490474"
/>

<img width="1934" height="1095" alt="image"
src="https://github.com/user-attachments/assets/8b93fa38-d4c9-4e72-a997-caa82b4949f0"
/>

<img width="1921" height="1094" alt="image"
src="https://github.com/user-attachments/assets/82aed1a5-810c-413f-a266-6d78490a1534"
/>

### AI/LLM usage
Code auditing and PR description drafting with Claude Code. Also used
Claude Code for the regex.
2026-05-13 10:02:33 -04:00
Damontecres
f364ef9708
Release v0.6.4 2026-05-12 13:13:19 -04:00
Damontecres
1614ef7158
Translations 2026-05-11 (#1374)
Update translations as of 2025-05-11

Thank you to all of the contributors!
2026-05-12 13:11:33 -04:00
dudecuda
96f94feac2
libass-android lifecycle issue: Fixes #1049 (much of it) (#1362)
Fixed a bug with libass integration where the background thread
responsible for drawing the ASS subtitles (AssRenderThread) has been
shut down, but ExoPlayer is still actively running and trying to push
video time updates to it. Added fallback for software rendering on older
android versions that can have broken OpenGl implementation.This should
address much of issue #1049.

## Description
Essentially, debug logs showed repeated:
3145 3920 W MessageQueue: Handler (android.os.Handler) {4ba3c72} sending
message to a Handler on a dead thread
3145 3920 W MessageQueue: java.lang.IllegalStateException: Handler
(android.os.Handler) {4ba3c72} sending message to a Handler on a dead
thread

Essentially this was a lifecycle bug where the libass-android thread was
created, but was detaching from the window, shutting down when it does
so. It was still registered to ExoPlayer, but since there was no thread
to send to, it just repeatedly kept failing, never spinning back up to
display any subtitles. It seems just about any ui change can cause this
detachment, but in this case it seems it was right from the moment the
loading spinner shows up (making libass-android fail before video starts
playing).

Fixed by ensuring TextureView's visibility wasn't changed to invisible,
which ends up destroying the canvas that libass-android attaches itself
to. Hid the canvas using graphicsLayer (so the user can't see it, but
it's still alive and active). Also changed resizing logic to prevent
Android from seeing a 0x0 TextureView as "destroyed".

Since I discovered in testing how terribly my TV's OpenGl was handling
this, I added an additional fallback for Android versions < 9. Older
TV's can fallback to software rendering when using libass-android.

### Related issues
#### Issue #1049 : 
**Fixes:**
- the issue where libass-android (when enabled) fails to load any
subtitles in ExoPlayer DirectPlay.

**Not Fixed from issue #1049 :**
- Issues around accented characters.
- Any issues surrounding MPV (I have no way of testing, MPV never worked
on any player for me)
- Fallback mode (libass-android disabled) where subtitles aren't
rendering properly

**Added:**
- While testing, discovered older Android versions have trouble with
reliable OpenGl rendering. Thus I added a fallback for older Android
versions to use libass-android in software rendering mode
(AssRenderType.OVERLAY_CANVAS)

### Testing
- Tested and confirmed flawlessly to work on Android 9 TCL Smart TV
(AssRenderType.OVERLAY_CANVAS)
- Tested on Android 14 Chromecast (AssRenderType.OVERLAY_OPEN_GL).
Slightly less perfect (font not always a match, less fancy shadows) but
most ASS/SSA effects work well. May be worth testing other AssRenderType
options to compare features and performance on other machines.

## AI or LLM usage
Google Gemini Pro in tracing down the cause and fine-tuning the fixes.

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-11 17:49:08 -04:00
Damontecres
8b9b0ddec8
Fix two home row focus bugs (#1376)
## Description
1. Fixes when moving from nav drawer to home page content, focus would
sometimes move up a row
2. Fixes when moving up/down between rows, focus would sometimes move to
the later card (usually the last visible)

The second above is fixed by downgrading `tv-material` to
`1.0.1-alpha01`. Switching to
[`1.0.1-beta01`](https://developer.android.com/jetpack/androidx/releases/tv#tv-material-1.1.0-beta01)
or newer causes the bug. Not clear if its a bug in the library or
Wholphin though.

### Related issues
Fixes #1359

### Testing
Emulator

## Screenshots
N/A

## AI or LLM usage
None
2026-05-11 17:48:38 -04:00
Damontecres
4928c1156d
Fix cleaning up APKs on debug builds (#1373)
## Description
Directly use "Wholphin" when searching for older APKs to clean up.

On debug builds, the `app_name` string is "Wholphin (Debug)" but the APK
file names is always "Wholphin.apk", so I think the debug build won't
clean them up.

### Related issues
Fixes #1368

### Testing
Testing downloading a few times without this change, applied the change,
and clean up worked

## Screenshots
N/A

## AI or LLM usage
None
2026-05-11 11:12:05 -04:00
tal_sarid
9c41a7200e
Translated using Weblate (Hebrew)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:12 +00:00
tal_sarid
278dbe3774
Translated using Weblate (Hebrew)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:12 +00:00
tal_sarid
af39b9f596
Translated using Weblate (Hebrew)
Currently translated at 99.2% (548 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:12 +00:00
Codeberg Translate
21fd8e0a14
Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/
2026-05-11 14:27:12 +00:00
tal_sarid
aab0b62e83
Translated using Weblate (Hebrew)
Currently translated at 46.5% (257 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:12 +00:00
opakholis
c13d2f4129
Translated using Weblate (Indonesian)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-05-11 14:27:12 +00:00
idezentas
1bf72656c8
Translated using Weblate (Turkish)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-11 14:27:12 +00:00
tal_sarid
47f728f8b1
Translated using Weblate (Hebrew)
Currently translated at 44.0% (243 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:11 +00:00
tal_sarid
73cb8c60fe
Translated using Weblate (Hebrew)
Currently translated at 30.6% (169 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/he/
2026-05-11 14:27:11 +00:00
RafaelSoaresP
74698d2d4e
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt_BR/
2026-05-11 14:27:11 +00:00
arcker95
fb3f738f50
Translated using Weblate (Italian)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-05-11 14:27:11 +00:00
TheMatrixan
3627d29d33
Translated using Weblate (Polish)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-11 14:27:11 +00:00
American_Jesus
7d79bf3d3e
Translated using Weblate (Portuguese)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-05-11 14:27:11 +00:00
Priit Jõerüüt
e8b3203817
Translated using Weblate (Estonian)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-11 14:27:11 +00:00
North-DaCoder
95303ac2db
Translated using Weblate (German)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-11 14:27:11 +00:00
Outbreak2096
80c4b9e7b7
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-11 14:27:11 +00:00
lednurb
75212e7148
Translated using Weblate (Dutch)
Currently translated at 89.6% (495 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/nl/
2026-05-11 14:27:11 +00:00
SimonHung
cd058b2f37
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-05-11 14:27:11 +00:00
danpergal84
251b659ad3
Translated using Weblate (Spanish)
Currently translated at 100.0% (552 of 552 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-11 14:27:11 +00:00
TheMatrixan
c66b41d90d
Translated using Weblate (Polish)
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-11 14:27:11 +00:00
MrDog
04f7f1ac79
Translated using Weblate (Slovenian)
Currently translated at 86.5% (476 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sl/
2026-05-11 14:27:11 +00:00
randomsoftware
9767e3297e
Translated using Weblate (Arabic)
Currently translated at 29.6% (163 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/ar/
2026-05-11 14:27:11 +00:00
SimonHung
b0db3ce483
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-05-11 14:27:11 +00:00
MrDog
dbe788e7e9
Translated using Weblate (Slovenian)
Currently translated at 42.3% (233 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sl/
2026-05-11 14:27:11 +00:00
RafaelSoaresP
aaca10fbea
Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt_BR/
2026-05-11 14:27:11 +00:00
Outbreak2096
9afc07e77c
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-11 14:27:11 +00:00
TheMatrixan
8b92fceeae
Translated using Weblate (Polish)
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-11 14:27:11 +00:00
n8llcaster
d7cbc1c926
Translated using Weblate (Slovak)
Currently translated at 94.5% (520 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sk/
2026-05-11 14:27:11 +00:00
American_Jesus
2cb44090f6
Translated using Weblate (Portuguese)
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-05-11 14:27:11 +00:00
North-DaCoder
235a782621
Translated using Weblate (German)
Currently translated at 100.0% (550 of 550 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-11 14:27:11 +00:00
renovate[bot]
9ddce95e57
Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-test to v1.11.0 (#1299) 2026-05-11 10:27:07 -04:00
renovate[bot]
59af13d29e
Update Dependencies to v14.2.0 (#1335) 2026-05-11 10:26:43 -04:00
Brian Gunter
08db2b0efc
Accept digits in the PIN field in addition to l/r/u/d (#1330)
## Description
This enhances the PIN entry system by allowing users to input digits
using the numbers 0-9. This is useful for those using a keyboard or
universal remote with a number pad.

### Testing
Tested on Nvidia Shield Pro and Onn 4k Pro

## Screenshots
<img width="3840" height="2160" alt="Screenshot_20260429_083041"
src="https://github.com/user-attachments/assets/9e603bda-f1d3-4268-a04c-b077297fdfac"
/>

---------

Co-authored-by: Damontecres <damontecres@gmail.com>
2026-05-11 10:23:02 -04:00