- Removed redundant `clip` and `size` modifiers from `CollectionCardRemoteImage` in `ProfileIdentityCard` and `AvatarChoiceItem`.
- Used `Modifier.fillMaxSize()` to inherit parent shape constraints, fixing the touch offset issue on iOS devices without affecting Android.
- Applied `Modifier.fillMaxSize()` to `CollectionCardRemoteImage` inside `PopupProfileBubble` and `ActiveProfileMiniAvatar`.
- Removed redundant clipping layers that displaced the touch area for Native iOS views within the bottom navigation and popup switcher.
- Replaced explicit `size` and `clip` modifiers with `Modifier.fillMaxSize()` on `CollectionCardRemoteImage`.
- Resolved an iOS-specific bug where extra Compose clipping layers caused the UIKitView hit-box to shift away from its visual bounds.
- Restored accurate touch targets by relying on the parent Box's constraints.
- Removed redundant `clip` and `size` modifiers from `CollectionCardRemoteImage` in `ProfileIdentityCard` and `AvatarChoiceItem`.
- Used `Modifier.fillMaxSize()` to inherit parent shape constraints, fixing the touch offset issue on iOS devices without affecting Android.
- Updated `ProfileIdentityCard` to use `CollectionCardRemoteImage`.
- Configured `animateIfPossible = true` to provide real-time animated previews during profile creation or customization on iOS.
- Integrated `CollectionCardRemoteImage` into `PopupProfileBubble` and `ActiveProfileMiniAvatar`.
- Set `animateIfPossible = true` to ensure consistent GIF playback within the bottom navigation tab and popup switcher on iOS.
- Maintained existing layout sizes and clip shapes for visual consistency.
- Replaced Coil's `AsyncImage` with `CollectionCardRemoteImage` inside `ProfileAvatarCard`.
- Passed `animateIfPossible = true` to allow iOS to utilize the existing custom native GIF decoding engine used in collection poster.
- Ensured zero behavioral impact on Android as the component maps back to Coil under the hood.
- Add New Episode / New Season badge to the Continue Watching next-up
cards, matching the NuvioTV implementation. Badge fires when a new
episode has aired after the user's last watched timestamp and within
the 60-day recency window.
- Filter shows that are marked as 'dropped' on Trakt from the Continue
Watching in-progress list, next-up seed candidates, and the
enrichment disk cache, matching NuvioTV behaviour.
- Add AirDateUtils.kt with calculateReleaseAlertState() and
parseReleaseDateToEpochMs() helpers used for both badge logic and
correct next-up sort ordering when a release alert is active.
- Persist isReleaseAlert / isNewSeasonRelease in CachedNextUpItem so
badge state survives cold starts without waiting for a full re-fetch.
- Extend translations for the badge strings (airs today / tomorrow /
in N days / on date) across de, el, es, fr, id, it, nb, pl, pt, tr,
cs and the default English strings.
- Add unit tests for parseReleaseDateToEpochMs, calculateReleaseAlertState
inputs/outputs, formatReleaseDateWithoutYear, isoCalendarDateOrNull,
daysUntilExplicitRelease, and isoEpochDay.
- Add New Episode / New Season badge to the Continue Watching next-up
cards, matching the NuvioTV implementation. Badge fires when a new
episode has aired after the user's last watched timestamp and within
the 60-day recency window.
- Filter shows that are marked as 'dropped' on Trakt from the Continue
Watching in-progress list, next-up seed candidates, and the
enrichment disk cache, matching NuvioTV behaviour.
- Add AirDateUtils.kt with calculateReleaseAlertState() and
parseReleaseDateToEpochMs() helpers used for both badge logic and
correct next-up sort ordering when a release alert is active.
- Persist isReleaseAlert / isNewSeasonRelease in CachedNextUpItem so
badge state survives cold starts without waiting for a full re-fetch.
- Extend translations for the badge strings (airs today / tomorrow /
in N days / on date) across de, el, es, fr, id, it, nb, pl, pt, tr,
cs and the default English strings.
- Add unit tests for parseReleaseDateToEpochMs, calculateReleaseAlertState
inputs/outputs, formatReleaseDateWithoutYear, isoCalendarDateOrNull,
daysUntilExplicitRelease, and isoEpochDay.
After cherry-picking pass3 changes on top of the 3 merged i18n PRs:
- Combined imports & merged code from both versions where compatible
- For CollectionEditorRepository.kt: kept pass3 version entirely (cleaner
scope.launch + getString flow vs runBlocking in #1025)
- For SubmitIntroDialog.kt: kept #943 convention (_label/_button suffixes)
- For TmdbCollectionSourceResolver.kt: merged all imports (#1025 + pass3)
- For PlayerControls.kt: kept #943 submit_intro_action key
- For PlaybackSettingsPage.kt: kept #943 pre-loaded invalidKeyMessage
- For CollectionEditorScreen.kt: kept new tmdb_country_placeholder key
- Added missing import in SubtitleRepository.kt
Strings.xml result: 1709 EN ↔ 1709 FR, 0 missing, 0 orphan, 0 vouvoiement.
After cherry-picking pass3 changes on top of the 3 merged i18n PRs:
- Combined imports & merged code from both versions where compatible
- For CollectionEditorRepository.kt: kept pass3 version entirely (cleaner
scope.launch + getString flow vs runBlocking in #1025)
- For SubmitIntroDialog.kt: kept #943 convention (_label/_button suffixes)
- For TmdbCollectionSourceResolver.kt: merged all imports (#1025 + pass3)
- For PlayerControls.kt: kept #943 submit_intro_action key
- For PlaybackSettingsPage.kt: kept #943 pre-loaded invalidKeyMessage
- For CollectionEditorScreen.kt: kept new tmdb_country_placeholder key
- Added missing import in SubtitleRepository.kt
Strings.xml result: 1709 EN ↔ 1709 FR, 0 missing, 0 orphan, 0 vouvoiement.
- Refactored `AppearanceLanguageBottomSheet` in `AppearanceSettingsPage.kt` to use a `LazyColumn` instead of a standard `Column`.
- Wrapped the sheet title inside an `item` block and used `itemsIndexed` to render the language options.
- This resolves an issue where the language list was truncated and unscrollable, particularly in landscape mode or when the list of translations grows.
This commit introduces the `values-in/strings.xml` file to support Indonesian translations specifically for Android.
It is necessary to keep both `values-id` and `values-in` in the codebase due to platform differences. iOS uses the modern ISO code `id` for Indonesian, whereas Android relies on the older `in` code. Providing both directories guarantees that the Indonesian localization works seamlessly across both iOS and Android platforms.