Fix: Messed up trackers progress update always auto sync (#794)
This commit is contained in:
parent
ee5b3d0d92
commit
edc0bd34ff
4 changed files with 41 additions and 15 deletions
|
|
@ -3,6 +3,7 @@ package eu.kanade.domain.track.interactor
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import eu.kanade.domain.track.model.toDbTrack
|
import eu.kanade.domain.track.model.toDbTrack
|
||||||
import eu.kanade.domain.track.model.toDomainTrack
|
import eu.kanade.domain.track.model.toDomainTrack
|
||||||
|
import eu.kanade.tachiyomi.data.track.EnhancedTracker
|
||||||
import eu.kanade.tachiyomi.data.track.Tracker
|
import eu.kanade.tachiyomi.data.track.Tracker
|
||||||
import eu.kanade.tachiyomi.data.track.TrackerManager
|
import eu.kanade.tachiyomi.data.track.TrackerManager
|
||||||
import eu.kanade.tachiyomi.util.system.toast
|
import eu.kanade.tachiyomi.util.system.toast
|
||||||
|
|
@ -26,10 +27,16 @@ class RefreshTracks(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches updated tracking data from all logged in trackers.
|
* Fetches updated tracking data from all logged in trackers.
|
||||||
|
* Also sync chapter progress with the [EnhancedTracker] or all trackers based on [enhancedTrackersOnly].
|
||||||
*
|
*
|
||||||
* @return Failed updates.
|
* @return Failed updates.
|
||||||
*/
|
*/
|
||||||
suspend fun await(mangaId: Long): List<Pair<Tracker?, Throwable>> {
|
suspend fun await(
|
||||||
|
mangaId: Long,
|
||||||
|
// KMK -->
|
||||||
|
enhancedTrackersOnly: Boolean = true,
|
||||||
|
// KMK <--
|
||||||
|
): List<Pair<Tracker?, Throwable>> {
|
||||||
return supervisorScope {
|
return supervisorScope {
|
||||||
return@supervisorScope getTracks.await(mangaId)
|
return@supervisorScope getTracks.await(mangaId)
|
||||||
.map { it to trackerManager.get(it.trackerId) }
|
.map { it to trackerManager.get(it.trackerId) }
|
||||||
|
|
@ -39,7 +46,13 @@ class RefreshTracks(
|
||||||
return@async try {
|
return@async try {
|
||||||
val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!!
|
val updatedTrack = service!!.refresh(track.toDbTrack()).toDomainTrack()!!
|
||||||
insertTrack.await(updatedTrack)
|
insertTrack.await(updatedTrack)
|
||||||
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service)
|
// KMK -->
|
||||||
|
if (!enhancedTrackersOnly) {
|
||||||
|
syncChapterProgressWithTrack.sync(mangaId, updatedTrack, service)
|
||||||
|
} else {
|
||||||
|
// KMK <--
|
||||||
|
syncChapterProgressWithTrack.await(mangaId, updatedTrack, service)
|
||||||
|
}
|
||||||
// KMK -->
|
// KMK -->
|
||||||
?.let {
|
?.let {
|
||||||
val context = Injekt.get<Application>()
|
val context = Injekt.get<Application>()
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
package eu.kanade.domain.track.interactor
|
package eu.kanade.domain.track.interactor
|
||||||
|
|
||||||
import eu.kanade.domain.track.model.toDbTrack
|
import eu.kanade.domain.track.model.toDbTrack
|
||||||
import eu.kanade.domain.track.service.TrackPreferences
|
import eu.kanade.tachiyomi.data.track.EnhancedTracker
|
||||||
import eu.kanade.tachiyomi.data.track.Tracker
|
import eu.kanade.tachiyomi.data.track.Tracker
|
||||||
import logcat.LogPriority
|
import logcat.LogPriority
|
||||||
import tachiyomi.core.common.util.system.logcat
|
import tachiyomi.core.common.util.system.logcat
|
||||||
|
|
@ -10,8 +10,6 @@ import tachiyomi.domain.chapter.interactor.UpdateChapter
|
||||||
import tachiyomi.domain.chapter.model.toChapterUpdate
|
import tachiyomi.domain.chapter.model.toChapterUpdate
|
||||||
import tachiyomi.domain.track.interactor.InsertTrack
|
import tachiyomi.domain.track.interactor.InsertTrack
|
||||||
import tachiyomi.domain.track.model.Track
|
import tachiyomi.domain.track.model.Track
|
||||||
import uy.kohesive.injekt.Injekt
|
|
||||||
import uy.kohesive.injekt.api.get
|
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
|
|
||||||
class SyncChapterProgressWithTrack(
|
class SyncChapterProgressWithTrack(
|
||||||
|
|
@ -19,19 +17,30 @@ class SyncChapterProgressWithTrack(
|
||||||
private val insertTrack: InsertTrack,
|
private val insertTrack: InsertTrack,
|
||||||
private val getChaptersByMangaId: GetChaptersByMangaId,
|
private val getChaptersByMangaId: GetChaptersByMangaId,
|
||||||
) {
|
) {
|
||||||
val trackPreferences: TrackPreferences = Injekt.get()
|
/**
|
||||||
|
* Sync chapter progress with the [EnhancedTracker]
|
||||||
|
*/
|
||||||
suspend fun await(
|
suspend fun await(
|
||||||
mangaId: Long,
|
mangaId: Long,
|
||||||
remoteTrack: Track,
|
remoteTrack: Track,
|
||||||
tracker: Tracker,
|
tracker: Tracker,
|
||||||
): Int? {
|
): Int? {
|
||||||
// KKM -->
|
if (tracker !is EnhancedTracker) {
|
||||||
// if (tracker !is EnhancedTracker) {
|
return null
|
||||||
// return
|
}
|
||||||
// }
|
// KMK -->
|
||||||
// <-- KKM
|
return sync(mangaId, remoteTrack, tracker)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync chapter progress with the all trackers.
|
||||||
|
*/
|
||||||
|
suspend fun sync(
|
||||||
|
mangaId: Long,
|
||||||
|
remoteTrack: Track,
|
||||||
|
tracker: Tracker,
|
||||||
|
): Int? {
|
||||||
|
// KMK <--
|
||||||
// Current chapters in database, sort by source's order because database's order is a mess
|
// Current chapters in database, sort by source's order because database's order is a mess
|
||||||
val dbChapters = getChaptersByMangaId.await(mangaId)
|
val dbChapters = getChaptersByMangaId.await(mangaId)
|
||||||
// KMK -->
|
// KMK -->
|
||||||
|
|
@ -78,7 +87,6 @@ class SyncChapterProgressWithTrack(
|
||||||
// KMK -->
|
// KMK -->
|
||||||
// Always update local chapters following Tracker even past chapters
|
// Always update local chapters following Tracker even past chapters
|
||||||
if (chapterUpdates.isNotEmpty() &&
|
if (chapterUpdates.isNotEmpty() &&
|
||||||
trackPreferences.autoSyncProgressFromTrackers().get() &&
|
|
||||||
!tracker.hasNotStartedReading(remoteTrack.status)
|
!tracker.hasNotStartedReading(remoteTrack.status)
|
||||||
) {
|
) {
|
||||||
updateChapter.awaitAll(chapterUpdates)
|
updateChapter.awaitAll(chapterUpdates)
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,11 @@ class TrackChapter(
|
||||||
private val delayedTrackingStore: DelayedTrackingStore,
|
private val delayedTrackingStore: DelayedTrackingStore,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches updated tracking data from all logged in trackers.
|
||||||
|
* Then update chapter progress to all trackers.
|
||||||
|
* This does not update local chapters' read status.
|
||||||
|
*/
|
||||||
suspend fun await(context: Context, mangaId: Long, chapterNumber: Double, setupJobOnFailure: Boolean = true) {
|
suspend fun await(context: Context, mangaId: Long, chapterNumber: Double, setupJobOnFailure: Boolean = true) {
|
||||||
withNonCancellableContext {
|
withNonCancellableContext {
|
||||||
val tracks = getTracks.await(mangaId)
|
val tracks = getTracks.await(mangaId)
|
||||||
|
|
|
||||||
|
|
@ -176,6 +176,7 @@ class MangaScreenModel(
|
||||||
private val uiPreferences: UiPreferences = Injekt.get(),
|
private val uiPreferences: UiPreferences = Injekt.get(),
|
||||||
// KMK -->
|
// KMK -->
|
||||||
private val sourcePreferences: SourcePreferences = Injekt.get(),
|
private val sourcePreferences: SourcePreferences = Injekt.get(),
|
||||||
|
private val refreshTracks: RefreshTracks = Injekt.get(),
|
||||||
// KMK <--
|
// KMK <--
|
||||||
private val trackerManager: TrackerManager = Injekt.get(),
|
private val trackerManager: TrackerManager = Injekt.get(),
|
||||||
private val trackChapter: TrackChapter = Injekt.get(),
|
private val trackChapter: TrackChapter = Injekt.get(),
|
||||||
|
|
@ -562,8 +563,7 @@ class MangaScreenModel(
|
||||||
private suspend fun syncTrackers() {
|
private suspend fun syncTrackers() {
|
||||||
if (!trackPreferences.autoSyncProgressFromTrackers().get()) return
|
if (!trackPreferences.autoSyncProgressFromTrackers().get()) return
|
||||||
|
|
||||||
val refreshTracks = Injekt.get<RefreshTracks>()
|
refreshTracks.await(mangaId, enhancedTrackersOnly = false)
|
||||||
refreshTracks.await(mangaId)
|
|
||||||
.filter { it.first != null }
|
.filter { it.first != null }
|
||||||
.forEach { (track, e) ->
|
.forEach { (track, e) ->
|
||||||
logcat(LogPriority.ERROR, e) {
|
logcat(LogPriority.ERROR, e) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue