fix(m204): Java 组写盘成功后请 host 重发设置快照

`pages/settings/java/store.rs` 的 `save()` / `set_selected()` / `prefs_store::save()`
是页面自己的一次同步原子落盘(`SettingStore::set` 多个键 + 一次 `save()`),
不经过 `AppCommand::SetSetting` 的写盘分支;而 `CoreEvent::SettingsChanged`
全仓只有 `dispatch.rs` 的 `SetSetting` 分支与 `host/mod.rs::refresh_all` 两处发出。
于是三键写成功之后,`AppState::settings_groups` 里 java 组那几行会停在旧值,
直到下一次任何别的写入顺手带一份新快照回来。

修法用一条**动作键**(`dto::JAVA_REFRESH_ACTION` = `java.action.refresh`,
与 `download.action.detect_region` 同一族:不写盘、见到就返回 Ok):
写盘成功后派发它,`SetSetting` 分支照常重发快照。

不用 `RefreshAll`:那个除重发快照之外还会 `versions::spawn_list` 与
`start_update_check`——每点一次「保存内存」打两个网络请求(实测:一次真 host 出图
就在数据根里落了 `cache/meta/version_manifest_v2.json`),代价与动作不相称。

另外给 D30 §2.1 补一行自证身份的日志:`--screenshot` 且身份变化时打
`[shot] settings route=… group=… theme=…`(`view` 每帧都跑,所以只在变化时落一行),
免得再出现「拿外观页当下载组证据」那种图与结论对不上的事故。

守卫(`tests/java_refresh.rs`,4 条):
- 真 `CoreHost` + 临时数据根跑完整链:写盘 ⇒ 快照里 `java.extra_args` 真的变了;
- 被拒的保存不许请求刷新;
- 成功之后确实派发了那条动作键(键名写错就红);
- 「立即扫描」在 App 层真的接线(此前没有任何用例驱动 `Message::Scan`)。
This commit is contained in:
AskaEth committed 2026-11-09 12:09:01 +08:00
1 parent a48d055118
commit 92ab3d4ddf
8 files changed
+436 -1

No files matched your search

+8
View File
@@ -250,6 +250,14 @@ pub fn set(env: &HostEnv, key: &str, value: &str) -> Result<(), String> {
if key == super::engine::DETECT_REGION_ACTION {
return detect_region(env);
}
// M204:设置页 Java 组的「写回完成,重发快照」动作键。**不写盘**——页面那一侧已经把三键
// 一次原子写进 `launcher.json` 了(`pages/settings/java/store.rs::save`),这里只要返回
// `Ok(())`,`dispatch.rs` 的 `SetSetting` 分支就会重发 `CoreEvent::SettingsChanged`,
// `AppState::settings_groups` 里 java 组那几行随之变成刚写进去的真值。
// 键的来历与取舍见 `crate::dto::JAVA_REFRESH_ACTION` 的文档。
if key == crate::dto::JAVA_REFRESH_ACTION {
return Ok(());
}
let parsed = parse_value(key, value)?;
let mut store = env.store();
store