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