diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt index 826eee35e..a6307bcf2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationFlags.kt @@ -1,20 +1,29 @@ package eu.kanade.tachiyomi.ui.browse.migration import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.cache.CoverCache +import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.util.hasCustomCover +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy object MigrationFlags { - private const val CHAPTERS = 0b001 - private const val CATEGORIES = 0b010 - private const val TRACK = 0b100 + private const val CHAPTERS = 0b0001 + private const val CATEGORIES = 0b0010 + private const val TRACK = 0b0100 + private const val CUSTOM_COVER = 0b1000 private const val CHAPTERS2 = 0x1 private const val CATEGORIES2 = 0x2 private const val TRACK2 = 0x4 - val titles get() = arrayOf(R.string.chapters, R.string.categories, R.string.track) + private val coverCache: CoverCache by injectLazy() + private val db: DatabaseHelper = Injekt.get() - val flags get() = arrayOf(CHAPTERS, CATEGORIES, TRACK) + val flags get() = arrayOf(CHAPTERS, CATEGORIES, TRACK, CUSTOM_COVER) fun hasChapters(value: Int): Boolean { return value and CHAPTERS != 0 @@ -28,11 +37,31 @@ object MigrationFlags { return value and TRACK != 0 } + fun hasCustomCover(value: Int): Boolean { + return value and CUSTOM_COVER != 0 + } + fun getEnabledFlagsPositions(value: Int): List { return flags.mapIndexedNotNull { index, flag -> if (value and flag != 0) index else null } } fun getFlagsFromPositions(positions: Array): Int { - return positions.fold(0, { accumulated, position -> accumulated or (1 shl position) }) + return positions.fold(0) { accumulated, position -> accumulated or (1 shl position) } } + + fun titles(manga: Manga?): Array { + val titles = arrayOf(R.string.chapters, R.string.categories).toMutableList() + if (manga != null) { + db.inTransaction { + if (db.getTracks(manga).executeAsBlocking().isNotEmpty()) { + titles.add(R.string.track) + } + + if (manga.hasCustomCover(coverCache)) { + titles.add(R.string.custom_cover) + } + } + } + return titles.toTypedArray() + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt index 1e529cb79..bc59850d2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchController.kt @@ -95,7 +95,7 @@ class SearchController( override fun onCreateDialog(savedViewState: Bundle?): Dialog { val prefValue = preferences.migrateFlags().get() val enabledFlagsPositions = MigrationFlags.getEnabledFlagsPositions(prefValue) - val items = MigrationFlags.titles + val items = MigrationFlags.titles(manga) .map { resources?.getString(it) } .toTypedArray() val selected = items diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt index 5c671b575..6f17a92e7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.browse.migration.search import android.os.Bundle import com.jakewharton.rxrelay.BehaviorRelay +import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.toMangaInfo @@ -17,12 +18,14 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchCardItem import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchItem import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchPresenter import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource +import eu.kanade.tachiyomi.util.hasCustomCover import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.system.toast import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy import java.util.Date class SearchPresenter( @@ -31,7 +34,7 @@ class SearchPresenter( ) : GlobalSearchPresenter(initialQuery) { private val replacingMangaRelay = BehaviorRelay.create>() - + private val coverCache: CoverCache by injectLazy() private val enhancedServices by lazy { Injekt.get().services.filterIsInstance() } override fun onCreate(savedState: Bundle?) { @@ -103,6 +106,10 @@ class SearchPresenter( MigrationFlags.hasTracks( flags, ) + val migrateCustomCover = + MigrationFlags.hasCustomCover( + flags, + ) db.inTransaction { // Update chapters read @@ -174,6 +181,11 @@ class SearchPresenter( manga.date_added = Date().time } + // Update custom cover + if (migrateCustomCover) { + coverCache.setCustomCoverToCache(manga, coverCache.getCustomCoverFile(prevManga).inputStream()) + } + // SearchPresenter#networkToLocalManga may have updated the manga title, // so ensure db gets updated title too db.insertManga(manga).executeAsBlocking() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 37dede11e..33b2c72d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -621,6 +621,7 @@ Custom All Unread + Custom cover Cover Cover saved Error saving cover