From 2ed54eed739aeee46610935f8aa75fc3968b9d21 Mon Sep 17 00:00:00 2001 From: Jay Date: Sat, 23 May 2020 16:28:07 -0400 Subject: [PATCH] Migration updates When searching manually, the sources used for auto migration will also be used for searching Can now migrate to the same source if it is the only source being used for migration (for those who cant stop using kakalot) (cherry picked from commit a3305171d64a8dc4c2fa52d3e5257f45e92f29f1) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt # app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt --- .../globalsearch/GlobalSearchPresenter.kt | 18 +++-- .../ui/migration/SearchController.kt | 12 +-- .../tachiyomi/ui/migration/SearchPresenter.kt | 5 +- .../manga/design/PreMigrationController.kt | 2 +- .../manga/process/MigrationListController.kt | 81 +++++++++++++++---- app/src/main/res/values/strings_extra.xml | 1 + 6 files changed, 90 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt index 31021ea16..24be8811a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt @@ -32,11 +32,12 @@ import uy.kohesive.injekt.injectLazy * @param preferences manages the preference calls. */ open class GlobalSearchPresenter( - val initialQuery: String? = "", - val initialExtensionFilter: String? = null, + private val initialQuery: String? = "", + private val initialExtensionFilter: String? = null, + private val sourcesToUse: List? = null, val sourceManager: SourceManager = Injekt.get(), val db: DatabaseHelper = Injekt.get(), - val preferences: PreferencesHelper = Injekt.get() + private val preferences: PreferencesHelper = Injekt.get() ) : BasePresenter() { /** @@ -105,13 +106,20 @@ open class GlobalSearchPresenter( val hiddenCatalogues = preferences.hiddenCatalogues().get() val pinnedCatalogues = preferences.pinnedCatalogues().get() - return sourceManager.getVisibleCatalogueSources() + val list = sourceManager.getVisibleCatalogueSources() .filter { it.lang in languages } .filterNot { it.id.toString() in hiddenCatalogues } - .sortedWith(compareBy({ it.id.toString() !in pinnedCatalogues }, { "(${it.lang}) ${it.name}" })) + .sortedBy { "(${it.lang}) ${it.name}" } + + return if (preferences.searchPinnedSourcesOnly()) { + list.filter { it.id.toString() in pinnedCatalogues } + } else { + list.sortedBy { it.id.toString() !in pinnedCatalogues } + } } private fun getSourcesToQuery(): List { + if (sourcesToUse != null) return sourcesToUse val filter = extensionFilter val enabledSources = getEnabledSources() var filteredSources: List? = null diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt index 2244b9e52..8c9994770 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt @@ -11,6 +11,7 @@ import com.afollestad.materialdialogs.list.listItemsMultiChoice import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction @@ -25,7 +26,8 @@ import reactivecircus.flowbinding.appcompat.queryTextEvents import uy.kohesive.injekt.injectLazy class SearchController( - private var manga: Manga? = null + private var manga: Manga? = null, + private var sources: List? = null ) : GlobalSearchController(manga?.title) { private var newManga: Manga? = null @@ -48,7 +50,7 @@ class SearchController( } override fun createPresenter(): GlobalSearchPresenter { - return SearchPresenter(initialQuery, manga!!) + return SearchPresenter(initialQuery, manga!!, sources = sources) } override fun onSaveInstanceState(outState: Bundle) { @@ -71,6 +73,7 @@ class SearchController( menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) } } + override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { 1 -> { @@ -142,10 +145,10 @@ class SearchController( return MaterialDialog(activity!!) .message(R.string.data_to_include_in_migration) .listItemsMultiChoice( - items = MigrationFlags.titles.map { resources?.getString(it) as CharSequence }, + items = MigrationFlags.titles.map + { resources?.getString(it) as CharSequence }, initialSelection = preselected.toIntArray() ) { _, positions, _ -> - // Save current settings for the next time val newValue = MigrationFlags.getFlagsFromPositions(positions.toTypedArray()) preferences.migrateFlags().set(newValue) } @@ -155,7 +158,6 @@ class SearchController( .negativeButton(R.string.copy) { (targetController as? SearchController)?.copyManga() } - .neutralButton(android.R.string.cancel) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt index 45daf369d..80619ccc0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt @@ -8,8 +8,9 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchPresenter class SearchPresenter( initialQuery: String? = "", - private val manga: Manga -) : GlobalSearchPresenter(initialQuery) { + private val manga: Manga, + sources: List? = null +) : GlobalSearchPresenter(initialQuery, sourcesToUse = sources) { override fun getEnabledSources(): List { // Put the source of the selected manga at the top diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/PreMigrationController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/PreMigrationController.kt index d7342caaa..0c5cd6006 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/PreMigrationController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/PreMigrationController.kt @@ -96,7 +96,7 @@ class PreMigrationController(bundle: Bundle? = null) : override fun startMigration(extraParam: String?) { val listOfSources = adapter?.items?.filter { it.sourceEnabled - }?.joinToString("/") { it.source.id.toString() } ?: "" + }?.joinToString("/") { it.source.id.toString() } ?: "" prefs.migrationSources().set(listOfSources) router.replaceTopController( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt index 7787d3865..95d1cd3c8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt @@ -153,8 +153,10 @@ class MigrationListController(bundle: Bundle? = null) : val result = try { CoroutineScope(manga.migrationJob).async { - val validSources = sources.filter { - it.id != mangaSource.id + val validSources = if (sources.size == 1) { + sources + } else { + sources.filter { it.id != mangaSource.id } } if (useSourceWithMost) { val sourceSemaphore = Semaphore(3) @@ -165,12 +167,23 @@ class MigrationListController(bundle: Bundle? = null) : sourceSemaphore.withPermit { try { val searchResult = if (useSmartSearch) { - smartSearchEngine.smartSearch(source, mangaObj.title) + smartSearchEngine.smartSearch( + source, + mangaObj.title + ) } else { - smartSearchEngine.normalSearch(source, mangaObj.title) + smartSearchEngine.normalSearch( + source, + mangaObj.title + ) } - if (searchResult != null) { + if (searchResult != null && + !( + searchResult.url == mangaObj.url && + source.id == mangaObj.source + ) + ) { val localManga = smartSearchEngine.networkToLocalManga( searchResult, @@ -209,16 +222,25 @@ class MigrationListController(bundle: Bundle? = null) : validSources.forEachIndexed { index, source -> val searchResult = try { val searchResult = if (useSmartSearch) { - smartSearchEngine.smartSearch(source, mangaObj.title) + smartSearchEngine.smartSearch( + source, + mangaObj.title + ) } else { - smartSearchEngine.normalSearch(source, mangaObj.title) + smartSearchEngine.normalSearch( + source, + mangaObj.title + ) } if (searchResult != null) { - val localManga = smartSearchEngine.networkToLocalManga(searchResult, source.id) + val localManga = smartSearchEngine.networkToLocalManga( + searchResult, + source.id + ) val chapters = try { - source.fetchChapterList(localManga) - .toSingle().await(Schedulers.io()) + source.fetchChapterList(localManga).toSingle() + .await(Schedulers.io()) } catch (e: java.lang.Exception) { Timber.e(e) emptyList() @@ -318,9 +340,18 @@ class MigrationListController(bundle: Bundle? = null) : when (item.itemId) { R.id.action_search_manually -> { launchUI { - val manga = adapter?.getItem(position) ?: return@launchUI + val manga = adapter?.getItem(position)?.manga?.manga() ?: return@launchUI selectedPosition = position - val searchController = SearchController(manga.manga.manga()) + val sources = preferences.migrationSources().get().split("/").mapNotNull { + val value = it.toLongOrNull() ?: return@mapNotNull null + sourceManager.get(value) as? CatalogueSource + } + val validSources = if (sources.size == 1) { + sources + } else { + sources.filter { it.id != manga.source } + } + val searchController = SearchController(manga, validSources) searchController.targetController = this@MigrationListController router.pushController(searchController.withFadeTransaction()) } @@ -421,13 +452,14 @@ class MigrationListController(bundle: Bundle? = null) : override fun handleBack(): Boolean { activity?.let { - MaterialDialog(it).title(R.string.stop_migrating) - .positiveButton(R.string.action_stop) { + MaterialDialog(it).show { + title(R.string.stop_migrating) + positiveButton(R.string.action_stop) { router.popCurrentController() migrationsJob?.cancel() } - .negativeButton(android.R.string.cancel) - .show() + negativeButton(android.R.string.cancel) + } } return true } @@ -484,6 +516,23 @@ class MigrationListController(bundle: Bundle? = null) : } return true } + /* + override fun canChangeTabs(block: () -> Unit): Boolean { + if (migrationsJob?.isCancelled == false || adapter?.allMangasDone() == true) { + activity?.let { + MaterialDialog(it).show { + title(R.string.stop_migrating) + positiveButton(R.string.action_stop) { + block() + migrationsJob?.cancel() + } + negativeButton(android.R.string.cancel) + } + } + return false + } + return true + }*/ companion object { const val CONFIG_EXTRA = "config_extra" diff --git a/app/src/main/res/values/strings_extra.xml b/app/src/main/res/values/strings_extra.xml index 52c10f3d0..816f56e22 100644 --- a/app/src/main/res/values/strings_extra.xml +++ b/app/src/main/res/values/strings_extra.xml @@ -75,6 +75,7 @@ %d manga migrated %d manga migrated + Select target sources Login