Commit graph

1373 commits

Author SHA1 Message Date
f9c0da2e08 Add unit tests and migrate legacy per-row spacing on decode
Restores TestHomeRowSamples.kt (sample-data + sanity tests that
survived an earlier soft-reset on disk but never got staged). Updates
the RecentlyAdded sample to use the new cardSizeMultiplier and
spacingMultiplier fields.

Adds InterfaceHelpersTest.kt covering:
- Int.withinBoundsOrDefault (in-range, below-min, above-max, boundary
  equality) for both CardSize and Spacing preferences.
- resolveCardHeight (newly extracted pure helper underneath the
  composable resolvedCardHeight): sentinel 0, legacy 172, explicit
  per-row override, multiplier path.
- InterfaceCustomization.cardHeightDp / spacingDp math.
- migrateLegacyRowSpacing: absent / default / non-default / snapping /
  clamping / does-not-overwrite-existing-multiplier.

Adds migrateLegacyRowSpacing in HomeSettingsService and wires it into
decode(): when a row's raw JSON still carries the legacy "spacing"
field (from before this PR deleted the absolute spacing data field),
translate the value into the new spacingMultiplier so users keep the
same visual gap after upgrade.

Extracts resolveCardHeight as a pure helper from the @Composable
resolvedCardHeight so the resolution math is testable without the
Compose runtime.
2026-05-28 10:05:21 +02:00
1f9188abc0 Restore per-row Card size and Spacing as multipliers; drop legacy spacing field
Per-row card size and spacing return to HomeRowSettings, reframed as
percent multipliers that compound with the global Display Size sliders
instead of the old absolute heightDp / spacing values. Display Presets
continue to set absolute heightDp for special cases (Favorite Episode,
Compact, etc.); the multiplier applies on top of whatever base is in
effect for that row.

HomeRowViewOptions:
- Drops the unused absolute `spacing: Int = 16` field.
- Adds `cardSizeMultiplier: Int = 100` and `spacingMultiplier: Int = 100`.
- `heightDp` stays as the per-row absolute set by Display Presets.

resolvedCardHeight() in InterfaceHelpers now layers the multiplier on
top of the existing per-row vs global resolution.

HomeRowSettings exposes Card size and Spacing sliders for each row
(range 50-150, step 5, default 100) under "General". Genre rows keep
their stripped-down options list and skip both. On HomePage, the
per-row spacingMultiplier compounds with the global Spacing slider for
that row's inter-card gap.
2026-05-28 10:05:21 +02:00
3060887756 Fix Card size slider for users with legacy stored heightDp
HomeRowViewOptions is serialized to the user's Jellyfin server.
Existing users have rows with heightDp == 172 (the pre-PR default)
persisted upstream. Without this guard, resolvedCardHeight() would
treat 172 as a per-row override and the Card size slider would do
nothing on the home page until the user explicitly reset their rows.

Treat the legacy 172 value as "no override" so users coming from older
builds see the slider take effect immediately on home rows.
HEIGHT_2X3_DP is now the base value the global multiplier scales
from; no preset sets heightDp to exactly 172. HEIGHT_EPISODE (128)
and other preset values remain valid per-row overrides because they
are not equal to 172.
2026-05-28 10:05:21 +02:00
9fc46a80b4 Route card height and spacing through global preferences
Replaces hardcoded card heights and the per-library Spacing slider
with reads from LocalInterfaceCustomization. Home rows split the
previous single horizontalPadding arg into a fixed leading-edge
contentPadding (BASE_SPACING_DP.dp) and a slider-driven cardSpacing.
CardGrid grows a contentPadding so its leading edge stays flush
regardless of the spacing slider.

The ViewOptionsSpacing slider in ViewOptionsDialog (grid + list) and
CollectionViewOptionsDialog is removed - the global Spacing slider
covers all browse-density tuning. ViewOptions.spacing remains as a
type-driven base (16/4/2 dp for GRID/LIST/DENSE_LIST, set by the type
setter) and is multiplied by the global Spacing percent at the
list-view consumer site. The Increase / Decrease all card-size
shortcuts in HomeSettingsGlobal are also removed (superseded by the
global Card size slider).

