mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-15 13:37:29 +01:00
Migrate more track DB calls to SQLDelight
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
package eu.kanade.tachiyomi.ui.browse.migration
|
||||
|
||||
import eu.kanade.domain.track.interactor.GetTracks
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.util.hasCustomCover
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
@@ -17,7 +18,7 @@ object MigrationFlags {
|
||||
private const val CUSTOM_COVER = 0b1000
|
||||
|
||||
private val coverCache: CoverCache by injectLazy()
|
||||
private val db: DatabaseHelper = Injekt.get()
|
||||
private val getTracks: GetTracks = Injekt.get()
|
||||
|
||||
val flags get() = arrayOf(CHAPTERS, CATEGORIES, TRACK, CUSTOM_COVER)
|
||||
|
||||
@@ -48,14 +49,12 @@ object MigrationFlags {
|
||||
fun titles(manga: Manga?): Array<Int> {
|
||||
val titles = arrayOf(R.string.chapters, R.string.categories).toMutableList()
|
||||
if (manga != null) {
|
||||
db.inTransaction {
|
||||
if (db.getTracks(manga.id).executeAsBlocking().isNotEmpty()) {
|
||||
titles.add(R.string.track)
|
||||
}
|
||||
if (runBlocking { getTracks.await(manga.id!!) }.isNotEmpty()) {
|
||||
titles.add(R.string.track)
|
||||
}
|
||||
|
||||
if (manga.hasCustomCover(coverCache)) {
|
||||
titles.add(R.string.custom_cover)
|
||||
}
|
||||
if (manga.hasCustomCover(coverCache)) {
|
||||
titles.add(R.string.custom_cover)
|
||||
}
|
||||
}
|
||||
return titles.toTypedArray()
|
||||
|
||||
@@ -5,6 +5,8 @@ import eu.davidea.flexibleadapter.items.IFlexible
|
||||
import eu.kanade.domain.category.interactor.GetCategories
|
||||
import eu.kanade.domain.manga.interactor.GetDuplicateLibraryManga
|
||||
import eu.kanade.domain.manga.model.toDbManga
|
||||
import eu.kanade.domain.track.interactor.InsertTrack
|
||||
import eu.kanade.domain.track.model.toDomainTrack
|
||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
import eu.kanade.tachiyomi.data.database.models.Category
|
||||
@@ -67,6 +69,7 @@ open class BrowseSourcePresenter(
|
||||
private val coverCache: CoverCache = Injekt.get(),
|
||||
private val getDuplicateLibraryManga: GetDuplicateLibraryManga = Injekt.get(),
|
||||
private val getCategories: GetCategories = Injekt.get(),
|
||||
private val insertTrack: InsertTrack = Injekt.get(),
|
||||
) : BasePresenter<BrowseSourceController>() {
|
||||
|
||||
/**
|
||||
@@ -286,7 +289,7 @@ open class BrowseSourcePresenter(
|
||||
service.match(manga)?.let { track ->
|
||||
track.manga_id = manga.id!!
|
||||
(service as TrackService).bind(track)
|
||||
db.insertTrack(track).executeAsBlocking()
|
||||
insertTrack.await(track.toDomainTrack()!!)
|
||||
|
||||
syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service as TrackService)
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ class LibraryPresenter(
|
||||
val filterCompleted = preferences.filterCompleted().get()
|
||||
val loggedInServices = trackManager.services.filter { trackService -> trackService.isLogged }
|
||||
.associate { trackService ->
|
||||
Pair(trackService.id, preferences.filterTracking(trackService.id).get())
|
||||
Pair(trackService.id, preferences.filterTracking(trackService.id.toInt()).get())
|
||||
}
|
||||
val isNotAnyLoggedIn = !loggedInServices.values.any()
|
||||
|
||||
@@ -173,8 +173,8 @@ class LibraryPresenter(
|
||||
|
||||
if (!containsExclude.any() && !containsInclude.any()) return@tracking true
|
||||
|
||||
val exclude = trackedManga?.filterKeys { containsExclude.containsKey(it) }?.values ?: emptyList()
|
||||
val include = trackedManga?.filterKeys { containsInclude.containsKey(it) }?.values ?: emptyList()
|
||||
val exclude = trackedManga?.filterKeys { containsExclude.containsKey(it.toLong()) }?.values ?: emptyList()
|
||||
val include = trackedManga?.filterKeys { containsInclude.containsKey(it.toLong()) }?.values ?: emptyList()
|
||||
|
||||
if (containsInclude.any() && containsExclude.any()) {
|
||||
return@tracking if (exclude.isNotEmpty()) !exclude.any() else include.any()
|
||||
@@ -411,7 +411,7 @@ class LibraryPresenter(
|
||||
.mapValues { tracksForMangaId ->
|
||||
// Check if any of the trackers is logged in for the current manga id
|
||||
tracksForMangaId.value.associate {
|
||||
Pair(it.sync_id, trackManager.getService(it.sync_id)?.isLogged ?: false)
|
||||
Pair(it.sync_id, trackManager.getService(it.sync_id.toLong())?.isLogged ?: false)
|
||||
}
|
||||
}
|
||||
}.observeOn(Schedulers.io())
|
||||
|
||||
@@ -91,7 +91,7 @@ class LibrarySettingsSheet(
|
||||
private val unread = Item.TriStateGroup(R.string.action_filter_unread, this)
|
||||
private val started = Item.TriStateGroup(R.string.action_filter_started, this)
|
||||
private val completed = Item.TriStateGroup(R.string.completed, this)
|
||||
private val trackFilters: Map<Int, Item.TriStateGroup>
|
||||
private val trackFilters: Map<Long, Item.TriStateGroup>
|
||||
|
||||
override val header = null
|
||||
override val items: List<Item>
|
||||
@@ -127,7 +127,7 @@ class LibrarySettingsSheet(
|
||||
completed.state = preferences.filterCompleted().get()
|
||||
|
||||
trackFilters.forEach { trackFilter ->
|
||||
trackFilter.value.state = preferences.filterTracking(trackFilter.key).get()
|
||||
trackFilter.value.state = preferences.filterTracking(trackFilter.key.toInt()).get()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ class LibrarySettingsSheet(
|
||||
else -> {
|
||||
trackFilters.forEach { trackFilter ->
|
||||
if (trackFilter.value == item) {
|
||||
preferences.filterTracking(trackFilter.key).set(newState)
|
||||
preferences.filterTracking(trackFilter.key.toInt()).set(newState)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -692,7 +692,7 @@ class MangaPresenter(
|
||||
.map { tracks ->
|
||||
val dbTracks = tracks.map { it.toDbTrack() }
|
||||
loggedServices.map { service ->
|
||||
TrackItem(dbTracks.find { it.sync_id == service.id }, service)
|
||||
TrackItem(dbTracks.find { it.sync_id.toLong() == service.id }, service)
|
||||
}
|
||||
}
|
||||
.collectLatest { trackItems ->
|
||||
|
||||
@@ -32,7 +32,7 @@ class SetTrackChaptersDialog<T> : DialogController
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle) : super(bundle) {
|
||||
val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id)!!
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id.toLong())!!
|
||||
item = TrackItem(track, service)
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ class SetTrackScoreDialog<T> : DialogController
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle) : super(bundle) {
|
||||
val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id)!!
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id.toLong())!!
|
||||
item = TrackItem(track, service)
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ class SetTrackStatusDialog<T> : DialogController
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle) : super(bundle) {
|
||||
val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id)!!
|
||||
val service = Injekt.get<TrackManager>().getService(track.sync_id.toLong())!!
|
||||
item = TrackItem(track, service)
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ class TrackSearchDialog : DialogController {
|
||||
|
||||
@Suppress("unused")
|
||||
constructor(bundle: Bundle) : super(bundle) {
|
||||
service = Injekt.get<TrackManager>().getService(bundle.getInt(KEY_SERVICE))!!
|
||||
service = Injekt.get<TrackManager>().getService(bundle.getLong(KEY_SERVICE))!!
|
||||
currentTrackUrl = bundle.getString(KEY_CURRENT_URL)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,9 @@ import eu.kanade.domain.chapter.model.ChapterUpdate
|
||||
import eu.kanade.domain.history.interactor.UpsertHistory
|
||||
import eu.kanade.domain.history.model.HistoryUpdate
|
||||
import eu.kanade.domain.manga.model.isLocal
|
||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||
import eu.kanade.domain.track.interactor.GetTracks
|
||||
import eu.kanade.domain.track.interactor.InsertTrack
|
||||
import eu.kanade.domain.track.model.toDbTrack
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
|
||||
@@ -45,6 +47,7 @@ import eu.kanade.tachiyomi.util.system.isOnline
|
||||
import eu.kanade.tachiyomi.util.system.logcat
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import logcat.LogPriority
|
||||
import rx.Observable
|
||||
import rx.Subscription
|
||||
@@ -63,9 +66,10 @@ class ReaderPresenter(
|
||||
private val db: DatabaseHelper = Injekt.get(),
|
||||
private val sourceManager: SourceManager = Injekt.get(),
|
||||
private val downloadManager: DownloadManager = Injekt.get(),
|
||||
private val coverCache: CoverCache = Injekt.get(),
|
||||
private val preferences: PreferencesHelper = Injekt.get(),
|
||||
private val delayedTrackingStore: DelayedTrackingStore = Injekt.get(),
|
||||
private val getTracks: GetTracks = Injekt.get(),
|
||||
private val insertTrack: InsertTrack = Injekt.get(),
|
||||
private val upsertHistory: UpsertHistory = Injekt.get(),
|
||||
private val updateChapter: UpdateChapter = Injekt.get(),
|
||||
) : BasePresenter<ReaderActivity>() {
|
||||
@@ -152,9 +156,8 @@ class ReaderPresenter(
|
||||
|
||||
private var hasTrackers: Boolean = false
|
||||
private val checkTrackers: (Manga) -> Unit = { manga ->
|
||||
val tracks = db.getTracks(manga.id).executeAsBlocking()
|
||||
|
||||
hasTrackers = tracks.size > 0
|
||||
val tracks = runBlocking { getTracks.await(manga.id!!) }
|
||||
hasTrackers = tracks.isNotEmpty()
|
||||
}
|
||||
|
||||
private val incognitoMode = preferences.incognitoMode().get()
|
||||
@@ -740,27 +743,27 @@ class ReaderPresenter(
|
||||
if (!preferences.autoUpdateTrack()) return
|
||||
val manga = manga ?: return
|
||||
|
||||
val chapterRead = readerChapter.chapter.chapter_number
|
||||
val chapterRead = readerChapter.chapter.chapter_number.toDouble()
|
||||
|
||||
val trackManager = Injekt.get<TrackManager>()
|
||||
val context = Injekt.get<Application>()
|
||||
|
||||
launchIO {
|
||||
db.getTracks(manga.id).executeAsBlocking()
|
||||
getTracks.await(manga.id!!)
|
||||
.mapNotNull { track ->
|
||||
val service = trackManager.getService(track.sync_id)
|
||||
if (service != null && service.isLogged && chapterRead > track.last_chapter_read) {
|
||||
track.last_chapter_read = chapterRead
|
||||
val service = trackManager.getService(track.syncId)
|
||||
if (service != null && service.isLogged && chapterRead > track.lastChapterRead) {
|
||||
val updatedTrack = track.copy(lastChapterRead = chapterRead)
|
||||
|
||||
// We want these to execute even if the presenter is destroyed and leaks
|
||||
// for a while. The view can still be garbage collected.
|
||||
async {
|
||||
runCatching {
|
||||
if (context.isOnline()) {
|
||||
service.update(track, true)
|
||||
db.insertTrack(track).executeAsBlocking()
|
||||
service.update(updatedTrack.toDbTrack(), true)
|
||||
insertTrack.await(updatedTrack)
|
||||
} else {
|
||||
delayedTrackingStore.addItem(track)
|
||||
delayedTrackingStore.addItem(updatedTrack)
|
||||
DelayedTrackingUpdateJob.setupTask(context)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ class SettingsTrackingController :
|
||||
return super.onOptionsItemSelected(item)
|
||||
}
|
||||
|
||||
private fun updatePreference(id: Int) {
|
||||
private fun updatePreference(id: Long) {
|
||||
val pref = findPreference(Keys.trackUsername(id)) as? TrackerPreference
|
||||
pref?.notifyChanged()
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ class TrackLoginDialog(
|
||||
bundle: Bundle? = null,
|
||||
) : LoginDialogPreference(usernameLabelRes, bundle) {
|
||||
|
||||
private val service = Injekt.get<TrackManager>().getService(args.getInt("serviceId"))!!
|
||||
private val service = Injekt.get<TrackManager>().getService(args.getLong("serviceId"))!!
|
||||
|
||||
constructor(service: TrackService) : this(service, null)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ import uy.kohesive.injekt.api.get
|
||||
|
||||
class TrackLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) {
|
||||
|
||||
private val service = Injekt.get<TrackManager>().getService(args.getInt("serviceId"))!!
|
||||
private val service = Injekt.get<TrackManager>().getService(args.getLong("serviceId"))!!
|
||||
|
||||
constructor(service: TrackService) : this(bundleOf("serviceId" to service.id))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user