fix: 漫画偏好设置问题

This commit is contained in:
HapeLee
2026-06-10 01:45:32 +08:00
parent 7bf9dfa09b
commit 43d5f6d5e2
19 changed files with 312 additions and 540 deletions
@@ -1,182 +0,0 @@
package io.legado.app.data.repository
import android.content.Context
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.emptyPreferences
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey
import io.legado.app.constant.PreferKey
import io.legado.app.ui.book.manga.config.MangaScrollMode
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.map
import java.io.IOException
data class MangaPreferences(
val showMangaUi: Boolean = true,
val disableMangaScale: Boolean = true,
val disableMangaScrollAnimation: Boolean = false,
val disableMangaCrossFade: Boolean = false,
val disableClickScroll: Boolean = false,
val mangaPreDownloadNum: Int = 10,
val mangaAutoPageSpeed: Int = 3,
val mangaFooterConfig: String = "",
val mangaScrollMode: Int = MangaScrollMode.WEBTOON,
val mangaLongClick: Boolean = true,
val mangaBackground: Int = 0xFF000000.toInt(),
val mangaColorFilter: String = "",
val hideMangaTitle: Boolean = false,
val enableMangaEInk: Boolean = false,
val mangaEInkThreshold: Int = 150,
val enableMangaGray: Boolean = false,
val webtoonSidePaddingDp: Int = 0,
val mangaVolumeKeyPage: Boolean = false,
val reverseVolumeKeyPage: Boolean = false,
val clickActionTL: Int = -1,
val clickActionTC: Int = -1,
val clickActionTR: Int = 1,
val clickActionML: Int = 2,
val clickActionMC: Int = 0,
val clickActionMR: Int = 1,
val clickActionBL: Int = 2,
val clickActionBC: Int = 1,
val clickActionBR: Int = 1
)
class MangaSettingsRepository(
private val context: Context,
private val settingsRepository: SettingsRepository
) {
val preferences: Flow<MangaPreferences> = context.dataStore.data
.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}
.map { preferences ->
preferences.toMangaPreferences()
}
suspend fun setShowMangaUi(value: Boolean) =
settingsRepository.putBoolean(PreferKey.showMangaUi, value)
suspend fun setMangaPreDownloadNum(value: Int) =
settingsRepository.putInt(PreferKey.mangaPreDownloadNum, value)
suspend fun setMangaAutoPageSpeed(value: Int) =
settingsRepository.putInt(PreferKey.mangaAutoPageSpeed, value)
suspend fun setDisableClickScroll(value: Boolean) =
settingsRepository.putBoolean(PreferKey.disableClickScroll, value)
suspend fun setDisableMangaScrollAnimation(value: Boolean) =
settingsRepository.putBoolean(PreferKey.disableMangaScrollAnimation, value)
suspend fun setDisableMangaCrossFade(value: Boolean) =
settingsRepository.putBoolean(PreferKey.disableMangaCrossFade, value)
suspend fun setDisableMangaScale(value: Boolean) =
settingsRepository.putBoolean(PreferKey.disableMangaScale, value)
suspend fun setEnableMangaEInk(value: Boolean) =
settingsRepository.putBoolean(PreferKey.enableMangaEInk, value)
suspend fun setMangaEInkThreshold(value: Int) =
settingsRepository.putInt(PreferKey.mangaEInkThreshold, value)
suspend fun setEnableMangaGray(value: Boolean) =
settingsRepository.putBoolean(PreferKey.enableMangaGray, value)
suspend fun setMangaAutoColorFilter(value: String) =
settingsRepository.putString(PreferKey.mangaColorFilter, value)
suspend fun setMangaBackground(value: Int) =
settingsRepository.putInt(PreferKey.mangaBackground, value)
suspend fun setMangaLongClick(value: Boolean) =
settingsRepository.putBoolean(PreferKey.mangaLongClick, value)
suspend fun setMangaVolumeKeyPage(value: Boolean) =
settingsRepository.putBoolean(PreferKey.mangaVolumeKeyPage, value)
suspend fun setReverseVolumeKeyPage(value: Boolean) =
settingsRepository.putBoolean(PreferKey.reverseVolumeKeyPage, value)
suspend fun setHideMangaTitle(value: Boolean) =
settingsRepository.putBoolean(PreferKey.hideMangaTitle, value)
suspend fun setMangaFooterConfig(value: String) =
settingsRepository.putString(PreferKey.mangaFooterConfig, value)
suspend fun setMangaClickAction(key: String, value: Int) =
settingsRepository.putInt(key, value)
private fun Preferences.toMangaPreferences(): MangaPreferences {
return MangaPreferences(
showMangaUi = this[Keys.ShowMangaUi] ?: true,
disableMangaScale = this[Keys.DisableMangaScale] ?: true,
disableMangaScrollAnimation = this[Keys.DisableMangaScrollAnimation] ?: false,
disableMangaCrossFade = this[Keys.DisableMangaCrossFade] ?: false,
disableClickScroll = this[Keys.DisableClickScroll] ?: false,
mangaPreDownloadNum = this[Keys.MangaPreDownloadNum] ?: 10,
mangaAutoPageSpeed = this[Keys.MangaAutoPageSpeed] ?: 3,
mangaFooterConfig = this[Keys.MangaFooterConfig] ?: "",
mangaScrollMode = this[Keys.MangaScrollMode] ?: MangaScrollMode.WEBTOON,
mangaLongClick = this[Keys.MangaLongClick] ?: true,
mangaBackground = this[Keys.MangaBackground] ?: 0xFF000000.toInt(),
mangaColorFilter = this[Keys.MangaColorFilter] ?: "",
hideMangaTitle = this[Keys.HideMangaTitle] ?: false,
enableMangaEInk = this[Keys.EnableMangaEInk] ?: false,
mangaEInkThreshold = this[Keys.MangaEInkThreshold] ?: 150,
enableMangaGray = this[Keys.EnableMangaGray] ?: false,
webtoonSidePaddingDp = this[Keys.WebtoonSidePaddingDp] ?: 0,
mangaVolumeKeyPage = this[Keys.MangaVolumeKeyPage] ?: false,
reverseVolumeKeyPage = this[Keys.ReverseVolumeKeyPage] ?: false,
clickActionTL = this[Keys.ClickActionTL] ?: -1,
clickActionTC = this[Keys.ClickActionTC] ?: -1,
clickActionTR = this[Keys.ClickActionTR] ?: 1,
clickActionML = this[Keys.ClickActionML] ?: 2,
clickActionMC = this[Keys.ClickActionMC] ?: 0,
clickActionMR = this[Keys.ClickActionMR] ?: 1,
clickActionBL = this[Keys.ClickActionBL] ?: 2,
clickActionBC = this[Keys.ClickActionBC] ?: 1,
clickActionBR = this[Keys.ClickActionBR] ?: 1
)
}
private object Keys {
val ShowMangaUi = booleanPreferencesKey(PreferKey.showMangaUi)
val DisableMangaScale = booleanPreferencesKey(PreferKey.disableMangaScale)
val DisableMangaScrollAnimation =
booleanPreferencesKey(PreferKey.disableMangaScrollAnimation)
val DisableMangaCrossFade = booleanPreferencesKey(PreferKey.disableMangaCrossFade)
val DisableClickScroll = booleanPreferencesKey(PreferKey.disableClickScroll)
val MangaPreDownloadNum = intPreferencesKey(PreferKey.mangaPreDownloadNum)
val MangaAutoPageSpeed = intPreferencesKey(PreferKey.mangaAutoPageSpeed)
val MangaFooterConfig = stringPreferencesKey(PreferKey.mangaFooterConfig)
val MangaScrollMode = intPreferencesKey(PreferKey.mangaScrollMode)
val MangaLongClick = booleanPreferencesKey(PreferKey.mangaLongClick)
val MangaBackground = intPreferencesKey(PreferKey.mangaBackground)
val MangaColorFilter = stringPreferencesKey(PreferKey.mangaColorFilter)
val HideMangaTitle = booleanPreferencesKey(PreferKey.hideMangaTitle)
val EnableMangaEInk = booleanPreferencesKey(PreferKey.enableMangaEInk)
val MangaEInkThreshold = intPreferencesKey(PreferKey.mangaEInkThreshold)
val EnableMangaGray = booleanPreferencesKey(PreferKey.enableMangaGray)
val WebtoonSidePaddingDp = intPreferencesKey(PreferKey.webtoonSidePaddingDp)
val MangaVolumeKeyPage = booleanPreferencesKey(PreferKey.mangaVolumeKeyPage)
val ReverseVolumeKeyPage = booleanPreferencesKey(PreferKey.reverseVolumeKeyPage)
val ClickActionTL = intPreferencesKey(PreferKey.mangaClickActionTL)
val ClickActionTC = intPreferencesKey(PreferKey.mangaClickActionTC)
val ClickActionTR = intPreferencesKey(PreferKey.mangaClickActionTR)
val ClickActionML = intPreferencesKey(PreferKey.mangaClickActionML)
val ClickActionMC = intPreferencesKey(PreferKey.mangaClickActionMC)
val ClickActionMR = intPreferencesKey(PreferKey.mangaClickActionMR)
val ClickActionBL = intPreferencesKey(PreferKey.mangaClickActionBL)
val ClickActionBC = intPreferencesKey(PreferKey.mangaClickActionBC)
val ClickActionBR = intPreferencesKey(PreferKey.mangaClickActionBR)
}
}
@@ -25,7 +25,6 @@ import io.legado.app.data.repository.ExploreRepositoryImpl
import io.legado.app.data.repository.HomepageModulesRepository
import io.legado.app.data.repository.LlmTranslateRepositoryImpl
import io.legado.app.data.repository.LocalBookRepository
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.data.repository.ReadBookStyleConfigRepository
import io.legado.app.data.repository.ReadAloudSettingsRepository
import io.legado.app.data.repository.ReadRecordRepository
@@ -157,7 +156,6 @@ val appModule = module {
singleOf(::ReadSettingsRepository)
singleOf(::ReadAloudSettingsRepository)
singleOf(::ReadBookStyleConfigRepository)
singleOf(::MangaSettingsRepository)
singleOf(::LocalPreferencesRepository)
singleOf(::ExploreBooksUseCase)
singleOf(::ExploreKindUiUseCase)
@@ -5,7 +5,6 @@ import io.legado.app.BuildConfig
import io.legado.app.constant.PreferKey
import io.legado.app.data.appDb
import io.legado.app.data.repository.ReadPreferences
import io.legado.app.ui.book.manga.config.MangaScrollMode
import io.legado.app.ui.config.backupConfig.BackupConfig
import io.legado.app.ui.config.bookshelfConfig.BookshelfConfig
import io.legado.app.ui.config.coverConfig.CoverConfig
@@ -13,6 +12,7 @@ import io.legado.app.ui.config.downloadCacheConfig.DownloadCacheConfig
import io.legado.app.ui.config.importBookConfig.ImportBookConfig
import io.legado.app.ui.config.otherConfig.OtherConfig
import io.legado.app.ui.config.readConfig.ReadConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory
import io.legado.app.utils.getPrefBoolean
@@ -46,15 +46,33 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
var clickActionBR = appCtx.getPrefInt(PreferKey.clickActionBR, 1)
// -1无操作 1下一页 2上一页 0显示菜单
var mangaClickActionTL = appCtx.getPrefInt(PreferKey.mangaClickActionTL, -1)
var mangaClickActionTC = appCtx.getPrefInt(PreferKey.mangaClickActionTC, -1)
var mangaClickActionTR = appCtx.getPrefInt(PreferKey.mangaClickActionTR, 1)
var mangaClickActionML = appCtx.getPrefInt(PreferKey.mangaClickActionML, 2)
var mangaClickActionMC = appCtx.getPrefInt(PreferKey.mangaClickActionMC, 0)
var mangaClickActionMR = appCtx.getPrefInt(PreferKey.mangaClickActionMR, 1)
var mangaClickActionBL = appCtx.getPrefInt(PreferKey.mangaClickActionBL, 2)
var mangaClickActionBC = appCtx.getPrefInt(PreferKey.mangaClickActionBC, 1)
var mangaClickActionBR = appCtx.getPrefInt(PreferKey.mangaClickActionBR, 1)
var mangaClickActionTL
get() = ReadMangaConfig.mangaClickActionTL
set(value) { ReadMangaConfig.mangaClickActionTL = value }
var mangaClickActionTC
get() = ReadMangaConfig.mangaClickActionTC
set(value) { ReadMangaConfig.mangaClickActionTC = value }
var mangaClickActionTR
get() = ReadMangaConfig.mangaClickActionTR
set(value) { ReadMangaConfig.mangaClickActionTR = value }
var mangaClickActionML
get() = ReadMangaConfig.mangaClickActionML
set(value) { ReadMangaConfig.mangaClickActionML = value }
var mangaClickActionMC
get() = ReadMangaConfig.mangaClickActionMC
set(value) { ReadMangaConfig.mangaClickActionMC = value }
var mangaClickActionMR
get() = ReadMangaConfig.mangaClickActionMR
set(value) { ReadMangaConfig.mangaClickActionMR = value }
var mangaClickActionBL
get() = ReadMangaConfig.mangaClickActionBL
set(value) { ReadMangaConfig.mangaClickActionBL = value }
var mangaClickActionBC
get() = ReadMangaConfig.mangaClickActionBC
set(value) { ReadMangaConfig.mangaClickActionBC = value }
var mangaClickActionBR
get() = ReadMangaConfig.mangaClickActionBR
set(value) { ReadMangaConfig.mangaClickActionBR = value }
val AppTheme get() = ThemeConfig.appTheme
@@ -160,33 +178,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
PreferKey.clickActionBR -> clickActionBR =
appCtx.getPrefInt(PreferKey.clickActionBR, 1)
PreferKey.mangaClickActionTL -> mangaClickActionTL =
appCtx.getPrefInt(PreferKey.mangaClickActionTL, -1)
PreferKey.mangaClickActionTC -> mangaClickActionTC =
appCtx.getPrefInt(PreferKey.mangaClickActionTC, -1)
PreferKey.mangaClickActionTR -> mangaClickActionTR =
appCtx.getPrefInt(PreferKey.mangaClickActionTR, 1)
PreferKey.mangaClickActionML -> mangaClickActionML =
appCtx.getPrefInt(PreferKey.mangaClickActionML, 2)
PreferKey.mangaClickActionMC -> mangaClickActionMC =
appCtx.getPrefInt(PreferKey.mangaClickActionMC, 0)
PreferKey.mangaClickActionMR -> mangaClickActionMR =
appCtx.getPrefInt(PreferKey.mangaClickActionMR, 1)
PreferKey.mangaClickActionBL -> mangaClickActionBL =
appCtx.getPrefInt(PreferKey.mangaClickActionBL, 2)
PreferKey.mangaClickActionBC -> mangaClickActionBC =
appCtx.getPrefInt(PreferKey.mangaClickActionBC, 1)
PreferKey.mangaClickActionBR -> mangaClickActionBR =
appCtx.getPrefInt(PreferKey.mangaClickActionBR, 1)
PreferKey.readBodyToLh -> ReadBookConfig.readBodyToLh =
appCtx.getPrefBoolean(PreferKey.readBodyToLh, true)
@@ -745,13 +736,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
}
fun detectMangaClickArea() {
if (mangaClickActionTL * mangaClickActionTC * mangaClickActionTR
* mangaClickActionML * mangaClickActionMC * mangaClickActionMR
* mangaClickActionBL * mangaClickActionBC * mangaClickActionBR != 0
) {
appCtx.putPrefInt(PreferKey.mangaClickActionMC, 0)
appCtx.toastOnUi("当前没有配置菜单区域,自动恢复中间区域为菜单.")
}
ReadMangaConfig.detectMangaClickArea()
}
var firebaseEnable: Boolean
@@ -762,26 +747,20 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
//跳转到漫画界面不使用富文本模式
val showMangaUi: Boolean
get() = appCtx.getPrefBoolean(PreferKey.showMangaUi, true)
get() = ReadMangaConfig.showMangaUi
//禁用漫画缩放
var disableMangaScale: Boolean
get() = appCtx.getPrefBoolean(PreferKey.disableMangaScale, true)
set(value) {
appCtx.putPrefBoolean(PreferKey.disableMangaScale, value)
}
get() = ReadMangaConfig.disableMangaScale
set(value) { ReadMangaConfig.disableMangaScale = value }
var disableMangaScrollAnimation: Boolean
get() = appCtx.getPrefBoolean(PreferKey.disableMangaScrollAnimation, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.disableMangaScrollAnimation, value)
}
get() = ReadMangaConfig.disableMangaScrollAnimation
set(value) { ReadMangaConfig.disableMangaScrollAnimation = value }
var disableMangaCrossFade: Boolean
get() = appCtx.getPrefBoolean(PreferKey.disableMangaCrossFade, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.disableMangaCrossFade, value)
}
get() = ReadMangaConfig.disableMangaCrossFade
set(value) { ReadMangaConfig.disableMangaCrossFade = value }
var titleBarMode
get() = ReadConfig.titleBarMode
@@ -791,105 +770,75 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
//漫画预加载数量
var mangaPreDownloadNum
get() = appCtx.getPrefInt(PreferKey.mangaPreDownloadNum, 10)
set(value) {
appCtx.putPrefInt(PreferKey.mangaPreDownloadNum, value)
}
get() = ReadMangaConfig.mangaPreDownloadNum
set(value) { ReadMangaConfig.mangaPreDownloadNum = value }
//点击翻页
var disableClickScroll
get() = appCtx.getPrefBoolean(PreferKey.disableClickScroll, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.disableClickScroll, value)
}
get() = ReadMangaConfig.disableClickScroll
set(value) { ReadMangaConfig.disableClickScroll = value }
//漫画滚动速度
var mangaAutoPageSpeed
get() = appCtx.getPrefInt(PreferKey.mangaAutoPageSpeed, 3)
set(value) {
appCtx.putPrefInt(PreferKey.mangaAutoPageSpeed, value)
}
get() = ReadMangaConfig.mangaAutoPageSpeed
set(value) { ReadMangaConfig.mangaAutoPageSpeed = value }
//漫画页脚配置
var mangaFooterConfig
get() = appCtx.getPrefString(PreferKey.mangaFooterConfig, "")
set(value) {
appCtx.putPrefString(PreferKey.mangaFooterConfig, value)
}
get() = ReadMangaConfig.mangaFooterConfig
set(value) { ReadMangaConfig.mangaFooterConfig = value }
//漫画滚动方式
var mangaScrollMode: Int
get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.WEBTOON)
set(value) {
appCtx.putPrefInt(PreferKey.mangaScrollMode, value)
}
get() = ReadMangaConfig.mangaScrollMode
set(value) { ReadMangaConfig.mangaScrollMode = value }
var mangaLongClick
get() = appCtx.getPrefBoolean(PreferKey.mangaLongClick, true)
set(value) {
appCtx.putPrefBoolean(PreferKey.mangaLongClick, value)
}
get() = ReadMangaConfig.mangaLongClick
set(value) { ReadMangaConfig.mangaLongClick = value }
var mangaBackground: Int
get() = appCtx.getPrefInt(PreferKey.mangaBackground, 0xFF000000.toInt())
set(value) {
appCtx.putPrefInt(PreferKey.mangaBackground, value)
}
get() = ReadMangaConfig.mangaBackground
set(value) { ReadMangaConfig.mangaBackground = value }
//漫画滤镜
var mangaColorFilter
get() = appCtx.getPrefString(PreferKey.mangaColorFilter, "")
set(value) {
appCtx.putPrefString(PreferKey.mangaColorFilter, value)
}
get() = ReadMangaConfig.mangaColorFilter
set(value) { ReadMangaConfig.mangaColorFilter = value }
//禁用漫画内标题
var hideMangaTitle
get() = appCtx.getPrefBoolean(PreferKey.hideMangaTitle, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.hideMangaTitle, value)
}
get() = ReadMangaConfig.hideMangaTitle
set(value) { ReadMangaConfig.hideMangaTitle = value }
//开启墨水屏模式
var enableMangaEInk
get() = appCtx.getPrefBoolean(PreferKey.enableMangaEInk, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.enableMangaEInk, value)
}
get() = ReadMangaConfig.enableMangaEInk
set(value) { ReadMangaConfig.enableMangaEInk = value }
//墨水屏阈值
var mangaEInkThreshold
get() = appCtx.getPrefInt(PreferKey.mangaEInkThreshold, 150)
set(value) {
appCtx.putPrefInt(PreferKey.mangaEInkThreshold, value)
}
get() = ReadMangaConfig.mangaEInkThreshold
set(value) { ReadMangaConfig.mangaEInkThreshold = value }
//漫画灰度
var enableMangaGray
get() = appCtx.getPrefBoolean(PreferKey.enableMangaGray, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.enableMangaGray, value)
}
get() = ReadMangaConfig.enableMangaGray
set(value) { ReadMangaConfig.enableMangaGray = value }
//条漫侧边距
var webtoonSidePaddingDp: Int
get() = appCtx.getPrefInt(PreferKey.webtoonSidePaddingDp, 0)
set(value) {
appCtx.putPrefInt(PreferKey.webtoonSidePaddingDp, value)
}
get() = ReadMangaConfig.webtoonSidePaddingDp
set(value) { ReadMangaConfig.webtoonSidePaddingDp = value }
//漫画音量键翻页
var MangaVolumeKeyPage: Boolean
get() = appCtx.getPrefBoolean(PreferKey.mangaVolumeKeyPage, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.mangaVolumeKeyPage, value)
}
get() = ReadMangaConfig.mangaVolumeKeyPage
set(value) { ReadMangaConfig.mangaVolumeKeyPage = value }
var reverseVolumeKeyPage: Boolean
get() = appCtx.getPrefBoolean(PreferKey.reverseVolumeKeyPage, false)
set(value) {
appCtx.putPrefBoolean(PreferKey.reverseVolumeKeyPage, value)
}
get() = ReadMangaConfig.reverseVolumeKeyPage
set(value) { ReadMangaConfig.reverseVolumeKeyPage = value }
var tabletInterface
get() = ThemeConfig.tabletInterface
@@ -25,6 +25,7 @@ import io.legado.app.data.entities.Book
import io.legado.app.help.CacheManager
import io.legado.app.help.DefaultData
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.help.glide.BlurTransformation
import io.legado.app.help.glide.ImageLoader
import io.legado.app.help.glide.OkHttpModelLoader
@@ -172,7 +173,7 @@ object BookCover {
if (transformation != null) {
builder = builder.transform(transformation)
}
builder = if (AppConfig.disableMangaCrossFade) {
builder = if (ReadMangaConfig.disableMangaCrossFade) {
builder
} else {
builder.transition(DrawableTransitionOptions.withCrossFade())
@@ -19,6 +19,7 @@ import io.legado.app.help.book.readSimulating
import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.book.update
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.globalExecutor
import io.legado.app.model.webBook.WebBook
@@ -349,7 +350,7 @@ object ReadManga : CoroutineScope by MainScope() , KoinComponent{
0
}
pos += durChapterPos
if (!AppConfig.hideMangaTitle && it.imageCount > 0) {
if (!ReadMangaConfig.hideMangaTitle && it.imageCount > 0) {
pos++
}
}
@@ -696,7 +697,7 @@ object ReadManga : CoroutineScope by MainScope() , KoinComponent{
it.imageCount = imageCount
}
if (AppConfig.hideMangaTitle && imageCount > 0) {
if (ReadMangaConfig.hideMangaTitle && imageCount > 0) {
return MangaChapter(chapter, list, imageCount)
}
@@ -18,6 +18,7 @@ import io.legado.app.help.book.isAudio
import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.model.SourceCallBack
import io.legado.app.ui.book.audio.AudioPlayActivity
import io.legado.app.ui.book.info.edit.BookInfoEditActivity
@@ -119,7 +120,7 @@ fun BookInfoRouteScreen(
is BookInfoEffect.OpenReader -> {
val cls = when {
effect.book.isAudio -> AudioPlayActivity::class.java
!effect.book.isLocal && effect.book.isImage && AppConfig.showMangaUi -> {
!effect.book.isLocal && effect.book.isImage && ReadMangaConfig.showMangaUi -> {
ReadMangaActivity::class.java
}
@@ -43,6 +43,7 @@ import io.legado.app.help.book.BookHelp
import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.source.getSourceType
import io.legado.app.help.storage.Backup
@@ -147,7 +148,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
private val mScrollTimer by lazy {
ScrollTimer(this, binding.recyclerView, lifecycleScope).apply {
setSpeed(AppConfig.mangaAutoPageSpeed)
setSpeed(ReadMangaConfig.mangaAutoPageSpeed)
}
}
private var enableAutoScrollPage = false
@@ -232,7 +233,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
loadMoreView.gone()
mMangaFooterConfig =
GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
GSON.fromJsonObject<MangaFooterConfig>(ReadMangaConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig()
onBackPressedDispatcher.addCallback(this){
@@ -258,12 +259,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
private fun initRecyclerView() {
val mangaColorFilter =
GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
GSON.fromJsonObject<MangaColorFilterConfig>(ReadMangaConfig.mangaColorFilter).getOrNull()
?: MangaColorFilterConfig()
mAdapter.run {
setMangaImageColorFilter(mangaColorFilter)
enableMangaEInk(AppConfig.enableMangaEInk, AppConfig.mangaEInkThreshold)
enableGray(AppConfig.enableMangaGray)
enableMangaEInk(ReadMangaConfig.enableMangaEInk, ReadMangaConfig.mangaEInkThreshold)
enableGray(ReadMangaConfig.enableMangaGray)
}
viewModel.initData(intent) {
@@ -276,8 +277,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
itemAnimator = null
layoutManager = mLayoutManager
setHasFixedSize(true)
setDisableMangaScale(AppConfig.disableMangaScale)
setRecyclerViewPreloader(AppConfig.mangaPreDownloadNum)
setDisableMangaScale(ReadMangaConfig.disableMangaScale)
setRecyclerViewPreloader(ReadMangaConfig.mangaPreDownloadNum)
setPreScrollListener { _, _, _, position ->
if (mAdapter.isNotEmpty()) {
val item = mAdapter.getItem(position)
@@ -498,7 +499,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
override fun onColorSelected(dialogId: Int, color: Int){
if (dialogId == MANGA_B)
{
viewModel.setMangaBackground(color)
ReadMangaConfig.mangaBackground = color
setBackground()
}
}
@@ -701,9 +702,9 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
showNumberPickerDialog(
0,
getString(R.string.pre_download),
AppConfig.mangaPreDownloadNum
ReadMangaConfig.mangaPreDownloadNum
) {
viewModel.setMangaPreDownloadNum(it)
ReadMangaConfig.mangaPreDownloadNum = it
item.title = getString(R.string.pre_download_m, it)
setRecyclerViewPreloader(it)
}
@@ -751,26 +752,26 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
mangaScrollMode = mode
}
setScrollMode(mode)
updateWebtoonSidePadding(AppConfig.webtoonSidePaddingDp)
updateWebtoonSidePadding(ReadMangaConfig.webtoonSidePaddingDp)
setAutoReadEnabled(false)
}
//点击滑动
override fun onClickScrollDisabledChanged(disabled: Boolean) {
viewModel.setDisableClickScroll(disabled)
ReadMangaConfig.disableClickScroll = disabled
}
override fun onScrollAniDisabledChanged(disabled: Boolean) {
viewModel.setDisableMangaScrollAnimation(disabled)
ReadMangaConfig.disableMangaScrollAnimation = disabled
}
override fun onCrossFadeDisabledChanged(disabled: Boolean) {
viewModel.setDisableMangaCrossFade(disabled)
ReadMangaConfig.disableMangaCrossFade = disabled
}
//双击缩放
override fun onMangaScaleDisabledChanged(disabled: Boolean) {
viewModel.setDisableMangaScale(disabled)
ReadMangaConfig.disableMangaScale = disabled
setDisableMangaScale(disabled)
}
@@ -784,13 +785,16 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
//墨水屏
override fun updateEpaperMode(enabled: Boolean, threshold: Int) {
viewModel.setEInkMode(enabled, threshold)
ReadMangaConfig.enableMangaEInk = enabled
ReadMangaConfig.enableMangaGray = false
ReadMangaConfig.mangaEInkThreshold = threshold
mAdapter.enableMangaEInk(enabled, threshold)
}
//灰度
override fun updateGrayMode(enabled: Boolean) {
viewModel.setGrayMode(enabled)
ReadMangaConfig.enableMangaGray = enabled
ReadMangaConfig.enableMangaEInk = false
mAdapter.enableGray(enabled)
}
@@ -808,28 +812,25 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
//自动翻页速度
override fun onAutoPageSpeedChanged(speed: Int) {
setAutoReadEnabled(false)
viewModel.setMangaAutoPageSpeed(speed)
ReadMangaConfig.mangaAutoPageSpeed = speed
mScrollTimer.setSpeed(speed)
setAutoReadEnabled(enableScroll)
// if (enableAutoScrollPage) {
// mScrollTimer.isEnabledPage = true
// }
}
override fun onMangaLongClickChanged(checked: Boolean) {
viewModel.setMangaLongClick(checked)
ReadMangaConfig.mangaLongClick = checked
}
override fun onVolumeKeyPageChanged(enable: Boolean) {
viewModel.setMangaVolumeKeyPage(enable)
ReadMangaConfig.mangaVolumeKeyPage = enable
}
override fun onReverseVolumeKeyPageChanged(enable: Boolean) {
viewModel.setReverseVolumeKeyPage(enable)
ReadMangaConfig.reverseVolumeKeyPage = enable
}
override fun onHideMangaTitleChanged(hide: Boolean) {
viewModel.setHideMangaTitle(hide)
ReadMangaConfig.hideMangaTitle = hide
ReadManga.loadContent()
}
@@ -946,8 +947,8 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
private fun setBackground() {
binding.webtoonFrame.setBackgroundColor(AppConfig.mangaBackground)
binding.recyclerView.setBackgroundColor(AppConfig.mangaBackground)
binding.webtoonFrame.setBackgroundColor(ReadMangaConfig.mangaBackground)
binding.recyclerView.setBackgroundColor(ReadMangaConfig.mangaBackground)
mAdapter.notifyItemRangeChanged(0, mAdapter.itemCount)
}
@@ -966,7 +967,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
private fun upMenu(menu: Menu) {
this.mMenu = menu
menu.findItem(R.id.menu_pre_manga_number).title =
getString(R.string.pre_download_m, AppConfig.mangaPreDownloadNum)
getString(R.string.pre_download_m, ReadMangaConfig.mangaPreDownloadNum)
}
private fun setDisableMangaScale(disable: Boolean) {
@@ -987,12 +988,12 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
private fun scrollToNext() {
if (!AppConfig.disableClickScroll)
if (!ReadMangaConfig.disableClickScroll)
scrollPageTo(1)
}
private fun scrollToPrev() {
if (!AppConfig.disableClickScroll)
if (!ReadMangaConfig.disableClickScroll)
scrollPageTo(-1)
}
@@ -1018,7 +1019,7 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
dx *= direction
dy *= direction
if (!AppConfig.disableMangaScrollAnimation)
if (!ReadMangaConfig.disableMangaScrollAnimation)
binding.recyclerView.smoothScrollBy(dx, dy)
else
binding.recyclerView.scrollBy(dx, dy)
@@ -1082,11 +1083,11 @@ class ReadMangaActivity : VMBaseActivity<ActivityMangaBinding, ReadMangaViewMode
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (!AppConfig.MangaVolumeKeyPage) {
if (!ReadMangaConfig.mangaVolumeKeyPage) {
return super.onKeyDown(keyCode, event)
}
val isReverse = AppConfig.reverseVolumeKeyPage
val isReverse = ReadMangaConfig.reverseVolumeKeyPage
when (keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
@@ -15,7 +15,6 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.Book.ReadConfig
import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.BookProgress
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.domain.model.ReadingProgress
import io.legado.app.domain.usecase.GetReadingProgressUseCase
import io.legado.app.exception.NoStackTraceException
@@ -31,6 +30,7 @@ import io.legado.app.model.ReadManga
import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook
import io.legado.app.ui.config.otherConfig.OtherConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.utils.ImageSaveUtils
import io.legado.app.utils.mapParallelSafe
import io.legado.app.utils.postEvent
@@ -51,8 +51,7 @@ import java.io.ByteArrayOutputStream
class ReadMangaViewModel(
application: Application,
private val getReadingProgressUseCase: GetReadingProgressUseCase,
private val mangaSettingsRepository: MangaSettingsRepository
private val getReadingProgressUseCase: GetReadingProgressUseCase
) : BaseViewModel(application) {
private var changeSourceCoroutine: Coroutine<*>? = null
@@ -326,11 +325,11 @@ class ReadMangaViewModel(
fun getEffectiveScrollMode(): Int {
return ReadManga.book?.readConfig?.mangaScrollMode ?: AppConfig.mangaScrollMode
return ReadManga.book?.readConfig?.mangaScrollMode ?: ReadMangaConfig.mangaScrollMode
}
fun getEffectiveWebtoonSidePadding(): Int {
return ReadManga.book?.readConfig?.webtoonSidePaddingDp ?: AppConfig.webtoonSidePaddingDp
return ReadManga.book?.readConfig?.webtoonSidePaddingDp ?: ReadMangaConfig.webtoonSidePaddingDp
}
fun saveImageToGallery(url: String, folderName: String = "Legado") {
@@ -380,91 +379,6 @@ class ReadMangaViewModel(
}
}
fun setMangaPreDownloadNum(value: Int) {
AppConfig.mangaPreDownloadNum = value
viewModelScope.launch { mangaSettingsRepository.setMangaPreDownloadNum(value) }
}
fun setMangaBackground(value: Int) {
AppConfig.mangaBackground = value
viewModelScope.launch { mangaSettingsRepository.setMangaBackground(value) }
}
fun setDisableClickScroll(value: Boolean) {
AppConfig.disableClickScroll = value
viewModelScope.launch { mangaSettingsRepository.setDisableClickScroll(value) }
}
fun setDisableMangaScrollAnimation(value: Boolean) {
AppConfig.disableMangaScrollAnimation = value
viewModelScope.launch { mangaSettingsRepository.setDisableMangaScrollAnimation(value) }
}
fun setDisableMangaCrossFade(value: Boolean) {
AppConfig.disableMangaCrossFade = value
viewModelScope.launch { mangaSettingsRepository.setDisableMangaCrossFade(value) }
}
fun setDisableMangaScale(value: Boolean) {
AppConfig.disableMangaScale = value
viewModelScope.launch { mangaSettingsRepository.setDisableMangaScale(value) }
}
fun setEInkMode(enabled: Boolean, threshold: Int) {
AppConfig.enableMangaEInk = enabled
AppConfig.enableMangaGray = false
AppConfig.mangaEInkThreshold = threshold
viewModelScope.launch {
mangaSettingsRepository.setEnableMangaEInk(enabled)
mangaSettingsRepository.setEnableMangaGray(false)
mangaSettingsRepository.setMangaEInkThreshold(threshold)
}
}
fun setGrayMode(enabled: Boolean) {
AppConfig.enableMangaGray = enabled
AppConfig.enableMangaEInk = false
viewModelScope.launch {
mangaSettingsRepository.setEnableMangaGray(enabled)
mangaSettingsRepository.setEnableMangaEInk(false)
}
}
fun setMangaAutoPageSpeed(value: Int) {
AppConfig.mangaAutoPageSpeed = value
viewModelScope.launch { mangaSettingsRepository.setMangaAutoPageSpeed(value) }
}
fun setMangaLongClick(value: Boolean) {
AppConfig.mangaLongClick = value
viewModelScope.launch { mangaSettingsRepository.setMangaLongClick(value) }
}
fun setMangaVolumeKeyPage(value: Boolean) {
AppConfig.MangaVolumeKeyPage = value
viewModelScope.launch { mangaSettingsRepository.setMangaVolumeKeyPage(value) }
}
fun setReverseVolumeKeyPage(value: Boolean) {
AppConfig.reverseVolumeKeyPage = value
viewModelScope.launch { mangaSettingsRepository.setReverseVolumeKeyPage(value) }
}
fun setHideMangaTitle(value: Boolean) {
AppConfig.hideMangaTitle = value
viewModelScope.launch { mangaSettingsRepository.setHideMangaTitle(value) }
}
fun setMangaColorFilter(value: String) {
AppConfig.mangaColorFilter = value
viewModelScope.launch { mangaSettingsRepository.setMangaAutoColorFilter(value) }
}
fun setMangaFooterConfig(value: String) {
AppConfig.mangaFooterConfig = value
viewModelScope.launch { mangaSettingsRepository.setMangaFooterConfig(value) }
}
override fun onCleared() {
super.onCleared()
changeSourceCoroutine?.cancel()
@@ -5,7 +5,7 @@ import android.view.View
import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.databinding.DialogMangaAutoReadBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.utils.viewbindingdelegate.viewBinding
class MangaAutoReadDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_auto_read) {
@@ -37,7 +37,7 @@ class MangaAutoReadDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_
binding.scvAutoPageSpeed.run {
isEnabled = boolean
valueFormat = { "$it" }
progress = AppConfig.mangaAutoPageSpeed
progress = ReadMangaConfig.mangaAutoPageSpeed
onChanged = { newValue ->
callback?.onAutoPageSpeedChanged(newValue)
@@ -8,17 +8,14 @@ import android.widget.TextView
import io.legado.app.R
import io.legado.app.base.BaseOverlayDialogFragment
import io.legado.app.constant.PreferKey
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.databinding.DialogClickActionConfigBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.lib.dialogs.selector
import io.legado.app.utils.getCompatColor
import io.legado.app.utils.viewbindingdelegate.viewBinding
import org.koin.android.ext.android.inject
class MangaClickActionConfigDialog : BaseOverlayDialogFragment(R.layout.dialog_click_action_config) {
private val binding by viewBinding(DialogClickActionConfigBinding::bind)
private val mangaSettingsRepository by inject<MangaSettingsRepository>()
private val actions by lazy {
linkedMapOf(
@@ -50,15 +47,15 @@ class MangaClickActionConfigDialog : BaseOverlayDialogFragment(R.layout.dialog_c
}
private fun initData() = binding.run {
tvTopLeft.text = actions[AppConfig.mangaClickActionTL]
tvTopCenter.text = actions[AppConfig.mangaClickActionTC]
tvTopRight.text = actions[AppConfig.mangaClickActionTR]
tvMiddleLeft.text = actions[AppConfig.mangaClickActionML]
tvMiddleCenter.text = actions[AppConfig.mangaClickActionMC]
tvMiddleRight.text = actions[AppConfig.mangaClickActionMR]
tvBottomLeft.text = actions[AppConfig.mangaClickActionBL]
tvBottomCenter.text = actions[AppConfig.mangaClickActionBC]
tvBottomRight.text = actions[AppConfig.mangaClickActionBR]
tvTopLeft.text = actions[ReadMangaConfig.mangaClickActionTL]
tvTopCenter.text = actions[ReadMangaConfig.mangaClickActionTC]
tvTopRight.text = actions[ReadMangaConfig.mangaClickActionTR]
tvMiddleLeft.text = actions[ReadMangaConfig.mangaClickActionML]
tvMiddleCenter.text = actions[ReadMangaConfig.mangaClickActionMC]
tvMiddleRight.text = actions[ReadMangaConfig.mangaClickActionMR]
tvBottomLeft.text = actions[ReadMangaConfig.mangaClickActionBL]
tvBottomCenter.text = actions[ReadMangaConfig.mangaClickActionBC]
tvBottomRight.text = actions[ReadMangaConfig.mangaClickActionBR]
}
private fun initViewEvent() {
@@ -132,18 +129,15 @@ class MangaClickActionConfigDialog : BaseOverlayDialogFragment(R.layout.dialog_c
private fun setClickAction(key: String, action: Int) {
when (key) {
PreferKey.mangaClickActionTL -> AppConfig.mangaClickActionTL = action
PreferKey.mangaClickActionTC -> AppConfig.mangaClickActionTC = action
PreferKey.mangaClickActionTR -> AppConfig.mangaClickActionTR = action
PreferKey.mangaClickActionML -> AppConfig.mangaClickActionML = action
PreferKey.mangaClickActionMC -> AppConfig.mangaClickActionMC = action
PreferKey.mangaClickActionMR -> AppConfig.mangaClickActionMR = action
PreferKey.mangaClickActionBL -> AppConfig.mangaClickActionBL = action
PreferKey.mangaClickActionBC -> AppConfig.mangaClickActionBC = action
PreferKey.mangaClickActionBR -> AppConfig.mangaClickActionBR = action
}
execute {
mangaSettingsRepository.setMangaClickAction(key, action)
PreferKey.mangaClickActionTL -> ReadMangaConfig.mangaClickActionTL = action
PreferKey.mangaClickActionTC -> ReadMangaConfig.mangaClickActionTC = action
PreferKey.mangaClickActionTR -> ReadMangaConfig.mangaClickActionTR = action
PreferKey.mangaClickActionML -> ReadMangaConfig.mangaClickActionML = action
PreferKey.mangaClickActionMC -> ReadMangaConfig.mangaClickActionMC = action
PreferKey.mangaClickActionMR -> ReadMangaConfig.mangaClickActionMR = action
PreferKey.mangaClickActionBL -> ReadMangaConfig.mangaClickActionBL = action
PreferKey.mangaClickActionBC -> ReadMangaConfig.mangaClickActionBC = action
PreferKey.mangaClickActionBR -> ReadMangaConfig.mangaClickActionBR = action
}
}
@@ -158,19 +152,16 @@ class MangaClickActionConfigDialog : BaseOverlayDialogFragment(R.layout.dialog_c
override fun onDestroy() {
if (!hasMenuClickArea()) {
AppConfig.detectMangaClickArea()
execute {
mangaSettingsRepository.setMangaClickAction(PreferKey.mangaClickActionMC, 0)
}
ReadMangaConfig.detectMangaClickArea()
}
super.onDestroy()
}
private fun hasMenuClickArea(): Boolean {
return AppConfig.mangaClickActionTL * AppConfig.mangaClickActionTC *
AppConfig.mangaClickActionTR * AppConfig.mangaClickActionML *
AppConfig.mangaClickActionMC * AppConfig.mangaClickActionMR *
AppConfig.mangaClickActionBL * AppConfig.mangaClickActionBC *
AppConfig.mangaClickActionBR == 0
return ReadMangaConfig.mangaClickActionTL * ReadMangaConfig.mangaClickActionTC *
ReadMangaConfig.mangaClickActionTR * ReadMangaConfig.mangaClickActionML *
ReadMangaConfig.mangaClickActionMC * ReadMangaConfig.mangaClickActionMR *
ReadMangaConfig.mangaClickActionBL * ReadMangaConfig.mangaClickActionBC *
ReadMangaConfig.mangaClickActionBR == 0
}
}
@@ -7,25 +7,22 @@ import android.view.WindowManager
import androidx.core.view.isVisible
import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.databinding.DialogMangaColorFilterBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.utils.GSON
import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.invisible
import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible
import org.koin.android.ext.android.inject
class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_color_filter) {
private val binding by viewBinding(DialogMangaColorFilterBinding::bind)
private val mangaSettingsRepository by inject<MangaSettingsRepository>()
private val mConfig =
GSON.fromJsonObject<MangaColorFilterConfig>(AppConfig.mangaColorFilter).getOrNull()
GSON.fromJsonObject<MangaColorFilterConfig>(ReadMangaConfig.mangaColorFilter).getOrNull()
?: MangaColorFilterConfig()
private val callback: Callback? get() = activity as? Callback
private var mMangaEInkThreshold = AppConfig.mangaEInkThreshold
private var mMangaEInkThreshold = ReadMangaConfig.mangaEInkThreshold
override fun onStart() {
@@ -42,13 +39,13 @@ class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_man
binding.run {
chipAutoBrightness.isChecked = mConfig.autoBrightness
if (AppConfig.enableMangaEInk) dsbEpaper.visible()
if (ReadMangaConfig.enableMangaEInk) dsbEpaper.visible()
else dsbEpaper.invisible()
dsbEpaper.progress = mMangaEInkThreshold
cpEpaper.isChecked = AppConfig.enableMangaEInk
cpEnableGray.isChecked = AppConfig.enableMangaGray
cpEpaper.isChecked = ReadMangaConfig.enableMangaEInk
cpEnableGray.isChecked = ReadMangaConfig.enableMangaGray
dsbBrightness.isEnabled = !mConfig.autoBrightness
dsbBrightness.progress = mConfig.l
@@ -117,13 +114,8 @@ class MangaColorFilterDialog : BaseBottomSheetDialogFragment(R.layout.dialog_man
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
val colorFilter = mConfig.toJson()
AppConfig.mangaColorFilter = colorFilter
AppConfig.mangaEInkThreshold = mMangaEInkThreshold
execute {
mangaSettingsRepository.setMangaAutoColorFilter(colorFilter)
mangaSettingsRepository.setMangaEInkThreshold(mMangaEInkThreshold)
}
ReadMangaConfig.mangaColorFilter = mConfig.toJson()
ReadMangaConfig.mangaEInkThreshold = mMangaEInkThreshold
}
interface Callback {
@@ -11,9 +11,8 @@ import com.jaredrummler.android.colorpicker.ColorPickerDialog
import io.legado.app.R
import io.legado.app.base.BaseBottomSheetDialogFragment
import io.legado.app.constant.EventBus
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.databinding.DialogMangaFooterSettingBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.ui.book.manga.entities.MangaFooterConfig
import io.legado.app.ui.widget.ReaderInfoBarView
import io.legado.app.utils.GSON
@@ -21,7 +20,6 @@ import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.postEvent
import io.legado.app.utils.toastOnUi
import io.legado.app.utils.viewbindingdelegate.viewBinding
import org.koin.android.ext.android.inject
class MangaFooterSettingDialog :
BaseBottomSheetDialogFragment(R.layout.dialog_manga_footer_setting) {
@@ -30,7 +28,7 @@ class MangaFooterSettingDialog :
const val MANGA_B = 1919
}
val config = GSON.fromJsonObject<MangaFooterConfig>(AppConfig.mangaFooterConfig).getOrNull()
val config = GSON.fromJsonObject<MangaFooterConfig>(ReadMangaConfig.mangaFooterConfig).getOrNull()
?: MangaFooterConfig()
var initialWebtoonSidePadding: Int = 0
@@ -39,7 +37,6 @@ class MangaFooterSettingDialog :
var callback: Callback? = null
private val binding by viewBinding(DialogMangaFooterSettingBinding::bind)
private val mangaSettingsRepository by inject<MangaSettingsRepository>()
override fun onStart() {
super.onStart()
@@ -63,18 +60,18 @@ class MangaFooterSettingDialog :
mode == MangaScrollMode.WEBTOON_WITH_GAP
}
setOnLongClickListener {
AppConfig.mangaScrollMode = mode
ReadMangaConfig.mangaScrollMode = mode
toastOnUi("已设置为全局默认模式")
true
}
})
}
binding.btnBackgroundColor.color = AppConfig.mangaBackground
binding.btnBackgroundColor.color = ReadMangaConfig.mangaBackground
binding.btnBackgroundColor.setOnClickListener {
dismiss()
ColorPickerDialog.newBuilder()
.setColor(AppConfig.mangaBackground)
.setColor(ReadMangaConfig.mangaBackground)
.setShowAlphaSlider(false)
.setDialogType(ColorPickerDialog.TYPE_CUSTOM)
.setDialogId(MANGA_B)
@@ -93,56 +90,56 @@ class MangaFooterSettingDialog :
}
binding.checkboxDisableClickScroll.apply {
isChecked = AppConfig.disableClickScroll
isChecked = ReadMangaConfig.disableClickScroll
setOnCheckedChangeListener { _, isChecked ->
callback?.onClickScrollDisabledChanged(isChecked)
}
}
binding.checkboxScrollAnimation.apply {
isChecked = AppConfig.disableMangaScrollAnimation
isChecked = ReadMangaConfig.disableMangaScrollAnimation
setOnCheckedChangeListener { _, isChecked ->
callback?.onScrollAniDisabledChanged(isChecked)
}
}
binding.checkboxMangaCrossFade.apply {
isChecked = AppConfig.disableMangaCrossFade
isChecked = ReadMangaConfig.disableMangaCrossFade
setOnCheckedChangeListener { _, isChecked ->
callback?.onCrossFadeDisabledChanged(isChecked)
}
}
binding.checkboxDisableMangaScale.apply {
isChecked = AppConfig.disableMangaScale
isChecked = ReadMangaConfig.disableMangaScale
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaScaleDisabledChanged(isChecked)
}
}
binding.checkboxHideMangaTitle.apply {
isChecked = AppConfig.hideMangaTitle
isChecked = ReadMangaConfig.hideMangaTitle
setOnCheckedChangeListener { _, isChecked ->
callback?.onHideMangaTitleChanged(isChecked)
}
}
binding.checkboxVolumeKeyPage.apply {
isChecked = AppConfig.MangaVolumeKeyPage
isChecked = ReadMangaConfig.mangaVolumeKeyPage
setOnCheckedChangeListener { _, isChecked ->
callback?.onVolumeKeyPageChanged(isChecked)
}
}
binding.reverseVolumeKeyPage.apply {
isChecked = AppConfig.reverseVolumeKeyPage
isChecked = ReadMangaConfig.reverseVolumeKeyPage
setOnCheckedChangeListener { _, isChecked ->
callback?.onReverseVolumeKeyPageChanged(isChecked)
}
}
binding.checkboxMangaLongClick.apply {
isChecked = AppConfig.mangaLongClick
isChecked = ReadMangaConfig.mangaLongClick
setOnCheckedChangeListener { _, isChecked ->
callback?.onMangaLongClickChanged(isChecked)
}
@@ -258,11 +255,7 @@ class MangaFooterSettingDialog :
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
val footerConfig = GSON.toJson(config)
AppConfig.mangaFooterConfig = footerConfig
execute {
mangaSettingsRepository.setMangaFooterConfig(footerConfig)
}
ReadMangaConfig.mangaFooterConfig = GSON.toJson(config)
}
private fun updateChapterText() {
@@ -22,7 +22,7 @@ import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.RecyclerAdapter.Companion.TYPE_FOOTER_VIEW
import io.legado.app.databinding.ItemBookMangaEdgeBinding
import io.legado.app.databinding.ItemBookMangaPageBinding
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.help.glide.progress.ProgressManager
import io.legado.app.model.BookCover
import io.legado.app.model.ReadManga
@@ -135,8 +135,8 @@ class MangaAdapter(private val context: Context) :
}
fun setBackground() {
binding.rootView.setBackgroundColor(AppConfig.mangaBackground)
binding.flProgress.setBackgroundColor(AppConfig.mangaBackground)
binding.rootView.setBackgroundColor(ReadMangaConfig.mangaBackground)
binding.flProgress.setBackgroundColor(ReadMangaConfig.mangaBackground)
}
}
@@ -9,7 +9,7 @@ import android.view.MotionEvent
import android.view.ScaleGestureDetector
import android.widget.FrameLayout
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.utils.findCenterViewPosition
class WebtoonFrame : FrameLayout {
@@ -46,7 +46,7 @@ class WebtoonFrame : FrameLayout {
private val gestureDetector =
GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onLongPress(e: MotionEvent) {
if (AppConfig.mangaLongClick)
if (ReadMangaConfig.mangaLongClick)
{
recycler?.let {
val centerPos = it.findCenterViewPosition()
@@ -69,15 +69,15 @@ class WebtoonFrame : FrameLayout {
regionRects.entries.find { it.value.contains(x, y) }?.key ?: return@tapListener
val action = when (key) {
"TL" -> AppConfig.mangaClickActionTL
"TC" -> AppConfig.mangaClickActionTC
"TR" -> AppConfig.mangaClickActionTR
"ML" -> AppConfig.mangaClickActionML
"MC" -> AppConfig.mangaClickActionMC
"MR" -> AppConfig.mangaClickActionMR
"BL" -> AppConfig.mangaClickActionBL
"BC" -> AppConfig.mangaClickActionBC
"BR" -> AppConfig.mangaClickActionBR
"TL" -> ReadMangaConfig.mangaClickActionTL
"TC" -> ReadMangaConfig.mangaClickActionTC
"TR" -> ReadMangaConfig.mangaClickActionTR
"ML" -> ReadMangaConfig.mangaClickActionML
"MC" -> ReadMangaConfig.mangaClickActionMC
"MR" -> ReadMangaConfig.mangaClickActionMR
"BL" -> ReadMangaConfig.mangaClickActionBL
"BC" -> ReadMangaConfig.mangaClickActionBC
"BR" -> ReadMangaConfig.mangaClickActionBR
else -> -1
}
@@ -23,6 +23,7 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import io.legado.app.R
import io.legado.app.service.WebService
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.adaptiveContentPadding
import io.legado.app.ui.widget.components.AppScaffold
@@ -49,7 +50,6 @@ fun OtherConfigScreen(
) {
val context = LocalContext.current
val readAloudPreferences by viewModel.readAloudPreferences.collectAsStateWithLifecycle()
val mangaPreferences by viewModel.mangaPreferences.collectAsStateWithLifecycle()
val notificationPermissionLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
@@ -237,8 +237,8 @@ fun OtherConfigScreen(
SwitchSettingItem(
title = stringResource(R.string.show_manga_ui),
checked = mangaPreferences.showMangaUi,
onCheckedChange = { viewModel.setShowMangaUi(it) }
checked = ReadMangaConfig.showMangaUi,
onCheckedChange = { ReadMangaConfig.showMangaUi = it }
)
}
@@ -9,8 +9,6 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.legado.app.constant.PreferKey
import io.legado.app.data.repository.MangaPreferences
import io.legado.app.data.repository.MangaSettingsRepository
import io.legado.app.data.repository.ReadAloudPreferences
import io.legado.app.data.repository.ReadAloudSettingsRepository
import io.legado.app.help.DirectLinkUpload
@@ -30,8 +28,7 @@ import kotlinx.coroutines.launch
import splitties.init.appCtx
class OtherConfigViewModel(
private val readAloudSettingsRepository: ReadAloudSettingsRepository,
private val mangaSettingsRepository: MangaSettingsRepository
private val readAloudSettingsRepository: ReadAloudSettingsRepository
) : ViewModel() {
private val packageManager = appCtx.packageManager
@@ -52,12 +49,6 @@ class OtherConfigViewModel(
initialValue = ReadAloudPreferences()
)
val mangaPreferences = mangaSettingsRepository.preferences.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = MangaPreferences()
)
fun setMediaButtonOnExit(value: Boolean) {
viewModelScope.launch {
readAloudSettingsRepository.setMediaButtonOnExit(value)
@@ -76,12 +67,6 @@ class OtherConfigViewModel(
}
}
fun setShowMangaUi(value: Boolean) {
viewModelScope.launch {
mangaSettingsRepository.setShowMangaUi(value)
}
}
fun isProcessTextEnabled(): Boolean {
return packageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED
}
@@ -0,0 +1,126 @@
package io.legado.app.ui.config.readMangaConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.book.manga.config.MangaScrollMode
import io.legado.app.ui.config.prefDelegate
import io.legado.app.utils.toastOnUi
import splitties.init.appCtx
object ReadMangaConfig {
var showMangaUi by prefDelegate(
PreferKey.showMangaUi,
true
)
var disableMangaScale by prefDelegate(
PreferKey.disableMangaScale,
true
)
var disableMangaScrollAnimation by prefDelegate(
PreferKey.disableMangaScrollAnimation,
false
)
var disableMangaCrossFade by prefDelegate(
PreferKey.disableMangaCrossFade,
false
)
var mangaScrollMode by prefDelegate(
PreferKey.mangaScrollMode,
MangaScrollMode.WEBTOON
)
var mangaPreDownloadNum by prefDelegate(
PreferKey.mangaPreDownloadNum,
10
)
var mangaAutoPageSpeed by prefDelegate(
PreferKey.mangaAutoPageSpeed,
3
)
var mangaFooterConfig by prefDelegate(
PreferKey.mangaFooterConfig,
""
)
var disableClickScroll by prefDelegate(
PreferKey.disableClickScroll,
false
)
var mangaLongClick by prefDelegate(
PreferKey.mangaLongClick,
true
)
var mangaBackground by prefDelegate(
PreferKey.mangaBackground,
0xFF000000.toInt()
)
var mangaColorFilter by prefDelegate(
PreferKey.mangaColorFilter,
""
)
var hideMangaTitle by prefDelegate(
PreferKey.hideMangaTitle,
false
)
var enableMangaEInk by prefDelegate(
PreferKey.enableMangaEInk,
false
)
var mangaEInkThreshold by prefDelegate(
PreferKey.mangaEInkThreshold,
150
)
var enableMangaGray by prefDelegate(
PreferKey.enableMangaGray,
false
)
var webtoonSidePaddingDp by prefDelegate(
PreferKey.webtoonSidePaddingDp,
0
)
var mangaVolumeKeyPage by prefDelegate(
PreferKey.mangaVolumeKeyPage,
false
)
var reverseVolumeKeyPage by prefDelegate(
PreferKey.reverseVolumeKeyPage,
false
)
// -1无操作 1下一页 2上一页 0显示菜单 3下一章 4上一章
var mangaClickActionTL by prefDelegate(PreferKey.mangaClickActionTL, -1)
var mangaClickActionTC by prefDelegate(PreferKey.mangaClickActionTC, -1)
var mangaClickActionTR by prefDelegate(PreferKey.mangaClickActionTR, 1)
var mangaClickActionML by prefDelegate(PreferKey.mangaClickActionML, 2)
var mangaClickActionMC by prefDelegate(PreferKey.mangaClickActionMC, 0)
var mangaClickActionMR by prefDelegate(PreferKey.mangaClickActionMR, 1)
var mangaClickActionBL by prefDelegate(PreferKey.mangaClickActionBL, 2)
var mangaClickActionBC by prefDelegate(PreferKey.mangaClickActionBC, 1)
var mangaClickActionBR by prefDelegate(PreferKey.mangaClickActionBR, 1)
fun detectMangaClickArea() {
if (mangaClickActionTL * mangaClickActionTC * mangaClickActionTR
* mangaClickActionML * mangaClickActionMC * mangaClickActionMR
* mangaClickActionBL * mangaClickActionBC * mangaClickActionBR != 0
) {
mangaClickActionMC = 0
appCtx.toastOnUi("当前没有配置菜单区域,自动恢复中间区域为菜单.")
}
}
}
@@ -46,6 +46,7 @@ import io.legado.app.help.book.isAudio
import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.ui.book.audio.AudioPlayActivity
import io.legado.app.ui.book.manga.ReadMangaActivity
import io.legado.app.ui.main.MainActivity
@@ -70,13 +71,13 @@ fun Context.startActivityForBook(
) {
val intent = when {
book.isAudio -> Intent(this, AudioPlayActivity::class.java)
!book.isLocal && book.isImage && AppConfig.showMangaUi ->
!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi ->
Intent(this, ReadMangaActivity::class.java)
else -> MainActivity.createReadBookIntent(this, book.bookUrl)
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (book.isAudio || (!book.isLocal && book.isImage && AppConfig.showMangaUi)) {
if (book.isAudio || (!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi)) {
intent.putExtra("bookUrl", book.bookUrl)
}
intent.apply(configIntent)
@@ -89,13 +90,13 @@ fun Context.startActivityForBook(
) {
val intent = when {
book.isAudio -> Intent(this, AudioPlayActivity::class.java)
!book.isLocal && book.isImage && AppConfig.showMangaUi ->
!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi ->
Intent(this, ReadMangaActivity::class.java)
else -> MainActivity.createReadBookIntent(this, book.bookUrl)
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (book.isAudio || (!book.isLocal && book.isImage && AppConfig.showMangaUi)) {
if (book.isAudio || (!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi)) {
intent.putExtra("bookUrl", book.bookUrl)
}
intent.apply(configIntent)
@@ -19,6 +19,7 @@ import io.legado.app.help.book.isAudio
import io.legado.app.help.book.isImage
import io.legado.app.help.book.isLocal
import io.legado.app.help.config.AppConfig
import io.legado.app.ui.config.readMangaConfig.ReadMangaConfig
import io.legado.app.ui.book.audio.AudioPlayActivity
import io.legado.app.ui.book.manga.ReadMangaActivity
import io.legado.app.ui.main.MainActivity
@@ -94,13 +95,13 @@ fun Fragment.startActivityForBook(
) {
val intent = when {
book.isAudio -> Intent(requireActivity(), AudioPlayActivity::class.java)
!book.isLocal && book.isImage && AppConfig.showMangaUi ->
!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi ->
Intent(requireActivity(), ReadMangaActivity::class.java)
else -> MainActivity.createReadBookIntent(requireActivity(), book.bookUrl)
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
if (book.isAudio || (!book.isLocal && book.isImage && AppConfig.showMangaUi)) {
if (book.isAudio || (!book.isLocal && book.isImage && ReadMangaConfig.showMangaUi)) {
intent.putExtra("bookUrl", book.bookUrl)
}
intent.apply(configIntent)