Commit Graph

338 Commits

Author SHA1 Message Date
b23db4bab3 fix(player): keep seek bar thumb at target on release
Previously, the Slider's value was switched from the local sliderPosition to
the positionMs prop the instant onValueChangeFinished cleared isScrubbing.
Because the prop had not yet caught up with the committed seek, the thumb
visibly snapped back to the pre-seek position before jumping to the target.

Drive the slider from sliderPosition unconditionally, sync sliderPosition
from the prop via a LaunchedEffect only when not scrubbing, and pin
sliderPosition to the committed target before clearing isScrubbing in
onValueChangeFinished.
2026-06-21 11:17:16 +00:00
8ac0fd0bd1 feat(series): show season/episode context on play button and truncate subtitle
Enhance the series play button to display season and episode number alongside the play label when a next-up episode is available. Also constrain the subtitle text to a single line with ellipsis overflow to prevent layout issues from long subtitle strings.
2026-06-20 17:42:03 +00:00
1910a0c144 refactor(player): improve EmptyValueTimedVisibility and ValueChangeTimedVisibility components 2026-06-20 19:26:59 +02:00
217ba5b6d9 refactor(player): use mutableFloatStateOf for volume and brightness states 2026-06-20 18:38:59 +02:00
8a2702a7cb refactor(core/series): improve data loading reliability with concurrent initialization 2026-06-20 12:18:29 +00:00
05f58295ad fix(player): disable swipe gestures when player controls are shown 2026-06-19 18:11:13 +02:00
31f9fe5d4c refactor(ui): drop focus border from circular buttons
- Remove focusedBorderWidth/focusedBorderColor from CircularIconButton
- Add new CircularTextButton component
- Replace skip segment FilledTonalButton with CircularTextButton
- Clean up unused imports
2026-06-19 14:32:18 +00:00
34340c2bd4 feat(player): add controls visibility handling to PlayerGesturesLayer 2026-06-19 15:02:10 +02:00
54c895ff0f feat(player): track skippable segment type to gate intro and outro UI
Expose the active skippable segment type from the player state so the UI
can show the skip intro button only for intro segments and trigger the
next episode overlay when an outro segment is active.
2026-06-19 14:25:29 +02:00
1bd51d8a9f refactor(player): move controls auto-hide from ViewModel to composable layer 2026-06-18 20:05:35 +00:00
615e95db5c feat(player): add next episode overlay that appears 20s before episode end
Show an "Up Next" card with the next episode thumbnail, play overlay,
and title when within 20 seconds of the current episode ending.
Tapping it immediately starts the next episode from the playlist queue.

- Add nextEpisode field to PlayerUiState derived from queue
- Create NextEpisodeOverlay for mobile with artwork + title
- Create TvNextEpisodeOverlay for TV with D-pad focus support
- Integrate into both PlayerScreen and TvPlayerScreen
- Auto-focus overlay on TV when it appears
2026-06-18 16:34:39 +00:00
ccd5a7f50e refactor(series): remove unused Add button from series detail screen 2026-06-18 15:48:26 +00:00
d0149bf647 fix(search): auto-focus search field to open keyboard on screen open 2026-06-18 15:39:51 +00:00
def92ad111 feat(ui): add watched toggle to detail screens and home/library cards
Add mark-as-watched/unwatched bottom sheet actions to home screen
NextUp cards and library browse cards, and to library screen grid items.
Add a single-button watched toggle (with dual icon/color states) to
Movie, Episode, and Series detail screens. Inject
JellyfinMediaMetadataUpdater into all four affected ViewModels.
2026-06-12 17:47:14 +00:00
4a6977eefb feat(connectivity): add offline resilience with server reachability checks 2026-06-07 11:25:59 +00:00
3f9fd6e36e feat(card): replace dropdown menu with modal bottom sheet and add long-press
Replace the DropdownMenu popup in MediaImageCard with a ModalBottomSheet
that appears when the three-dot icon is pressed on ContinueWatchingCard
items. Also trigger the bottom sheet on long-press of the card.
Follows the existing ModalBottomSheet pattern from SeriesComponents.
2026-06-07 09:40:20 +00:00
10e7b450f3 fix(series): make season selector bottom sheet scrollable
Replace the non-scrollable Column with a LazyColumn in the season selector ModalBottomSheet so the sheet content scrolls when there are many seasons.
2026-06-06 17:37:47 +00:00
c81b228bb2 refactor(media): centralize detail scaffold content
Move duplicated media detail title, metadata, actions, synopsis, playback, and cast rendering behind MediaDetailScaffoldUiModel so screens only provide model data and optional trailing content.
2026-06-06 12:17:34 +00:00
f94bdc5bce feat(downloads): add DefaultTopBar to DownloadsScreen 2026-06-06 14:01:52 +02:00
4ade70a5de refactor(media): merge heroContent and content into single content lambda 2026-06-06 11:47:48 +00:00
dd66302da0 feat(series): replace season tabs with BottomSheet selector
Convert SeasonTabs from horizontal scrollable tabs to a clickable label that opens a ModalBottomSheet listing all seasons for selection.

