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:
parent
4d67066de3
commit
4882896f4d
3 changed files with 35 additions and 7 deletions
|
@ -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()
|
||||||
|
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
Reference in a new issue