* feat: Add versioning to categories
* feat: use random UID for categories.
For legacy and migration we should assign uid on insert, and modify existing one as well in the migration.
* feat: sync category metadata
Add version, uid and lastModifiedAt fields to Category model to allow syncing.
* chore: fix category merging logic
Improve the category merging logic by matching using UIDs first, with a fallback to matching by name for legacy remote categories.
Previously, categories were only matched by name, which could lead to incorrect merges if names were changed. This change ensures more accurate synchronization by prioritizing the unique identifier. Conflict resolution is now based on the `version` field, and logging has been added for better visibility into the merging process.
* refactor: prioritize UID when restoring categories
If a category with the same UID exists, update it instead of creating a new one. Fallback to matching by name if no UID match is found.
* chore: add isSyncing flag like before.
This make sure the version is consistent, and it's not accidentally appended by the trigger, if it does then one device will always be ahead, than previous, and they need to make multiple changes to increase the version.
* Apply suggestion from @jobobby04
Use SY specific numbers(601, 602 for now)
Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>
* chore: commit review, re-order.
* chore: surround changes in // SY --> // SY <--
* refactor: fallback to existing category UID if backup UID is 0 during restore.
when dealing with old backups (backups created before we added UIDs). In those old backups, backupCategory.uid defaults to 0.
If a user restored an old backup, it would match by name, and then overwrite the newly generated local UID with 0. This would break the synchronization.
* refactor: change to 6xx
* feat: improve sync reliability for categories and settings
- Refactor `mergeCategoriesLists` to correctly match categories by name when UID matching fails, ensuring better reconciliation across devices.
- Fix a bug in category merging where multiple categories with UID 0 (common for non-synced items) caused data loss.
- Update `SyncManager` to detect changes in categories, sources, preferences, saved searches, and extension repos, ensuring they synchronize even when the library favorites haven't changed.
- Convert `BackupCategory` and `BackupExtensionRepos` to data classes to support robust content-aware comparison during the sync process.
- Fix data loss in `mergeSourcesLists`, `mergePreferencesLists`, and `mergeSavedSearchesLists` by retaining local versions when conflicting with remote data.
* fix(sync): properly sync category deletions across devices
Previously, the sync system could not distinguish between a category that was deleted locally and a new category created on another device, causing deleted categories to be restored from the remote backup.
- Update `SyncService` to use `lastSyncTimestamp` to deduce if a missing local category was deleted (if modified before last sync) or newly created remotely (if modified after).
- Update `SyncManager` to explicitly delete local categories that are absent from the merged remote backup, propagating deletions to other devices.
- Fix `RestoreOptions` in `SyncManager` to respect the user's sync preferences instead of hardcoding `categories = true`.
* chore: change it to 6xx and not 600.
* chore: don't need to change this.
* chore: use kotlin time duration units
---------
Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>
* Add Filters to Updates screen
Behaves basically like the filters in the library:
- Unread: Show/Don't show unread chapters
- Downloaded: Show/Don't show downloaded chapters
- Started: Show/Don't show chapters that have some progress but aren't
fully Read
- Bookmarked: Show/Don't show chapters that have been bookmarked
Started behaves differently from its Library counterpart because the
actual manga data is not available at this point in time and I thought
calling getManga for each entry without caching would be a pretty bad
idea.
I have modelled this closely on the filter control flow in the
Library, but I'm sure this can be simplified/adjusted in some way.
* Move most filtering logic to SQL
Unread, Started, and Bookmarked filters are now part of the SQL query.
Download state cannot be filtered in the database so it remains in
Kotlin.
Because the Downloaded filter has to be run in Kotlin, the combine
flow uses the preferences flow twice, once to get the SQL query params
and once for the Kotlin filters (only Downloaded at this time).
* Add "Hide excluded scanlators" to update filters
Based on the work done in #1623 but integrated with the other filters
in this PR. Added the user as a co-author for credit.
Co-authored-by: Dani <17619547+shabnix@users.noreply.github.com>
---------
Co-authored-by: Dani <17619547+shabnix@users.noreply.github.com>
(cherry picked from commit bbe9aa8561360f030072fbc49f79748e71c6535e)
# Conflicts:
# CHANGELOG.md
# app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt
# data/src/main/java/tachiyomi/data/updates/UpdatesRepositoryImpl.kt
# data/src/main/sqldelight/tachiyomi/migrations/9.sqm
# domain/src/main/java/tachiyomi/domain/updates/interactor/GetUpdates.kt
* Add query to get chapter count by manga and chapter number
* Add functions to get chapter count by manga and chapter number
* Only count read chapters
* Add interactor
* Savepoint
* Extract new chapter logic to separate function
* Update javadocs
* Add preference to toggle new functionality
* Add todo
* Add debug logcat
* Use string resource instead of hardcoding title
* Add temporary logcat for debugging
* Fix detekt issues
* Update javadocs
* Update download unread chapters preference
* Remove debug logcat calls
* Update javadocs
* Resolve issue where read chapters were still being downloaded during manual manga fetch
* Apply code review changes
* Apply code review changes
* Revert "Apply code review changes"
This reverts commit 1a2dce78acc66a7c529ce5b572bdaf94804b1a30.
* Revert "Apply code review changes"
This reverts commit ac2a77829313967ad39ce3cb0c0231083b9d640d.
* Group download chapter logic inside the interactor GetChaptersToDownload
* Update javadocs
* Apply code review
* Apply code review
* Apply code review
* Update CHANGELOG.md to include the new feature
* Run spotless
* Update domain/src/main/java/mihon/domain/chapter/interactor/FilterChaptersForDownload.kt
---------
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
(cherry picked from commit ca968f162ef7a61a9036b7ab9bea407a6334801d)
# Conflicts:
# CHANGELOG.md
# app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt
# app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt
* Remove detekt (mihonapp/mihon#1130)
Annoying. More annoying in this project.
(cherry picked from commit 777ae2461e1eb277a3aa0c998ff69e4f100387a1)
* Add spotless (with ktlint) (mihonapp/mihon#1136)
(cherry picked from commit 5ae8095ef1ed2ae9f98486f9148e933c77a28692)
* Address spotless lint errors (mihonapp/mihon#1138)
* Add spotless (with ktlint)
* Run spotlessApply
* screaming case screaming case screaming case
* Update PagerViewerAdapter.kt
* Update ReaderTransitionView.kt
(cherry picked from commit d6252ab7703d52ecf9f43de3ee36fd63e665a31f)
* Generate locales_config.xml in build dir
(cherry picked from commit ac41bffdc97b4cfed923de6b9e8e01cccf3eb6eb)
* Address more spotless lint errors in SY
* some more missed
* more missed
* still missing, not sure while it won't report error when running locally
* one more
* more
* more
* correct comment
---------
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
* Work in progress upcoming feature
* Checkpointing WIP upcoming feature
* Functional Upcoming Screen
* Rename UpdateCalendar to UpdateUpcoming
* Converted Strings to resources
* Cleanup
* Fixed detekt issues
* Removed Link icon per @AntsyLich's suggestion.
* Detekt
* Fixed Calendar display on wide form factor devices
* Added Key to upcoming lazycolumn
* Updated tablet mode UI to support two column view
* Updated header creation logic
* Updated header creation logic... again
* Moved stray string to resources
* Fixed PR Comments and query refactor
* Tweaks to query, refactored to flow, comments on calendar
* Switched to Date Formatter
* Cleaned up date formatter
* More Refactor work
* Updated Calendar to support localized week formats
* Fixed year format
* Refactored Header animation
* Moved upcoming FAQ
* Completed YearMonth Migration
* Replaced currentYearMonth with delegate
* Even more cleanup
* cleaned up alignment modifiers
* Click Handler and other refactors
* Removed Wrapped Content Height/Size/extra clips
* Huge Refactor for CalendarDay
* Another cleanup attempt
* Migrated to new mihon.feature.* module pattern
* changed access modifier
* A Bunch of changes from the next round of reviews
* Cleanups
* Cleanup 2
---------
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
(cherry picked from commit 72222ad86d6fb328d20eead86c6357833d08c061)
# Conflicts:
# app/src/main/java/eu/kanade/domain/DomainModule.kt
# gradle/libs.versions.toml