|
@@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
|
|
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
|
|
import eu.kanade.tachiyomi.data.database.models.Track
|
|
|
import eu.kanade.tachiyomi.source.Source
|
|
|
-import eu.kanade.tachiyomi.util.chapter.NoChaptersException
|
|
|
import kotlinx.serialization.ExperimentalSerializationApi
|
|
|
import okio.buffer
|
|
|
import okio.gzip
|
|
@@ -22,8 +21,7 @@ import rx.Observable
|
|
|
import java.util.Date
|
|
|
|
|
|
@OptIn(ExperimentalSerializationApi::class)
|
|
|
-class FullBackupRestore(context: Context, notifier: BackupNotifier, private val online: Boolean) : AbstractBackupRestore(context, notifier) {
|
|
|
- private lateinit var fullBackupManager: FullBackupManager
|
|
|
+class FullBackupRestore(context: Context, notifier: BackupNotifier, private val online: Boolean) : AbstractBackupRestore<FullBackupManager>(context, notifier) {
|
|
|
|
|
|
/**
|
|
|
* Restores data from backup file.
|
|
@@ -34,10 +32,10 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
val startTime = System.currentTimeMillis()
|
|
|
|
|
|
// Initialize manager
|
|
|
- fullBackupManager = FullBackupManager(context)
|
|
|
+ backupManager = FullBackupManager(context)
|
|
|
|
|
|
val backupString = context.contentResolver.openInputStream(uri)!!.source().gzip().buffer().use { it.readByteArray() }
|
|
|
- val backup = fullBackupManager.parser.decodeFromByteArray(BackupSerializer, backupString)
|
|
|
+ val backup = backupManager.parser.decodeFromByteArray(BackupSerializer, backupString)
|
|
|
|
|
|
restoreAmount = backup.backupManga.size + 1 // +1 for categories
|
|
|
restoreProgress = 0
|
|
@@ -71,7 +69,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
|
|
|
private fun restoreCategories(backupCategories: List<BackupCategory>) {
|
|
|
db.inTransaction {
|
|
|
- fullBackupManager.restoreCategories(backupCategories)
|
|
|
+ backupManager.restoreCategories(backupCategories)
|
|
|
}
|
|
|
|
|
|
restoreProgress += 1
|
|
@@ -86,7 +84,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
val tracks = backupManga.getTrackingImpl()
|
|
|
|
|
|
try {
|
|
|
- val source = fullBackupManager.sourceManager.get(manga.source)
|
|
|
+ val source = backupManager.sourceManager.get(manga.source)
|
|
|
if (source != null || !online) {
|
|
|
restoreMangaData(manga, source, chapters, categories, history, tracks, backupCategories, online)
|
|
|
} else {
|
|
@@ -121,7 +119,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
backupCategories: List<BackupCategory>,
|
|
|
online: Boolean
|
|
|
) {
|
|
|
- val dbManga = fullBackupManager.getMangaFromDatabase(manga)
|
|
|
+ val dbManga = backupManager.getMangaFromDatabase(manga)
|
|
|
|
|
|
db.inTransaction {
|
|
|
if (dbManga == null) {
|
|
@@ -129,7 +127,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
restoreMangaFetch(source, manga, chapters, categories, history, tracks, backupCategories, online)
|
|
|
} else { // Manga in database
|
|
|
// Copy information from manga already in database
|
|
|
- fullBackupManager.restoreMangaNoFetch(manga, dbManga)
|
|
|
+ backupManager.restoreMangaNoFetch(manga, dbManga)
|
|
|
// Fetch rest of manga information
|
|
|
restoreMangaNoFetch(source, manga, chapters, categories, history, tracks, backupCategories, online)
|
|
|
}
|
|
@@ -153,7 +151,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
backupCategories: List<BackupCategory>,
|
|
|
online: Boolean
|
|
|
) {
|
|
|
- fullBackupManager.restoreMangaFetchObservable(source, manga, online)
|
|
|
+ backupManager.restoreMangaFetchObservable(source, manga, online)
|
|
|
.doOnError {
|
|
|
errors.add(Date() to "${manga.title} - ${it.message}")
|
|
|
}
|
|
@@ -164,7 +162,7 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
// Convert to the manga that contains new chapters.
|
|
|
.map { manga }
|
|
|
} else {
|
|
|
- fullBackupManager.restoreChaptersForMangaOffline(it, chapters)
|
|
|
+ backupManager.restoreChaptersForMangaOffline(it, chapters)
|
|
|
Observable.just(manga)
|
|
|
}
|
|
|
}
|
|
@@ -190,14 +188,14 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
Observable.just(backupManga)
|
|
|
.flatMap { manga ->
|
|
|
if (online && source != null) {
|
|
|
- if (!fullBackupManager.restoreChaptersForManga(manga, chapters)) {
|
|
|
+ if (!backupManager.restoreChaptersForManga(manga, chapters)) {
|
|
|
chapterFetchObservable(source, manga, chapters)
|
|
|
.map { manga }
|
|
|
} else {
|
|
|
Observable.just(manga)
|
|
|
}
|
|
|
} else {
|
|
|
- fullBackupManager.restoreChaptersForMangaOffline(manga, chapters)
|
|
|
+ backupManager.restoreChaptersForMangaOffline(manga, chapters)
|
|
|
Observable.just(manga)
|
|
|
}
|
|
|
}
|
|
@@ -212,72 +210,12 @@ class FullBackupRestore(context: Context, notifier: BackupNotifier, private val
|
|
|
|
|
|
private fun restoreExtraForManga(manga: Manga, categories: List<Int>, history: List<BackupHistory>, tracks: List<Track>, backupCategories: List<BackupCategory>) {
|
|
|
// Restore categories
|
|
|
- fullBackupManager.restoreCategoriesForManga(manga, categories, backupCategories)
|
|
|
+ backupManager.restoreCategoriesForManga(manga, categories, backupCategories)
|
|
|
|
|
|
// Restore history
|
|
|
- fullBackupManager.restoreHistoryForManga(history)
|
|
|
+ backupManager.restoreHistoryForManga(history)
|
|
|
|
|
|
// Restore tracking
|
|
|
- fullBackupManager.restoreTrackForManga(manga, tracks)
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * [Observable] that fetches chapter information
|
|
|
- *
|
|
|
- * @param source source of manga
|
|
|
- * @param manga manga that needs updating
|
|
|
- * @return [Observable] that contains manga
|
|
|
- */
|
|
|
- private fun chapterFetchObservable(source: Source, manga: Manga, chapters: List<Chapter>): Observable<Pair<List<Chapter>, List<Chapter>>> {
|
|
|
- return fullBackupManager.restoreChapterFetchObservable(source, manga, chapters)
|
|
|
- // If there's any error, return empty update and continue.
|
|
|
- .onErrorReturn {
|
|
|
- val errorMessage = if (it is NoChaptersException) {
|
|
|
- context.getString(R.string.no_chapters_error)
|
|
|
- } else {
|
|
|
- it.message
|
|
|
- }
|
|
|
- errors.add(Date() to "${manga.title} - $errorMessage")
|
|
|
- Pair(emptyList(), emptyList())
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * [Observable] that refreshes tracking information
|
|
|
- * @param manga manga that needs updating.
|
|
|
- * @param tracks list containing tracks from restore file.
|
|
|
- * @return [Observable] that contains updated track item
|
|
|
- */
|
|
|
- private fun trackingFetchObservable(manga: Manga, tracks: List<Track>): Observable<Track> {
|
|
|
- return Observable.from(tracks)
|
|
|
- .flatMap { track ->
|
|
|
- val service = trackManager.getService(track.sync_id)
|
|
|
- if (service != null && service.isLogged) {
|
|
|
- service.refresh(track)
|
|
|
- .doOnNext { db.insertTrack(it).executeAsBlocking() }
|
|
|
- .onErrorReturn {
|
|
|
- errors.add(Date() to "${manga.title} - ${it.message}")
|
|
|
- track
|
|
|
- }
|
|
|
- } else {
|
|
|
- errors.add(Date() to "${manga.title} - ${context.getString(R.string.tracker_not_logged_in, service?.name)}")
|
|
|
- Observable.empty()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Called to update dialog in [BackupConst]
|
|
|
- *
|
|
|
- * @param progress restore progress
|
|
|
- * @param amount total restoreAmount of manga
|
|
|
- * @param title title of restored manga
|
|
|
- */
|
|
|
- private fun showRestoreProgress(
|
|
|
- progress: Int,
|
|
|
- amount: Int,
|
|
|
- title: String
|
|
|
- ) {
|
|
|
- notifier.showRestoreProgress(title, progress, amount)
|
|
|
+ backupManager.restoreTrackForManga(manga, tracks)
|
|
|
}
|
|
|
}
|