Episode-card heights also scale with the global Card size slider via
a new InterfaceCustomization.episodeCardHeightDp helper. Direct
consumer sites (ExtrasRow, MovieDetails similar-items, PersonPage
episode row, SearchPage EPISODE_ROW results) read it. Preset-set
absolute heights (Favorite-Episode preset, etc.) stay as overrides.

Adds HomeRowViewOptions.resolvedCardHeight() to InterfaceHelpers.kt -
the composable resolver bridging per-row heightDp overrides and the
global slider. HomeRowViewOptions.heightDp default flips from
Cards.HEIGHT_2X3_DP (172) to 0, the new sentinel meaning "use the
global value".
2026-05-28 10:05:21 +02:00
8fb301c2bb Add Display size customization page
Consolidates UI sizing into three percentage sliders surfaced through a
new Settings -> Interface -> Display size page: UI scale (50-150%),
Card size (50-150%), Spacing (25-175%). Each persists immediately via
DataStore; the rest of the app reflects them through
LocalInterfaceCustomization and a root-level LocalDensity override in
MainContent.

The page mirrors HomeSettingsPage's two-column shell: a fixed-width
settings panel on the left, HomePageContent rendering live preview rows
on the right. The page snapshots its own density on entry so the slider
rail stays fixed while UI scale changes the rest of the app.

