fix(migration, extensions): fix batch migration multi-select, manual search overrides, and duplicate extensions#425
Merged
Conversation
…search overrides, and duplicate extensions - Add visual checkboxes on migration source selection config screens. - Implement multi-selection (long-press) on Migrate screens under Browse. - Filter manual searches by target sources and return overrides back to the batch migration list. - Fix extension listing duplicates by ignoring signature hash differences.
There was a problem hiding this comment.
Pull request overview
This PR expands migration UX by adding multi-select/batch flows and tighter integration between migration search screens and the migration list, plus a small adjustment to how “available” extensions are derived.
Changes:
- Add “use entry for migration” override path so selecting a target in the search screen can immediately update the existing migration list item.
- Introduce multi-select mode in migrate lists (long-press to select, select all/clear, continue into migration config).
- Filter migration search enabled sources by the migration source selection preferences and simplify extension “already installed/untrusted” checks.
Reviewed changes
Copilot reviewed 20 out of 20 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| app/src/main/java/mihon/feature/migration/list/MangaMigrationListScreenModel.kt | Adds manual override method to set a migration target from an ID. |
| app/src/main/java/mihon/feature/migration/list/MangaMigrationListScreen.kt | Hooks match override into the screen model via LaunchedEffect. |
| app/src/main/java/mihon/feature/migration/list/AnimeMigrationListScreenModel.kt | Adds manual override method to set a migration target from an ID. |
| app/src/main/java/mihon/feature/migration/list/AnimeMigrationListScreen.kt | Hooks match override into the screen model via LaunchedEffect. |
| app/src/main/java/mihon/feature/migration/config/MangaMigrationConfigScreen.kt | Adds selection checkbox UI to source selection list items. |
| app/src/main/java/mihon/feature/migration/config/AnimeMigrationConfigScreen.kt | Adds selection checkbox UI to source selection list items. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MigrateMangaSearchScreenModel.kt | Filters enabled sources by migration source preferences. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/search/MigrateMangaSearchScreen.kt | Returns selected target back to the migration list screen when present. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/manga/MigrateMangaScreenModel.kt | Adds selection state and selection actions (toggle/select all/clear). |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/manga/migration/manga/MigrateMangaScreen.kt | Adds selection-mode behavior, back handling, and navigation into config with selected IDs. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeSearchScreenModel.kt | Filters enabled sources by migration source preferences. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeSearchScreen.kt | Returns selected target back to the migration list screen when present. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/MigrateAnimeScreenModel.kt | Adds selection state and selection actions (toggle/select all/clear). |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/MigrateAnimeScreen.kt | Adds selection-mode behavior, back handling, and navigation into config with selected IDs. |
| app/src/main/java/eu/kanade/presentation/entries/manga/components/BaseMangaListItem.kt | Adds long-click support by switching to combinedClickable. |
| app/src/main/java/eu/kanade/presentation/entries/anime/components/BaseAnimeListItem.kt | Adds long-click support by switching to combinedClickable. |
| app/src/main/java/eu/kanade/presentation/browse/manga/MigrateMangaScreen.kt | Adds selection-mode UI (count title, app bar actions, continue FAB, inline checkboxes). |
| app/src/main/java/eu/kanade/presentation/browse/anime/MigrateAnimeScreen.kt | Adds selection-mode UI (count title, app bar actions, continue FAB, inline checkboxes). |
| app/src/main/java/eu/kanade/domain/extension/manga/interactor/GetMangaExtensionsByType.kt | Simplifies available-extension filtering to use pkgName-only matching. |
| app/src/main/java/eu/kanade/domain/extension/anime/interactor/GetAnimeExtensionsByType.kt | Simplifies available-extension filtering to use pkgName-only matching. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+258
to
+262
| fun useMangaForMigration(mangaId: Long, targetMangaId: Long) { | ||
| val item = items.find { it.manga.id == mangaId } ?: return | ||
| screenModelScope.launchIO { | ||
| item.searchResult.value = SearchResult.Searching | ||
| updateMigrationProgress() |
Comment on lines
+258
to
+262
| fun useAnimeForMigration(animeId: Long, targetAnimeId: Long) { | ||
| val item = items.find { it.anime.id == animeId } ?: return | ||
| screenModelScope.launchIO { | ||
| item.searchResult.value = SearchResult.Searching | ||
| updateMigrationProgress() |
Comment on lines
+313
to
+316
| Checkbox( | ||
| checked = isSelected, | ||
| onCheckedChange = null, | ||
| ) |
Comment on lines
+313
to
+316
| Checkbox( | ||
| checked = isSelected, | ||
| onCheckedChange = null, | ||
| ) |
Comment on lines
+149
to
+152
| Checkbox( | ||
| checked = isSelected, | ||
| onCheckedChange = null, | ||
| ) |
Comment on lines
+149
to
+152
| Checkbox( | ||
| checked = isSelected, | ||
| onCheckedChange = null, | ||
| ) |
Comment on lines
36
to
40
| override fun getEnabledSources(): List<CatalogueSource> { | ||
| val migrationSources = sourcePreferences.migrationMangaSources.get() | ||
| return super.getEnabledSources() | ||
| .filter { migrationSources.isEmpty() || it.id in migrationSources } | ||
| .filter { state.value.sourceFilter != MangaSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } |
Comment on lines
36
to
40
| override fun getEnabledSources(): List<AnimeCatalogueSource> { | ||
| val migrationSources = sourcePreferences.migrationAnimeSources.get() | ||
| return super.getEnabledSources() | ||
| .filter { migrationSources.isEmpty() || it.id in migrationSources } | ||
| .filter { state.value.sourceFilter != AnimeSourceFilter.PinnedOnly || "${it.id}" in pinnedSources } |
…M handling - Port Mihon's simplified extension store decoding logic using first-byte peeking and gzip support. - Add safeguard to strip UTF-8 BOM headers from index streams. - Ensure correct fallback to legacy repo.json (which fixes missing Discord button issue).
…M handling - Port Mihon's simplified extension store decoding logic using first-byte peeking and gzip support. - Add safeguard to strip UTF-8 BOM headers from index streams. - Ensure correct fallback to legacy repo.json (which fixes missing Discord button issue).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Close #424
Close #423
Close #421
Close #413