From 04e8f0d77fec567db618ecd4ecfd13a6f71db4df Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Tue, 26 May 2020 17:04:07 -0400 Subject: [PATCH] Rewrite migration, split it up into 2 controllers and reorganize the classes Everything is under the hood, so on top only the back button was fixed in the selct manga screen --- .../java/eu/kanade/tachiyomi/source/Source.kt | 3 +- .../tachiyomi/ui/browse/BrowseController.kt | 4 +- .../ui/browse/migration/MangaAdapter.kt | 17 -- .../browse/migration/MigrationController.kt | 151 ------------------ .../browse/migration/MigrationMangaDialog.kt | 2 +- .../ui/browse/migration/ViewState.kt | 10 -- .../design/MigrationBottomSheetDialog.kt | 2 +- .../design/MigrationSourceAdapter.kt | 2 +- .../design/MigrationSourceHolder.kt | 2 +- .../design/MigrationSourceItem.kt | 2 +- .../design/PreMigrationController.kt | 6 +- .../process/MigratingManga.kt | 2 +- .../process/MigrationListController.kt | 12 +- .../process/MigrationProcedureConfig.kt | 2 +- .../process/MigrationProcessAdapter.kt | 2 +- .../process/MigrationProcessHolder.kt | 2 +- .../process/MigrationProcessItem.kt | 2 +- .../migration/{ => manga}/MangaHolder.kt | 2 +- .../browse/migration/{ => manga}/MangaItem.kt | 12 +- .../manga/MigrationMangaController.kt | 95 +++++++++++ .../MigrationMangaPresenter.kt} | 86 ++++------ .../{ => search}/SearchController.kt | 36 +++-- .../migration/{ => search}/SearchPresenter.kt | 2 +- .../sources/MigrationSourcesController.kt | 95 +++++++++++ .../sources/MigrationSourcesPresenter.kt | 49 ++++++ .../{ => sources}/SelectionHeader.kt | 7 +- .../migration/{ => sources}/SourceAdapter.kt | 15 +- .../migration/{ => sources}/SourceHolder.kt | 2 +- .../migration/{ => sources}/SourceItem.kt | 9 +- .../tachiyomi/ui/library/LibraryController.kt | 9 +- .../ui/manga/MangaAllInOneController.kt | 2 +- .../ui/manga/info/MangaInfoController.kt | 2 +- 32 files changed, 352 insertions(+), 294 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaAdapter.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationController.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/ViewState.kt rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/design/MigrationBottomSheetDialog.kt (98%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/design/MigrationSourceAdapter.kt (95%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/design/MigrationSourceHolder.kt (96%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/design/MigrationSourceItem.kt (97%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/design/PreMigrationController.kt (97%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigratingManga.kt (95%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigrationListController.kt (98%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigrationProcedureConfig.kt (75%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigrationProcessAdapter.kt (98%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigrationProcessHolder.kt (99%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{manga => advanced}/process/MigrationProcessItem.kt (95%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => manga}/MangaHolder.kt (96%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => manga}/MangaItem.kt (82%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaController.kt rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{MigrationPresenter.kt => manga/MigrationMangaPresenter.kt} (58%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => search}/SearchController.kt (86%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => search}/SearchPresenter.kt (95%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesController.kt create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => sources}/SelectionHeader.kt (92%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => sources}/SourceAdapter.kt (64%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => sources}/SourceHolder.kt (96%) rename app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/{ => sources}/SourceItem.kt (88%) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/Source.kt b/app/src/main/java/eu/kanade/tachiyomi/source/Source.kt index ca63ae041..c1af1239d 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/Source.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/Source.kt @@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga +import java.io.Serializable import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -12,7 +13,7 @@ import uy.kohesive.injekt.api.get /** * A basic interface for creating a source. It could be an online source, a local source, etc... */ -interface Source { +interface Source : Serializable { /** * Id for the source. Must be unique. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseController.kt index 61cafdd4d..c1d60cd31 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/BrowseController.kt @@ -20,7 +20,7 @@ import eu.kanade.tachiyomi.ui.base.controller.RootController import eu.kanade.tachiyomi.ui.base.controller.RxController import eu.kanade.tachiyomi.ui.base.controller.TabbedController import eu.kanade.tachiyomi.ui.browse.extension.ExtensionController -import eu.kanade.tachiyomi.ui.browse.migration.MigrationController +import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrationSourcesController import eu.kanade.tachiyomi.ui.browse.source.SourceController import kotlinx.android.synthetic.main.main_activity.tabs import uy.kohesive.injekt.injectLazy @@ -126,7 +126,7 @@ class BrowseController : val controller: Controller = when (position) { SOURCES_CONTROLLER -> SourceController() EXTENSIONS_CONTROLLER -> ExtensionController() - MIGRATION_CONTROLLER -> MigrationController() + MIGRATION_CONTROLLER -> MigrationSourcesController() else -> error("Wrong position $position") } router.setRoot(RouterTransaction.with(controller)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaAdapter.kt deleted file mode 100644 index ad6045759..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaAdapter.kt +++ /dev/null @@ -1,17 +0,0 @@ -package eu.kanade.tachiyomi.ui.browse.migration - -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible - -class MangaAdapter(controller: MigrationController) : - FlexibleAdapter>(null, controller) { - - private var items: List>? = null - - override fun updateDataSet(items: MutableList>?) { - if (this.items !== items) { - this.items = items - super.updateDataSet(items) - } - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationController.kt deleted file mode 100644 index 68982fea4..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationController.kt +++ /dev/null @@ -1,151 +0,0 @@ -package eu.kanade.tachiyomi.ui.browse.migration - -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import eu.davidea.flexibleadapter.FlexibleAdapter -import eu.davidea.flexibleadapter.items.IFlexible -import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.database.DatabaseHelper -import eu.kanade.tachiyomi.data.database.models.Manga -import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.databinding.MigrationControllerBinding -import eu.kanade.tachiyomi.ui.base.controller.NucleusController -import eu.kanade.tachiyomi.ui.browse.migration.manga.design.PreMigrationController -import eu.kanade.tachiyomi.util.lang.launchUI -import exh.util.RecyclerWindowInsetsListener -import exh.util.applyWindowInsetsForController -import exh.util.await -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import rx.schedulers.Schedulers -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get - -class MigrationController : - NucleusController(), - FlexibleAdapter.OnItemClickListener, - SourceAdapter.OnAllClickListener, - MigrationInterface { - - private var adapter: FlexibleAdapter>? = null - - private var title: String? = null - set(value) { - field = value - setTitle() - } - - override fun createPresenter(): MigrationPresenter { - return MigrationPresenter() - } - - override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { - binding = MigrationControllerBinding.inflate(inflater) - return binding.root - } - - fun searchController(manga: Manga): SearchController { - val controller = SearchController(manga) - controller.targetController = this - - return controller - } - - override fun onViewCreated(view: View) { - super.onViewCreated(view) - view.applyWindowInsetsForController() - - adapter = FlexibleAdapter(null, this) - binding.recycler.layoutManager = - androidx.recyclerview.widget.LinearLayoutManager(view.context) - binding.recycler.adapter = adapter - binding.recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) - } - - override fun onDestroyView(view: View) { - adapter = null - super.onDestroyView(view) - } - - override fun getTitle(): String? { - return title - } - - override fun handleBack(): Boolean { - return if (presenter.state.selectedSource != null) { - presenter.deselectSource() - true - } else { - super.handleBack() - } - } - - fun render(state: ViewState) { - if (state.selectedSource == null) { - title = resources?.getString(R.string.source_migration) - if (adapter !is SourceAdapter) { - adapter = SourceAdapter(this) - binding.recycler.adapter = adapter - adapter?.fastScroller = binding.fastScroller - } - adapter?.updateDataSet(state.sourcesWithManga) - } else { - // val switching = title == resources?.getString(R.string.source_migration) - title = state.selectedSource.toString() - if (adapter !is MangaAdapter) { - adapter = MangaAdapter(this) - binding.recycler.adapter = adapter - adapter?.fastScroller = binding.fastScroller - } - adapter?.updateDataSet(state.mangaForSource, true) - /*if (switching) launchUI { - migration_recycler.alpha = 0f - migration_recycler.animate().alpha(1f).setStartDelay(100).setDuration(200).start() - }*/ - } - } - - override fun onItemClick(view: View?, position: Int): Boolean { - val item = adapter?.getItem(position) ?: return false - - if (item is MangaItem) { - PreMigrationController.navigateToMigration( - Injekt.get().skipPreMigration().get(), - parentController!!.router, - listOf(item.manga.id!!) - ) - } else if (item is SourceItem) { - presenter.setSelectedSource(item.source) - } - return false - } - - override fun onAllClick(position: Int) { - val item = adapter?.getItem(position) as? SourceItem ?: return - - launchUI { - val manga = Injekt.get().getFavoriteMangas().asRxSingle().await( - Schedulers.io() - ) - val sourceMangas = - manga.asSequence().filter { it.source == item.source.id }.map { it.id!! }.toList() - withContext(Dispatchers.Main) { - PreMigrationController.navigateToMigration( - Injekt.get().skipPreMigration().get(), - parentController!!.router, - sourceMangas - ) - } - } - } - - override fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean): Manga? { - presenter.migrateManga(prevManga, manga, replace) - return null - } -} - -interface MigrationInterface { - fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean): Manga? -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt index 28cd105d5..6409afcb7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt @@ -6,7 +6,7 @@ import com.afollestad.materialdialogs.MaterialDialog import com.bluelinelabs.conductor.Controller import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController -import eu.kanade.tachiyomi.ui.browse.migration.manga.process.MigrationListController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController class MigrationMangaDialog(bundle: Bundle? = null) : DialogController(bundle) where T : Controller { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/ViewState.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/ViewState.kt deleted file mode 100644 index a61a0aa45..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/ViewState.kt +++ /dev/null @@ -1,10 +0,0 @@ -package eu.kanade.tachiyomi.ui.browse.migration - -import eu.kanade.tachiyomi.source.Source - -data class ViewState( - val selectedSource: Source? = null, - val mangaForSource: List = emptyList(), - val sourcesWithManga: List = emptyList(), - val isReplacingManga: Boolean = false -) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationBottomSheetDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt similarity index 98% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationBottomSheetDialog.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt index 7322e644a..99eba7a88 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationBottomSheetDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.design +package eu.kanade.tachiyomi.ui.browse.migration.advanced.design import android.app.Activity import android.content.res.Configuration diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceAdapter.kt similarity index 95% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceAdapter.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceAdapter.kt index a038baa42..75c8905eb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceAdapter.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.design +package eu.kanade.tachiyomi.ui.browse.migration.advanced.design import android.os.Bundle import eu.davidea.flexibleadapter.FlexibleAdapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceHolder.kt similarity index 96% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceHolder.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceHolder.kt index 3b2f41907..169e902c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceHolder.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.design +package eu.kanade.tachiyomi.ui.browse.migration.advanced.design import android.graphics.Paint.STRIKE_THRU_TEXT_FLAG import android.view.View diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceItem.kt similarity index 97% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceItem.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceItem.kt index a64d2c4ae..d8ef9ccf0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/MigrationSourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationSourceItem.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.design +package eu.kanade.tachiyomi.ui.browse.migration.advanced.design import android.os.Parcelable import android.view.View diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/PreMigrationController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt similarity index 97% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/PreMigrationController.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt index 8959e7b27..86b3ae139 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/design/PreMigrationController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/PreMigrationController.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.design +package eu.kanade.tachiyomi.ui.browse.migration.advanced.design import android.os.Bundle import android.view.LayoutInflater @@ -20,8 +20,8 @@ import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction -import eu.kanade.tachiyomi.ui.browse.migration.manga.process.MigrationListController -import eu.kanade.tachiyomi.ui.browse.migration.manga.process.MigrationProcedureConfig +import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationProcedureConfig import exh.util.doOnApplyWindowInsets import exh.util.marginBottom import exh.util.updateLayoutParams diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigratingManga.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt similarity index 95% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigratingManga.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt index f65b0c2b5..16784c2bf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigratingManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigratingManga.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationListController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt similarity index 98% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationListController.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt index 89d6e3543..ebda07edb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationListController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.content.pm.ActivityInfo import android.graphics.Color @@ -27,8 +27,8 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.browse.migration.MigrationMangaDialog -import eu.kanade.tachiyomi.ui.browse.migration.SearchController -import eu.kanade.tachiyomi.ui.browse.migration.manga.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.search.SearchController import eu.kanade.tachiyomi.ui.manga.MangaAllInOneController import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource @@ -349,7 +349,11 @@ class MigrationListController(bundle: Bundle? = null) : } else { sources.filter { it.id != manga.source } } - val searchController = SearchController(manga, validSources) + val searchController = + SearchController( + manga, + validSources + ) searchController.targetController = this@MigrationListController router.pushController(searchController.withFadeTransaction()) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcedureConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcedureConfig.kt similarity index 75% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcedureConfig.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcedureConfig.kt index 6c544e0ad..787e6eb6a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcedureConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcedureConfig.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.os.Parcelable import kotlinx.android.parcel.Parcelize diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessAdapter.kt similarity index 98% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessAdapter.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessAdapter.kt index ad2ef7fbd..d556c30d7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessAdapter.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.view.MenuItem import eu.davidea.flexibleadapter.FlexibleAdapter diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt similarity index 99% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessHolder.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt index 43ab8372e..489b330f9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessHolder.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.view.View import android.widget.PopupMenu diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessItem.kt similarity index 95% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessItem.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessItem.kt index ec0562ecf..3f34532b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/process/MigrationProcessItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationProcessItem.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration.manga.process +package eu.kanade.tachiyomi.ui.browse.migration.advanced.process import android.view.View import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt similarity index 96% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaHolder.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt index 56d40f307..0cc61d055 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaHolder.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.manga import android.view.View import com.bumptech.glide.load.engine.DiskCacheStrategy diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaItem.kt similarity index 82% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaItem.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaItem.kt index 467896534..f1dca5731 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MangaItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MangaItem.kt @@ -1,5 +1,6 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.manga +import android.os.Parcelable import android.view.View import androidx.recyclerview.widget.RecyclerView import eu.davidea.flexibleadapter.FlexibleAdapter @@ -7,15 +8,20 @@ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga +import kotlinx.android.parcel.Parcelize -class MangaItem(val manga: Manga) : AbstractFlexibleItem() { +@Parcelize +class MangaItem(val manga: Manga) : AbstractFlexibleItem(), Parcelable { override fun getLayoutRes(): Int { return R.layout.source_list_item } override fun createViewHolder(view: View, adapter: FlexibleAdapter>): MangaHolder { - return MangaHolder(view, adapter) + return MangaHolder( + view, + adapter + ) } override fun bindViewHolder( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaController.kt new file mode 100644 index 000000000..40a023563 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaController.kt @@ -0,0 +1,95 @@ +package eu.kanade.tachiyomi.ui.browse.migration.manga + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.IFlexible +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.databinding.MigrationControllerBinding +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.ui.base.controller.NucleusController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.source.SourceDividerItemDecoration +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MigrationMangaController : + NucleusController, + FlexibleAdapter.OnItemClickListener, + MigrationInterface { + + private var adapter: FlexibleAdapter>? = null + + constructor(source: Source) : super( + Bundle().apply { + putSerializable(SOURCE_EXTRA, source) + } + ) + + @Suppress("unused") + constructor(bundle: Bundle) : this(bundle.getSerializable(SOURCE_EXTRA) as Source) + + private val source: Source = args.getSerializable(SOURCE_EXTRA) as Source + + override fun getTitle(): String? { + return source.name + } + + override fun createPresenter(): MigrationMangaPresenter { + return MigrationMangaPresenter( + source.id + ) + } + + override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { + binding = MigrationControllerBinding.inflate(inflater) + return binding.root + } + + override fun onViewCreated(view: View) { + super.onViewCreated(view) + + adapter = FlexibleAdapter>(null, this) + binding.recycler.layoutManager = LinearLayoutManager(view.context) + binding.recycler.adapter = adapter + binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context)) + adapter?.fastScroller = binding.fastScroller + } + + override fun onDestroyView(view: View) { + adapter = null + super.onDestroyView(view) + } + + fun setManga(manga: List) { + adapter?.updateDataSet(manga) + } + + override fun onItemClick(view: View, position: Int): Boolean { + val item = adapter?.getItem(position) as? MangaItem + ?: return false + PreMigrationController.navigateToMigration( + Injekt.get().skipPreMigration().get(), + router, + listOf(item.manga.id!!) + ) + return false + } + + override fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean): Manga? { + presenter.migrateManga(prevManga, manga, replace) + return null + } + + companion object { + const val SOURCE_EXTRA = "source_id_extra" + } +} + +interface MigrationInterface { + fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean): Manga? +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt similarity index 58% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationPresenter.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt index ca6aabd7a..4205f9f7f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/manga/MigrationMangaPresenter.kt @@ -1,37 +1,26 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.manga import android.os.Bundle -import com.jakewharton.rxrelay.BehaviorRelay import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter +import eu.kanade.tachiyomi.ui.browse.migration.MigrationFlags import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource -import eu.kanade.tachiyomi.util.lang.combineLatest +import exh.debug.DebugFunctions.sourceManager import rx.Observable import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class MigrationPresenter( - private val sourceManager: SourceManager = Injekt.get(), - private val db: DatabaseHelper = Injekt.get(), - private val preferences: PreferencesHelper = Injekt.get() -) : BasePresenter() { - - var state = ViewState() - private set(value) { - field = value - stateRelay.call(value) - } - - private val stateRelay = BehaviorRelay.create(state) +class MigrationMangaPresenter( + private val sourceId: Long, + private val db: DatabaseHelper = Injekt.get() +) : BasePresenter() { override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) @@ -39,54 +28,24 @@ class MigrationPresenter( db.getFavoriteMangas() .asRxObservable() .observeOn(AndroidSchedulers.mainThread()) - .doOnNext { state = state.copy(sourcesWithManga = findSourcesWithManga(it)) } - .combineLatest( - stateRelay.map { it.selectedSource } - .distinctUntilChanged() - ) { library, source -> library to source } - .filter { (_, source) -> source != null } - .observeOn(Schedulers.io()) - .map { (library, source) -> libraryToMigrationItem(library, source!!.id) } - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext { state = state.copy(mangaForSource = it) } - .subscribe() - - stateRelay - // Render the view when any field other than isReplacingManga changes - .distinctUntilChanged { t1, t2 -> t1.isReplacingManga != t2.isReplacingManga } - .subscribeLatestCache(MigrationController::render) + .map { libraryToMigrationItem(it) } + .subscribeLatestCache(MigrationMangaController::setManga) } - fun setSelectedSource(source: Source) { - state = state.copy(selectedSource = source, mangaForSource = emptyList()) - } - - fun deselectSource() { - state = state.copy(selectedSource = null, mangaForSource = emptyList()) - } - - private fun findSourcesWithManga(library: List): List { - val header = SelectionHeader() - return library.map { it.source }.toSet() - .mapNotNull { if (it != LocalSource.ID) sourceManager.getOrStub(it) else null } - .sortedBy { it.name } - .map { SourceItem(it, header) } - } - - private fun libraryToMigrationItem(library: List, sourceId: Long): List { - return library.filter { it.source == sourceId }.map(::MangaItem) + private fun libraryToMigrationItem(library: List): List { + return library.filter { it.source == sourceId } + .sortedBy { it.title } + .map { MangaItem(it) } } fun migrateManga(prevManga: Manga, manga: Manga, replace: Boolean) { val source = sourceManager.get(manga.source) ?: return - state = state.copy(isReplacingManga = true) - Observable.defer { source.fetchChapterList(manga) }.onErrorReturn { emptyList() } .doOnNext { migrateMangaInternal(source, it, prevManga, manga, replace) } .onErrorReturn { emptyList() }.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .doOnUnsubscribe { state = state.copy(isReplacingManga = false) }.subscribe() + .subscribe() } private fun migrateMangaInternal( @@ -96,10 +55,19 @@ class MigrationPresenter( manga: Manga, replace: Boolean ) { - val flags = preferences.migrateFlags().get() - val migrateChapters = MigrationFlags.hasChapters(flags) - val migrateCategories = MigrationFlags.hasCategories(flags) - val migrateTracks = MigrationFlags.hasTracks(flags) + val flags = Injekt.get().migrateFlags().get() + val migrateChapters = + MigrationFlags.hasChapters( + flags + ) + val migrateCategories = + MigrationFlags.hasCategories( + flags + ) + val migrateTracks = + MigrationFlags.hasTracks( + flags + ) db.inTransaction { // Update chapters read diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt similarity index 86% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchController.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt index 7cbb99645..3ef5cb9c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.search import android.app.Dialog import android.os.Bundle @@ -15,7 +15,9 @@ 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 -import eu.kanade.tachiyomi.ui.browse.migration.manga.process.MigrationListController +import eu.kanade.tachiyomi.ui.browse.migration.MigrationFlags +import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController +import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrationInterface import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchPresenter import kotlinx.coroutines.flow.filter @@ -50,7 +52,11 @@ class SearchController( } override fun createPresenter(): GlobalSearchPresenter { - return SearchPresenter(initialQuery, manga!!, sources = sources) + return SearchPresenter( + initialQuery, + manga!!, + sources = sources + ) } override fun onSaveInstanceState(outState: Bundle) { @@ -85,7 +91,8 @@ class SearchController( }*/ fun migrateManga() { - val target = targetController as? MigrationInterface ?: return + val target = targetController as? MigrationInterface + ?: return val manga = manga ?: return val newManga = newManga ?: return @@ -94,7 +101,8 @@ class SearchController( } fun copyManga() { - val target = targetController as? MigrationInterface ?: return + val target = targetController as? MigrationInterface + ?: return val manga = manga ?: return val newManga = newManga ?: return @@ -105,7 +113,10 @@ class SearchController( private fun replaceWithNewSearchController(manga: Manga?) { if (manga != null) { // router.popCurrentController() - val searchController = SearchController(manga) + val searchController = + SearchController( + manga + ) searchController.targetController = targetController searchController.progress = progress + 1 searchController.totalProgress = totalProgress @@ -123,7 +134,8 @@ class SearchController( return } newManga = manga - val dialog = MigrationDialog() + val dialog = + MigrationDialog() dialog.targetController = this dialog.showDialog(router) } @@ -140,7 +152,10 @@ class SearchController( override fun onCreateDialog(savedViewState: Bundle?): Dialog { val prefValue = preferences.migrateFlags().get() - val preselected = MigrationFlags.getEnabledFlagsPositions(prefValue) + val preselected = + MigrationFlags.getEnabledFlagsPositions( + prefValue + ) return MaterialDialog(activity!!) .message(R.string.data_to_include_in_migration) @@ -149,7 +164,10 @@ class SearchController( { resources?.getString(it) as CharSequence }, initialSelection = preselected.toIntArray() ) { _, positions, _ -> - val newValue = MigrationFlags.getFlagsFromPositions(positions.toTypedArray()) + val newValue = + MigrationFlags.getFlagsFromPositions( + positions.toTypedArray() + ) preferences.migrateFlags().set(newValue) } .positiveButton(R.string.migrate) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt similarity index 95% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchPresenter.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt index 898002f96..3ff530416 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.search import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.source.CatalogueSource diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesController.kt new file mode 100644 index 000000000..cabacd279 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesController.kt @@ -0,0 +1,95 @@ +package eu.kanade.tachiyomi.ui.browse.migration.sources + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.databinding.MigrationControllerBinding +import eu.kanade.tachiyomi.ui.base.controller.NucleusController +import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrationMangaController +import eu.kanade.tachiyomi.ui.browse.source.SourceDividerItemDecoration +import eu.kanade.tachiyomi.util.lang.launchUI +import exh.util.await +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import rx.schedulers.Schedulers +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MigrationSourcesController : + NucleusController(), + FlexibleAdapter.OnItemClickListener, + SourceAdapter.OnAllClickListener { + + private var adapter: SourceAdapter? = null + + override fun createPresenter(): MigrationSourcesPresenter { + return MigrationSourcesPresenter() + } + + override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { + binding = MigrationControllerBinding.inflate(inflater) + return binding.root + } + + override fun onViewCreated(view: View) { + super.onViewCreated(view) + + adapter = + SourceAdapter(this) + binding.recycler.layoutManager = LinearLayoutManager(view.context) + binding.recycler.adapter = adapter + binding.recycler.addItemDecoration(SourceDividerItemDecoration(view.context)) + adapter?.fastScroller = binding.fastScroller + } + + override fun onDestroyView(view: View) { + adapter = null + super.onDestroyView(view) + } + + fun setSources(sourcesWithManga: List) { + adapter?.updateDataSet(sourcesWithManga) + } + + override fun getTitle(): String? { + return resources?.getString(R.string.source_migration) + } + + override fun onItemClick(view: View?, position: Int): Boolean { + val item = adapter?.getItem(position) as? SourceItem + ?: return false + val controller = + MigrationMangaController( + item.source + ) + parentController!!.router.pushController(controller.withFadeTransaction()) + return false + } + + override fun onAllClick(position: Int) { + val item = adapter?.getItem(position) as? SourceItem + ?: return + + launchUI { + val manga = Injekt.get().getFavoriteMangas().asRxSingle().await( + Schedulers.io() + ) + val sourceMangas = + manga.asSequence().filter { it.source == item.source.id }.map { it.id!! }.toList() + withContext(Dispatchers.Main) { + PreMigrationController.navigateToMigration( + Injekt.get().skipPreMigration().get(), + parentController!!.router, + sourceMangas + ) + } + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt new file mode 100644 index 000000000..ee41e32a0 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt @@ -0,0 +1,49 @@ +package eu.kanade.tachiyomi.ui.browse.migration.sources + +import android.os.Bundle +import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.source.LocalSource +import eu.kanade.tachiyomi.source.SourceManager +import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter +import eu.kanade.tachiyomi.ui.browse.migration.manga.MangaItem +import exh.MERGED_SOURCE_ID +import rx.android.schedulers.AndroidSchedulers +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MigrationSourcesPresenter( + private val sourceManager: SourceManager = Injekt.get(), + private val db: DatabaseHelper = Injekt.get(), + private val preferences: PreferencesHelper = Injekt.get() +) : BasePresenter() { + + override fun onCreate(savedState: Bundle?) { + super.onCreate(savedState) + + db.getFavoriteMangas() + .asRxObservable() + .observeOn(AndroidSchedulers.mainThread()) + .map { findSourcesWithManga(it) } + .subscribeLatestCache(MigrationSourcesController::setSources) + } + + private fun findSourcesWithManga(library: List): List { + val header = + SelectionHeader() + return library.map { it.source }.toSet() + .mapNotNull { if (it != LocalSource.ID && it != MERGED_SOURCE_ID) sourceManager.getOrStub(it) else null } + .sortedBy { it.name } + .map { + SourceItem( + it, + header + ) + } + } + + private fun libraryToMigrationItem(library: List, sourceId: Long): List { + return library.filter { it.source == sourceId }.map(::MangaItem) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SelectionHeader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt similarity index 92% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SelectionHeader.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt index e552bc329..51c78dedd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SelectionHeader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SelectionHeader.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.sources import android.view.View import androidx.recyclerview.widget.RecyclerView @@ -25,7 +25,10 @@ class SelectionHeader : AbstractHeaderItem() { * Creates a new view holder for this item. */ override fun createViewHolder(view: View, adapter: FlexibleAdapter>): Holder { - return Holder(view, adapter) + return Holder( + view, + adapter + ) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceAdapter.kt similarity index 64% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceAdapter.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceAdapter.kt index e09ada28a..9e8d8bf7c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceAdapter.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.sources import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.IFlexible @@ -8,15 +8,13 @@ import eu.kanade.tachiyomi.util.system.getResourceColor /** * Adapter that holds the catalogue cards. * - * @param controller instance of [MigrationController]. + * @param controller instance of [MigrationSourcesController]. */ -class SourceAdapter(val controller: MigrationController) : +class SourceAdapter(val controller: MigrationSourcesController) : FlexibleAdapter>(null, controller, true) { val cardBackground = controller.activity!!.getResourceColor(R.attr.colorSurface) - private var items: List>? = null - init { setDisplayHeadersAtStartUp(true) } @@ -32,11 +30,4 @@ class SourceAdapter(val controller: MigrationController) : interface OnAllClickListener { fun onAllClick(position: Int) } - - override fun updateDataSet(items: MutableList>?) { - if (this.items !== items) { - this.items = items - super.updateDataSet(items) - } - } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt similarity index 96% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceHolder.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt index fdc94778e..5490e045e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceHolder.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.sources import android.view.View import eu.kanade.tachiyomi.source.icon diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceItem.kt similarity index 88% rename from app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceItem.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceItem.kt index 3c6cbe5d6..5de6162a7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/SourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/SourceItem.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.ui.browse.migration +package eu.kanade.tachiyomi.ui.browse.migration.sources import android.view.View import androidx.recyclerview.widget.RecyclerView @@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.source.Source * @param source Instance of [Source] containing source information. * @param header The header for this item. */ -data class SourceItem(val source: Source, val header: SelectionHeader? = null) : +data class SourceItem(val source: Source, val header: SelectionHeader) : AbstractSectionableItem(header) { /** @@ -28,7 +28,10 @@ data class SourceItem(val source: Source, val header: SelectionHeader? = null) : * Creates a new view holder for this item. */ override fun createViewHolder(view: View, adapter: FlexibleAdapter>): SourceHolder { - return SourceHolder(view, adapter as SourceAdapter) + return SourceHolder( + view, + adapter as SourceAdapter + ) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 9038cf54e..7626783a2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -34,8 +34,8 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.RootController import eu.kanade.tachiyomi.ui.base.controller.TabbedController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction -import eu.kanade.tachiyomi.ui.browse.migration.MigrationController -import eu.kanade.tachiyomi.ui.browse.migration.manga.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrationSourcesController import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.main.offsetAppbarHeight import eu.kanade.tachiyomi.ui.manga.MangaAllInOneController @@ -429,7 +429,10 @@ class LibraryController( } } R.id.action_source_migration -> { - router.pushController(MigrationController().withFadeTransaction()) + router.pushController( + MigrationSourcesController() + .withFadeTransaction() + ) } // --> EXH R.id.action_sync_favorites -> { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt index c58ddfe75..b8d41a64f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOneController.kt @@ -32,7 +32,7 @@ import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction -import eu.kanade.tachiyomi.ui.browse.migration.manga.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController import eu.kanade.tachiyomi.ui.browse.source.SourceController import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index 895b85890..e4ed96b43 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -24,7 +24,7 @@ import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction -import eu.kanade.tachiyomi.ui.browse.migration.manga.design.PreMigrationController +import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationController import eu.kanade.tachiyomi.ui.browse.source.SourceController import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController