* 初始版本 * refactor(reader): MVI architecture + menu settings overhaul MVI/UDF Architecture: - Add ReadBookContract: UiState, Intent, Effect, Sheet, Dialog, ConfigUpdate - Refactor ReadBookViewModel with onIntent() entry point - Add ReadBookScreen/ReadBookRouteScreen stateless composables - Add ReadBookColorTheme for reader-specific theme override - Add ReadConfigContract for read config screen MVI ReadStyleSheet Decomposition: - Split ReadStyleSheet into SystemMenuPage, TextTitleSheet, HeaderFooterPage, TitleBarIconSheet, GlobalThemePage - Each page owns its tab state, color picker, and config mutations Data Layer (DataStore-backed Repositories): - Add ReadSettingsRepository with ReadPreferences flow - Add MangaSettingsRepository with MangaPreferences flow - Add ReadAloudSettingsRepository for TTS settings - Add ReadStyleRepository (file I/O for read style configs) - Add ReadBookStyleConfigRepository (repository boundary) - Add ReadStyleResolver for background/theme resolution - Remove legacy ReadTipConfig (merged into ReadBookConfig) - Register all new repositories in Koin appModule Menu Settings: - Add unified border settings (width, color, colorNight) for both top and bottom bars with drawWithCache + drawPath - Add ColorModePill with light/dark toggle and '+' icon for no-color state in TinySettingItems - Add TinyClearColorModeSettingItem for border color config - Add menu color customization (bg, accent, container) with day/night variants and seed color mode - Add bottom bar layout settings (corner radius, margins) - Add custom icon support for menu buttons and title bar icons - Add title bar icon position setting Config Pipeline: - Consolidate all ReadBookConfig mutations into typed ConfigUpdate sealed interface with legacy UP_CONFIG code mapping - Add resolvedMenuBorderColor (auto day/night switching) - Add 20 new PreferKey constants for menu settings - Update manga config dialogs to use MangaSettingsRepository - Update ReadConfigViewModel with DataStore flow observation * feat(reader): add liquid glass menu bars and floating bottom bar - Integrate com.kyant.backdrop 2.0.0 for liquid glass blur/vibrancy effects on reading menu top bar and bottom bar (Android 13+) - Add floating bottom bar toggle replacing manual margin sliders - Extract ReadMenuConfig data class for proper MVI state management of all menu configuration properties - Enable edge-to-edge in BaseComposeActivity, remove manual navigation bar color management across base classes and controller - Fix fullScreen() to use setDecorFitsSystemWindows(false) * Refactor series button rendering * 实现液态玻璃 * 优化液态玻璃 * @ fix(reader): fix MVI behavior issues and improve sheet lifecycle Behavior fixes: - Fix AddSourceAsNewBook empty implementation — wire intent to addToBookshelf - Fix content edit loading stuck on null chapter/content — use onFinally - Fix cannot save empty content — remove isEmpty guard, use title as loaded proxy - Fix bookmark not opening — use openReadMenuRoute instead of dead activeSheet path - Fix chapter source sheet persists — animate dismiss via show param before removal - Fix chapter source reopens to TOC — reset showToc in initData - Fix SaveChapterContent saves to wrong chapter — carry chapterIndex in intent - Fix chapter source search runs after dismiss — cancel searchJob in dispose - Fix "go to background" button in ReadAloud — use CloseReadBook intent Architecture improvements: - ReadMenuConfig uses ImmutableMap for Compose stability - Fix stale remember in ReadBookMenuBar title bar icons - Move icon picker file IO from composable to ViewModel - Route launcher results through MVI intents instead of direct calls - Fix ChangeChapterSource effect collector key — use viewModel not Unit - Make ReadAloudConfigSheet UDF-compliant — stateless with intents - Remove main menu buttons from AutoRead and ReadAloud sheets @ * @ refactor(reader): use Material Icons and ConfirmDismissButtonsRow - TitleBarIconSheet: replace drawable resources with Icons library, use ConfirmDismissButtonsRow for save/cancel buttons - SystemMenuPage MenuCustomIconSheet: same icon and button treatment - ReadBookMenuBar: update ToolButtonDef/TitleBarIconDef to use ImageVector instead of drawable resource Int - Use AutoMirrored variants for List and HelpOutline icons @ * feat: 优化液态玻璃 * feat: 优化液态玻璃 * fix(AppLogSheet): 从本地文件读取日志,替代内存列表 * @ feat(reader): highlight rules, theme refactor & MVI improvements - Add HighlightRule entity, DAO, and config/edit sheets - Add ThemeConfigStore, remove OldThemeConfig - Refactor ReadBookContract/ViewModel/Screen for deeper MVI - Add CharStyle for text rendering, refactor TextLine/TextChapterLayout - Add SectionTitle, TinySettingItems UI components - Remove legacy XML layouts (regex_color_config) - Update database schema to v90 - Various sheet and widget refinements @ * @ fix: address PR review feedback - ReadStyleRepository: fix copy-paste bug (bgStrNight→bgStr) + add bgTypeNight import - BgImageSpan: replace Bitmap.createScaledBitmap with BitmapShader matrix scaling - HighlightRule: use UUID.randomUUID() instead of System.currentTimeMillis() - ChangeSourceSearchUseCase: guard against empty chapters list @ * @fix: remove residual regexColorRules references after merge - ChangeSourceSearchUseCase: adapt filter lambda to new 3-param signature - TextChapterLayout: remove globalRegexResult field, preApplyRegexColorRules call, and the entire regexColorRules fullTextBuilder block @ * fix: 图标间距
268 lines
14 KiB
TOML
268 lines
14 KiB
TOML
[versions]
|
||
|
||
accompanistWebview = "0.36.0"
|
||
adaptive = "1.3.0-beta02"
|
||
adaptiveLayout = "1.3.0-beta02"
|
||
adaptiveNavigation = "1.3.0-beta02"
|
||
animation = "1.11.2"
|
||
biometric = "1.4.0-alpha07"
|
||
coilCompose = "2.7.0"
|
||
composeBom = "2026.05.01"
|
||
constraintlayoutCompose = "1.1.1"
|
||
coreSplashscreen = "1.2.0"
|
||
datastorePreferences = "1.2.1"
|
||
foundation = "1.11.2"
|
||
kotlin = "2.3.21"
|
||
kotlinxSerialization = "1.11.0"
|
||
kotlinxCoroutinesAndroid = "1.11.0"
|
||
kotlinxSerializationJson = "1.11.0"
|
||
kotlinxCollectionsImmutable = "0.4.0"
|
||
ksp = "2.3.6"
|
||
agp = "9.2.1"
|
||
appcompat = "1.7.1"
|
||
colorpicker = "1.1.0"
|
||
colorpicker-compose = "1.1.4"
|
||
commonsText = "1.15.0"
|
||
constraintlayout = "2.2.1"
|
||
core = "1.18.0"
|
||
firebaseBom = "34.6.0"
|
||
flexbox = "3.0.0"
|
||
fragment = "1.8.9"
|
||
|
||
#不要更新版本
|
||
hutool = "5.8.22"
|
||
|
||
libarchive = "1.1.6"
|
||
lifecycle = "2.10.0"
|
||
glide = "5.0.7"
|
||
gson = "2.14.0"
|
||
jsonPath = "3.0.0"
|
||
ktor = "3.5.0"
|
||
# issue #3811,不要更新版本,新版引入了一个破坏性变更(详见https://github.com/jhy/jsoup/pull/2017)
|
||
# 若要升级请确保相关代码不会受此变更影响(如AnalyzeByJSoup.kt、JsoupXpath库等)
|
||
jsoup = "1.16.2"
|
||
jsoupxpath = "2.5.3"
|
||
coroutines = "1.10.2"
|
||
lifecycleViewmodelCompose = "2.10.0"
|
||
liveeventbus = "1.8.14"
|
||
navigation3 = "1.1.2"
|
||
markdownRenderer = "0.40.2"
|
||
markwon = "4.6.2"
|
||
material = "1.14.0"
|
||
material3 = "1.5.0-alpha20"
|
||
material3IconsExtended = "1.7.8"
|
||
materialKolor = "4.1.1"
|
||
media = "1.8.0"
|
||
media3 = "1.8.0"
|
||
navigationCompose = "2.9.8"
|
||
okhttp = "5.3.2"
|
||
palette = "1.0.0"
|
||
preference = "1.2.1"
|
||
protobufJavalite = "4.26.1"
|
||
quickChineseTransfer = "0.2.17"
|
||
room = "2.8.4"
|
||
splitties = "3.0.0"
|
||
rhino = "1.8.1"
|
||
desugar = "2.1.5"
|
||
|
||
activity = "1.13.0"
|
||
#kotlinxSerialization = "1.8.0"
|
||
startupRuntime = "1.2.0"
|
||
swiperefreshlayout = "1.2.0"
|
||
#noinspection GradleDependency
|
||
recyclerview = "1.4.0"
|
||
#noinspection GradleDependency
|
||
uiViewbinding = "1.9.4"
|
||
viewpager2 = "1.1.0"
|
||
webkit = "1.16.0"
|
||
collection = "1.6.0"
|
||
|
||
zxingLite = "3.4.1"
|
||
|
||
koin-bom = "4.2.1"
|
||
biometricKtx = "1.1.0"
|
||
|
||
reorderable = "3.1.0"
|
||
haze = "1.7.2"
|
||
timber = "5.0.1"
|
||
miuix = "0.9.1"
|
||
backdrop = "2.0.0"
|
||
capsule = "2.1.3"
|
||
lyricViewx = "1.3.2"
|
||
uiautomator = "2.3.0"
|
||
benchmarkMacroJunit4 = "1.4.1"
|
||
baselineprofile = "1.4.1"
|
||
profileinstaller = "1.4.1"
|
||
[libraries]
|
||
|
||
accompanist-webview = { module = "com.google.accompanist:accompanist-webview", version.ref = "accompanistWebview" }
|
||
activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" }
|
||
activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activity" }
|
||
|
||
androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.10.0" }
|
||
androidx-collection = { module = "androidx.collection:collection", version.ref = "collection" }
|
||
androidx-compose-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" }
|
||
androidx-compose-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" }
|
||
androidx-compose-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptiveNavigation" }
|
||
androidx-compose-animation = { module = "androidx.compose.animation:animation", version.ref = "animation" }
|
||
androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
|
||
androidx-compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "foundation" }
|
||
androidx-compose-material = { module = "androidx.compose.material:material" }
|
||
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "navigation3" }
|
||
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "navigation3" }
|
||
compose-materialIcons = { group = "androidx.compose.material", name = "material-icons-extended", version.ref = "material3IconsExtended" }
|
||
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" }
|
||
androidx-compose-ui = { module = "androidx.compose.ui:ui" }
|
||
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
|
||
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
|
||
androidx-compose-ui-viewbinding = { module = "androidx.compose.ui:ui-viewbinding", version.ref = "uiViewbinding" }
|
||
androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" }
|
||
androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" }
|
||
androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" }
|
||
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose" }
|
||
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" }
|
||
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
|
||
androidx-palette = { module = "androidx.palette:palette", version.ref = "palette" }
|
||
androidx-startup-runtime = { module = "androidx.startup:startup-runtime", version.ref = "startupRuntime" }
|
||
appcompat-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
|
||
androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
|
||
|
||
haze-core = { module = "dev.chrisbanes.haze:haze", version.ref = "haze" }
|
||
haze-materials = { module = "dev.chrisbanes.haze:haze-materials", version.ref = "haze" }
|
||
koin-bom = { module = "io.insert-koin:koin-bom", version.ref = "koin-bom" }
|
||
koin-core = { module = "io.insert-koin:koin-core" }
|
||
koin-android = { group = "io.insert-koin", name = "koin-android" }
|
||
koin-compose = { group = "io.insert-koin", name = "koin-androidx-compose" }
|
||
koin-compose-viewmodel = { group = "io.insert-koin", name = "koin-compose-viewmodel" }
|
||
|
||
coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coilCompose" }
|
||
coil-gif = { module = "io.coil-kt:coil-gif", version.ref = "coilCompose" }
|
||
coil-svg = { module = "io.coil-kt:coil-svg", version.ref = "coilCompose" }
|
||
core-ktx = { module = "androidx.core:core-ktx", version.ref = "core" }
|
||
|
||
androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version = "3.7.0" }
|
||
|
||
firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" }
|
||
firebase-analytics = { module = "com.google.firebase:firebase-analytics" }
|
||
firebase-perf = { module = "com.google.firebase:firebase-perf" }
|
||
|
||
|
||
fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment" }
|
||
|
||
androidx-junit = { module = "androidx.test.ext:junit", version = "1.3.0" }
|
||
|
||
hutool-crypto = { module = "cn.hutool:hutool-crypto", version.ref = "hutool" }
|
||
|
||
kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" }
|
||
libarchive = { module = "me.zhanghai.android.libarchive:library", version.ref = "libarchive" }
|
||
lifecycle-common-java8 = { module = "androidx.lifecycle:lifecycle-common-java8", version.ref = "lifecycle" }
|
||
lifecycle-service = { module = "androidx.lifecycle:lifecycle-service", version.ref = "lifecycle" }
|
||
|
||
markdown-renderer-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "markdownRenderer" }
|
||
material-kolor = { module = "com.materialkolor:material-kolor", version.ref = "materialKolor" }
|
||
media-media = { module = "androidx.media:media", version.ref = "media" }
|
||
media3-datasource-okhttp = { module = "androidx.media3:media3-datasource-okhttp", version.ref = "media3" }
|
||
media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" }
|
||
|
||
markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" }
|
||
markwon-image-glide = { module = "io.noties.markwon:image-glide", version.ref = "markwon" }
|
||
markwon-ext-tables = { module = "io.noties.markwon:ext-tables", version.ref = "markwon" }
|
||
markwon-html = { module = "io.noties.markwon:html", version.ref = "markwon" }
|
||
|
||
ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" }
|
||
ktor-server-cio = { module = "io.ktor:ktor-server-cio", version.ref = "ktor" }
|
||
ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negotiation", version.ref = "ktor" }
|
||
ktor-serialization-gson = { module = "io.ktor:ktor-serialization-gson", version.ref = "ktor" }
|
||
ktor-server-cors = { module = "io.ktor:ktor-server-cors", version.ref = "ktor" }
|
||
ktor-server-websockets = { module = "io.ktor:ktor-server-websockets", version.ref = "ktor" }
|
||
|
||
preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preference" }
|
||
|
||
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
|
||
protobuf-javalite = { module = "com.google.protobuf:protobuf-javalite", version.ref = "protobufJavalite" }
|
||
|
||
quick-chinese-transfer-core = { module = "com.github.liuyueyi.quick-chinese-transfer:quick-transfer-core", version.ref = "quickChineseTransfer" }
|
||
|
||
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
|
||
room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
|
||
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
|
||
room-testing = { module = "androidx.room:room-testing", version.ref = "room" }
|
||
|
||
glide-glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
|
||
glide-okhttp= { module = "com.github.bumptech.glide:okhttp3-integration", version.ref ="glide" }
|
||
glide-recyclerview={module="com.github.bumptech.glide:recyclerview-integration",version.ref="glide"}
|
||
glide-ksp = { module = "com.github.bumptech.glide:ksp", version.ref = "glide" }
|
||
glide-svg = { module = "com.github.qoqa:glide-svg", version = "4.0.2" }
|
||
androidsvg = { module = "com.caverock:androidsvg-aar", version = "1.4" }
|
||
|
||
splitties-appctx = { module = "com.louiscad.splitties:splitties-appctx", version.ref = "splitties" }
|
||
splitties-systemservices = { module = "com.louiscad.splitties:splitties-systemservices", version.ref = "splitties" }
|
||
splitties-views = { module = "com.louiscad.splitties:splitties-views", version.ref = "splitties" }
|
||
|
||
androidx-runner = { module = "androidx.test:runner", version = "1.7.0" }
|
||
androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" }
|
||
androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
|
||
androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" }
|
||
androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" }
|
||
colorpicker = { module = "com.jaredrummler:colorpicker", version.ref = "colorpicker" }
|
||
colorpicker-compose = { module = "com.github.skydoves:colorpicker-compose", version.ref = "colorpicker-compose" }
|
||
commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" }
|
||
desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version.ref = "desugar" }
|
||
|
||
flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" }
|
||
gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
|
||
json-path = { module = "com.jayway.jsonpath:json-path", version.ref = "jsonPath" }
|
||
jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" }
|
||
jsoupxpath = { module = "cn.wanghaomiao:JsoupXpath", version.ref = "jsoupxpath" }
|
||
junit = { module = "junit:junit", version = "4.13.2" }
|
||
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
|
||
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
|
||
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
|
||
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
|
||
|
||
liveeventbus = { module = "com.github.michaellee123:LiveEventBus", version.ref = "liveeventbus" }
|
||
material = { module = "com.google.android.material:material", version.ref = "material" }
|
||
|
||
mozilla-rhino = { module = "org.mozilla:rhino", version.ref = "rhino" }
|
||
zxing-lite = { module = "com.github.jenly1314:zxing-lite", version.ref = "zxingLite" }
|
||
|
||
reorderable = { module = "sh.calvin.reorderable:reorderable", version.ref = "reorderable" }
|
||
|
||
# log
|
||
timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" }
|
||
|
||
# miuix
|
||
miuix-core = { module = "top.yukonga.miuix.kmp:miuix-core", version.ref = "miuix" }
|
||
miuix-blur-android = { module = "top.yukonga.miuix.kmp:miuix-blur-android", version.ref = "miuix" }
|
||
miuix-icons-android = { module = "top.yukonga.miuix.kmp:miuix-icons-android", version.ref = "miuix" }
|
||
miuix-preference-android = { module = "top.yukonga.miuix.kmp:miuix-preference-android", version.ref = "miuix" }
|
||
miuix-ui-android = { module = "top.yukonga.miuix.kmp:miuix-ui-android", version.ref = "miuix" }
|
||
|
||
capsule = { module = "io.github.kyant0:capsule", version.ref = "capsule" }
|
||
backdrop = { module = "io.github.kyant0:backdrop", version.ref = "backdrop" }
|
||
lyricViewx = { module = "com.github.Moriafly:LyricViewX", version.ref = "lyricViewx" }
|
||
androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" }
|
||
androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" }
|
||
androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" }
|
||
|
||
[bundles]
|
||
coroutines = ["kotlinx-coroutines-core", "kotlinx-coroutines-android"]
|
||
androidTest = ["androidx-espresso-core", "androidx-junit", "androidx-runner"]
|
||
|
||
[plugins]
|
||
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||
android-library = { id = "com.android.library", version.ref = "agp" }
|
||
android-test = { id = "com.android.test", version.ref = "agp" }
|
||
|
||
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
|
||
|
||
google-services = { id = "com.google.gms.google-services", version = "4.4.4" }
|
||
|
||
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
|
||
room = { id = "androidx.room", version.ref = "room" }
|
||
|
||
download = { id = "de.undercouch.download", version = "5.7.0" }
|
||
baselineprofile = { id = "androidx.baselineprofile", version.ref = "baselineprofile" }
|