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
This commit is contained in:
AntsyLich 2024-07-08 09:20:02 +06:00 committed by Cuong-Tran
parent 74a71de53e
commit b12735732f
No known key found for this signature in database
GPG key ID: 733AA7624B9315C2
2 changed files with 39 additions and 40 deletions

View file

@ -290,7 +290,7 @@ class MangaScreen(
) )
}.takeIf { isHttpSource }, }.takeIf { isHttpSource },
onTrackingClicked = { onTrackingClicked = {
if (successState.loggedInTracker.isEmpty()) { if (!successState.hasLoggedInTrackers) {
navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking)) navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking))
} else { } else {
screenModel.showTrackDialog() screenModel.showTrackDialog()

View file

@ -49,7 +49,6 @@ import eu.kanade.tachiyomi.data.download.DownloadCache
import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.download.DownloadManager
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.data.track.EnhancedTracker 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.TrackerManager
import eu.kanade.tachiyomi.data.track.mdlist.MdList import eu.kanade.tachiyomi.data.track.mdlist.MdList
import eu.kanade.tachiyomi.network.HttpException 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.isLoading
import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.removeDuplicates import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.removeDuplicates
import eu.kanade.tachiyomi.ui.manga.RelatedManga.Companion.sorted 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.ui.reader.setting.ReaderPreferences
import eu.kanade.tachiyomi.util.chapter.getNextUnread import eu.kanade.tachiyomi.util.chapter.getNextUnread
import eu.kanade.tachiyomi.util.removeCovers 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.source.service.SourceManager
import tachiyomi.domain.track.interactor.GetTracks import tachiyomi.domain.track.interactor.GetTracks
import tachiyomi.domain.track.interactor.InsertTrack import tachiyomi.domain.track.interactor.InsertTrack
import tachiyomi.domain.track.model.Track
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.i18n.sy.SYMR import tachiyomi.i18n.sy.SYMR
import tachiyomi.source.local.LocalSource import tachiyomi.source.local.LocalSource
@ -400,16 +399,6 @@ class MangaScreenModel(
} }
} }
screenModelScope.launchIO {
trackerManager.loggedInTrackersFlow()
.distinctUntilChanged()
.collectLatest { trackers ->
updateSuccessState {
it.copy(loggedInTracker = trackers)
}
}
}
observeDownloads() observeDownloads()
screenModelScope.launchIO { screenModelScope.launchIO {
@ -1755,42 +1744,54 @@ class MangaScreenModel(
getTracks.subscribe(manga.id).catch { logcat(LogPriority.ERROR, it) }, getTracks.subscribe(manga.id).catch { logcat(LogPriority.ERROR, it) },
trackerManager.loggedInTrackersFlow(), trackerManager.loggedInTrackersFlow(),
) { mangaTracks, loggedInTrackers -> ) { mangaTracks, loggedInTrackers ->
loggedInTrackers // Show only if the service supports this manga's source
// Map to TrackItem val supportedTrackers = loggedInTrackers.filter { (it as? EnhancedTracker)?.accept(source!!) ?: true }
.map { service -> TrackItem(mangaTracks.find { it.trackerId == service.id }, service) } val supportedTrackerIds = supportedTrackers.map { it.id }.toHashSet()
// Show only if the service supports this manga's source val supportedTrackerTracks = mangaTracks.filter { it.trackerId in supportedTrackerIds }
.filter { (it.tracker as? EnhancedTracker)?.accept(source!!) ?: true } supportedTrackerTracks to supportedTrackers
} }
// SY --> // SY -->
.map { trackItems -> .map { (tracks, supportedTrackers) ->
if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any { val supportedTrackerTracks = if (manga.source in mangaDexSourceIds || state.mergedData?.manga?.values.orEmpty().any {
it.source in mangaDexSourceIds it.source in mangaDexSourceIds
} }
) { ) {
val mdTrack = trackItems.firstOrNull { it.tracker is MdList } val mdTrack = supportedTrackers.firstOrNull { it is MdList }
when { when {
mdTrack == null -> { mdTrack == null -> {
trackItems tracks
} }
mdTrack.track == null -> { // KMK: auto track MangaDex
trackItems - mdTrack + createMdListTrack() mdTrack.id !in tracks.map { it.trackerId } -> {
tracks + createMdListTrack()
} }
else -> trackItems else -> tracks
} }
} else { } else {
trackItems tracks
} }
supportedTrackerTracks
.filter {
it.trackerId != trackerManager.mdList.id ||
it.status != FollowStatus.UNFOLLOWED.long
}
.size to supportedTrackers.isNotEmpty()
} }
// SY <-- // SY <--
.distinctUntilChanged() .distinctUntilChanged()
.collectLatest { trackItems -> .collectLatest { (trackingCount, hasLoggedInTrackers) ->
updateSuccessState { it.copy(trackItems = trackItems) } updateSuccessState {
it.copy(
trackingCount = trackingCount,
hasLoggedInTrackers = hasLoggedInTrackers,
)
}
} }
} }
} }
// SY --> // SY -->
private suspend fun createMdListTrack(): TrackItem { private suspend fun createMdListTrack(): Track {
val state = successState!! val state = successState!!
val mdManga = state.manga.takeIf { it.source in mangaDexSourceIds } val mdManga = state.manga.takeIf { it.source in mangaDexSourceIds }
?: state.mergedData?.manga?.values?.find { 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) val track = trackerManager.mdList.createInitialTracker(state.manga, mdManga)
.toDomainTrack(false)!! .toDomainTrack(false)!!
insertTrack.await(track) 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 <-- // SY <--
@ -1896,11 +1903,11 @@ class MangaScreenModel(
val chapters: List<ChapterList.Item>, val chapters: List<ChapterList.Item>,
val availableScanlators: ImmutableSet<String>, val availableScanlators: ImmutableSet<String>,
val excludedScanlators: ImmutableSet<String>, val excludedScanlators: ImmutableSet<String>,
val trackItems: List<TrackItem> = emptyList(), val trackingCount: Int = 0,
val hasLoggedInTrackers: Boolean = false,
val isRefreshingData: Boolean = false, val isRefreshingData: Boolean = false,
val dialog: MangaScreenModel.Dialog? = null, val dialog: MangaScreenModel.Dialog? = null,
val hasPromptedToAddBefore: Boolean = false, val hasPromptedToAddBefore: Boolean = false,
val loggedInTracker: List<Tracker> = emptyList(),
// SY --> // SY -->
val meta: RaisedSearchMetadata?, val meta: RaisedSearchMetadata?,
@ -1981,14 +1988,6 @@ class MangaScreenModel(
val filterActive: Boolean val filterActive: Boolean
get() = scanlatorFilterActive || manga.chaptersFiltered() 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. * Applies the view filters to the list of chapters obtained from the database.
* @return an observable of the list of chapters filtered and sorted. * @return an observable of the list of chapters filtered and sorted.