* 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