The merged upstream tree needs more heap/metaspace during assembleRelease.
Document Obtainium Forgejo source override, SSL, and version trim regex.
Co-authored-by: Cursor <cursoragent@cursor.com>
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 check-upstream.sh, generated status artifacts, merge guide, and a
scheduled Forgejo job to refresh upstream sync visibility.
Co-authored-by: Cursor <cursoragent@cursor.com>
Allow rebuilding an existing tag via workflow_dispatch and document
Obtainium-friendly asset names, secrets, and runner setup.
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)
Capture library vs reader ETA behaviour, historical duplicate caps, tunable
preferences, and code map from the reading-eta work. Link from README.
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(agent): Add mandatory rules for AI agents covering Git, i18n, and formatting
* Explicit path for strings resource
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* Specify both strings.xml & plurals.xml
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Also exclude non-base local folders from i18n-kmk
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
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>
Add development environment setup documentation for Cloud Agent VMs,
including Android SDK configuration, key Gradle commands, and gotchas
for headless development without an emulator.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
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
* Translated using Weblate (Turkish)
Currently translated at 70.4% (148 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/tr/
* Translated using Weblate (Turkish)
Currently translated at 70.4% (148 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/tr/
* Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 84.2% (177 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/zh_Hans/
* Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 84.2% (177 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/zh_Hans/
* Translated using Weblate (Bengali)
Currently translated at 22.3% (47 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/bn/
* Translated using Weblate (French)
Currently translated at 92.8% (195 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fr/
* Translated using Weblate (Thai)
Currently translated at 27.1% (57 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/th/
* Translated using Weblate (Thai)
Currently translated at 27.1% (57 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/th/
* Translated using Weblate (Danish)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/da/
* Translated using Weblate (Danish)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/da/
* Translated using Weblate (Czech)
Currently translated at 80.9% (170 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/cs/
* Translated using Weblate (Czech)
Currently translated at 80.9% (170 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/cs/
* Translated using Weblate (Malay)
Currently translated at 20.4% (43 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ms/
* Translated using Weblate (Ukrainian)
Currently translated at 86.1% (181 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/uk/
* Translated using Weblate (Ukrainian)
Currently translated at 86.1% (181 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/uk/
* Translated using Weblate (Spanish)
Currently translated at 85.7% (180 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/es/
* Translated using Weblate (Spanish)
Currently translated at 85.7% (180 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/es/
* Translated using Weblate (Swedish)
Currently translated at 79.5% (167 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/sv/
* Translated using Weblate (Swedish)
Currently translated at 79.5% (167 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/sv/
* Translated using Weblate (Korean)
Currently translated at 76.1% (160 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ko/
* Translated using Weblate (Korean)
Currently translated at 76.1% (160 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ko/
* Translated using Weblate (Italian)
Currently translated at 97.1% (204 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/it/
* Translated using Weblate (Italian)
Currently translated at 97.1% (204 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/it/
* Translated using Weblate (Assamese)
Currently translated at 82.8% (174 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/as/
* Translated using Weblate (Assamese)
Currently translated at 82.8% (174 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/as/
* Translated using Weblate (Vietnamese)
Currently translated at 75.2% (158 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/vi/
* Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.0% (187 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/pt_BR/
* Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.0% (187 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/pt_BR/
* Translated using Weblate (Romanian)
Currently translated at 78.5% (165 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ro/
* Translated using Weblate (Romanian)
Currently translated at 78.5% (165 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ro/
* Translated using Weblate (Filipino)
Currently translated at 95.7% (201 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fil/
* Translated using Weblate (Filipino)
Currently translated at 95.7% (201 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fil/
* Translated using Weblate (German)
Currently translated at 92.8% (195 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/de/
* Translated using Weblate (German)
Currently translated at 92.8% (195 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/de/
* Translated using Weblate (Greek)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/el/
* Translated using Weblate (Greek)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/el/
* Translated using Weblate (Croatian)
Currently translated at 30.4% (64 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/hr/
* Translated using Weblate (Croatian)
Currently translated at 30.4% (64 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/hr/
* Translated using Weblate (Arabic)
Currently translated at 92.3% (194 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ar/
* Translated using Weblate (Arabic)
Currently translated at 92.3% (194 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ar/
* Translated using Weblate (Dutch)
Currently translated at 79.5% (167 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/nl/
* Translated using Weblate (Dutch)
Currently translated at 79.5% (167 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/nl/
* Translated using Weblate (Japanese)
Currently translated at 84.7% (178 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ja/
* Translated using Weblate (Japanese)
Currently translated at 84.7% (178 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ja/
* Translated using Weblate (Finnish)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fi/
* Translated using Weblate (Finnish)
Currently translated at 79.0% (166 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fi/
* Translated using Weblate (Hindi)
Currently translated at 27.1% (57 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/hi/
* Translated using Weblate (Portuguese)
Currently translated at 87.1% (183 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/pt/
* Translated using Weblate (Indonesian)
Currently translated at 92.8% (195 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/id/
* Translated using Weblate (Tamil)
Currently translated at 35.2% (74 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ta/
* Translated using Weblate (Polish)
Currently translated at 80.9% (170 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/pl/
* Translated using Weblate (Polish)
Currently translated at 80.9% (170 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/pl/
* Translated using Weblate (Catalan)
Currently translated at 74.7% (157 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ca/
* Translated using Weblate (Catalan)
Currently translated at 74.7% (157 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ca/
* Translated using Weblate (Korean)
Currently translated at 76.1% (160 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/ko/
* Translated using Weblate (Filipino)
Currently translated at 96.6% (203 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fil/
* Translated using Weblate (Filipino)
Currently translated at 97.1% (204 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/fil/
* Translated using Weblate (Assamese)
Currently translated at 100.0% (210 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/as/
* Translated using Weblate (Assamese)
Currently translated at 100.0% (210 of 210 strings)
Translation: Komikku-App/Komikku
Translate-URL: https://hosted.weblate.org/projects/komikku-app/komikku/as/
* [ar] `connections_discord_info`: placeholder for app name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ar] `pref_discord_idle`: don't use emoji tag
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ro] `pref_discord_idle`: don't use emoji tag
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [zh-rCN] `connections_discord_info`: placeholder for app name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ro] `connections_discord_info`: placeholder for app name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [pt-rBR] `discord_status_description`: placeholder
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [bn] `action_scroll_to_top`: remove quote sign
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ca] `pref_discord_show_download_button`: translate
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
* [da] `connections_discord`: correct Discord name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [es] `connections_discord`: correct Discord name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [fi] `connections_discord_info`: placeholder for app name
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [hi] `pref_discord_idle`: correct use of word
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [hi] `pref_theme_cover_based_style_fruitsalad`: type
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [hr] `action_open_folder`: use folder instead of file
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [it] `pref_fetch_manga_chapters_on_add_description`: correct translation
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ja] `pref_discord_idle`: translate
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [ko] `pref_discord_show_timestamp`: correct use of words
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
* [ms] `download_cache_renew_interval_12hour`: remove AM/PM
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
* [nl] `connections_discord`: correct Discord
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
* [ta] `scale_type_16_9`: remove space
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [tr] `updating`: grammar
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [tr] `pref_auto_sync_progress_from_trackers`: translate
* [uk] `pref_discord_custom_message`: correct translation
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
* [zh-rCN] `discord_status_description`: add space
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---------
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: 안세훈 <on9686@gmail.com>
Co-authored-by: Infy's Tagalog Translations <ced.paltep10@gmail.com>
Co-authored-by: Itsmechinmoy <167056923+itsmechinmoy@users.noreply.github.com>
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
* 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>
Fails the job if an artifact is not a valid zip or manifest (same class
of errors as Android 'package could not be parsed' after download).
Co-authored-by: Cursor <cursoragent@cursor.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>
- Build What's Changed from previous v* tag..HEAD only (not upstream..HEAD).
- List at most 50 newest commits with pointer to Full Changelog compare.
- Drop fork-delta footer block to reduce scrolling.
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>
Bucket commits into New/Fix/Improve/Other from conventional-style
subjects. When upstream main is available, split direct fork commits
from merge commits under separate headings.
Co-authored-by: Cursor <cursoragent@cursor.com>
Pass commit messages via tmp file + COMMIT_LOG_FILE in GITHUB_ENV instead
of injecting COMMIT_LOGS into step env (Forgejo runner could fail before
bash ran, producing no logs).
Co-authored-by: Cursor <cursoragent@cursor.com>
- Use $HOME/.cache/komikku-ci-gradle (override KOMIKKU_GRADLE_CACHE on runner)
instead of per-job .gradle-ci under the checkout so dependencies survive runs.
- Skip sdkmanager when build-tools 35.0.0 already installed.
- Enable kotlin.incremental for assembleRelease to shorten Kotlin compile.
- Replace curl -f release/asset calls with explicit HTTP status checks and
always print JSON error bodies on failure (Forgejo UI often hid stderr).
Co-authored-by: Cursor <cursoragent@cursor.com>
Accidentally reverted version_core naming and release notes when switching
draft to false. Restore stable Komikku-v<semver>-<abi> artifacts and
alias logic; keep draft: false for Obtainium/public API visibility.
Co-authored-by: Cursor <cursoragent@cursor.com>
Draft releases are not visible to unauthenticated API clients, so
Obtainium could not list or match a suitable version. Use draft: false
when creating or updating Forgejo releases.
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>
Normalize APK filenames to stable ABI/version patterns and add clearer release notes with a download guide so clients like Obtainium can reliably match assets.
Register GetReadDurationEntriesByMangaIds in DomainModule so LibraryScreenModel can resolve it and the app no longer crashes on startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent unsigned artifacts from being published as Obtainium aliases and fail fast when signing secrets are missing so releases remain installable.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Utilize tracker for library duplicate detection (#2978)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
(cherry picked from commit 89bbdb17fb4ed1cbe99c14f389940e0f91093a10)
* Avoid crash due to duplicate manga ID when there are more than 1 trackers
* Add index for duplicate library manga detection in manga_sync
---------
Co-authored-by: Cuong-Tran <16017808+cuong-tran@users.noreply.github.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
* Update `excluded_scanlators` index to a composite index on `manga_id` and `scanlator`.
* Convert `idx_history_last_read` into a partial index for entries where `last_read > 0`.
* Remove redundant `idx_manga_sync_manga_id` index.
* Remove unused `last_modified_at` column and its associated trigger from `mangas_categories`.
* Sync migration files with schema changes.
* 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
* 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