Resolve conflicts: keep upstream GitHub workflows, adopt extension_store
migration as 46.sqm, move fork pages_read history column to 47.sqm, merge
DomainModule DI for ExtensionStore + fork features, and combine DE strings.
Co-authored-by: Cursor <cursoragent@cursor.com>
Add configurable library-update download modes (disabled, next X unread, all)
with settings UI and enqueue downloads after chapter sync completes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Extract a single ETA estimator, refresh library badges when history changes,
and expose a history revision stream for reactive updates.
Co-authored-by: Cursor <cursoragent@cursor.com>
MAL has a concept of "titles waiting for approval". These titles
cannot be added to user lists, but they do show up on the website and
crucially, in search results.
However, trying to add such an "unapproved" title will return a 400
error response with the error "invalid_content".
Previously, the awaitSuccess() call would mean the generic "HTTP 400"
toast would be shown. Now, a dedicated informative error message is
shown instead.
(cherry picked from commit af4f17efc54a00d9abe20e0d0b701d60c3531369)
Report sync failures that previously failed silently (e.g. null remote
backup) and show a library update error notification when a chained sync
blocks the update, including the sync failure reason.
Co-authored-by: Cuong-Tran <cuong-tran@users.noreply.github.com>
* ExtensionInstaller: Fix mistakenly canceling unrelated `waitingInstall` & avoid adding duplicate entry to installing `queue`
- Changes the installer queue from a synchronized list to a synchronized set to prevent duplicate entries.
- Updates queue removal logic to remove specific entries instead of using index-based removal.
- Refines `cancelQueue` logic to ensure the active installation is only cancelled if its download ID matches the requested ID.
* Ensure thread-safe access to the installation queue when canceling downloads
Introduce ReadingEtaPreferences and ReadingEtaLimits so library badges, reader series ETA, cross-manga history mining, and page-rate estimation share one configuration. Add reader settings sliders (EN/DE strings). Register preferences in PreferenceModule and wire GetCrossMangaPageRateHistorySamples.
Co-authored-by: Cursor <cursoragent@cursor.com>
* perform haptic before doing action
* Perform haptic feedback call in UI/main thread instead of IO
* Haptic feedback on both cases of long press action
* feat: Add sync events to SyncYomi
Now it will send the events back to `SyncYomi` server and then forward those to the notifications services that are enabled, such as discord, telegram, and etc.
* chore: fix build error.
(cherry picked from commit 2776e411272499eba2f91acfea3cb40dc0d4c622)
* Improve client management and response handling
---------
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
* Fix extension install/update stuck at pending (mihonapp/mihon#3000)
Co-authored-by: p
(cherry picked from commit 84265febf3ce24d71994ced2b81215f858430d4e)
* Fix lint
* Throw exception when Shizuku shell interface is unavailable during installation instead of silently doing nothing
* Properly close OkHttp response and streams
* Delete temporary extension file if failed to install
* Use ConcurrentHashMap for active jobs and steps to ensure thread safety when managing extension installation states across multiple coroutines.
* Use SupervisorJob to ensure that a failure in one installation job doesn't cancel the entire scope
* Don't use `:` in package name for safer filename
* Throw exception if asset file descriptor fails to open during extension installation
---------
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
* Fix migration's selected sources order not preserved
(cherry picked from commit 47816d4b218e6a62ef9fcd3097b6b0b8f2f95b17)
* Use indexed map for improved sorting performance
---------
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
Gitea may emit null for empty release notes or assets; enable
Json.coerceInputValues and defaults so update checks do not fail
deserialization (unrelated to release-note workflow length).
Co-authored-by: Cursor <cursoragent@cursor.com>
- Cap per-chapter samples used for averages at 45m (stats only).
- Prefer session ms/page extrapolation for current chapter so cumulative
DB read time over revisits no longer blows up duration/progress.
- Floor uncertain page rates using conservative ms/page until enough samples.
- Shared defaults in ReadingEtaDefaults for reader + library badge.
Co-authored-by: Cursor <cursoragent@cursor.com>
Persist per-session pages read in history, include it in backup/restore, and prefer a page-based ETA model so chapter-length variance (especially webtoons) is reflected more accurately.
Co-authored-by: Cursor <cursoragent@cursor.com>
Point in-app release checks/changelog links to the Forgejo fork and generate release notes against upstream komikku-app baseline commits for clearer fork-specific change visibility.
Co-authored-by: Cursor <cursoragent@cursor.com>
Register GetReadDurationEntriesByMangaIds in DomainModule so LibraryScreenModel can resolve it and the app no longer crashes on startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore: Refactor selection state management and improve performance across various screens
* **MigrateMangaScreen**: Refactor state management to use a `Set<Long>` of IDs for selection instead of a list of wrapper items.
* **LibraryUpdateErrorScreen**: Simplify `onErrorSelected` signature by removing the unused `userSelected` parameter and clean up related UI components.
* **Performance**: Use `remember(state.selection)` in `MigrateMangaScreen` for efficient selection status lookups.
* **Code Quality**: Fix minor typos (e.g., `inbetweenItem` to `inBetweenItem`) and optimize imports.
* Refactor selection logic to prevent redundant state updates
* Move early exit checks for item selection status outside or to the beginning of state update blocks to avoid unnecessary recompositions.
* Improve safety and correctness of item selection by returning early from state updates when an item index is not found.
* Standardize selection checks across `HistoryScreenModel`, `LibraryUpdateErrorScreenModel`, `MigrateMangaScreenModel`, `UpdatesScreenModel`, and `MangaScreenModel`.
* update selection when migration list got updated
* Update state management to reset selection and loading status on fetch failure
* use remember getUiModel
* update headerIndexes to use remember for state management
* Refactor LibraryUpdateErrorScreen to improve state management
* Move header index calculation from the screen model to the presentation layer.
* Optimize UI model and header index memoization using `remember(state)`.
* Remove redundant `LaunchedEffect` and simplify scroll-to-index logic.
* Refactor LibraryUpdateErrorScreen to enhance state management with derivedStateOf
* fix(trackers-mangadex): Handle nullability in `createMdListTrack`
* Return null instead of throwing exception in initial track creation
* Improve error handling in `createMdListTrack`
* Change exception to return null when track not found
* handle nullability in MangaDex tracking