Includes a one-shot AppUpgradeHandler migration block for installs at or
before 0.6.4-31-g0 that resets the three new percent fields to their
defaults.
2026-05-28 10:02:08 +02:00
Damontecres
81e5f31401
Workaround for resource shrinking w/ split ABIs 2026-05-27 13:56:18 -04:00
Damontecres
30837d0a9a
Release v1.0.0 2026-05-27 13:05:32 -04:00
Damontecres
1da72c5df2
Translations as of 2026-05-27 (#1471)
Updates translations as of 2026-05-27

Thank you to all of the contributors!
2026-05-27 13:05:18 -04:00
Damontecres
967295fd5e
Fix linting 2026-05-27 12:56:46 -04:00
Outbreak2096
428f58b1e3
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (575 of 575 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-27 12:53:18 -04:00
idezentas
64d6579cae
Translated using Weblate (Turkish)
Currently translated at 100.0% (575 of 575 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-27 12:53:18 -04:00
Priit Jõerüüt
40b080ce32
Translated using Weblate (Estonian)
Currently translated at 100.0% (575 of 575 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:18 -04:00
danpergal84
696af7b39d
Translated using Weblate (Spanish)
Currently translated at 100.0% (575 of 575 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:18 -04:00
thotranhuu99
0dbf172742
Added translation using Weblate (Vietnamese) 2026-05-27 12:53:18 -04:00
TheMatrixan
c5fc26bbff
Translated using Weblate (Polish)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-27 12:53:17 -04:00
opakholis
445ed91275
Translated using Weblate (Indonesian)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-05-27 12:53:17 -04:00
danpergal84
fb8b516239
Translated using Weblate (Spanish)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:17 -04:00
JoschiGrey
caa0e769da
Translated using Weblate (German)
Currently translated at 99.8% (572 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-27 12:53:17 -04:00
idezentas
a29dcd2ea0
Translated using Weblate (Turkish)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-27 12:53:17 -04:00
Outbreak2096
8271d7a486
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-27 12:53:17 -04:00
TheMatrixan
4ac2024318
Translated using Weblate (Polish)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-27 12:53:17 -04:00
SimonHung
08a0f3f247
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-05-27 12:53:17 -04:00
ymir
e6e5502cdc
Translated using Weblate (French)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-05-27 12:53:17 -04:00
Priit Jõerüüt
f2b87c9e36
Translated using Weblate (Estonian)
Currently translated at 100.0% (573 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:16 -04:00
nofkclue
8e124846a3
Translated using Weblate (German)
Currently translated at 99.6% (571 of 573 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-27 12:53:16 -04:00
Priit Jõerüüt
99560439ad
Translated using Weblate (Estonian)
Currently translated at 100.0% (570 of 570 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:16 -04:00
danpergal84
8618fbc6e6
Translated using Weblate (Spanish)
Currently translated at 99.8% (569 of 570 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:16 -04:00
idezentas
9d6197671e
Translated using Weblate (Turkish)
Currently translated at 100.0% (570 of 570 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-27 12:53:16 -04:00
SimonHung
dcb71a48fd
Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (569 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hant/
2026-05-27 12:53:16 -04:00
TheMatrixan
3f5ffdb865
Translated using Weblate (Polish)
Currently translated at 100.0% (569 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pl/
2026-05-27 12:53:16 -04:00
idezentas
96e670cc17
Translated using Weblate (Turkish)
Currently translated at 100.0% (569 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-27 12:53:16 -04:00
Outbreak2096
5543a78421
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (569 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-27 12:53:16 -04:00
Priit Jõerüüt
4580b2598a
Translated using Weblate (Estonian)
Currently translated at 100.0% (569 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:16 -04:00
danpergal84
8f6ce83cd3
Translated using Weblate (Spanish)
Currently translated at 99.8% (568 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:15 -04:00
Timer
25bf0ee574
Translated using Weblate (German)
Currently translated at 98.2% (559 of 569 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-27 12:53:15 -04:00
mashu
da685142a8
Translated using Weblate (Serbian)
Currently translated at 1.2% (7 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/sr/
2026-05-27 12:53:15 -04:00
idezentas
e64ab11a2e
Translated using Weblate (Turkish)
Currently translated at 100.0% (566 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/tr/
2026-05-27 12:53:15 -04:00
Outbreak2096
8c20c57595
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (566 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-27 12:53:15 -04:00
Geekice
debc810cd3
Translated using Weblate (Italian)
Currently translated at 99.4% (563 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/it/
2026-05-27 12:53:15 -04:00
Priit Jõerüüt
19912b9e0c
Translated using Weblate (Estonian)
Currently translated at 100.0% (566 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:15 -04:00
danpergal84
07bddc5efa
Translated using Weblate (Spanish)
Currently translated at 100.0% (566 of 566 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:15 -04:00
Priit Jõerüüt
e352cce894
Translated using Weblate (Estonian)
Currently translated at 100.0% (560 of 560 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/et/
2026-05-27 12:53:15 -04:00
pavel-miniutka
88b569c156
Added translation using Weblate (Belarusian) 2026-05-27 12:53:14 -04:00
Outbreak2096
5380bc18bc
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (560 of 560 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/zh_Hans/
2026-05-27 12:53:14 -04:00
danpergal84
a438733af9
Translated using Weblate (Spanish)
Currently translated at 100.0% (560 of 560 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/es/
2026-05-27 12:53:14 -04:00
ymir
a09f0ffabd
Translated using Weblate (French)
Currently translated at 100.0% (557 of 557 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/fr/
2026-05-27 12:53:14 -04:00
opakholis
0bdbd2e84d
Translated using Weblate (Indonesian)
Currently translated at 100.0% (557 of 557 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/id/
2026-05-27 12:53:14 -04:00
American_Jesus
c6729df112
Translated using Weblate (Portuguese)
Currently translated at 100.0% (557 of 557 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/pt/
2026-05-27 12:53:14 -04:00
Wit Krittawit
a4789fcaca
Translated using Weblate (Thai)
Currently translated at 100.0% (557 of 557 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/th/
2026-05-27 12:53:14 -04:00
nofkclue
0cf1ac4bb4
Translated using Weblate (German)
Currently translated at 100.0% (557 of 557 strings)

Translation: Wholphin/Wholphin
Translate-URL: https://translate.codeberg.org/projects/wholphin/wholphin/de/
2026-05-27 12:53:14 -04:00