From 9aca1159777f0409db7ca90c62111136d5a661cb Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 14 Mar 2021 16:08:00 -0400 Subject: [PATCH] Refactor LibraryUpdateService a bit for future changes (cherry picked from commit b5c293427017abfb1c631fe3d931376beb56b765) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt --- .../data/library/LibraryUpdateService.kt | 73 +++++++++++-------- .../data/library/LibraryUpdateServiceTest.kt | 3 +- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index a7a07e34d..75cf1aa55 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -88,6 +88,7 @@ class LibraryUpdateService( private lateinit var notifier: LibraryUpdateNotifier private lateinit var ioScope: CoroutineScope + private var mangaToUpdate: List = mutableListOf() private var updateJob: Job? = null /** @@ -109,6 +110,8 @@ class LibraryUpdateService( companion object { + private var instance: LibraryUpdateService? = null + /** * Key for category to update. */ @@ -147,7 +150,7 @@ class LibraryUpdateService( * @return true if service newly started, false otherwise */ fun start(context: Context, category: Category? = null, target: Target = Target.CHAPTERS /* SY --> */, group: Int = LibraryGroup.BY_DEFAULT, groupExtra: String? = null /* SY <-- */): Boolean { - if (!isRunning(context)) { + return if (!isRunning(context)) { val intent = Intent(context, LibraryUpdateService::class.java).apply { putExtra(KEY_TARGET, target) category?.let { putExtra(KEY_CATEGORY, it.id) } @@ -158,10 +161,11 @@ class LibraryUpdateService( } ContextCompat.startForegroundService(context, intent) - return true + true + } else { + instance?.addMangaToQueue(category?.id ?: -1, group, groupExtra, target) + false } - - return false } /** @@ -198,6 +202,9 @@ class LibraryUpdateService( if (wakeLock.isHeld) { wakeLock.release() } + if (instance == this) { + instance = null + } super.onDestroy() } @@ -221,23 +228,27 @@ class LibraryUpdateService( val target = intent.getSerializableExtra(KEY_TARGET) as? Target ?: return START_NOT_STICKY - // Unsubscribe from any previous subscription if needed. + instance = this + + // Unsubscribe from any previous subscription if needed updateJob?.cancel() - // Update favorite manga. Destroy service when completed or in case of an error. - val selectedScheme = preferences.libraryUpdatePrioritization().get() - val mangaList = getMangaToUpdate(intent, target) - .sortedWith(rankingScheme[selectedScheme]) + // Update favorite manga + val categoryId = intent.getIntExtra(KEY_CATEGORY, -1) + val group = intent.getIntExtra(KEY_GROUP, LibraryGroup.BY_DEFAULT) + val groupExtra = intent.getStringExtra(KEY_GROUP_EXTRA) + addMangaToQueue(categoryId, group, groupExtra, target) + // Destroy service when completed or in case of an error. val handler = CoroutineExceptionHandler { _, exception -> Timber.e(exception) stopSelf(startId) } updateJob = ioScope.launch(handler) { when (target) { - Target.CHAPTERS -> updateChapterList(mangaList) - Target.COVERS -> updateCovers(mangaList) - Target.TRACKING -> updateTrackings(mangaList) + Target.CHAPTERS -> updateChapterList() + Target.COVERS -> updateCovers() + Target.TRACKING -> updateTrackings() // SY --> Target.SYNC_FOLLOWS -> syncFollows() Target.PUSH_FAVORITES -> pushFavorites() @@ -250,36 +261,31 @@ class LibraryUpdateService( } /** - * Returns the list of manga to be updated. + * Adds list of manga to be updated. * - * @param intent the update intent. + * @param category the ID of the category to update, or -1 if no category specified. * @param target the target to update. - * @return a list of manga to update */ - fun getMangaToUpdate(intent: Intent, target: Target): List { - val categoryId = intent.getIntExtra(KEY_CATEGORY, -1) + fun addMangaToQueue(categoryId: Int, group: Int, groupExtra: String?, target: Target) { + val libraryManga = db.getLibraryMangas().executeAsBlocking() // SY --> - val group = intent.getIntExtra(KEY_GROUP, LibraryGroup.BY_DEFAULT) val groupLibraryUpdateType = preferences.groupLibraryUpdateType().get() // SY <-- var listToUpdate = if (categoryId != -1) { - db.getLibraryMangas().executeAsBlocking().filter { it.category == categoryId } + libraryManga.filter { it.category == categoryId } // SY --> } else if (group == LibraryGroup.BY_DEFAULT || groupLibraryUpdateType == PreferenceValues.GroupLibraryMode.GLOBAL || (groupLibraryUpdateType == PreferenceValues.GroupLibraryMode.ALL_BUT_UNGROUPED && group == LibraryGroup.UNGROUPED)) { val categoriesToUpdate = preferences.libraryUpdateCategories().get().map(String::toInt) if (categoriesToUpdate.isNotEmpty()) { - db.getLibraryMangas().executeAsBlocking() - .filter { it.category in categoriesToUpdate } - .distinctBy { it.id } + libraryManga.filter { it.category in categoriesToUpdate } } else { - db.getLibraryMangas().executeAsBlocking().distinctBy { it.id } + libraryManga } } else { - val libraryManga = db.getLibraryMangas().executeAsBlocking().distinctBy { it.id } when (group) { LibraryGroup.BY_TRACK_STATUS -> { - val trackingExtra = intent.getStringExtra(KEY_GROUP_EXTRA)?.toIntOrNull() ?: -1 + val trackingExtra = groupExtra?.toIntOrNull() ?: -1 libraryManga.filter { val loggedServices = trackManager.services.filter { it.isLogged } val status: String = run { @@ -298,12 +304,12 @@ class LibraryUpdateService( } } LibraryGroup.BY_SOURCE -> { - val sourceExtra = intent.getStringExtra(KEY_GROUP_EXTRA).nullIfBlank() + val sourceExtra = groupExtra.nullIfBlank() val source = sourceManager.getCatalogueSources().find { it.name == sourceExtra } if (source != null) libraryManga.filter { it.source == source.id } else emptyList() } LibraryGroup.BY_STATUS -> { - val statusExtra = intent.getStringExtra(KEY_GROUP_EXTRA)?.toIntOrNull() ?: -1 + val statusExtra = groupExtra?.toIntOrNull() ?: -1 libraryManga.filter { it.status == statusExtra } @@ -314,10 +320,13 @@ class LibraryUpdateService( // SY <-- } if (target == Target.CHAPTERS && preferences.updateOnlyNonCompleted()) { - listToUpdate = listToUpdate.filter { it.status != SManga.COMPLETED } + listToUpdate = listToUpdate.filterNot { it.status == SManga.COMPLETED } } - return listToUpdate + val selectedScheme = preferences.libraryUpdatePrioritization().get() + mangaToUpdate = listToUpdate + .distinctBy { it.id } + .sortedWith(rankingScheme[selectedScheme]) } /** @@ -329,7 +338,7 @@ class LibraryUpdateService( * @param mangaToUpdate the list to update * @return an observable delivering the progress of each update. */ - suspend fun updateChapterList(mangaToUpdate: List) { + suspend fun updateChapterList() { val semaphore = Semaphore(5) val progressCount = AtomicInteger(0) val newUpdates = mutableListOf>>() @@ -463,7 +472,7 @@ class LibraryUpdateService( return syncChaptersWithSource(db, chapters, manga, source) } - private suspend fun updateCovers(mangaToUpdate: List) { + private suspend fun updateCovers() { var progressCount = 0 mangaToUpdate.forEach { manga -> @@ -496,7 +505,7 @@ class LibraryUpdateService( * Method that updates the metadata of the connected tracking services. It's called in a * background thread, so it's safe to do heavy operations or network calls here. */ - private suspend fun updateTrackings(mangaToUpdate: List) { + private suspend fun updateTrackings() { var progressCount = 0 val loggedServices = trackManager.services.filter { it.isLogged } diff --git a/app/src/test/java/eu/kanade/tachiyomi/data/library/LibraryUpdateServiceTest.kt b/app/src/test/java/eu/kanade/tachiyomi/data/library/LibraryUpdateServiceTest.kt index 20483c073..7bed711c8 100644 --- a/app/src/test/java/eu/kanade/tachiyomi/data/library/LibraryUpdateServiceTest.kt +++ b/app/src/test/java/eu/kanade/tachiyomi/data/library/LibraryUpdateServiceTest.kt @@ -100,7 +100,8 @@ class LibraryUpdateServiceTest { val intent = Intent() val target = LibraryUpdateService.Target.CHAPTERS runBlocking { - service.updateChapterList(service.getMangaToUpdate(intent, target)) + service.addMangaToQueue(intent, target) + service.updateChapterList() // There are 3 network attempts and 2 insertions (1 request failed) assertThat(service.db.getChapters(favManga[0]).executeAsBlocking()).hasSize(2)