Put Komga tracker in separate group

This commit is contained in:
arkon 2021-07-18 12:55:26 -04:00
parent a252a8acee
commit 8bfc5f0450
10 changed files with 56 additions and 37 deletions

View File

@ -20,9 +20,9 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateRanker.rankingScheme
import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Companion.start import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Companion.start
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.model.toSChapter import eu.kanade.tachiyomi.source.model.toSChapter
@ -489,7 +489,7 @@ class LibraryUpdateService(
val updatedTrack = service.refresh(track) val updatedTrack = service.refresh(track)
db.insertTrack(updatedTrack).executeAsBlocking() db.insertTrack(updatedTrack).executeAsBlocking()
if (service is UnattendedTrackService) { if (service is EnhancedTrackService) {
syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service) syncChaptersWithTrackServiceTwoWay(db, db.getChapters(manga).executeAsBlocking(), track, service)
} }
} catch (e: Throwable) { } catch (e: Throwable) {

View File

@ -1,18 +1,26 @@
package eu.kanade.tachiyomi.data.track package eu.kanade.tachiyomi.data.track
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.komga.Komga
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
/** /**
* An Unattended Track Service will never prompt the user to match a manga with the remote. * An Enhanced Track Service will never prompt the user to match a manga with the remote.
* It is expected that such Track Sercice can only work with specific sources and unique IDs. * It is expected that such Track Service can only work with specific sources and unique IDs.
*/ */
interface UnattendedTrackService { interface EnhancedTrackService {
/** /**
* This TrackService will only work with the sources that are accepted by this filter function. * This TrackService will only work with the sources that are accepted by this filter function.
*/ */
fun accept(source: Source): Boolean fun accept(source: Source): Boolean {
return source::class.qualifiedName in getAcceptedSources()
}
/**
* Fully qualified source classes that this track service is compatible with.
*/
fun getAcceptedSources(): List<String>
/** /**
* match is similar to TrackService.search, but only return zero or one match. * match is similar to TrackService.search, but only return zero or one match.

View File

@ -6,22 +6,20 @@ import androidx.annotation.StringRes
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.NoLoginTrackService import eu.kanade.tachiyomi.data.track.NoLoginTrackService
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import okhttp3.Dns import okhttp3.Dns
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
class Komga(private val context: Context, id: Int) : TrackService(id), UnattendedTrackService, NoLoginTrackService { class Komga(private val context: Context, id: Int) : TrackService(id), EnhancedTrackService, NoLoginTrackService {
companion object { companion object {
const val UNREAD = 1 const val UNREAD = 1
const val READING = 2 const val READING = 2
const val COMPLETED = 3 const val COMPLETED = 3
const val ACCEPTED_SOURCE = "eu.kanade.tachiyomi.extension.all.komga.Komga"
} }
override val client: OkHttpClient = override val client: OkHttpClient =
@ -94,7 +92,7 @@ class Komga(private val context: Context, id: Int) : TrackService(id), Unattende
saveCredentials("user", "pass") saveCredentials("user", "pass")
} }
override fun accept(source: Source): Boolean = source::class.qualifiedName == ACCEPTED_SOURCE override fun getAcceptedSources() = listOf("eu.kanade.tachiyomi.extension.all.komga.Komga")
override suspend fun match(manga: Manga): TrackSearch? = override suspend fun match(manga: Manga): TrackSearch? =
try { try {

View File

@ -9,9 +9,9 @@ import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.MangaCategory
import eu.kanade.tachiyomi.data.database.models.toMangaInfo import eu.kanade.tachiyomi.data.database.models.toMangaInfo
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.CatalogueSource
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.model.Filter import eu.kanade.tachiyomi.source.model.Filter
@ -277,7 +277,7 @@ open class BrowseSourcePresenter(
private fun autoAddTrack(manga: Manga) { private fun autoAddTrack(manga: Manga) {
loggedServices loggedServices
.filterIsInstance<UnattendedTrackService>() .filterIsInstance<EnhancedTrackService>()
.filter { it.accept(source) } .filter { it.accept(source) }
.forEach { service -> .forEach { service ->
launchIO { launchIO {

View File

@ -36,8 +36,8 @@ import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.download.DownloadService import eu.kanade.tachiyomi.data.download.DownloadService
import eu.kanade.tachiyomi.data.download.model.Download import eu.kanade.tachiyomi.data.download.model.Download
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.databinding.MangaControllerBinding import eu.kanade.tachiyomi.databinding.MangaControllerBinding
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
@ -538,7 +538,7 @@ class MangaController :
if (source != null && preferences.autoAddTrack()) { if (source != null && preferences.autoAddTrack()) {
presenter.trackList presenter.trackList
.map { it.service } .map { it.service }
.filterIsInstance<UnattendedTrackService>() .filterIsInstance<EnhancedTrackService>()
.filter { it.accept(source!!) } .filter { it.accept(source!!) }
.forEach { service -> .forEach { service ->
launchIO { launchIO {

View File

@ -15,9 +15,9 @@ import eu.kanade.tachiyomi.data.database.models.toMangaInfo
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.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
import eu.kanade.tachiyomi.data.track.UnattendedTrackService
import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.model.toSChapter import eu.kanade.tachiyomi.source.model.toSChapter
@ -747,7 +747,7 @@ class MangaPresenter(
val track = it.service.refresh(it.track!!) val track = it.service.refresh(it.track!!)
db.insertTrack(track).executeAsBlocking() db.insertTrack(track).executeAsBlocking()
if (it.service is UnattendedTrackService) { if (it.service is EnhancedTrackService) {
syncChaptersWithTrackServiceTwoWay(db, allChapters, track, it.service) syncChaptersWithTrackServiceTwoWay(db, allChapters, track, it.service)
} }
} }
@ -783,7 +783,7 @@ class MangaPresenter(
service.bind(item, hasReadChapters) service.bind(item, hasReadChapters)
db.insertTrack(item).executeAsBlocking() db.insertTrack(item).executeAsBlocking()
if (service is UnattendedTrackService) { if (service is EnhancedTrackService) {
syncChaptersWithTrackServiceTwoWay(db, allChapters, item, service) syncChaptersWithTrackServiceTwoWay(db, allChapters, item, service)
} }
} catch (e: Throwable) { } catch (e: Throwable) {

View File

@ -12,7 +12,7 @@ import com.google.android.material.datepicker.DateValidatorPointForward
import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.datepicker.MaterialDatePicker
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.UnattendedTrackService import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.databinding.TrackControllerBinding import eu.kanade.tachiyomi.databinding.TrackControllerBinding
import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.base.controller.openInBrowser import eu.kanade.tachiyomi.ui.base.controller.openInBrowser
@ -80,7 +80,7 @@ class TrackSheet(
override fun onSetClick(position: Int) { override fun onSetClick(position: Int) {
val item = adapter.getItem(position) ?: return val item = adapter.getItem(position) ?: return
if (item.service is UnattendedTrackService) { if (item.service is EnhancedTrackService) {
if (item.track != null) { if (item.track != null) {
controller.presenter.unregisterTracking(item.service) controller.presenter.unregisterTracking(item.service)
return return

View File

@ -4,8 +4,10 @@ import android.app.Activity
import android.view.Menu import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import androidx.preference.PreferenceGroup
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
import eu.kanade.tachiyomi.data.track.NoLoginTrackService import eu.kanade.tachiyomi.data.track.NoLoginTrackService
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.TrackService
@ -13,11 +15,13 @@ import eu.kanade.tachiyomi.data.track.anilist.AnilistApi
import eu.kanade.tachiyomi.data.track.bangumi.BangumiApi import eu.kanade.tachiyomi.data.track.bangumi.BangumiApi
import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeListApi import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeListApi
import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.setting.track.TrackLoginDialog import eu.kanade.tachiyomi.ui.setting.track.TrackLoginDialog
import eu.kanade.tachiyomi.ui.setting.track.TrackLogoutDialog import eu.kanade.tachiyomi.ui.setting.track.TrackLogoutDialog
import eu.kanade.tachiyomi.util.preference.add
import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.iconRes
import eu.kanade.tachiyomi.util.preference.infoPreference import eu.kanade.tachiyomi.util.preference.infoPreference
import eu.kanade.tachiyomi.util.preference.initThenAdd
import eu.kanade.tachiyomi.util.preference.onClick import eu.kanade.tachiyomi.util.preference.onClick
import eu.kanade.tachiyomi.util.preference.preferenceCategory import eu.kanade.tachiyomi.util.preference.preferenceCategory
import eu.kanade.tachiyomi.util.preference.switchPreference import eu.kanade.tachiyomi.util.preference.switchPreference
@ -33,6 +37,7 @@ class SettingsTrackingController :
TrackLogoutDialog.Listener { TrackLogoutDialog.Listener {
private val trackManager: TrackManager by injectLazy() private val trackManager: TrackManager by injectLazy()
private val sourceManager: SourceManager by injectLazy()
override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply { override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
titleRes = R.string.pref_category_tracking titleRes = R.string.pref_category_tracking
@ -42,11 +47,7 @@ class SettingsTrackingController :
titleRes = R.string.pref_auto_update_manga_sync titleRes = R.string.pref_auto_update_manga_sync
defaultValue = true defaultValue = true
} }
switchPreference {
key = Keys.autoAddTrack
titleRes = R.string.pref_auto_add_track
defaultValue = true
}
preferenceCategory { preferenceCategory {
titleRes = R.string.services titleRes = R.string.services
@ -67,26 +68,37 @@ class SettingsTrackingController :
trackPreference(trackManager.bangumi) { trackPreference(trackManager.bangumi) {
activity?.openInBrowser(BangumiApi.authUrl(), trackManager.bangumi.getLogoColor()) activity?.openInBrowser(BangumiApi.authUrl(), trackManager.bangumi.getLogoColor())
} }
infoPreference(R.string.tracking_info)
}
preferenceCategory {
titleRes = R.string.enhanced_services
switchPreference {
key = Keys.autoAddTrack
titleRes = R.string.pref_auto_add_track
defaultValue = true
}
trackPreference(trackManager.komga) { trackPreference(trackManager.komga) {
trackManager.komga.loginNoop() trackManager.komga.loginNoop()
updatePreference(trackManager.komga.id) updatePreference(trackManager.komga.id)
} }
}
preferenceCategory { infoPreference(R.string.enhanced_tracking_info)
infoPreference(R.string.tracking_info)
} }
} }
private inline fun PreferenceScreen.trackPreference( private inline fun PreferenceGroup.trackPreference(
service: TrackService, service: TrackService,
crossinline login: () -> Unit crossinline login: () -> Unit
): LoginPreference { ): LoginPreference {
return initThenAdd( return add(
LoginPreference(context).apply { LoginPreference(context).apply {
key = Keys.trackUsername(service.id) key = Keys.trackUsername(service.id)
titleRes = service.nameRes() titleRes = service.nameRes()
}, iconRes = service.getLogo()
{
onClick { onClick {
if (service.isLogged) { if (service.isLogged) {
if (service is NoLoginTrackService) { if (service is NoLoginTrackService) {

View File

@ -34,9 +34,8 @@ inline fun PreferenceGroup.preference(block: (@DSL Preference).() -> Unit): Pref
} }
inline fun PreferenceGroup.infoPreference(@StringRes infoRes: Int): Preference { inline fun PreferenceGroup.infoPreference(@StringRes infoRes: Int): Preference {
return initThenAdd( return add(
Preference(context), Preference(context).apply {
{
iconRes = R.drawable.ic_info_24dp iconRes = R.drawable.ic_info_24dp
iconTint = context.getResourceColor(android.R.attr.textColorHint) iconTint = context.getResourceColor(android.R.attr.textColorHint)
summaryRes = infoRes summaryRes = infoRes

View File

@ -381,9 +381,11 @@
<!-- Tracking section --> <!-- Tracking section -->
<string name="tracking_guide">Tracking guide</string> <string name="tracking_guide">Tracking guide</string>
<string name="pref_auto_update_manga_sync">Update chapter progress after reading</string> <string name="pref_auto_update_manga_sync">Update chapter progress after reading</string>
<string name="pref_auto_add_track">Track silently when adding manga to library</string>
<string name="services">Services</string> <string name="services">Services</string>
<string name="tracking_info">One-way sync to update the chapter progress in tracking services. Set up tracking for individual manga entries from their tracking button.</string> <string name="tracking_info">One-way sync to update the chapter progress in tracking services. Set up tracking for individual manga entries from their tracking button.</string>
<string name="enhanced_services">Enhanced services</string>
<string name="pref_auto_add_track">Automatically track manga when added to library</string>
<string name="enhanced_tracking_info">Services that provide enhanced features for specific sources.</string>
<!-- Browse section --> <!-- Browse section -->
<string name="pref_enable_automatic_extension_updates">Check for extension updates</string> <string name="pref_enable_automatic_extension_updates">Check for extension updates</string>