现象
用户反馈「验证码短信标记为已读」开关会间歇性自动关闭。
复现口述:
- 第一次进入设置页,打开该开关,显示保存 Toast,退出 App 与 LSPosed。
- 第二次进入时看起来仍为开启,再退出 App 与 LSPosed。
- 第三次进入显示为关闭。
影响
- 用户认为设置未持久化,开关状态不可信。
- 实际行为与 UI 预期不一致,属于回归问题。
日志证据
LSPosed 日志(play/XposedSmsCode/log/LSPosed_20260225_231537.zip)中出现:
PrefsReader: sharedPrefs boolean '%s' failed, default=%s
IllegalStateException: SharedPreferences in credential encrypted storage are not available until after user (id 0) is unlocked
该错误会导致部分时机读取回退默认值(false)。
代码根因
ComposeSettingsScreen 中存在进入页面即强制写回 false 的逻辑:
- 文件:
app/src/main/java/com/tianma/xsmscode/ui/home/ComposeSettingsScreen.kt
- 位置:
LaunchedEffect(Unit)
- 代码:
AppPreferencesDataStore.setBoolean(context, PrefConst.KEY_MARK_AS_READ, false)
AppPreferencesDataStore.syncToSharedPrefs(context)
这会在每次进入设置页时重置该开关,导致“前面看着开,后面又关”。
历史关联提交
- 引入强制关闭逻辑:
17f6274 (feat(settings): clarify notification wording and regroup toast option)
- 恢复开关可点但未移除重置逻辑:
3356265 (feat(ui): re-enable 'mark as read' switch in settings)
修复方案
- 删除进入设置页时强制
KEY_MARK_AS_READ=false 的 LaunchedEffect。
- 保持用户手动设置值,不再在页面初始化阶段覆写。
验证
- 本地编译通过:
./gradlew :app:compileDebugKotlin -q
- 预期:开关状态可持久化,不再出现“多次进入后自动关闭”。
现象
用户反馈「验证码短信标记为已读」开关会间歇性自动关闭。
复现口述:
影响
日志证据
LSPosed 日志(
play/XposedSmsCode/log/LSPosed_20260225_231537.zip)中出现:PrefsReader: sharedPrefs boolean '%s' failed, default=%sIllegalStateException: SharedPreferences in credential encrypted storage are not available until after user (id 0) is unlocked该错误会导致部分时机读取回退默认值(
false)。代码根因
ComposeSettingsScreen中存在进入页面即强制写回false的逻辑:app/src/main/java/com/tianma/xsmscode/ui/home/ComposeSettingsScreen.ktLaunchedEffect(Unit)AppPreferencesDataStore.setBoolean(context, PrefConst.KEY_MARK_AS_READ, false)AppPreferencesDataStore.syncToSharedPrefs(context)这会在每次进入设置页时重置该开关,导致“前面看着开,后面又关”。
历史关联提交
17f6274(feat(settings): clarify notification wording and regroup toast option)3356265(feat(ui): re-enable 'mark as read' switch in settings)修复方案
KEY_MARK_AS_READ=false的LaunchedEffect。验证
./gradlew :app:compileDebugKotlin -q