* feat: native trickplay
TODO: update downloaded trickplay data
* chore: fix tv build
* fix: set dispatcher on image loading to remove flicker
* feat: download trickplay data
* refactor: simplify trickplay info by only loading a single resolution
* refactor: follow jellyfin naming of trickplay
* Add chapter markers and "skip chapter" on long press
* Fix linting problems
- Missing comma
- Unused import
- Comment block
* Add preferences options
* Drop chapter support for ExoPlayer
* Fix linting
* Remove Trailing spaces
* Remove TODO from marker color
* Move code to function
* Optimize imports
* Fix crash on episode skip
* Disable player control view animation
* Avoid crash when there are no chapters for media item
* Skip to next episode when skipping last chapter
* Load chapters from Jellyfin API instead of MPV Player
* Remove chapter gesture
* Fix build
* Fix linting
* Fix linting
* Support chapters with offline media
* Remove debug print
* Add chapter skipping
* Remove trailing spaces
* fix(chapters): display correct chapter while seeking
* refactor: faster and cleaner `getCurrentChapterIndex`
* refactor: seek to start of current chapter if player position is more than 5 seconds past start of chapter
* refactor: change "Matroska chapters" to just "Chapters"
The chapters feature also works for MP4 files so just make it generic
* Bump database version
* Add auto-migration for database version bump
* Save database schema
* chore: clean up
---------
Co-authored-by: Jarne Demeulemeester <jarnedemeulemeester@gmail.com>
* Add AddServerScreen
* Upgrade androidx-compose-material3 and androidx-compose-ui to alpha
* Add DiscoveredServerComponent
* Show discovered servers
* Add navigation using compose-destinations
* Implement Loginscreen
* Start of HomeScreen
* Use coil for home screen images and update layout with spacers
* Select correct startRoute based on conditions
* Upgrade compose material3 to 1.1.0-alpha05
* Add series title, max 1 line, padding
* Upgrade dependencies
* Switch to TvLazyColumn and TvLazyRow
* Add header to `HomeScreen`
* Add progress bar to Continue watching items
* Limit the number of lines under Movie or Show and use correct episode text
* chore: run ktlintFormat
* ci: assemble tv
* feat: `LibraryScreen`
* fix: update to reworked items system
* chore(deps): update androidx-paging-compose and compose-destination
Also fix lint issue on HomeScreen
* feat: start using androidx.material3 composables
* feat: add coil svg
* feat: experimenting with cards
* lint: fix linting issues
* feat: server select screen
* build: upgrade dependencies
* lint: run ktlintFormat
* feat(ServerSelectScreen): add "No servers found" text
* feat: update AddServerScreen
* feat: implement `UiText.asString()` composable
* lint: run ktlintFormat
* refactor(phone): remove livedata from `ServerSelectScreen`
* feat: add `UserSelectScreen`
* feat(UserSelectScreen): load user's profile picture
* feat: update LoginScreen
* feat: update progress indicator on `AddServerScreen`
* fix: change color of `ServerComponent`
* style(ServerSelect): use material typography
* chore: update ktlint config in build.gradle
* style: use material typography
* refactor: move home screen to separate layout function so it can be previewed
- Introduce dummy items
- Fix `UiText.asString()` composable
* refactor: preview `LibraryScreen`
* refactor: preview `ServerSelectScreen`
* refactor: preview `AddServerScreen`
* refactor: preview `UserSelectScreen`
* refactor: preview `LoginScreen`
* lint: run ktlintFormat
* feat: switch servers
* feat: main screen tabs navigation
* feat: add Live TV tab (not shown for now)
* chore: remove libraries from `HomeViewModel`
* chore: change colors of selected tab
* feat: new item card component
* chore: remove `HomeItem.Libraries`
* style: update spacing
* feat: add findroid icon and profile button on main screen
* style(main): add gradient background
* fix: use "latest" + library name in home screen
* fix: navigate from LoginScreen and UserSelectScreen to MainScreen
* style: update tab colors
* fix: remove reference to `HomeItem.Libraries` from `ViewListAdapter`
* chore: update kotlin compiler to 1.5.0
* feat: add horizontal item card variant
* feat: `LibrariesScreen`
* feat: `LibraryScreen`
* fix(`LibraryScreen`): remove hardcoded library name
* feat: `MovieScreen`
* feat(`MovieScreen`): Make trailer button work
Also hide the button when there is no trailer
* refactor(`MovieScreen`): move click logic out of layout
* refactor: create `FindroidImages` which holds all image uris
* build: upgrade androidx.tv to 1.0.0-alpha08
* chore: update compose libraries
* chore: update compose compiler to 1.5.1
* fix(ItemCard): only show progress when horizontal
* refactor: clean build.gradle.kts
* build: up minSdk to 28 and targetSdk to 34
* refactor: use spacings to provide paddings (#443)
* feat: add Spacings in MaterialTheme
* style: use MaterialTheme.spacings in layouts
Using sizes in Spacer & padding & PaddingValues to standardize it.
* fix: linting issues and a few paddings
* feat: use spacings in `LibraryScreen`
* feat: use spacings in `MovieScreen`
* fix: missing trailing comma
* refactor: replace hardcoded spacer in ItemCard with spacing
---------
Co-authored-by: Jarne Demeulemeester <jarnedemeulemeester@gmail.com>
* build: migrate to ksp and upgrade compose compiler
* build: upgrade compose libraries
* fix: align with main codebase
* chore: update agp to 8.1.3
* chore: update ksp and compose-destinations
ksp 1.9.10-1.0.13 -> 1.9.20-1.0.14
compose-destinations 1.9.51 -> 1.9.54
* refactor(UserSelectViewModel): use channel for events
* feat: basic video player
First implementation of the video player.
Uses the basic player view with no custom layout.
Only media keys are passed to the PlayerView.
* feat: show screen
Still a work in progress
* fix: make player background black
* fix(player): keep screen on
* feat: add border around focused tab
* lint: run ktlintFormat
* feat: focus improvements
* feat: logo for main screen
* fix: remember tab position
* feat: add loading indicator to main screen
And fix home and libraries screen list refresh on navigating back
* feat: add seasons to show screen
* feat: add season screen
* feat: add progress badge
* chore(deps) update dependencies
android-plugin 8.1.3 -> 8.1.4
androidx-activity 1.8.0 -> 1.8.1
androidx-media3 1.1.1 -> 1.2.0
coil 2.4.0 -> 2.5.0
kotlinx-serialization 1.6.0 -> 1.6.1
* ci: upload tv artifacts and don't build universal apks
* chore: get rid of deprecated android.defaults.buildfeatures.buildconfig
* build: upgrade dependencies
android-plugin 8.1.4 -> 8.2.0
androidx-room 2.6.0 -> 2.6.1
androidx-work 2.8.1 -> 2.9.0
jellyfin 1.4.5 -> 1.4.6
compose compiler 1.5.4 -> 1.5.5
* fix: workManagerConfiguration is now a property
* feat: add profile picture to main screen
* feat: start of settings screen
* refactor: base tv theme on normal compose material theme
* chore(deps): update kotlin to 1.9.21
kotlin 1.9.20 -> 1.9.21
ksp 1.9.20-1.0.14 -> 1.9.21-1.0.15
compose-compiler 1.5.5 -> 1.5.6
* feat(settings): add categories and pop backstack when navigating to main screen
* feat(settings): nested settings and switch setting
* feat(settings): settings select component
* feat(settings): icons for cache and about
* feat(settings): add option to toggle mpv player
* feat(settings): move preference value logic to viewmodel
* feat(settings): add dependencies
* chore: update compose compiler
compose-compiler 1.5.6 -> 1.5.7
* feat(settings): add settings detail select card
New sub settings screen with different layout
Settings detail select card to select an option
* feat: play episode from home screen
* feat(player): basic custom overlay
Courtesy of Android TV JetStreamCompose sample
* feat(player): add track selection dialog
* feat(player): add media session and clean up dpad events
* refactor(mpv): implement track selection via TrackSelectionParameters
Need to add ability to disable track type
* feat: implement watched and favorite buttons
* refactor: remove unused PreferenceType enum
---------
* refactor WIP: stop using `BaseItemDto` but use custom items specific to Findroid
This will make it easier to support downloaded items
* refactor: split `MediaInfoFragment` into `MovieFragment` and `ShowFragment`
* feat: add download icons to items
* feat WIP: download movies
* feat: download movie and play local file
* fix: remove `VideoVersionDialogFragment` from `ShowFragment`
* feat: select which version you want to download
* feat: delete downloaded movie
* feat: download progress indicator
* refactor: rename JellyfinItems to FindroidItems
* feat: offline mode (movies only)
* feat: offline mode card
* feat: download external files
* feat: toggle played on downloads
* feat: convert intros to `FindroidIntro`
* refactor: add itemId and sourceId to external downloaded subtitle filenames
* refactor: simplify `onMediaItemTransition`
* refactor: clean up some player item logic
* feat: download trickPlay data
* refactor: downloading of item to only require the item and a source id
* fix: external subtitle title
* feat: add `DownloadsFragment`
* feat: download episodes
* fix: cascade deletion if last item
* feat: download intro timestamps
* feat WIP: add storage activity
* feat: user data in separate table
* feat: add buttons to season fragment
* fix: improve responsiveness of the watched and favorite buttons
* fix: move `ic_database.xml` to main
* perf: optimize home fragment by limiting the number of items
* fix: database improvements
- use compound primary key for FindroidUserDataDto instead of id
- set played to false when playback percentage is below 90%
- capitalize SQL keywords
- update favorite in userdata
- set primary key of TrickPlayManifestDto to itemId
- prepare to sync data back to server
* feat: sync playback progress
This includes playback position, played and favorite
* fix: use non-transitive r classes
* lint: ktlint fix
* refactor: centralize item buttons in `item_actions.xml`
* feat: show intermediate progress when progress is less than 5
Also remove delete button from item_actions.xml
* feat: remove intros
* feat: check available storage space before downloading
* fix: trailer button
* refactor: make indexNumberEnd nullable
* feat: add offline mode toggle in settings
* fix: download over mobile data and roaming
* feat: immediately show spinner when tapping download
* revert: season fragment buttons
* feat: snackbar in downloads fragment
This snackbar is displayed when there is no connection to the server but the app is not in Offline Mode (Offline Mode is required to play content when the server is unavailable)
* refactor: make onReceive arguments non nullable
* fix: handle download finished / failed when BroadcastReceiver does not work
* fix: download multiple episodes
* feat: download to external storage (SD card)
* fix: reset download button when dialog is dismissed
* feat(offline): show "continue watching" episodes on home
* fix: watch progress bar on episode item in season
* feat(offline): next up items
* lint: fix some linting issues
* lint: fix some linting issues
* lint: fix some linting issues
* feat: remove StorageActivity
StorageActivity is not ready yet and out of scope for this PR
* fix: collection types that are not known crash the media fragment
* fix: downloading trick play data
* fix: sort downloaded items
* fix: navigate back if item is deleted instead of showing error
Navigate back based on NullPointerException in loadData method of viewmodels. This may not be the best approach but it works well enough.
Navigating back from BottomSheetFragment does not trigger onResume of previous fragment which in turn does not refresh its contents.
* fix: play from local storage instead of server when downloaded
* fix: missing items
* fix: `SyncWorker` using the app JellyfinApi instance instead of it's own
* fix: only show downloaded items when navigating from `DownloadsFragment`
* fix: make chips horizontal scrollable
* feat: migrate database (retain) and downloads (wipe)
Also add indexes on seriesId and seasonId
* fix: remove temp testing in downloadsMigrated
* lint: fix some linting issues
* fix: add error handling to downloading item
* feat: add "Preparing download" dialog to make sure the user waits for the download to start
* refactor: first show dialog then start downloading
* fix: add error handling to user configuration in `PlayerViewModel`
* feat: allow downloads to be cancelled
* fix: "View details" is cut off when text is too long
* lint: fix indent
* Scrubbing Preview
Add Jellyscrub plugin support
* Fix syntax
* Some adjustments
Rounded corners
Fix switch
* refactor: switch to `StateFlow`
* refactor: remove `FrameLayout`
* refactor: move trick play retrieval to `onMediaItemTransition`
Only load trick play data for current item
Make it async
---------
Co-authored-by: Jarne Demeulemeester <jarnedemeulemeester@gmail.com>
* Fix playback progress when playback has already started
Before, if an item had playback progress when the download was started, the player would jump to the end of the item immediately when playing from downloads.
* Fix syncing playback progress when remote is ahead
* Fix playback progress when playback has already started
Before, if an item had playback progress when the download was started, the player would jump to the end of the item immediately when playing from downloads.
* Fix syncing playback progress when remote is ahead
* Update android-plugin to v7.4.0
* Set Java version to 11
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jarne Demeulemeester <jarnedemeulemeester@gmail.com>
* Split app into core and app:phone
* Use global versionCode and versionName
* Clean up gradle dependencies
* Use string formatting inside getString function
* Move proguard file to app:phone
* Move app_navigation and BasePlayerActivity to app:phone
* Add buildTypes to core gradle and remove buildFeatures
* Add suffix core to core namespace
* Split code into 4 more modules: data, preferences, player:core and player:video
* Clean up some gradle files
* Clean up data gradle
* Remove duplicate Constants.kt
* Use AppPreferences in more places
* Split off strings
* Remove unused animations
* Make about_libraries strings non-translatable
* Move mpv assets to player:video module
* Make AppPreferences a Singleton