Misc cleanup
This commit is contained in:
parent
d703fb7946
commit
3cca460282
29 changed files with 90 additions and 110 deletions
|
@ -1,6 +1,7 @@
|
||||||
package eu.kanade.domain.base
|
package eu.kanade.domain.base
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.util.system.isPreviewBuildType
|
import eu.kanade.tachiyomi.util.system.isPreviewBuildType
|
||||||
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
||||||
import tachiyomi.core.preference.PreferenceStore
|
import tachiyomi.core.preference.PreferenceStore
|
||||||
|
@ -19,4 +20,10 @@ class BasePreferences(
|
||||||
fun extensionInstaller() = ExtensionInstallerPreference(context, preferenceStore)
|
fun extensionInstaller() = ExtensionInstallerPreference(context, preferenceStore)
|
||||||
|
|
||||||
fun acraEnabled() = preferenceStore.getBoolean("acra.enable", isPreviewBuildType || isReleaseBuildType)
|
fun acraEnabled() = preferenceStore.getBoolean("acra.enable", isPreviewBuildType || isReleaseBuildType)
|
||||||
|
|
||||||
|
enum class ExtensionInstaller(val titleResId: Int) {
|
||||||
|
LEGACY(R.string.ext_installer_legacy),
|
||||||
|
PACKAGEINSTALLER(R.string.ext_installer_packageinstaller),
|
||||||
|
SHIZUKU(R.string.ext_installer_shizuku),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package eu.kanade.domain.base
|
package eu.kanade.domain.base
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.ExtensionInstaller
|
import eu.kanade.domain.base.BasePreferences.ExtensionInstaller
|
||||||
import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller
|
import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller
|
||||||
import eu.kanade.tachiyomi.util.system.isShizukuInstalled
|
import eu.kanade.tachiyomi.util.system.isShizukuInstalled
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
|
@ -7,7 +7,6 @@ import eu.kanade.domain.manga.model.toSManga
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadProvider
|
import eu.kanade.tachiyomi.data.download.DownloadProvider
|
||||||
import eu.kanade.tachiyomi.source.Source
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.isLocal
|
|
||||||
import eu.kanade.tachiyomi.source.model.SChapter
|
import eu.kanade.tachiyomi.source.model.SChapter
|
||||||
import eu.kanade.tachiyomi.source.online.HttpSource
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
import tachiyomi.data.chapter.ChapterSanitizer
|
import tachiyomi.data.chapter.ChapterSanitizer
|
||||||
|
@ -20,6 +19,7 @@ import tachiyomi.domain.chapter.model.toChapterUpdate
|
||||||
import tachiyomi.domain.chapter.repository.ChapterRepository
|
import tachiyomi.domain.chapter.repository.ChapterRepository
|
||||||
import tachiyomi.domain.chapter.service.ChapterRecognition
|
import tachiyomi.domain.chapter.service.ChapterRecognition
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.lang.Long.max
|
import java.lang.Long.max
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package eu.kanade.domain.chapter.model
|
package eu.kanade.domain.chapter.model
|
||||||
|
|
||||||
import eu.kanade.domain.manga.model.downloadedFilter
|
import eu.kanade.domain.manga.model.downloadedFilter
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
import eu.kanade.tachiyomi.ui.manga.ChapterItem
|
import eu.kanade.tachiyomi.ui.manga.ChapterItem
|
||||||
import tachiyomi.domain.chapter.model.Chapter
|
import tachiyomi.domain.chapter.model.Chapter
|
||||||
import tachiyomi.domain.chapter.service.getChapterSort
|
import tachiyomi.domain.chapter.service.getChapterSort
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.domain.manga.model.applyFilter
|
import tachiyomi.domain.manga.model.applyFilter
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
package eu.kanade.domain.manga.interactor
|
package eu.kanade.domain.manga.interactor
|
||||||
|
|
||||||
import eu.kanade.domain.manga.model.hasCustomCover
|
import eu.kanade.domain.manga.model.hasCustomCover
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.domain.manga.model.MangaUpdate
|
import tachiyomi.domain.manga.model.MangaUpdate
|
||||||
import tachiyomi.domain.manga.repository.MangaRepository
|
import tachiyomi.domain.manga.repository.MangaRepository
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
|
@ -5,10 +5,11 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||||
|
import tachiyomi.core.metadata.comicinfo.ComicInfo
|
||||||
|
import tachiyomi.core.metadata.comicinfo.ComicInfoPublishingStatus
|
||||||
import tachiyomi.domain.chapter.model.Chapter
|
import tachiyomi.domain.chapter.model.Chapter
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.domain.manga.model.TriStateFilter
|
import tachiyomi.domain.manga.model.TriStateFilter
|
||||||
import tachiyomi.source.local.LocalSource
|
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
|
@ -87,8 +88,6 @@ fun SManga.toDomainManga(sourceId: Long): Manga {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Manga.isLocal(): Boolean = source == LocalSource.ID
|
|
||||||
|
|
||||||
fun Manga.hasCustomCover(coverCache: CoverCache = Injekt.get()): Boolean {
|
fun Manga.hasCustomCover(coverCache: CoverCache = Injekt.get()): Boolean {
|
||||||
return coverCache.getCustomCoverFile(id).exists()
|
return coverCache.getCustomCoverFile(id).exists()
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadCache
|
import eu.kanade.tachiyomi.data.download.DownloadCache
|
||||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||||
import eu.kanade.tachiyomi.network.NetworkHelper
|
import eu.kanade.tachiyomi.network.NetworkHelper
|
||||||
import eu.kanade.tachiyomi.network.NetworkPreferences
|
import eu.kanade.tachiyomi.network.NetworkPreferences
|
||||||
|
@ -376,7 +375,7 @@ object SettingsAdvancedScreen : SearchableSettings {
|
||||||
entries = extensionInstallerPref.entries
|
entries = extensionInstallerPref.entries
|
||||||
.associateWith { stringResource(it.titleResId) },
|
.associateWith { stringResource(it.titleResId) },
|
||||||
onValueChanged = {
|
onValueChanged = {
|
||||||
if (it == PreferenceValues.ExtensionInstaller.SHIZUKU &&
|
if (it == BasePreferences.ExtensionInstaller.SHIZUKU &&
|
||||||
!context.isShizukuInstalled
|
!context.isShizukuInstalled
|
||||||
) {
|
) {
|
||||||
shizukuMissing = true
|
shizukuMissing = true
|
||||||
|
|
|
@ -12,8 +12,6 @@ import androidx.compose.ui.res.stringResource
|
||||||
import eu.kanade.presentation.more.settings.Preference
|
import eu.kanade.presentation.more.settings.Preference
|
||||||
import eu.kanade.presentation.util.collectAsState
|
import eu.kanade.presentation.util.collectAsState
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.ReaderHideThreshold
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
|
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||||
|
@ -171,10 +169,10 @@ object SettingsReaderScreen : SearchableSettings {
|
||||||
pref = readerPreferences.pagerNavInverted(),
|
pref = readerPreferences.pagerNavInverted(),
|
||||||
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
||||||
entries = mapOf(
|
entries = mapOf(
|
||||||
TappingInvertMode.NONE to stringResource(R.string.none),
|
ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none),
|
||||||
TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
||||||
TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
||||||
TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
||||||
),
|
),
|
||||||
enabled = navMode != 5,
|
enabled = navMode != 5,
|
||||||
),
|
),
|
||||||
|
@ -251,10 +249,10 @@ object SettingsReaderScreen : SearchableSettings {
|
||||||
pref = readerPreferences.webtoonNavInverted(),
|
pref = readerPreferences.webtoonNavInverted(),
|
||||||
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
title = stringResource(R.string.pref_read_with_tapping_inverted),
|
||||||
entries = mapOf(
|
entries = mapOf(
|
||||||
TappingInvertMode.NONE to stringResource(R.string.none),
|
ReaderPreferences.TappingInvertMode.NONE to stringResource(R.string.none),
|
||||||
TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
ReaderPreferences.TappingInvertMode.HORIZONTAL to stringResource(R.string.tapping_inverted_horizontal),
|
||||||
TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
ReaderPreferences.TappingInvertMode.VERTICAL to stringResource(R.string.tapping_inverted_vertical),
|
||||||
TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
ReaderPreferences.TappingInvertMode.BOTH to stringResource(R.string.tapping_inverted_both),
|
||||||
),
|
),
|
||||||
enabled = navMode != 5,
|
enabled = navMode != 5,
|
||||||
),
|
),
|
||||||
|
@ -274,10 +272,10 @@ object SettingsReaderScreen : SearchableSettings {
|
||||||
pref = readerPreferences.readerHideThreshold(),
|
pref = readerPreferences.readerHideThreshold(),
|
||||||
title = stringResource(R.string.pref_hide_threshold),
|
title = stringResource(R.string.pref_hide_threshold),
|
||||||
entries = mapOf(
|
entries = mapOf(
|
||||||
ReaderHideThreshold.HIGHEST to stringResource(R.string.pref_highest),
|
ReaderPreferences.ReaderHideThreshold.HIGHEST to stringResource(R.string.pref_highest),
|
||||||
ReaderHideThreshold.HIGH to stringResource(R.string.pref_high),
|
ReaderPreferences.ReaderHideThreshold.HIGH to stringResource(R.string.pref_high),
|
||||||
ReaderHideThreshold.LOW to stringResource(R.string.pref_low),
|
ReaderPreferences.ReaderHideThreshold.LOW to stringResource(R.string.pref_low),
|
||||||
ReaderHideThreshold.LOWEST to stringResource(R.string.pref_lowest),
|
ReaderPreferences.ReaderHideThreshold.LOWEST to stringResource(R.string.pref_lowest),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Preference.PreferenceItem.SwitchPreference(
|
Preference.PreferenceItem.SwitchPreference(
|
||||||
|
|
|
@ -9,7 +9,6 @@ import eu.kanade.domain.ui.UiPreferences
|
||||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
|
import eu.kanade.tachiyomi.core.security.SecurityPreferences
|
||||||
import eu.kanade.tachiyomi.data.backup.BackupCreateJob
|
import eu.kanade.tachiyomi.data.backup.BackupCreateJob
|
||||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.data.track.TrackManager
|
import eu.kanade.tachiyomi.data.track.TrackManager
|
||||||
import eu.kanade.tachiyomi.network.NetworkPreferences
|
import eu.kanade.tachiyomi.network.NetworkPreferences
|
||||||
import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE
|
import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE
|
||||||
|
@ -244,8 +243,8 @@ object Migrations {
|
||||||
if (oldSecureScreen) {
|
if (oldSecureScreen) {
|
||||||
securityPreferences.secureScreen().set(SecurityPreferences.SecureScreenMode.ALWAYS)
|
securityPreferences.secureScreen().set(SecurityPreferences.SecureScreenMode.ALWAYS)
|
||||||
}
|
}
|
||||||
if (DeviceUtil.isMiui && basePreferences.extensionInstaller().get() == PreferenceValues.ExtensionInstaller.PACKAGEINSTALLER) {
|
if (DeviceUtil.isMiui && basePreferences.extensionInstaller().get() == BasePreferences.ExtensionInstaller.PACKAGEINSTALLER) {
|
||||||
basePreferences.extensionInstaller().set(PreferenceValues.ExtensionInstaller.LEGACY)
|
basePreferences.extensionInstaller().set(BasePreferences.ExtensionInstaller.LEGACY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (oldVersion < 76) {
|
if (oldVersion < 76) {
|
||||||
|
|
|
@ -89,7 +89,7 @@ class DownloadManager(
|
||||||
* @param chapterId the chapter to check.
|
* @param chapterId the chapter to check.
|
||||||
*/
|
*/
|
||||||
fun getQueuedDownloadOrNull(chapterId: Long): Download? {
|
fun getQueuedDownloadOrNull(chapterId: Long): Download? {
|
||||||
return queueState.value.find { it: Download -> it.chapter.id == chapterId }
|
return queueState.value.find { it.chapter.id == chapterId }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startDownloadNow(chapterId: Long?) {
|
fun startDownloadNow(chapterId: Long?) {
|
||||||
|
|
|
@ -4,8 +4,6 @@ import android.content.Context
|
||||||
import com.hippo.unifile.UniFile
|
import com.hippo.unifile.UniFile
|
||||||
import com.jakewharton.rxrelay.PublishRelay
|
import com.jakewharton.rxrelay.PublishRelay
|
||||||
import eu.kanade.domain.chapter.model.toSChapter
|
import eu.kanade.domain.chapter.model.toSChapter
|
||||||
import eu.kanade.domain.manga.model.COMIC_INFO_FILE
|
|
||||||
import eu.kanade.domain.manga.model.ComicInfo
|
|
||||||
import eu.kanade.domain.manga.model.getComicInfo
|
import eu.kanade.domain.manga.model.getComicInfo
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
||||||
|
@ -39,6 +37,8 @@ import rx.Observable
|
||||||
import rx.Subscription
|
import rx.Subscription
|
||||||
import rx.android.schedulers.AndroidSchedulers
|
import rx.android.schedulers.AndroidSchedulers
|
||||||
import rx.schedulers.Schedulers
|
import rx.schedulers.Schedulers
|
||||||
|
import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE
|
||||||
|
import tachiyomi.core.metadata.comicinfo.ComicInfo
|
||||||
import tachiyomi.core.util.lang.awaitSingle
|
import tachiyomi.core.util.lang.awaitSingle
|
||||||
import tachiyomi.core.util.lang.launchIO
|
import tachiyomi.core.util.lang.launchIO
|
||||||
import tachiyomi.core.util.lang.launchNow
|
import tachiyomi.core.util.lang.launchNow
|
||||||
|
@ -66,11 +66,6 @@ import java.util.zip.ZipOutputStream
|
||||||
*
|
*
|
||||||
* The queue manipulation must be done in one thread (currently the main thread) to avoid unexpected
|
* The queue manipulation must be done in one thread (currently the main thread) to avoid unexpected
|
||||||
* behavior, but it's safe to read it from multiple threads.
|
* behavior, but it's safe to read it from multiple threads.
|
||||||
*
|
|
||||||
* @param context the application context.
|
|
||||||
* @param provider the downloads directory provider.
|
|
||||||
* @param cache the downloads cache, used to add the downloads to the cache after their completion.
|
|
||||||
* @param sourceManager the source manager.
|
|
||||||
*/
|
*/
|
||||||
class Downloader(
|
class Downloader(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
|
@ -90,7 +85,7 @@ class Downloader(
|
||||||
/**
|
/**
|
||||||
* Queue where active downloads are kept.
|
* Queue where active downloads are kept.
|
||||||
*/
|
*/
|
||||||
val _queueState = MutableStateFlow<List<Download>>(emptyList())
|
private val _queueState = MutableStateFlow<List<Download>>(emptyList())
|
||||||
val queueState = _queueState.asStateFlow()
|
val queueState = _queueState.asStateFlow()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -140,7 +135,7 @@ class Downloader(
|
||||||
|
|
||||||
initializeSubscription()
|
initializeSubscription()
|
||||||
|
|
||||||
val pending = queueState.value.filter { it: Download -> it.status != Download.State.DOWNLOADED }
|
val pending = queueState.value.filter { it.status != Download.State.DOWNLOADED }
|
||||||
pending.forEach { if (it.status != Download.State.QUEUE) it.status = Download.State.QUEUE }
|
pending.forEach { if (it.status != Download.State.QUEUE) it.status = Download.State.QUEUE }
|
||||||
|
|
||||||
isPaused = false
|
isPaused = false
|
||||||
|
@ -266,7 +261,7 @@ class Downloader(
|
||||||
// Runs in main thread (synchronization needed).
|
// Runs in main thread (synchronization needed).
|
||||||
val chaptersToQueue = chaptersWithoutDir.await()
|
val chaptersToQueue = chaptersWithoutDir.await()
|
||||||
// Filter out those already enqueued.
|
// Filter out those already enqueued.
|
||||||
.filter { chapter -> queueState.value.none { it: Download -> it.chapter.id == chapter.id } }
|
.filter { chapter -> queueState.value.none { it.chapter.id == chapter.id } }
|
||||||
// Create a download for each one.
|
// Create a download for each one.
|
||||||
.map { Download(source, manga, it) }
|
.map { Download(source, manga, it) }
|
||||||
|
|
||||||
|
@ -280,7 +275,7 @@ class Downloader(
|
||||||
|
|
||||||
// Start downloader if needed
|
// Start downloader if needed
|
||||||
if (autoStart && wasEmpty) {
|
if (autoStart && wasEmpty) {
|
||||||
val queuedDownloads = queueState.value.count { it: Download -> it.source !is UnmeteredSource }
|
val queuedDownloads = queueState.value.count { it.source !is UnmeteredSource }
|
||||||
val maxDownloadsFromSource = queueState.value
|
val maxDownloadsFromSource = queueState.value
|
||||||
.groupBy { it.source }
|
.groupBy { it.source }
|
||||||
.filterKeys { it !is UnmeteredSource }
|
.filterKeys { it !is UnmeteredSource }
|
||||||
|
@ -639,10 +634,10 @@ class Downloader(
|
||||||
* Returns true if all the queued downloads are in DOWNLOADED or ERROR state.
|
* Returns true if all the queued downloads are in DOWNLOADED or ERROR state.
|
||||||
*/
|
*/
|
||||||
private fun areAllDownloadsFinished(): Boolean {
|
private fun areAllDownloadsFinished(): Boolean {
|
||||||
return queueState.value.none { it: Download -> it.status.value <= Download.State.DOWNLOADING.value }
|
return queueState.value.none { it.status.value <= Download.State.DOWNLOADING.value }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addAllToQueue(downloads: List<Download>) {
|
private fun addAllToQueue(downloads: List<Download>) {
|
||||||
_queueState.update {
|
_queueState.update {
|
||||||
downloads.forEach { download ->
|
downloads.forEach { download ->
|
||||||
download.status = Download.State.QUEUE
|
download.status = Download.State.QUEUE
|
||||||
|
@ -652,7 +647,7 @@ class Downloader(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun removeFromQueue(download: Download) {
|
private fun removeFromQueue(download: Download) {
|
||||||
_queueState.update {
|
_queueState.update {
|
||||||
store.remove(download)
|
store.remove(download)
|
||||||
if (download.status == Download.State.DOWNLOADING || download.status == Download.State.QUEUE) {
|
if (download.status == Download.State.DOWNLOADING || download.status == Download.State.QUEUE) {
|
||||||
|
@ -672,7 +667,7 @@ class Downloader(
|
||||||
queueState.value.filter { it.manga.id == manga.id }.forEach { removeFromQueue(it) }
|
queueState.value.filter { it.manga.id == manga.id }.forEach { removeFromQueue(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun _clearQueue() {
|
private fun _clearQueue() {
|
||||||
_queueState.update {
|
_queueState.update {
|
||||||
it.forEach { download ->
|
it.forEach { download ->
|
||||||
if (download.status == Download.State.DOWNLOADING || download.status == Download.State.QUEUE) {
|
if (download.status == Download.State.DOWNLOADING || download.status == Download.State.QUEUE) {
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
package eu.kanade.tachiyomi.data.preference
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.R
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class stores the values for the preferences in the application.
|
|
||||||
*/
|
|
||||||
object PreferenceValues {
|
|
||||||
|
|
||||||
enum class TappingInvertMode(val shouldInvertHorizontal: Boolean = false, val shouldInvertVertical: Boolean = false) {
|
|
||||||
NONE,
|
|
||||||
HORIZONTAL(shouldInvertHorizontal = true),
|
|
||||||
VERTICAL(shouldInvertVertical = true),
|
|
||||||
BOTH(shouldInvertHorizontal = true, shouldInvertVertical = true),
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class ReaderHideThreshold(val threshold: Int) {
|
|
||||||
HIGHEST(5),
|
|
||||||
HIGH(13),
|
|
||||||
LOW(31),
|
|
||||||
LOWEST(47),
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class ExtensionInstaller(val titleResId: Int) {
|
|
||||||
LEGACY(R.string.ext_installer_legacy),
|
|
||||||
PACKAGEINSTALLER(R.string.ext_installer_packageinstaller),
|
|
||||||
SHIZUKU(R.string.ext_installer_shizuku),
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,9 +5,9 @@ import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.notification.Notifications
|
import eu.kanade.tachiyomi.data.notification.Notifications
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.extension.installer.Installer
|
import eu.kanade.tachiyomi.extension.installer.Installer
|
||||||
import eu.kanade.tachiyomi.extension.installer.PackageInstallerInstaller
|
import eu.kanade.tachiyomi.extension.installer.PackageInstallerInstaller
|
||||||
import eu.kanade.tachiyomi.extension.installer.ShizukuInstaller
|
import eu.kanade.tachiyomi.extension.installer.ShizukuInstaller
|
||||||
|
@ -36,7 +36,7 @@ class ExtensionInstallService : Service() {
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
val uri = intent?.data
|
val uri = intent?.data
|
||||||
val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L }
|
val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L }
|
||||||
val installerUsed = intent?.getSerializableExtraCompat<PreferenceValues.ExtensionInstaller>(EXTRA_INSTALLER)
|
val installerUsed = intent?.getSerializableExtraCompat<BasePreferences.ExtensionInstaller>(EXTRA_INSTALLER)
|
||||||
if (uri == null || id == null || installerUsed == null) {
|
if (uri == null || id == null || installerUsed == null) {
|
||||||
stopSelf()
|
stopSelf()
|
||||||
return START_NOT_STICKY
|
return START_NOT_STICKY
|
||||||
|
@ -44,8 +44,8 @@ class ExtensionInstallService : Service() {
|
||||||
|
|
||||||
if (installer == null) {
|
if (installer == null) {
|
||||||
installer = when (installerUsed) {
|
installer = when (installerUsed) {
|
||||||
PreferenceValues.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstaller(this)
|
BasePreferences.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstaller(this)
|
||||||
PreferenceValues.ExtensionInstaller.SHIZUKU -> ShizukuInstaller(this)
|
BasePreferences.ExtensionInstaller.SHIZUKU -> ShizukuInstaller(this)
|
||||||
else -> {
|
else -> {
|
||||||
logcat(LogPriority.ERROR) { "Not implemented for installer $installerUsed" }
|
logcat(LogPriority.ERROR) { "Not implemented for installer $installerUsed" }
|
||||||
stopSelf()
|
stopSelf()
|
||||||
|
@ -71,7 +71,7 @@ class ExtensionInstallService : Service() {
|
||||||
context: Context,
|
context: Context,
|
||||||
downloadId: Long,
|
downloadId: Long,
|
||||||
uri: Uri,
|
uri: Uri,
|
||||||
installer: PreferenceValues.ExtensionInstaller,
|
installer: BasePreferences.ExtensionInstaller,
|
||||||
): Intent {
|
): Intent {
|
||||||
return Intent(context, ExtensionInstallService::class.java)
|
return Intent(context, ExtensionInstallService::class.java)
|
||||||
.setDataAndType(uri, ExtensionInstaller.APK_MIME)
|
.setDataAndType(uri, ExtensionInstaller.APK_MIME)
|
||||||
|
|
|
@ -12,7 +12,6 @@ import androidx.core.content.getSystemService
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import com.jakewharton.rxrelay.PublishRelay
|
import com.jakewharton.rxrelay.PublishRelay
|
||||||
import eu.kanade.domain.base.BasePreferences
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.extension.installer.Installer
|
import eu.kanade.tachiyomi.extension.installer.Installer
|
||||||
import eu.kanade.tachiyomi.extension.model.Extension
|
import eu.kanade.tachiyomi.extension.model.Extension
|
||||||
import eu.kanade.tachiyomi.extension.model.InstallStep
|
import eu.kanade.tachiyomi.extension.model.InstallStep
|
||||||
|
@ -134,7 +133,7 @@ internal class ExtensionInstaller(private val context: Context) {
|
||||||
*/
|
*/
|
||||||
fun installApk(downloadId: Long, uri: Uri) {
|
fun installApk(downloadId: Long, uri: Uri) {
|
||||||
when (val installer = extensionInstaller.get()) {
|
when (val installer = extensionInstaller.get()) {
|
||||||
PreferenceValues.ExtensionInstaller.LEGACY -> {
|
BasePreferences.ExtensionInstaller.LEGACY -> {
|
||||||
val intent = Intent(context, ExtensionInstallActivity::class.java)
|
val intent = Intent(context, ExtensionInstallActivity::class.java)
|
||||||
.setDataAndType(uri, APK_MIME)
|
.setDataAndType(uri, APK_MIME)
|
||||||
.putExtra(EXTRA_DOWNLOAD_ID, downloadId)
|
.putExtra(EXTRA_DOWNLOAD_ID, downloadId)
|
||||||
|
|
|
@ -5,7 +5,7 @@ import eu.kanade.domain.source.service.SourcePreferences
|
||||||
import eu.kanade.tachiyomi.extension.ExtensionManager
|
import eu.kanade.tachiyomi.extension.ExtensionManager
|
||||||
import tachiyomi.domain.source.model.SourceData
|
import tachiyomi.domain.source.model.SourceData
|
||||||
import tachiyomi.domain.source.model.StubSource
|
import tachiyomi.domain.source.model.StubSource
|
||||||
import tachiyomi.source.local.LocalSource
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
|
@ -30,6 +30,4 @@ fun Source.getNameForMangaInfo(): String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Source.isLocal(): Boolean = id == LocalSource.ID
|
|
||||||
|
|
||||||
fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource
|
fun Source.isLocalOrStub(): Boolean = isLocal() || this is StubSource
|
||||||
|
|
|
@ -17,7 +17,6 @@ import eu.kanade.core.util.fastPartition
|
||||||
import eu.kanade.domain.base.BasePreferences
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
import eu.kanade.domain.chapter.interactor.SetReadStatus
|
||||||
import eu.kanade.domain.manga.interactor.UpdateManga
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS
|
import eu.kanade.presentation.components.SEARCH_DEBOUNCE_MILLIS
|
||||||
import eu.kanade.presentation.library.components.LibraryToolbarTitle
|
import eu.kanade.presentation.library.components.LibraryToolbarTitle
|
||||||
import eu.kanade.presentation.manga.DownloadAction
|
import eu.kanade.presentation.manga.DownloadAction
|
||||||
|
@ -61,6 +60,7 @@ import tachiyomi.domain.manga.model.TriStateFilter
|
||||||
import tachiyomi.domain.manga.model.applyFilter
|
import tachiyomi.domain.manga.model.applyFilter
|
||||||
import tachiyomi.domain.source.service.SourceManager
|
import tachiyomi.domain.source.service.SourceManager
|
||||||
import tachiyomi.domain.track.interactor.GetTracksPerManga
|
import tachiyomi.domain.track.interactor.GetTracksPerManga
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.text.Collator
|
import java.text.Collator
|
||||||
|
@ -417,7 +417,6 @@ class LibraryScreenModel(
|
||||||
DownloadAction.NEXT_10_CHAPTERS -> downloadUnreadChapters(mangas, 10)
|
DownloadAction.NEXT_10_CHAPTERS -> downloadUnreadChapters(mangas, 10)
|
||||||
DownloadAction.NEXT_25_CHAPTERS -> downloadUnreadChapters(mangas, 25)
|
DownloadAction.NEXT_25_CHAPTERS -> downloadUnreadChapters(mangas, 25)
|
||||||
DownloadAction.UNREAD_CHAPTERS -> downloadUnreadChapters(mangas, null)
|
DownloadAction.UNREAD_CHAPTERS -> downloadUnreadChapters(mangas, null)
|
||||||
else -> {}
|
|
||||||
}
|
}
|
||||||
clearSelection()
|
clearSelection()
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,6 @@ import cafe.adriel.voyager.navigator.Navigator
|
||||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||||
import cafe.adriel.voyager.navigator.tab.LocalTabNavigator
|
import cafe.adriel.voyager.navigator.tab.LocalTabNavigator
|
||||||
import cafe.adriel.voyager.navigator.tab.TabOptions
|
import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.presentation.category.components.ChangeCategoryDialog
|
import eu.kanade.presentation.category.components.ChangeCategoryDialog
|
||||||
import eu.kanade.presentation.library.DeleteLibraryMangaDialog
|
import eu.kanade.presentation.library.DeleteLibraryMangaDialog
|
||||||
import eu.kanade.presentation.library.LibrarySettingsDialog
|
import eu.kanade.presentation.library.LibrarySettingsDialog
|
||||||
|
@ -57,6 +56,7 @@ import tachiyomi.presentation.core.components.material.Scaffold
|
||||||
import tachiyomi.presentation.core.screens.EmptyScreen
|
import tachiyomi.presentation.core.screens.EmptyScreen
|
||||||
import tachiyomi.presentation.core.screens.EmptyScreenAction
|
import tachiyomi.presentation.core.screens.EmptyScreenAction
|
||||||
import tachiyomi.presentation.core.screens.LoadingScreen
|
import tachiyomi.presentation.core.screens.LoadingScreen
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
|
|
||||||
object LibraryTab : Tab {
|
object LibraryTab : Tab {
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@ import eu.kanade.domain.chapter.interactor.SetReadStatus
|
||||||
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
import eu.kanade.domain.chapter.interactor.SyncChaptersWithSource
|
||||||
import eu.kanade.domain.manga.interactor.UpdateManga
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
||||||
import eu.kanade.domain.manga.model.downloadedFilter
|
import eu.kanade.domain.manga.model.downloadedFilter
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.domain.manga.model.toSManga
|
import eu.kanade.domain.manga.model.toSManga
|
||||||
import eu.kanade.domain.ui.UiPreferences
|
import eu.kanade.domain.ui.UiPreferences
|
||||||
import eu.kanade.presentation.manga.DownloadAction
|
import eu.kanade.presentation.manga.DownloadAction
|
||||||
|
@ -71,6 +70,7 @@ import tachiyomi.domain.manga.model.TriStateFilter
|
||||||
import tachiyomi.domain.manga.model.applyFilter
|
import tachiyomi.domain.manga.model.applyFilter
|
||||||
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.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.text.DecimalFormat
|
import java.text.DecimalFormat
|
||||||
|
|
|
@ -951,7 +951,7 @@ class ReaderActivity : BaseActivity() {
|
||||||
* cover to the presenter.
|
* cover to the presenter.
|
||||||
*/
|
*/
|
||||||
fun setAsCover(page: ReaderPage) {
|
fun setAsCover(page: ReaderPage) {
|
||||||
viewModel.setAsCover(this, page)
|
viewModel.setAsCover(page)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package eu.kanade.tachiyomi.ui.reader
|
package eu.kanade.tachiyomi.ui.reader
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.lifecycle.SavedStateHandle
|
import androidx.lifecycle.SavedStateHandle
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
|
@ -9,7 +8,6 @@ import androidx.lifecycle.viewModelScope
|
||||||
import eu.kanade.domain.base.BasePreferences
|
import eu.kanade.domain.base.BasePreferences
|
||||||
import eu.kanade.domain.chapter.model.toDbChapter
|
import eu.kanade.domain.chapter.model.toDbChapter
|
||||||
import eu.kanade.domain.manga.interactor.SetMangaViewerFlags
|
import eu.kanade.domain.manga.interactor.SetMangaViewerFlags
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.domain.manga.model.orientationType
|
import eu.kanade.domain.manga.model.orientationType
|
||||||
import eu.kanade.domain.manga.model.readingModeType
|
import eu.kanade.domain.manga.model.readingModeType
|
||||||
import eu.kanade.domain.track.model.toDbTrack
|
import eu.kanade.domain.track.model.toDbTrack
|
||||||
|
@ -78,6 +76,7 @@ import tachiyomi.domain.manga.model.Manga
|
||||||
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.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
@ -767,7 +766,7 @@ class ReaderViewModel(
|
||||||
/**
|
/**
|
||||||
* Sets the image of this [page] as cover and notifies the UI of the result.
|
* Sets the image of this [page] as cover and notifies the UI of the result.
|
||||||
*/
|
*/
|
||||||
fun setAsCover(context: Context, page: ReaderPage) {
|
fun setAsCover(page: ReaderPage) {
|
||||||
if (page.status != Page.State.READY) return
|
if (page.status != Page.State.READY) return
|
||||||
val manga = manga ?: return
|
val manga = manga ?: return
|
||||||
val stream = page.stream ?: return
|
val stream = page.stream ?: return
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package eu.kanade.tachiyomi.ui.reader.setting
|
package eu.kanade.tachiyomi.ui.reader.setting
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
import eu.kanade.tachiyomi.util.system.isReleaseBuildType
|
||||||
import tachiyomi.core.preference.PreferenceStore
|
import tachiyomi.core.preference.PreferenceStore
|
||||||
import tachiyomi.core.preference.getEnum
|
import tachiyomi.core.preference.getEnum
|
||||||
|
@ -52,7 +51,7 @@ class ReaderPreferences(
|
||||||
|
|
||||||
fun webtoonSidePadding() = preferenceStore.getInt("webtoon_side_padding", 0)
|
fun webtoonSidePadding() = preferenceStore.getInt("webtoon_side_padding", 0)
|
||||||
|
|
||||||
fun readerHideThreshold() = preferenceStore.getEnum("reader_hide_threshold", PreferenceValues.ReaderHideThreshold.LOW)
|
fun readerHideThreshold() = preferenceStore.getEnum("reader_hide_threshold", ReaderHideThreshold.LOW)
|
||||||
|
|
||||||
fun folderPerManga() = preferenceStore.getBoolean("create_folder_per_manga", false)
|
fun folderPerManga() = preferenceStore.getBoolean("create_folder_per_manga", false)
|
||||||
|
|
||||||
|
@ -106,13 +105,27 @@ class ReaderPreferences(
|
||||||
|
|
||||||
fun navigationModeWebtoon() = preferenceStore.getInt("reader_navigation_mode_webtoon", 0)
|
fun navigationModeWebtoon() = preferenceStore.getInt("reader_navigation_mode_webtoon", 0)
|
||||||
|
|
||||||
fun pagerNavInverted() = preferenceStore.getEnum("reader_tapping_inverted", PreferenceValues.TappingInvertMode.NONE)
|
fun pagerNavInverted() = preferenceStore.getEnum("reader_tapping_inverted", TappingInvertMode.NONE)
|
||||||
|
|
||||||
fun webtoonNavInverted() = preferenceStore.getEnum("reader_tapping_inverted_webtoon", PreferenceValues.TappingInvertMode.NONE)
|
fun webtoonNavInverted() = preferenceStore.getEnum("reader_tapping_inverted_webtoon", TappingInvertMode.NONE)
|
||||||
|
|
||||||
fun showNavigationOverlayNewUser() = preferenceStore.getBoolean("reader_navigation_overlay_new_user", true)
|
fun showNavigationOverlayNewUser() = preferenceStore.getBoolean("reader_navigation_overlay_new_user", true)
|
||||||
|
|
||||||
fun showNavigationOverlayOnStart() = preferenceStore.getBoolean("reader_navigation_overlay_on_start", false)
|
fun showNavigationOverlayOnStart() = preferenceStore.getBoolean("reader_navigation_overlay_on_start", false)
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
enum class TappingInvertMode(val shouldInvertHorizontal: Boolean = false, val shouldInvertVertical: Boolean = false) {
|
||||||
|
NONE,
|
||||||
|
HORIZONTAL(shouldInvertHorizontal = true),
|
||||||
|
VERTICAL(shouldInvertVertical = true),
|
||||||
|
BOTH(shouldInvertHorizontal = true, shouldInvertVertical = true),
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class ReaderHideThreshold(val threshold: Int) {
|
||||||
|
HIGHEST(5),
|
||||||
|
HIGH(13),
|
||||||
|
LOW(31),
|
||||||
|
LOWEST(47),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import androidx.lifecycle.lifecycleScope
|
||||||
import eu.kanade.domain.manga.model.orientationType
|
import eu.kanade.domain.manga.model.orientationType
|
||||||
import eu.kanade.domain.manga.model.readingModeType
|
import eu.kanade.domain.manga.model.readingModeType
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
|
||||||
import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding
|
import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding
|
||||||
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
|
import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
|
||||||
|
@ -71,7 +70,7 @@ class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attr
|
||||||
binding.webtoonPrefsGroup.root.isVisible = false
|
binding.webtoonPrefsGroup.root.isVisible = false
|
||||||
binding.pagerPrefsGroup.root.isVisible = true
|
binding.pagerPrefsGroup.root.isVisible = true
|
||||||
|
|
||||||
binding.pagerPrefsGroup.tappingInverted.bindToPreference(readerPreferences.pagerNavInverted(), PreferenceValues.TappingInvertMode::class.java)
|
binding.pagerPrefsGroup.tappingInverted.bindToPreference(readerPreferences.pagerNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
|
||||||
binding.pagerPrefsGroup.navigatePan.bindToPreference(readerPreferences.navigateToPan())
|
binding.pagerPrefsGroup.navigatePan.bindToPreference(readerPreferences.navigateToPan())
|
||||||
|
|
||||||
binding.pagerPrefsGroup.pagerNav.bindToPreference(readerPreferences.navigationModePager())
|
binding.pagerPrefsGroup.pagerNav.bindToPreference(readerPreferences.navigationModePager())
|
||||||
|
@ -107,7 +106,7 @@ class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attr
|
||||||
binding.pagerPrefsGroup.root.isVisible = false
|
binding.pagerPrefsGroup.root.isVisible = false
|
||||||
binding.webtoonPrefsGroup.root.isVisible = true
|
binding.webtoonPrefsGroup.root.isVisible = true
|
||||||
|
|
||||||
binding.webtoonPrefsGroup.tappingInverted.bindToPreference(readerPreferences.webtoonNavInverted(), PreferenceValues.TappingInvertMode::class.java)
|
binding.webtoonPrefsGroup.tappingInverted.bindToPreference(readerPreferences.webtoonNavInverted(), ReaderPreferences.TappingInvertMode::class.java)
|
||||||
|
|
||||||
binding.webtoonPrefsGroup.webtoonNav.bindToPreference(readerPreferences.navigationModeWebtoon())
|
binding.webtoonPrefsGroup.webtoonNav.bindToPreference(readerPreferences.navigationModeWebtoon())
|
||||||
readerPreferences.navigationModeWebtoon()
|
readerPreferences.navigationModeWebtoon()
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package eu.kanade.tachiyomi.ui.reader.viewer
|
package eu.kanade.tachiyomi.ui.reader.viewer
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
|
|
||||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
|
@ -17,7 +16,7 @@ abstract class ViewerConfig(readerPreferences: ReaderPreferences, private val sc
|
||||||
|
|
||||||
var navigationModeChangedListener: (() -> Unit)? = null
|
var navigationModeChangedListener: (() -> Unit)? = null
|
||||||
|
|
||||||
var tappingInverted = TappingInvertMode.NONE
|
var tappingInverted = ReaderPreferences.TappingInvertMode.NONE
|
||||||
var longTapEnabled = true
|
var longTapEnabled = true
|
||||||
var usePageTransitions = false
|
var usePageTransitions = false
|
||||||
var doubleTapAnimDuration = 500
|
var doubleTapAnimDuration = 500
|
||||||
|
|
|
@ -4,7 +4,7 @@ import android.graphics.PointF
|
||||||
import android.graphics.RectF
|
import android.graphics.RectF
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
||||||
import eu.kanade.tachiyomi.util.lang.invert
|
import eu.kanade.tachiyomi.util.lang.invert
|
||||||
|
|
||||||
abstract class ViewerNavigation {
|
abstract class ViewerNavigation {
|
||||||
|
@ -21,8 +21,8 @@ abstract class ViewerNavigation {
|
||||||
val rectF: RectF,
|
val rectF: RectF,
|
||||||
val type: NavigationRegion,
|
val type: NavigationRegion,
|
||||||
) {
|
) {
|
||||||
fun invert(invertMode: PreferenceValues.TappingInvertMode): Region {
|
fun invert(invertMode: ReaderPreferences.TappingInvertMode): Region {
|
||||||
if (invertMode == PreferenceValues.TappingInvertMode.NONE) return this
|
if (invertMode == ReaderPreferences.TappingInvertMode.NONE) return this
|
||||||
return this.copy(
|
return this.copy(
|
||||||
rectF = this.rectF.invert(invertMode),
|
rectF = this.rectF.invert(invertMode),
|
||||||
)
|
)
|
||||||
|
@ -33,7 +33,7 @@ abstract class ViewerNavigation {
|
||||||
|
|
||||||
abstract var regions: List<Region>
|
abstract var regions: List<Region>
|
||||||
|
|
||||||
var invertMode: PreferenceValues.TappingInvertMode = PreferenceValues.TappingInvertMode.NONE
|
var invertMode: ReaderPreferences.TappingInvertMode = ReaderPreferences.TappingInvertMode.NONE
|
||||||
|
|
||||||
fun getAction(pos: PointF): NavigationRegion {
|
fun getAction(pos: PointF): NavigationRegion {
|
||||||
val x = pos.x
|
val x = pos.x
|
||||||
|
|
|
@ -7,7 +7,6 @@ import eu.kanade.core.util.fastDistinctBy
|
||||||
import eu.kanade.core.util.fastFilter
|
import eu.kanade.core.util.fastFilter
|
||||||
import eu.kanade.core.util.fastFilterNot
|
import eu.kanade.core.util.fastFilterNot
|
||||||
import eu.kanade.core.util.fastMapNotNull
|
import eu.kanade.core.util.fastMapNotNull
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.presentation.more.stats.StatsScreenState
|
import eu.kanade.presentation.more.stats.StatsScreenState
|
||||||
import eu.kanade.presentation.more.stats.data.StatsData
|
import eu.kanade.presentation.more.stats.data.StatsData
|
||||||
import eu.kanade.tachiyomi.data.download.DownloadManager
|
import eu.kanade.tachiyomi.data.download.DownloadManager
|
||||||
|
@ -24,6 +23,7 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_R
|
||||||
import tachiyomi.domain.manga.interactor.GetLibraryManga
|
import tachiyomi.domain.manga.interactor.GetLibraryManga
|
||||||
import tachiyomi.domain.track.interactor.GetTracks
|
import tachiyomi.domain.track.interactor.GetTracks
|
||||||
import tachiyomi.domain.track.model.Track
|
import tachiyomi.domain.track.model.Track
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,13 @@ package eu.kanade.tachiyomi.util
|
||||||
|
|
||||||
import eu.kanade.domain.manga.interactor.UpdateManga
|
import eu.kanade.domain.manga.interactor.UpdateManga
|
||||||
import eu.kanade.domain.manga.model.hasCustomCover
|
import eu.kanade.domain.manga.model.hasCustomCover
|
||||||
import eu.kanade.domain.manga.model.isLocal
|
|
||||||
import eu.kanade.domain.manga.model.toSManga
|
import eu.kanade.domain.manga.model.toSManga
|
||||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import tachiyomi.domain.download.service.DownloadPreferences
|
import tachiyomi.domain.download.service.DownloadPreferences
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.source.local.image.LocalCoverManager
|
import tachiyomi.source.local.image.LocalCoverManager
|
||||||
|
import tachiyomi.source.local.isLocal
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package eu.kanade.tachiyomi.util.lang
|
package eu.kanade.tachiyomi.util.lang
|
||||||
|
|
||||||
import android.graphics.RectF
|
import android.graphics.RectF
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
|
||||||
|
|
||||||
fun RectF.invert(invertMode: PreferenceValues.TappingInvertMode): RectF {
|
fun RectF.invert(invertMode: ReaderPreferences.TappingInvertMode): RectF {
|
||||||
val horizontal = invertMode.shouldInvertHorizontal
|
val horizontal = invertMode.shouldInvertHorizontal
|
||||||
val vertical = invertMode.shouldInvertVertical
|
val vertical = invertMode.shouldInvertVertical
|
||||||
return when {
|
return when {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package eu.kanade.domain.manga.model
|
package tachiyomi.core.metadata.comicinfo
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
package tachiyomi.source.local
|
package tachiyomi.source.local
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import eu.kanade.domain.manga.model.COMIC_INFO_FILE
|
|
||||||
import eu.kanade.domain.manga.model.ComicInfo
|
|
||||||
import eu.kanade.domain.manga.model.copyFromComicInfo
|
|
||||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
import eu.kanade.tachiyomi.source.CatalogueSource
|
||||||
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.source.UnmeteredSource
|
import eu.kanade.tachiyomi.source.UnmeteredSource
|
||||||
import eu.kanade.tachiyomi.source.model.FilterList
|
import eu.kanade.tachiyomi.source.model.FilterList
|
||||||
import eu.kanade.tachiyomi.source.model.MangasPage
|
import eu.kanade.tachiyomi.source.model.MangasPage
|
||||||
|
@ -19,11 +17,15 @@ import logcat.LogPriority
|
||||||
import nl.adaptivity.xmlutil.AndroidXmlReader
|
import nl.adaptivity.xmlutil.AndroidXmlReader
|
||||||
import nl.adaptivity.xmlutil.serialization.XML
|
import nl.adaptivity.xmlutil.serialization.XML
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
|
import tachiyomi.core.metadata.comicinfo.COMIC_INFO_FILE
|
||||||
|
import tachiyomi.core.metadata.comicinfo.ComicInfo
|
||||||
|
import tachiyomi.core.metadata.comicinfo.copyFromComicInfo
|
||||||
import tachiyomi.core.metadata.tachiyomi.MangaDetails
|
import tachiyomi.core.metadata.tachiyomi.MangaDetails
|
||||||
import tachiyomi.core.util.lang.withIOContext
|
import tachiyomi.core.util.lang.withIOContext
|
||||||
import tachiyomi.core.util.system.ImageUtil
|
import tachiyomi.core.util.system.ImageUtil
|
||||||
import tachiyomi.core.util.system.logcat
|
import tachiyomi.core.util.system.logcat
|
||||||
import tachiyomi.domain.chapter.service.ChapterRecognition
|
import tachiyomi.domain.chapter.service.ChapterRecognition
|
||||||
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.source.local.filter.OrderBy
|
import tachiyomi.source.local.filter.OrderBy
|
||||||
import tachiyomi.source.local.image.LocalCoverManager
|
import tachiyomi.source.local.image.LocalCoverManager
|
||||||
import tachiyomi.source.local.io.Archive
|
import tachiyomi.source.local.io.Archive
|
||||||
|
@ -349,3 +351,7 @@ actual class LocalSource(
|
||||||
private val LATEST_THRESHOLD = TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)
|
private val LATEST_THRESHOLD = TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Manga.isLocal(): Boolean = source == LocalSource.ID
|
||||||
|
|
||||||
|
fun Source.isLocal(): Boolean = id == LocalSource.ID
|
||||||
|
|
Reference in a new issue