- Removes unused LazyRow, itemsIndexed, rememberLazyListState imports
- Removes unused SeasonTab private composable and SeasonTabTagPrefix constant
- Adds ArrowDropDown and Check icon imports
- Adds OptIn(ExperimentalMaterial3Api) for ModalBottomSheet
2026-06-06 10:51:12 +00:00
753b461453 refactor(series): remove unused preview functions and imports from SeriesScreen 2026-06-06 12:40:07 +02:00
0bf968a42b feat(ui): make top bars scroll aware 2026-06-06 10:38:40 +00:00
005b3249ff refactor(series): remove unused PlayCircle icon from SeriesComponents 2026-06-06 11:40:21 +02:00
84157868d0 feat(series): show episodes as vertical list 2026-06-06 09:38:15 +00:00
25b65b9048 refactor(app/ui): refactor MediaDetailScaffold
Move everything into the Scaffold for simpler scrolling behavior

pass Modifier to heroContent and content composables
2026-06-06 11:30:03 +02:00
88e8b3a41f refactor(download): share download UI handling 2026-06-05 15:29:06 +00:00
1ad7bc4e23 feat: add exit confirmation dialog on back navigation 2026-06-04 20:57:38 +02:00
e72c421294 feat(playback): pause media playback when screen is in the background 2026-06-04 17:39:59 +02:00
9aec271aa4 fix(playback): manage playback state on activity lifecycle events 2026-06-04 17:39:59 +02:00
717bf3c8e1 fix(playback): Add clamp effect to brightness sliders 2026-06-03 20:59:47 +02:00
80ab591662 Simplify Jellyfin playback url retrieval 2026-06-01 20:54:20 +02:00
8064367e7a Revert "feat(player): enhance video aspect ratio handling and resize mode logic"
This reverts commit b7186be4
2026-05-27 18:40:44 +02:00
dedd4f1da5 fix(settings): update title text style to use titleMedium 2026-05-25 21:27:20 +02:00
b0ed32ef7c feat(series): improve season and episode loading handling 2026-05-25 20:40:10 +02:00
b226eaeba2 feat(downloads): update downloaded item handling 2026-05-23 18:45:27 +00:00
ef56db5d16 feat: redesign settings screen 2026-05-23 12:55:37 +00:00
6e90a9e225 feat(build): update debug and release update URLs in README and build.gradle.kts 2026-05-23 11:52:04 +02:00
8d73974add feat(build): add separate versionCode for debug build type
Renamed purefinVersionCode to purefinReleaseVersionCode and added purefinDebugVersionCode to allow independent version tracking for debug and release builds.
2026-05-23 09:31:47 +00:00
Purefin Dev
2e4eb2fb30 feat: add red debug icon and separate debug update URL
- Replace hardcoded vector fill color with @color/ic_launcher_foreground
- Override foreground to #E53935 (red) for debug builds
- Use manifest placeholders for build-type specific update URLs
- Update release URL to https://apks.t.bbara.hu/apks/purefin-app/update.json
- Add APK repository upload guide to README
2026-05-23 08:50:25 +00:00
4c15474ad9 feat(build): add debug build type with applicationId and version name suffixes 2026-05-22 21:17:20 +02:00
Barnabás Balogh
e82e370e48 Merge pull request #2 from bbara04/feat/brightness-auto-mode
feat/brightness-auto-mode
2026-05-22 18:52:44 +02:00
Purefin Dev
d14eec2346 feat(player): add adaptive brightness mode support
Extend the brightness slider to allow values below 0% which triggers
adaptive/auto brightness mode (screenBrightness = -1.0f). The brightness
indicator shows 'Auto' with an empty bar when in adaptive mode.

- Widen gesture range from [0,1] to [-0.1,1] so a small flick below 0 enters auto mode
- readCurrentBrightness returns -0.1f instead of 0.5f when system auto is active
- applyBrightness writes -1f to LayoutParams when value < 0
- PlayerAdjustmentIndicator displays 'Auto' in tertiary color for negative values
2026-05-22 16:46:22 +00:00
56da98a90b refactor(settings): remove Settings text 2026-05-22 13:42:42 +02:00
Purefin Dev
8da759257c refactor: replace collectAsState with lifecycle-aware collectAsStateWithLifecycle
Migrate all Flow state collection to collectAsStateWithLifecycle for proper lifecycle awareness, ensuring collection stops when the composable is not in the STARTED state.

- Added lifecycle-runtime-compose dependency to app and app-tv modules
- Replaced all collectAsState() calls with collectAsStateWithLifecycle()
- Updated initial parameter to initialValue for the lifecycle-aware variant
2026-05-21 19:47:58 +00:00
1274ab25f9 feat(app): expose test tags for Appium 2026-05-21 10:10:08 +02:00
b7186be46a feat(player): enhance video aspect ratio handling and resize mode logic 2026-05-14 21:44:50 +02:00
4b87f93dee Add Timber file logging and Jellyfin log upload 2026-05-14 18:06:54 +02:00
a0a51ef436 feat: add smart download management with enable and delete options 2026-05-14 14:09:35 +02:00
f60aba5a72 feat: update media selection logic to handle offline state in view models and DTOs 2026-05-14 12:56:48 +02:00