From c5546e1095bdf6d6a0d39bfd85aece0e40c312ec 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 | 89 +++++++++---------- 2 files changed, 43 insertions(+), 48 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 823a52a2b..d6e79c19e 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 @@ -186,7 +186,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 655b3003d..84a9202cf 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 @@ -34,7 +34,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 @@ -128,6 +127,7 @@ import tachiyomi.domain.manga.repository.MangaRepository 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 @@ -361,16 +361,6 @@ class MangaScreenModel( } } - screenModelScope.launchIO { - trackerManager.loggedInTrackersFlow() - .distinctUntilChanged() - .collectLatest { trackers -> - updateSuccessState { - it.copy(loggedInTracker = trackers) - } - } - } - observeDownloads() screenModelScope.launchIO { @@ -1500,45 +1490,55 @@ class MangaScreenModel( screenModelScope.launchIO { combine( - getTracks.subscribe(manga.id).catch { logcat(LogPriority.ERROR, it) }, + getTracks.subscribe(manga.id) + // SY --> + .map { trackItems -> + if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { + it.source in mangaDexSourceIds + } + ) { + val mdTrack = trackItems.firstOrNull { it.trackerId == TrackerManager.MDLIST } + when { + trackerManager.mdList.isLoggedIn && mdTrack == null -> { + trackItems + createMdListTrack() + } + else -> trackItems + } + } else { + trackItems + } + } + // SY <-- + .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 } // SY --> - .map { trackItems -> - if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { - it.source in mangaDexSourceIds - } - ) { - val mdTrack = trackItems.firstOrNull { it.tracker is MdList } - when { - mdTrack == null -> { - trackItems - } - mdTrack.track == null -> { - trackItems - mdTrack + createMdListTrack() - } - else -> trackItems - } - } else { - trackItems - } + val trackingCount = supportedTrackerTracks.count { + (it.trackerId == TrackerManager.MDLIST && it.status != FollowStatus.UNFOLLOWED.long) || + it.trackerId != TrackerManager.MDLIST } + trackingCount 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 } @@ -1546,7 +1546,7 @@ 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) + return getTracks.await(mangaId).first { it.trackerId == trackerManager.mdList.id } } // SY <-- @@ -1643,11 +1643,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?, val mergedData: MergedMangaData?, @@ -1700,11 +1700,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) || it.tracker !is MdList) - } - /** * Applies the view filters to the list of chapters obtained from the database. * @return an observable of the list of chapters filtered and sorted.