From b12735732f034436ee46aae0b812ea4aa8af6fbb Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:20:02 +0600 Subject: [PATCH] Fix login prompts despite being logged in to trackers in Manga screen (cherry picked from commit cbcd8bd6682023f728568f2b44da26124618aed7) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt --- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 2 +- .../tachiyomi/ui/manga/MangaScreenModel.kt | 77 +++++++++---------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index 339d1f88a..94cec671c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -290,7 +290,7 @@ class MangaScreen( ) }.takeIf { isHttpSource }, onTrackingClicked = { - if (successState.loggedInTracker.isEmpty()) { + if (!successState.hasLoggedInTrackers) { navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking)) } else { screenModel.showTrackDialog() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index c88d102e3..fab0d4bc9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -49,7 +49,6 @@ import eu.kanade.tachiyomi.data.download.DownloadCache import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.track.EnhancedTracker -import eu.kanade.tachiyomi.data.track.Tracker import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.mdlist.MdList import eu.kanade.tachiyomi.network.HttpException @@ -62,7 +61,6 @@ import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.isLoading import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.removeDuplicates import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.sorted -import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences import eu.kanade.tachiyomi.util.chapter.getNextUnread import eu.kanade.tachiyomi.util.removeCovers @@ -154,6 +152,7 @@ import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.service.SourceManager import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.InsertTrack +import tachiyomi.domain.track.model.Track import tachiyomi.i18n.MR import tachiyomi.i18n.sy.SYMR import tachiyomi.source.local.LocalSource @@ -400,16 +399,6 @@ class MangaScreenModel( } } - screenModelScope.launchIO { - trackerManager.loggedInTrackersFlow() - .distinctUntilChanged() - .collectLatest { trackers -> - updateSuccessState { - it.copy(loggedInTracker = trackers) - } - } - } - observeDownloads() screenModelScope.launchIO { @@ -1755,42 +1744,54 @@ class MangaScreenModel( getTracks.subscribe(manga.id).catch { logcat(LogPriority.ERROR, it) }, trackerManager.loggedInTrackersFlow(), ) { mangaTracks, loggedInTrackers -> - loggedInTrackers - // Map to TrackItem - .map { service -> TrackItem(mangaTracks.find { it.trackerId == service.id }, service) } - // Show only if the service supports this manga's source - .filter { (it.tracker as? EnhancedTracker)?.accept(source!!) ?: true } + // Show only if the service supports this manga's source + val supportedTrackers = loggedInTrackers.filter { (it as? EnhancedTracker)?.accept(source!!) ?: true } + val supportedTrackerIds = supportedTrackers.map { it.id }.toHashSet() + val supportedTrackerTracks = mangaTracks.filter { it.trackerId in supportedTrackerIds } + supportedTrackerTracks to supportedTrackers } // SY --> - .map { trackItems -> - if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { + .map { (tracks, supportedTrackers) -> + val supportedTrackerTracks = if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { it.source in mangaDexSourceIds } ) { - val mdTrack = trackItems.firstOrNull { it.tracker is MdList } + val mdTrack = supportedTrackers.firstOrNull { it is MdList } when { mdTrack == null -> { - trackItems + tracks } - mdTrack.track == null -> { - trackItems - mdTrack + createMdListTrack() + // KMK: auto track MangaDex + mdTrack.id !in tracks.map { it.trackerId } -> { + tracks + createMdListTrack() } - else -> trackItems + else -> tracks } } else { - trackItems + tracks } + supportedTrackerTracks + .filter { + it.trackerId != trackerManager.mdList.id || + it.status != FollowStatus.UNFOLLOWED.long + } + .size to supportedTrackers.isNotEmpty() } // SY <-- .distinctUntilChanged() - .collectLatest { trackItems -> - updateSuccessState { it.copy(trackItems = trackItems) } + .collectLatest { (trackingCount, hasLoggedInTrackers) -> + updateSuccessState { + it.copy( + trackingCount = trackingCount, + hasLoggedInTrackers = hasLoggedInTrackers, + ) + } } } } // SY --> - private suspend fun createMdListTrack(): TrackItem { + private suspend fun createMdListTrack(): Track { val state = successState!! val mdManga = state.manga.takeIf { it.source in mangaDexSourceIds } ?: state.mergedData?.manga?.values?.find { it.source in mangaDexSourceIds } @@ -1798,7 +1799,13 @@ class MangaScreenModel( val track = trackerManager.mdList.createInitialTracker(state.manga, mdManga) .toDomainTrack(false)!! insertTrack.await(track) - return TrackItem(getTracks.await(mangaId).first { it.trackerId == trackerManager.mdList.id }, trackerManager.mdList) + /* KMK --> + return TrackItem( + getTracks.await(mangaId).first { it.trackerId == trackerManager.mdList.id }, + trackerManager.mdList, + ) + KMK <-- */ + return getTracks.await(mangaId).first { it.trackerId == trackerManager.mdList.id } } // SY <-- @@ -1896,11 +1903,11 @@ class MangaScreenModel( val chapters: List, val availableScanlators: ImmutableSet, val excludedScanlators: ImmutableSet, - val trackItems: List = emptyList(), + val trackingCount: Int = 0, + val hasLoggedInTrackers: Boolean = false, val isRefreshingData: Boolean = false, val dialog: MangaScreenModel.Dialog? = null, val hasPromptedToAddBefore: Boolean = false, - val loggedInTracker: List = emptyList(), // SY --> val meta: RaisedSearchMetadata?, @@ -1981,14 +1988,6 @@ class MangaScreenModel( val filterActive: Boolean get() = scanlatorFilterActive || manga.chaptersFiltered() - val trackingCount: Int - get() = trackItems.count { - it.track != null && ( - it.tracker !is MdList || - it.track.status != FollowStatus.UNFOLLOWED.long - ) - } - /** * Applies the view filters to the list of chapters obtained from the database. * @return an observable of the list of chapters filtered and sorted.