Skip to content

fix: 'mark as read' switch may auto turn off after reopening settings #122

@magisk317

Description

@magisk317

现象

用户反馈「验证码短信标记为已读」开关会间歇性自动关闭。

复现口述:

  1. 第一次进入设置页,打开该开关,显示保存 Toast,退出 App 与 LSPosed。
  2. 第二次进入时看起来仍为开启,再退出 App 与 LSPosed。
  3. 第三次进入显示为关闭。

影响

  • 用户认为设置未持久化,开关状态不可信。
  • 实际行为与 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=falseLaunchedEffect
  • 保持用户手动设置值,不再在页面初始化阶段覆写。

验证

  • 本地编译通过:./gradlew :app:compileDebugKotlin -q
  • 预期:开关状态可持久化,不再出现“多次进入后自动关闭”。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions