diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 0c73e47e6..2ba8f7307 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -94,6 +94,8 @@ object PreferKey { const val defaultCoverDark = "defaultCoverDark" const val replaceEnableDefault = "replaceEnableDefault" const val showBrightnessView = "showBrightnessView" + const val useUnderline = "useUnderline" + const val adaptSpecialStyle = "adaptSpecialStyle" const val autoClearExpired = "autoClearExpired" const val autoChangeSource = "autoChangeSource" const val importKeepName = "importKeepName" @@ -174,6 +176,8 @@ object PreferKey { const val cAccent = "colorAccent" const val customMode = "customMode" const val paletteStyle = "paletteStyle" + const val composeEngine = "composeEngine" + const val containerOpacity = "containerOpacity" const val enableBlur = "enableBlur" const val cBackground = "colorBackground" const val cBBackground = "colorBottomBackground" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index a48009e5c..6ac1272d7 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -53,14 +53,26 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { var themeMode = appCtx.getPrefString(PreferKey.themeMode, "0") var AppTheme = appCtx.getPrefString(PreferKey.appTheme, "0") + var containerOpacity = appCtx.getPrefInt(PreferKey.containerOpacity, 100) var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false) var optimizeRender = CanvasRecorderFactory.isSupport && appCtx.getPrefBoolean(PreferKey.optimizeRender, false) var recordLog = appCtx.getPrefBoolean(PreferKey.recordLog) + + // -- lyc 版本特性 -- + var adaptSpecialStyle = appCtx.getPrefBoolean(PreferKey.adaptSpecialStyle, true) + var useUnderline = appCtx.getPrefBoolean(PreferKey.useUnderline, false) + var webServiceAutoStart = appCtx.getPrefBoolean(PreferKey.webServiceAutoStart) override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { when (key) { + PreferKey.adaptSpecialStyle -> adaptSpecialStyle = + appCtx.getPrefBoolean(PreferKey.adaptSpecialStyle, true) + + PreferKey.useUnderline -> useUnderline = + appCtx.getPrefBoolean(PreferKey.useUnderline, false) + PreferKey.appTheme -> { AppTheme = appCtx.getPrefString(PreferKey.appTheme, "0") } @@ -973,16 +985,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefBoolean(PreferKey.sliderVibrator, value) } - val audioPreDownloadNum: Int - get() = appCtx.getPrefInt(PreferKey.audioPreDownloadNum, 10) - - val audioCacheCleanTimeOrgin: Int - get() = appCtx.getPrefInt(PreferKey.audioCacheCleanTime, 10) - - val audioCacheCleanTime: Long - get() { - val str = appCtx.getPrefInt(PreferKey.audioCacheCleanTime, 10) - return str * 60 * 1000L - } } + diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 4c3bd1acf..43185f933 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -87,6 +87,7 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), addPreferencesFromResource(R.xml.pref_config_theme) upPreferenceSummary(PreferKey.fontScale) + upPreferenceSummary(PreferKey.containerOpacity) findPreference(PreferKey.cBackground)?.let { it.onSaveColor = { color -> @@ -254,6 +255,20 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), recreateActivities() } + PreferKey.containerOpacity -> NumberPickerDialog(requireContext()) + .setTitle(getString(R.string.container_opacity)) + .setMaxValue(100) + .setMinValue(0) + .setValue(100) + .setCustomButton((R.string.btn_default_s)) { + putPrefInt(PreferKey.containerOpacity, 100) + ThemeSyncer.syncContainerOpacity() + } + .show { + putPrefInt(PreferKey.containerOpacity, it) + ThemeSyncer.syncContainerOpacity() + } + PreferKey.bgImage -> selectBgAction(false) PreferKey.bgImageN -> selectBgAction(true) "colorImage" -> selectBgAction(null) @@ -402,6 +417,10 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), when (preferenceKey) { //PreferKey.barElevation -> preference.summary = // getString(R.string.bar_elevation_s, value) + PreferKey.containerOpacity -> { + preference.summary = + getString(R.string.container_opacity_summary, AppConfig.containerOpacity) + } PreferKey.fontScale -> { val fontScale = AppContextWrapper.getFontScale(requireContext()) diff --git a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt index e38b19296..4ac35acfa 100644 --- a/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt +++ b/app/src/main/java/io/legado/app/ui/theme/AppTheme.kt @@ -20,13 +20,15 @@ fun AppTheme( val isPureBlack by ThemeState.isPureBlack.collectAsState() val hasImageBg by ThemeState.hasImageBg.collectAsState() val paletteStyle by ThemeState.paletteStyle.collectAsState() + val opacity by ThemeState.containerOpacity.collectAsState() val colorScheme = ThemeManager.getColorScheme( mode = appThemeMode, darkTheme = darkTheme, isAmoled = isPureBlack, isImageBg = hasImageBg, - paletteStyle = paletteStyle + paletteStyle = paletteStyle, + opacity = opacity ) MaterialExpressiveTheme( diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt index d35577e73..bc466ef41 100644 --- a/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeManager.kt @@ -47,7 +47,8 @@ object ThemeManager { isAmoled: Boolean, isImageBg: Boolean, paletteStyle: String?, - forceOpaque: Boolean = false + forceOpaque: Boolean = false, + opacity: Int = 100 ): ColorScheme { val context = LocalContext.current val style = resolvePaletteStyle(paletteStyle) @@ -83,16 +84,27 @@ object ThemeManager { ) } - return if (!forceOpaque && (isImageBg || actualMode == AppThemeMode.Transparent)) { - scheme.copy( + if (!forceOpaque && (isImageBg || actualMode == AppThemeMode.Transparent)) { + return scheme.copy( surface = Color.Transparent, background = Color.Transparent, surfaceContainerLow = Color.Transparent, - surfaceContainer = Color.Transparent + surfaceContainer = Color.Transparent, + ) + } + + val alpha = opacity / 100f + + return if (opacity < 100 && !forceOpaque) { + scheme.copy( + surfaceContainerLowest = scheme.surfaceContainerLowest.copy(alpha = alpha), + surfaceContainerLow = scheme.surfaceContainerLow.copy(alpha = alpha), + surfaceContainer = scheme.surfaceContainer.copy(alpha = alpha), + surfaceContainerHigh = scheme.surfaceContainerHigh.copy(alpha = alpha), + surfaceContainerHighest = scheme.surfaceContainerHighest.copy(alpha = alpha), ) } else { scheme } } - } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeState.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeState.kt index dd01485dc..ca2371b19 100644 --- a/app/src/main/java/io/legado/app/ui/theme/ThemeState.kt +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeState.kt @@ -30,6 +30,10 @@ object ThemeState { MutableStateFlow(AppConfig.enableBlur) val enableBlur: StateFlow = _enableBlur.asStateFlow() + private val _containerOpacity = + MutableStateFlow(AppConfig.containerOpacity) + val containerOpacity: StateFlow = _containerOpacity + fun updateThemeMode(newMode: AppThemeMode) { if (_themeMode.value != newMode) { _themeMode.value = newMode @@ -60,4 +64,10 @@ object ThemeState { } } + fun updateContainerOpacity(opacity: Int) { + if (_containerOpacity.value != opacity) { + _containerOpacity.value = opacity + } + } + } diff --git a/app/src/main/java/io/legado/app/ui/theme/ThemeSyncer.kt b/app/src/main/java/io/legado/app/ui/theme/ThemeSyncer.kt index 658a1e222..666847c45 100644 --- a/app/src/main/java/io/legado/app/ui/theme/ThemeSyncer.kt +++ b/app/src/main/java/io/legado/app/ui/theme/ThemeSyncer.kt @@ -13,6 +13,7 @@ object ThemeSyncer { syncImageBg() syncPaletteStyle() syncEnableBlur() + syncContainerOpacity() } fun syncThemeMode() { @@ -36,4 +37,9 @@ object ThemeSyncer { fun syncEnableBlur() { ThemeState.updateEnableBlur(AppConfig.enableBlur) } + + fun syncContainerOpacity() { + ThemeState.updateContainerOpacity(AppConfig.containerOpacity) + } + } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 450a97c47..41469116f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1370,6 +1370,11 @@ 调色板样式 这里的选项仅可以控制使用Compose重写的界面。 启用控件模糊 + 总是使用下划线表示强调文本 + 适配特殊样式 + 主题风格 + 容器背景不透明度 + %d 启动应用时打开Web服务 听书预加载数量 %d diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b7501e2a5..798039028 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1375,6 +1375,11 @@ 调色板样式 这里的选项仅可以控制使用Compose重写的界面。 启用控件模糊 + 总是使用下划线表示强调文本 + 适配特殊样式 + 主题风格 + 容器背景不透明度 + %d 启动应用时打开Web服务 听书预加载数量 %d diff --git a/app/src/main/res/xml/pref_config_theme.xml b/app/src/main/res/xml/pref_config_theme.xml index edc46db98..2f125cd60 100644 --- a/app/src/main/res/xml/pref_config_theme.xml +++ b/app/src/main/res/xml/pref_config_theme.xml @@ -96,8 +96,23 @@ app:entries="@array/paletteStyle" app:entryValues="@array/paletteStyle_value" /> + + + +