Add function to delete downloaded chapters when migrating manga (#9621)

add function to delete downloaded chapters when migrating manga and getFlagsFromPositions fix
This commit is contained in:
Semen 2023-07-07 16:57:02 +03:00 committed by GitHub
parent 4d67066de3
commit 4882896f4d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 7 deletions

View File

@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.browse.migration
import eu.kanade.domain.manga.model.hasCustomCover import eu.kanade.domain.manga.model.hasCustomCover
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.download.DownloadCache
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.GetTracks
@ -12,15 +13,18 @@ import uy.kohesive.injekt.injectLazy
object MigrationFlags { object MigrationFlags {
private const val CHAPTERS = 0b0001 private const val CHAPTERS = 0b00001
private const val CATEGORIES = 0b0010 private const val CATEGORIES = 0b00010
private const val TRACK = 0b0100 private const val TRACK = 0b00100
private const val CUSTOM_COVER = 0b1000 private const val CUSTOM_COVER = 0b01000
private const val DELETE_DOWNLOADED = 0b10000
private val coverCache: CoverCache by injectLazy() private val coverCache: CoverCache by injectLazy()
private val getTracks: GetTracks = Injekt.get() private val getTracks: GetTracks = Injekt.get()
private val downloadCache: DownloadCache by injectLazy()
val flags get() = arrayOf(CHAPTERS, CATEGORIES, TRACK, CUSTOM_COVER) val flags get() = arrayOf(CHAPTERS, CATEGORIES, TRACK, CUSTOM_COVER, DELETE_DOWNLOADED)
private var enableFlags = emptyList<Int>().toMutableList()
fun hasChapters(value: Int): Boolean { fun hasChapters(value: Int): Boolean {
return value and CHAPTERS != 0 return value and CHAPTERS != 0
@ -38,23 +42,36 @@ object MigrationFlags {
return value and CUSTOM_COVER != 0 return value and CUSTOM_COVER != 0
} }
fun hasDeleteDownloaded(value: Int): Boolean {
return value and DELETE_DOWNLOADED != 0
}
fun getEnabledFlagsPositions(value: Int): List<Int> { fun getEnabledFlagsPositions(value: Int): List<Int> {
return flags.mapIndexedNotNull { index, flag -> if (value and flag != 0) index else null } return flags.mapIndexedNotNull { index, flag -> if (value and flag != 0) index else null }
} }
fun getFlagsFromPositions(positions: Array<Int>): Int { fun getFlagsFromPositions(positions: Array<Int>): Int {
return positions.fold(0) { accumulated, position -> accumulated or (1 shl position) } val fold = positions.fold(0) { accumulated, position -> accumulated or enableFlags[position] }
enableFlags.clear()
return fold
} }
fun titles(manga: Manga?): Array<Int> { fun titles(manga: Manga?): Array<Int> {
enableFlags.add(CHAPTERS)
enableFlags.add(CATEGORIES)
val titles = arrayOf(R.string.chapters, R.string.categories).toMutableList() val titles = arrayOf(R.string.chapters, R.string.categories).toMutableList()
if (manga != null) { if (manga != null) {
if (runBlocking { getTracks.await(manga.id) }.isNotEmpty()) { if (runBlocking { getTracks.await(manga.id) }.isNotEmpty()) {
titles.add(R.string.track) titles.add(R.string.track)
enableFlags.add(TRACK)
} }
if (manga.hasCustomCover(coverCache)) { if (manga.hasCustomCover(coverCache)) {
titles.add(R.string.custom_cover) titles.add(R.string.custom_cover)
enableFlags.add(CUSTOM_COVER)
}
if (downloadCache.getDownloadCount(manga) > 0) {
titles.add(R.string.delete_downloaded)
enableFlags.add(DELETE_DOWNLOADED)
} }
} }
return titles.toTypedArray() return titles.toTypedArray()

View File

@ -34,6 +34,7 @@ import eu.kanade.domain.manga.model.hasCustomCover
import eu.kanade.domain.manga.model.toSManga import eu.kanade.domain.manga.model.toSManga
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.CoverCache
import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.track.EnhancedTrackService import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
@ -161,6 +162,7 @@ internal fun MigrateDialog(
internal class MigrateDialogScreenModel( internal class MigrateDialogScreenModel(
private val sourceManager: SourceManager = Injekt.get(), private val sourceManager: SourceManager = Injekt.get(),
private val downloadManager: DownloadManager = Injekt.get(),
private val updateManga: UpdateManga = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(),
private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(),
private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(), private val syncChaptersWithSource: SyncChaptersWithSource = Injekt.get(),
@ -219,6 +221,7 @@ internal class MigrateDialogScreenModel(
val migrateCategories = MigrationFlags.hasCategories(flags) val migrateCategories = MigrationFlags.hasCategories(flags)
val migrateTracks = MigrationFlags.hasTracks(flags) val migrateTracks = MigrationFlags.hasTracks(flags)
val migrateCustomCover = MigrationFlags.hasCustomCover(flags) val migrateCustomCover = MigrationFlags.hasCustomCover(flags)
val deleteDownloaded = MigrationFlags.hasDeleteDownloaded(flags)
try { try {
syncChaptersWithSource.await(sourceChapters, newManga, newSource) syncChaptersWithSource.await(sourceChapters, newManga, newSource)
@ -283,6 +286,13 @@ internal class MigrateDialogScreenModel(
insertTrack.awaitAll(tracks) insertTrack.awaitAll(tracks)
} }
// Delete downloaded
if (deleteDownloaded) {
if (oldSource != null) {
downloadManager.deleteManga(oldManga, oldSource)
}
}
if (replace) { if (replace) {
updateManga.await(MangaUpdate(oldManga.id, favorite = false, dateAdded = 0)) updateManga.await(MangaUpdate(oldManga.id, favorite = false, dateAdded = 0))
} }

View File

@ -12,6 +12,7 @@
<string name="manga">Library entries</string> <string name="manga">Library entries</string>
<string name="chapters">Chapters</string> <string name="chapters">Chapters</string>
<string name="track">Tracking</string> <string name="track">Tracking</string>
<string name="delete_downloaded">Delete downloaded</string>
<string name="history">History</string> <string name="history">History</string>
<!-- Screen titles --> <!-- Screen titles -->