Commit graph

8776 commits

Author SHA1 Message Date
littlecodedragon
6316b85a09 fix(release): tolerate Forgejo null body/assets in release JSON
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>
2026-05-11 07:04:04 +02:00
littlecodedragon
c15d280cb4 feat(eta): cross-manga page-rate priors for reading time left
All checks were successful
Forgejo Release Builder / release (push) Successful in 5m53s
Blend series-local ms/page with samples from completed chapters in other
titles (similar page counts via ±15%/±30% bands). Removes fixed ms/page
floors; adds SQL query + estimator + DI wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 02:59:22 +02:00
littlecodedragon
07019175d1 fix(eta): tame reading-time estimates (idle + cumulative history)
- 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>
2026-05-11 02:28:28 +02:00
littlecodedragon
fe43d3ef2c Reader: track per-page history metrics for ETA and backups
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>
2026-05-09 18:35:41 +02:00
littlecodedragon
384aee7372 Release: use fork update source and upstream-based changelog delta
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>
2026-05-09 18:29:15 +02:00
littlecodedragon
b26a537d55 Fix DI registration for read-duration history interactor
All checks were successful
Forgejo Release Builder / release (push) Successful in 17m1s
Register GetReadDurationEntriesByMangaIds in DomainModule so LibraryScreenModel can resolve it and the app no longer crashes on startup.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-09 12:20:27 +02:00
littlecodedragon
25137641c1 Fix ETA history duration mapping for library compile
Some checks failed
Forgejo Release Builder / release (push) Failing after 7m34s
2026-05-07 06:35:29 +02:00
littlecodedragon
780ef2af25 Fix library ETA compile by adding history interactor
Some checks failed
Forgejo Release Builder / release (push) Failing after 8m38s
2026-05-07 06:08:52 +02:00
littlecodedragon
48436e3c46 feat(reader): restore series ETA tracking and estimated time left
Some checks failed
Forgejo Release Builder / release (push) Failing after 5m28s
2026-05-06 22:04:16 +02:00
Cuong-Tran
bdf81596e9
chore: Avoid race conditions and improve bulk selection (#1606)
* avoid race conditions

* Improve Bulk selection

* Consolidate selection mode updates and list clearing into a single state update.
2026-04-23 16:30:55 +07:00
Cuong-Tran
d8eb71e004
chore(UI): Use remember getUiModel (#1605)
* 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
2026-04-23 15:19:54 +07:00
MediocreLegion
80ea323281
fix(delegate): migrate NH to the v2 api (#1582)
* fix(delegate): migrate NH to the v2 api

* bump versionId

* remove versionId requirement

* gemini review suggestions

* remove dead code

* remove unused imports

* linging

* unneeded comment

* fix(delegate): migrate NH to the v2 api (jobobby04/TachiyomiSY#1581)

* fix(delegate): migrate NH to the v2 api

* remove extra comment

* remove redundant data

* linting

* Code cleanup

---------

Co-authored-by: Jobobby04 <jobobby04@users.noreply.github.com>
(cherry picked from commit eec1236b8b5904b46d79bb716e29f073c6fe9b34)

* close `response`

* Avoid empty server list

---------

Co-authored-by: Jobobby04 <jobobby04@users.noreply.github.com>
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-04-22 13:31:05 +07:00
Cuong-Tran
26d3be95e3
feat(UI): Mask WebDAV password while typing (#1564)
* Refactor

* feat(UI): Mask WebDAV password while typing

* fix: allow space as password

* use coroutines for asynchronous setting
2026-04-16 14:01:49 +07:00
Cuong-Tran
fd60bc7f13
fix(MangaDex): Fix nullability issues in track creation for MangaDex (#1527)
* 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
2026-04-16 12:52:51 +07:00
Cuong-Tran
6f06974524
feat: split "sync on add" into separate metadata and chapter fetch preferences (#1563)
* feat: split "sync on add" into separate metadata and chapter fetch preferences

* refactor: remove redundant SnackbarHostState and error snackbars when auto sync entries

* clean other languages strings
2026-03-17 13:09:48 +07:00
Cuong-Tran
3fa1cf9e07 chore(deps): Automate app shortcuts with shortcut-helper plugin
- Revert shortcuts setup with `com.github.zellius.shortcut-helper`
- Switch to komikku-app/android-shortcut-gradle:0.2.0
2026-02-24 12:11:58 +07:00
Cuong-Tran
78f9cf65c0 feat(navigation): Allow clearing search when Back on Extensions Screen (#1506) 2026-02-20 18:17:44 +07:00
Cuong-Tran
a09e55270c (chore): Don't wrap an intent-chooser inside another intent-chooser (#1505) 2026-02-20 17:02:46 +07:00
Cuong-Tran
7380e77b5c feat(theme): Support Dynamic theme for Android 11 and below (#1504) 2026-02-20 12:02:31 +07:00
Cuong-Tran
fe7b10f941
feat(migration): Allow skipping smart search for single entry migration (#1496)
* feat(migration): Allow skipping smart search for single entry migration

Introduces a "Smart search" setting when migrating a single manga, allowing users to choose between an automated best-match search or manual selection directly.

* ensure manual migration is only triggered once

* Add UI toggle

* refactor pref
2026-02-20 08:49:51 +07:00
Cuong-Tran
36c1c642ca
fix(recommends): Handle crash due to null manga case in RecommendsScreenModel (#1495) 2026-02-13 13:53:11 +07:00
Cuong-Tran
4292b22743
fix(logging): Fix xLog crash (#1494) 2026-02-13 12:31:53 +07:00
Syabit
dd3b19fa89
fix(notifications): paused notifications not showing (#1468)
* fix(notifications): paused notifications not showing

* docs(notifications): clarify notification dismissal and add comment for paused notifications

* refactor

---------

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-02-10 13:54:36 +07:00
Cuong-Tran
b68444f3cb
fix(ExH): Fix CF cookies interceptor (#1485)
* fix(ExH): Fix CF cookies interceptor

* No need getting cookies from system webview
2026-02-10 12:51:57 +07:00
MajorTanya
513e5e8dd3 Add src:local search alias for Local Source (mihonapp/mihon#2928)
(cherry picked from commit cf93afab4526bf7dc336b9eaec93a45181785ff1)
2026-02-09 10:24:19 +07:00
MajorTanya
34102027d1 Clean up some build warnings (mihonapp/mihon#2929)
* Replace deprecated rememberPlainTooltipPositionProvider

* Remove superfluous when branch

This when is marked as exhaustive.

* Replace deprecated LibrariesContainer call

AboutLibraries now wants us to produce the libraries ourselves.

* Replace deprecated ClipboardManager with Clipboard

Clipboard uses suspend functions, hence the coroutine scope addition.

* Use multi-dollar strs to simplify GraphQL queries

These have been available since Kotlin 2.1.

* Remove various redundant casts & conversions

- WebViewScreenContent: loadingState is in the LoadingState.Loading
  branch, no need to cast at all
- Bangumi: username is not modified, make val
- Kavita: token is already a String
- PagerViewerAdapter: insertPageLastPage is already null-checked
- PagerViewerAdapter: use reified filterIsInstance
- ReaderViewModel: chapter IDs are already Longs
- CloudflareInterceptor: webview is smart-cast to non-null here

* Replace deprecated MenuAnchorType

Literally just a typealias for ExposedDropdownMenuAnchorType anyway.

* OptimizeNonSkippingGroups is enabled by default

* Suppress shadowing warning

This is explicitly intentional according to the KDocs.

* Migrate Context Receivers to Context Parameters

Requires changing the compiler arg, but that is part of the migration:

https://blog.jetbrains.com/kotlin/2025/04/update-on-context-parameters

Apparently, the only visible change is that names are required now.
"_" can be used for anonymous context parameters.

* Fix expression bodies with explicit return

Naming conflict resolved by aliasing.

From 2.4/2.5 onward, these will only be allowed with explicit return
types, or have to be turned into a block body. I opted for the latter
since the function is reasonably dense already.

see: https://youtrack.jetbrains.com/issue/KTLC-288

* Suppress deprecation of non-AutoMirrored icons

We use these arrows for navigation in the Upcoming screen.
I strongly doubt the AutoMirrored versions would make sense for our
use-case.

* Explicitly opt-in to new annotation default rules

affects the following annotated value-parameters:
- Preference.SliderPreference.steps (`@IntRange`)
- ReaderViewModel.State.brightnessOverlayValue (`@IntRange`)
- ReadingMode.iconRes (`@DrawableRes`)
- MigrationListScreenModel.Dialog.Progress.progress (`@FloatRange`)

see: https://youtrack.jetbrains.com/issue/KT-73255
see: https://github.com/Kotlin/KEEP/blob/change-defaulting-rule/proposals/annotation-target-in-properties.md

Warning message was the following:

    This annotation is currently applied to the value parameter only, but in the future it will also be applied to field.
    - To opt in to applying to both value parameter and field, add '-Xannotation-default-target=param-property' to your compiler arguments.
    - To keep applying to the value parameter only, use the '@param:' annotation target.

(cherry picked from commit b543bc089a442c5e93b0fb6c83bc4037740b1eb5)
2026-02-05 22:56:31 +07:00
MajorTanya
0d712e4365
Add "src:" prefix to search by source ID (mihonapp/mihon#2927)
Allows users to search for the exact source ID in their library.

Similar to the Browse > Migrate screen, but filtered in the Library,
where users can take all the usual actions.

Could be used in the future to change the search behaviour of tapping
the source name in the title info view to search by the ID with this
prefix.

(cherry picked from commit 4e4bdffdf38043418685ab42b177c8476842c83c)
2026-02-03 18:06:57 +07:00
Kudomaga
696908f94b
feat(sync): Add WebDAV synchronization service (#1104)
* Add WebMAV synchronization service

* extract custom client builder

* validation

* FIX: If the subfolder does not exist, create it first.

* FIX: Handle existing folders more leniently.

* refactor

* Fix strings

* lint & comment

* Default file name & log

---------

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-02-03 15:36:57 +07:00
David Brochero
e7bdbb5794
feat: option to auto sync metadata and chapter list when adding to library (#1091)
* feat: auto-fetch chapter list when adding to library

* simplify impl

* IO context (gemini suggestion)

* don't trigger NoChapterException

* add option to settings

* linting

* fix: fetching on bulk

* add kmk comment

* fix exception handling

* linting again

* feat: also sync metadata

* fix: rebase issues

* remove KMK comment

* Use `manga` instead of `new` so its title got updated with source's `getMangaDetails`; also reset chapterFlags

---------

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-02-02 16:47:34 +07:00
David Brochero
c7e0585c6f
feat(tracker): add support for EnhancedTracker to merged sources (#932)
* fix: add support for `EnhancedTracker` to merged sources

* ref: readability

* fix: use only sources specific to the merged title

* fix: don't match using name

* formatting

* don't block, suspend

* Move merged source out of EnhancedTracker

* Extract Injekt

* Return first accepted merged manga

* Move getMergedSources to SourceManager and update usages accordingly

* simplify code

---------

Co-authored-by: Cuong-Tran <cuongtran.tm@gmail.com>
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-02-02 12:17:23 +07:00
Cuong-Tran
8f57f4a5a0
feat(history): Allow multi/range-selection and batch reset for history items (#1437)
* feat(history): Allow multi-selection and batch reset for history items

* Use chapterId instead of history.id

* use remember getUiModel

* Toolbar selection mode

* cleanup History

* Replace selectedChapterIds with selection for chapter selection state

* Remove userSelected parameter from selection logic and related function signatures

* remove parentheses

* Fix range selection

* longclick on cover too

* disable clear-history button when none-selected
2026-02-02 11:21:32 +07:00
Cuong-Tran
f373818d93
feat(history): Add Filters to History screen (#1433)
* Add Filters to History screen

* Revert favorite condition
2026-01-28 16:43:07 +07:00
MajorTanya
3e7dc5c41a Add Filters to Updates screen (mihonapp/mihon#2851)
* 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 mihonapp/mihon#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>

---------

* Merge Panorama toggle into Filter diaglog
* Make Panorama toggle persistent and share it with History
* Implement toggleSwitch method for preference management to avoid create new function on every composition

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>

(cherry picked from commit bbe9aa8561360f030072fbc49f79748e71c6535e)
2026-01-28 12:41:18 +07:00
Jobobby04
1e39a8d4db Cleanup
(cherry picked from commit 08d6c604bc65755ec635c4cc425b4adf0284c4ee)
2026-01-27 13:46:06 +07:00
Jobobby04
e0340be73c Minor fixes
(cherry picked from commit b8b468cea7f1d117f54331780d75584bff9cf644)
2026-01-27 13:46:06 +07:00
Jobobby04
ad9736a2ba Lanraragi delegation
(cherry picked from commit 3ae6c0131b2a975c8e517c4de00e65a3637b01cc)

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-01-27 13:24:20 +07:00
NGB-Was-Taken
db22e8add3 Add handling for previously unhandled preferences (delegated MD) (jobobby04/TachiyomiSY#1524)
* Include romanized titles of the original language in description

* Implement handling for `finalChapterInDesc` preference.

* Handle `preferExtensionLangTitle` preference when fetching manga details.

* Address some warnings, clean up unused code and spotless apply.

(cherry picked from commit 582d0ef1219ae2a2e1dd275d969b35a2e5511a73)

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-01-27 12:47:35 +07:00
Jobobby04
8828da80b7 Use ComposeStars from RatingBar library.
(cherry picked from commit 01e8c6cc12f6345ad780d31033b2ef739bf959b3)
2026-01-26 14:33:10 +07:00
NGB-Was-Taken
1ac96825c4 Add preference to toggle chapter URL hash for downloads (jobobby04/TachiyomiSY#1533)
(cherry picked from commit 0ffc798e9ae5a201ef2051d48099bf38f467815b)

* Or

(cherry picked from commit b1e6fa65d6437427b6a3eb03af36b3d9e3e5e645)
2026-01-26 14:13:21 +07:00
Cuong-Tran
64f12cc6a5
fix(reader-chapter): Fix deletion of duplicated chapters when automatically mark as read (#1421) 2026-01-26 13:59:38 +07:00
Cuong-Tran
505c8c23f0
fix(migration): Throttle E-Hentai requests (#1420) 2026-01-26 13:43:00 +07:00
AntsyLich
7e71162519 Remove checksum from release notes and improve download tip
(cherry picked from commit b93337cb3d53278e191cf1dceeaf6c4effdb141d)
2026-01-26 13:19:41 +07:00
Cuong-Tran
d60181c3ea Fix memoization in manga bottom action menus (#1418) 2026-01-26 11:18:17 +07:00
az4521
d01903ff34 significantly less stupid cloudflare cookie detection in EH
(cherry picked from commit 31e2e62cd3a262b9b194ffd2049e601617bd1aac)
2026-01-22 18:15:02 +07:00
az4521
5e3915eae8 EH keep CF cookies
(cherry picked from commit 68dc8b51765537bdb7bd4edcca5c95e0f3cf025a)
2026-01-22 18:15:02 +07:00
Cuong-Tran
a86ec40c79 refactor: clean up browse/migrate (#1414)
* Support mass migration in 'Browse -> Migrate' (mihonapp/mihon#2338)

(cherry picked from commit 22f851173b1eca242645f328a46e6038c035d5ec)

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
2026-01-22 15:52:34 +07:00
AntsyLich
9cbd46947b Support mass migration for selected library items (mihonapp/mihon#2336)
(cherry picked from commit 982ebcf777215c90584ad28fae79e9ca8a22a951)

Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
2026-01-22 12:29:35 +07:00
AntsyLich
9a3934eadf Fix migration "Attempt to invoke virtual method" crash (mihonapp/mihon#2632)
(cherry picked from commit 93ba6acea56334573fc506d593affd5bea2a86b2)
2026-01-22 09:16:33 +07:00
Cuong-Tran
b28778221e fix(migrate-dialog): Fix Migrate Manga dialog won't show the second time (#1409)
Also handle the case migrate-dialog keeps loading forever in case of exception
2026-01-21 20:08:35 +07:00
AntsyLich
e79b3f97f4
Fix migration dialog migrating to wrong entry (mihonapp/mihon#2631)
(cherry picked from commit 5e7fecc2c11b4a175fe1c3f698f7daeb58fe311f)
2026-01-21 19:48:12 +07:00