Tracker-related cleanup
This commit is contained in:
@@ -23,9 +23,9 @@ import eu.kanade.tachiyomi.R
|
||||
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.EnhancedTrackService
|
||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
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.network.HttpException
|
||||
import eu.kanade.tachiyomi.source.Source
|
||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
|
||||
@@ -84,7 +84,7 @@ class MangaScreenModel(
|
||||
private val libraryPreferences: LibraryPreferences = Injekt.get(),
|
||||
readerPreferences: ReaderPreferences = Injekt.get(),
|
||||
uiPreferences: UiPreferences = Injekt.get(),
|
||||
private val trackManager: TrackManager = Injekt.get(),
|
||||
private val trackerManager: TrackerManager = Injekt.get(),
|
||||
private val downloadManager: DownloadManager = Injekt.get(),
|
||||
private val downloadCache: DownloadCache = Injekt.get(),
|
||||
private val getMangaAndChapters: GetMangaWithChapters = Injekt.get(),
|
||||
@@ -105,7 +105,7 @@ class MangaScreenModel(
|
||||
private val successState: State.Success?
|
||||
get() = state.value as? State.Success
|
||||
|
||||
private val loggedServices by lazy { trackManager.services.filter { it.isLoggedIn } }
|
||||
private val loggedInTrackers by lazy { trackerManager.trackers.filter { it.isLoggedIn } }
|
||||
|
||||
val manga: Manga?
|
||||
get() = successState?.manga
|
||||
@@ -317,14 +317,14 @@ class MangaScreenModel(
|
||||
// Finally match with enhanced tracking when available
|
||||
val source = state.source
|
||||
state.trackItems
|
||||
.map { it.service }
|
||||
.filterIsInstance<EnhancedTrackService>()
|
||||
.map { it.tracker }
|
||||
.filterIsInstance<EnhancedTracker>()
|
||||
.filter { it.accept(source) }
|
||||
.forEach { service ->
|
||||
launchIO {
|
||||
try {
|
||||
service.match(manga)?.let { track ->
|
||||
(service as TrackService).register(track, mangaId)
|
||||
(service as Tracker).register(track, mangaId)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
logcat(LogPriority.WARN, e) {
|
||||
@@ -949,11 +949,11 @@ class MangaScreenModel(
|
||||
getTracks.subscribe(manga.id)
|
||||
.catch { logcat(LogPriority.ERROR, it) }
|
||||
.map { tracks ->
|
||||
loggedServices
|
||||
loggedInTrackers
|
||||
// Map to TrackItem
|
||||
.map { service -> TrackItem(tracks.find { it.syncId == service.id }, service) }
|
||||
// Show only if the service supports this manga's source
|
||||
.filter { (it.service as? EnhancedTrackService)?.accept(source!!) ?: true }
|
||||
.filter { (it.tracker as? EnhancedTracker)?.accept(source!!) ?: true }
|
||||
}
|
||||
.distinctUntilChanged()
|
||||
.collectLatest { trackItems ->
|
||||
|
||||
@@ -46,14 +46,14 @@ import eu.kanade.presentation.track.TrackChapterSelector
|
||||
import eu.kanade.presentation.track.TrackDateSelector
|
||||
import eu.kanade.presentation.track.TrackInfoDialogHome
|
||||
import eu.kanade.presentation.track.TrackScoreSelector
|
||||
import eu.kanade.presentation.track.TrackServiceSearch
|
||||
import eu.kanade.presentation.track.TrackStatusSelector
|
||||
import eu.kanade.presentation.track.TrackerSearch
|
||||
import eu.kanade.presentation.util.Screen
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.track.DeletableTrackService
|
||||
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
|
||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
import eu.kanade.tachiyomi.data.track.DeletableTracker
|
||||
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.model.TrackSearch
|
||||
import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone
|
||||
import eu.kanade.tachiyomi.util.system.openInBrowser
|
||||
@@ -105,7 +105,7 @@ data class TrackInfoDialogHomeScreen(
|
||||
navigator.push(
|
||||
TrackStatusSelectorScreen(
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -113,7 +113,7 @@ data class TrackInfoDialogHomeScreen(
|
||||
navigator.push(
|
||||
TrackChapterSelectorScreen(
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -121,7 +121,7 @@ data class TrackInfoDialogHomeScreen(
|
||||
navigator.push(
|
||||
TrackScoreSelectorScreen(
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -129,7 +129,7 @@ data class TrackInfoDialogHomeScreen(
|
||||
navigator.push(
|
||||
TrackDateSelectorScreen(
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
start = true,
|
||||
),
|
||||
)
|
||||
@@ -138,21 +138,21 @@ data class TrackInfoDialogHomeScreen(
|
||||
navigator.push(
|
||||
TrackDateSelectorScreen(
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
start = false,
|
||||
),
|
||||
)
|
||||
},
|
||||
onNewSearch = {
|
||||
if (it.service is EnhancedTrackService) {
|
||||
if (it.tracker is EnhancedTracker) {
|
||||
sm.registerEnhancedTracking(it)
|
||||
} else {
|
||||
navigator.push(
|
||||
TrackServiceSearchScreen(
|
||||
TrackerSearchScreen(
|
||||
mangaId = mangaId,
|
||||
initialQuery = it.track?.title ?: mangaTitle,
|
||||
currentUrl = it.track?.remoteUrl,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
),
|
||||
)
|
||||
}
|
||||
@@ -160,10 +160,10 @@ data class TrackInfoDialogHomeScreen(
|
||||
onOpenInBrowser = { openTrackerInBrowser(context, it) },
|
||||
onRemoved = {
|
||||
navigator.push(
|
||||
TrackServiceRemoveScreen(
|
||||
TrackerRemoveScreen(
|
||||
mangaId = mangaId,
|
||||
track = it.track!!,
|
||||
serviceId = it.service.id,
|
||||
serviceId = it.tracker.id,
|
||||
),
|
||||
)
|
||||
},
|
||||
@@ -201,12 +201,12 @@ data class TrackInfoDialogHomeScreen(
|
||||
}
|
||||
|
||||
fun registerEnhancedTracking(item: TrackItem) {
|
||||
item.service as EnhancedTrackService
|
||||
item.tracker as EnhancedTracker
|
||||
coroutineScope.launchNonCancellable {
|
||||
val manga = Injekt.get<GetManga>().await(mangaId) ?: return@launchNonCancellable
|
||||
try {
|
||||
val matchResult = item.service.match(manga) ?: throw Exception()
|
||||
item.service.register(matchResult, mangaId)
|
||||
val matchResult = item.tracker.match(manga) ?: throw Exception()
|
||||
item.tracker.register(matchResult, mangaId)
|
||||
} catch (e: Exception) {
|
||||
withUIContext { Injekt.get<Application>().toast(R.string.error_no_match) }
|
||||
}
|
||||
@@ -236,13 +236,13 @@ data class TrackInfoDialogHomeScreen(
|
||||
}
|
||||
|
||||
private fun List<Track>.mapToTrackItem(): List<TrackItem> {
|
||||
val loggedServices = Injekt.get<TrackManager>().services.filter { it.isLoggedIn }
|
||||
val loggedInTrackers = Injekt.get<TrackerManager>().trackers.filter { it.isLoggedIn }
|
||||
val source = Injekt.get<SourceManager>().getOrStub(sourceId)
|
||||
return loggedServices
|
||||
return loggedInTrackers
|
||||
// Map to TrackItem
|
||||
.map { service -> TrackItem(find { it.syncId == service.id }, service) }
|
||||
// Show only if the service supports this manga's source
|
||||
.filter { (it.service as? EnhancedTrackService)?.accept(source) ?: true }
|
||||
.filter { (it.tracker as? EnhancedTracker)?.accept(source) ?: true }
|
||||
}
|
||||
|
||||
@Immutable
|
||||
@@ -263,7 +263,7 @@ private data class TrackStatusSelectorScreen(
|
||||
val sm = rememberScreenModel {
|
||||
Model(
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
)
|
||||
}
|
||||
val state by sm.state.collectAsState()
|
||||
@@ -281,11 +281,11 @@ private data class TrackStatusSelectorScreen(
|
||||
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
) : StateScreenModel<Model.State>(State(track.status.toInt())) {
|
||||
|
||||
fun getSelections(): Map<Int, Int?> {
|
||||
return service.getStatusList().associateWith { service.getStatus(it) }
|
||||
return tracker.getStatusList().associateWith { tracker.getStatus(it) }
|
||||
}
|
||||
|
||||
fun setSelection(selection: Int) {
|
||||
@@ -294,7 +294,7 @@ private data class TrackStatusSelectorScreen(
|
||||
|
||||
fun setStatus() {
|
||||
coroutineScope.launchNonCancellable {
|
||||
service.setRemoteStatus(track.toDbTrack(), state.value.selection)
|
||||
tracker.setRemoteStatus(track.toDbTrack(), state.value.selection)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ private data class TrackChapterSelectorScreen(
|
||||
val sm = rememberScreenModel {
|
||||
Model(
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
)
|
||||
}
|
||||
val state by sm.state.collectAsState()
|
||||
@@ -335,7 +335,7 @@ private data class TrackChapterSelectorScreen(
|
||||
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
) : StateScreenModel<Model.State>(State(track.lastChapterRead.toInt())) {
|
||||
|
||||
fun getRange(): Iterable<Int> {
|
||||
@@ -353,7 +353,7 @@ private data class TrackChapterSelectorScreen(
|
||||
|
||||
fun setChapter() {
|
||||
coroutineScope.launchNonCancellable {
|
||||
service.setRemoteLastChapterRead(track.toDbTrack(), state.value.selection)
|
||||
tracker.setRemoteLastChapterRead(track.toDbTrack(), state.value.selection)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -375,7 +375,7 @@ private data class TrackScoreSelectorScreen(
|
||||
val sm = rememberScreenModel {
|
||||
Model(
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
)
|
||||
}
|
||||
val state by sm.state.collectAsState()
|
||||
@@ -394,11 +394,11 @@ private data class TrackScoreSelectorScreen(
|
||||
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
) : StateScreenModel<Model.State>(State(service.displayScore(track.toDbTrack()))) {
|
||||
private val tracker: Tracker,
|
||||
) : StateScreenModel<Model.State>(State(tracker.displayScore(track.toDbTrack()))) {
|
||||
|
||||
fun getSelections(): List<String> {
|
||||
return service.getScoreList()
|
||||
return tracker.getScoreList()
|
||||
}
|
||||
|
||||
fun setSelection(selection: String) {
|
||||
@@ -407,7 +407,7 @@ private data class TrackScoreSelectorScreen(
|
||||
|
||||
fun setScore() {
|
||||
coroutineScope.launchNonCancellable {
|
||||
service.setRemoteScore(track.toDbTrack(), state.value.selection)
|
||||
tracker.setRemoteScore(track.toDbTrack(), state.value.selection)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ private data class TrackDateSelectorScreen(
|
||||
val sm = rememberScreenModel {
|
||||
Model(
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
start = start,
|
||||
)
|
||||
}
|
||||
@@ -515,7 +515,7 @@ private data class TrackDateSelectorScreen(
|
||||
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
private val start: Boolean,
|
||||
) : ScreenModel {
|
||||
|
||||
@@ -534,15 +534,15 @@ private data class TrackDateSelectorScreen(
|
||||
val localMillis = millis.convertEpochMillisZone(ZoneOffset.UTC, ZoneOffset.systemDefault())
|
||||
coroutineScope.launchNonCancellable {
|
||||
if (start) {
|
||||
service.setRemoteStartDate(track.toDbTrack(), localMillis)
|
||||
tracker.setRemoteStartDate(track.toDbTrack(), localMillis)
|
||||
} else {
|
||||
service.setRemoteFinishDate(track.toDbTrack(), localMillis)
|
||||
tracker.setRemoteFinishDate(track.toDbTrack(), localMillis)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun confirmRemoveDate(navigator: Navigator) {
|
||||
navigator.push(TrackDateRemoverScreen(track, service.id, start))
|
||||
navigator.push(TrackDateRemoverScreen(track, tracker.id, start))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -559,7 +559,7 @@ private data class TrackDateRemoverScreen(
|
||||
val sm = rememberScreenModel {
|
||||
Model(
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
start = start,
|
||||
)
|
||||
}
|
||||
@@ -614,25 +614,25 @@ private data class TrackDateRemoverScreen(
|
||||
|
||||
private class Model(
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
private val start: Boolean,
|
||||
) : ScreenModel {
|
||||
|
||||
fun getServiceName() = service.name
|
||||
fun getServiceName() = tracker.name
|
||||
|
||||
fun removeDate() {
|
||||
coroutineScope.launchNonCancellable {
|
||||
if (start) {
|
||||
service.setRemoteStartDate(track.toDbTrack(), 0)
|
||||
tracker.setRemoteStartDate(track.toDbTrack(), 0)
|
||||
} else {
|
||||
service.setRemoteFinishDate(track.toDbTrack(), 0)
|
||||
tracker.setRemoteFinishDate(track.toDbTrack(), 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class TrackServiceSearchScreen(
|
||||
data class TrackerSearchScreen(
|
||||
private val mangaId: Long,
|
||||
private val initialQuery: String,
|
||||
private val currentUrl: String?,
|
||||
@@ -647,14 +647,14 @@ data class TrackServiceSearchScreen(
|
||||
mangaId = mangaId,
|
||||
currentUrl = currentUrl,
|
||||
initialQuery = initialQuery,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
)
|
||||
}
|
||||
|
||||
val state by sm.state.collectAsState()
|
||||
|
||||
var textFieldValue by remember { mutableStateOf(TextFieldValue(initialQuery)) }
|
||||
TrackServiceSearch(
|
||||
TrackerSearch(
|
||||
query = textFieldValue,
|
||||
onQueryChange = { textFieldValue = it },
|
||||
onDispatchQuery = { sm.trackingSearch(textFieldValue.text) },
|
||||
@@ -673,7 +673,7 @@ data class TrackServiceSearchScreen(
|
||||
private val mangaId: Long,
|
||||
private val currentUrl: String? = null,
|
||||
initialQuery: String,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
) : StateScreenModel<Model.State>(State()) {
|
||||
|
||||
init {
|
||||
@@ -690,7 +690,7 @@ data class TrackServiceSearchScreen(
|
||||
|
||||
val result = withIOContext {
|
||||
try {
|
||||
val results = service.search(query)
|
||||
val results = tracker.search(query)
|
||||
Result.success(results)
|
||||
} catch (e: Throwable) {
|
||||
Result.failure(e)
|
||||
@@ -706,7 +706,7 @@ data class TrackServiceSearchScreen(
|
||||
}
|
||||
|
||||
fun registerTracking(item: TrackSearch) {
|
||||
coroutineScope.launchNonCancellable { service.register(item, mangaId) }
|
||||
coroutineScope.launchNonCancellable { tracker.register(item, mangaId) }
|
||||
}
|
||||
|
||||
fun updateSelection(selected: TrackSearch) {
|
||||
@@ -721,7 +721,7 @@ data class TrackServiceSearchScreen(
|
||||
}
|
||||
}
|
||||
|
||||
private data class TrackServiceRemoveScreen(
|
||||
private data class TrackerRemoveScreen(
|
||||
private val mangaId: Long,
|
||||
private val track: Track,
|
||||
private val serviceId: Long,
|
||||
@@ -734,10 +734,10 @@ private data class TrackServiceRemoveScreen(
|
||||
Model(
|
||||
mangaId = mangaId,
|
||||
track = track,
|
||||
service = Injekt.get<TrackManager>().getService(serviceId)!!,
|
||||
tracker = Injekt.get<TrackerManager>().get(serviceId)!!,
|
||||
)
|
||||
}
|
||||
val serviceName = sm.getServiceName()
|
||||
val serviceName = sm.getName()
|
||||
var removeRemoteTrack by remember { mutableStateOf(false) }
|
||||
AlertDialogContent(
|
||||
modifier = Modifier.windowInsetsPadding(WindowInsets.systemBars),
|
||||
@@ -758,7 +758,7 @@ private data class TrackServiceRemoveScreen(
|
||||
Text(
|
||||
text = stringResource(R.string.track_delete_text, serviceName),
|
||||
)
|
||||
if (sm.isServiceDeletable()) {
|
||||
if (sm.isDeletable()) {
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
Checkbox(checked = removeRemoteTrack, onCheckedChange = { removeRemoteTrack = it })
|
||||
Text(text = stringResource(R.string.track_delete_remote_text, serviceName))
|
||||
@@ -798,17 +798,17 @@ private data class TrackServiceRemoveScreen(
|
||||
private class Model(
|
||||
private val mangaId: Long,
|
||||
private val track: Track,
|
||||
private val service: TrackService,
|
||||
private val tracker: Tracker,
|
||||
private val deleteTrack: DeleteTrack = Injekt.get(),
|
||||
) : ScreenModel {
|
||||
|
||||
fun getServiceName() = service.name
|
||||
fun getName() = tracker.name
|
||||
|
||||
fun isServiceDeletable() = service is DeletableTrackService
|
||||
fun isDeletable() = tracker is DeletableTracker
|
||||
|
||||
fun deleteMangaFromService() {
|
||||
coroutineScope.launchNonCancellable {
|
||||
(service as DeletableTrackService).delete(track.toDbTrack())
|
||||
(tracker as DeletableTracker).delete(track.toDbTrack())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package eu.kanade.tachiyomi.ui.manga.track
|
||||
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
import eu.kanade.tachiyomi.data.track.Tracker
|
||||
import tachiyomi.domain.track.model.Track
|
||||
|
||||
data class TrackItem(val track: Track?, val service: TrackService)
|
||||
data class TrackItem(val track: Track?, val tracker: Tracker)
|
||||
|
||||
Reference in New Issue
Block a user