Files
MeowOS-For-R3P2/NOTIFICATION_SYSTEM.md
T

75 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MeowOS 通知系统设计(M2 通知存储 + 分发,阶段 B/D 前置)
> 状态:设计稿定稿讨论中(2026-08-29,用户已给定多数决策)。按 FREWORKS §4/附C + 用户约定,遵循 freedesktop.org 通知规范。**实施前仅剩"应用配额"细节待深入讨论**(见 §7)。
## 1. 定位
- MeowOS 通知中心的后端(存储+分发),是阶段 B 通知中心 UI + 阶段 D(M2 通知存储)的前提。
- 生产者 = MeowAPP(原生 IPC)+ **系统事件(系统抽象为 App)** + 外部桌面 app(D-Bus 桥)。
## 2. 通知标准(freedesktop.org Desktop Notifications,用户约定)
遵循 `org.freedesktop.Notifications`(D-Bus 接口),字段严格按标准:
- **app_name**(来源应用名)
- **replaces_id**(更新/替换通知 id;0=新建)
- **app_icon**(图标,指 icon name 或 path)
- **summary**(标题,单行)
- **body**(正文,可多行)
- **actions[]**(按钮,可选;动作回调)
- **hints{}**(提示,含 `x-canonical-*`/progress/图片数据等;我们用 `hints` 传 target Activity、进度 percent 等)
- **expire_timeout**(超时 ms;-1=常驻/ONGOING,0=不自动过期)
- 返回新版通知 **id**。
**MeowOS 扩展**:`hints` 内加 MeowOS 专有键(如 `meow.target_activity`、`meow.progress`)用于通知中心点击跳转/进度条显示。媒体通知走 MPRIS(`org.mpris.MediaPlayer2`,另行)。
## 3. 双接口(FREWORKS 附C,已定)
1. **原生 IPC**:MeowAPP 经 AF_UNIX socket 发 `MSG_NOTIFY`(FREWORKS §4 通定协议 0x0020)+ `MSG_NOTIFY_ACK`(0x0021)/`DISMISS`(0x0022)/`LIST`(0x0023)。
2. **D-Bus 桥** `meow_notify_dbus`(独立小守护,链 libdbus/GDBus,系统总线注册 `org.freedesktop.Notifications`):收到标准 `Notify()` → 经 MeowOS IPC 后端入通知存储;后端关闭/动作 → 回发信号。libdbus-1/libdbus-glib/libgio 已确认可用。
## 4. 通知数据结构(存内存 + 转储)
每通知字段(对齐 freedesktop + MeowOS):
```
id(uint32) / app_name / app_icon / summary / body / actions[] / hints{}
expire_timeout / created_ms / dismissed / ongoing(bool)
target_activity(可选, 来自 hints) / progress(可选 int)
```
统一从 IPC/D-Bus 两路解析入该结构。
## 5. 存储分层(用户已定 2026-08-29)
- **关键配置优先板载**:设置类(notify.* 配额等)存板载 `/usr/data/meow/settings.conf`(B2a),确保**无卡时系统正常工作**。
- **实时通知 → 本地内存**(板载,动态分配/ring)。
- **超时/转储 → TF 卡** `MeowOS/notifications/`(**系统约定:系统文件统一放 MeowOS/ 下**,非 MeowData/——MeowData 是应用专属数据根)(转储区,**appended 日志行 CSV**,见 §8)。
- **无 TF 卡可运行**(本地内存态即可,不依赖卡;TF 卡在时才转储)。转储/日志类是可降级数据(无卡用 /tmp 回退),配置类永远板载。
- **本地数据清理策略**:
- 关机/重启前 → 清理本地内存通知数据(正常关机路径)。
- 异常关机(重启后)→ 开机时识别并清理本地残留。
- **TF 卡转储区**:保留**最新 10MB**(ring/截断),**不被电源事件清理**(持久留存)。
## 6. 通知生命周期(FREWORKS §4 已定,作参考)
- 内存态:每应用**配额**(待讨论 §7),满丢最旧;ttl 过期(1s 粒度);ONGOING 常驻(服务死随清)。
- 转储:超时/入 TF 卡区。
## 7. 【已定】应用配额(用户拍板,2026-08-29)
- **每个 App 最多申请 4 个通知类型(category)**。
- **每个类型活跃(未过期)通知上限 4 条**。
- **媒体通知除外**:单个 App 只允许保留 1 个媒体通知;允许多个媒体 App 同时(多应用同时播放场景),UI/逻辑后期处理好。
- 数据类型:`notify.category`(App 声明用哪些类型,≤4) / `notify.category_quota`(每类型 4,默认)。
- 系统事件:系统也抽象为 App(`app_id=system`),同样走配额(系统通知也占"系统"App 的类型/条数配额)。
- 配额只管**内存活跃态**;转储到 TF 的历史不受配额限制(只受 10MB 总量)。
## 8. 转储规则(用户拍板,2026-08-29)
- **通知创建 10 秒后自动转储到 TF 卡**(无论是否过期/被清)——通知中心显示"最近 10 秒内活跃" + TF 归档历史。
- **正常电源事件(关机/重启)触发清除板载通知数据之前**:先转储所有未上卡的通知,再清除板载。
- **异常关机**:开机时清理板载残留通知数据。
- TF 卡转储区 `MeowOS/notifications/`:保留**最新 10MB**(ring/截断),**不被电源事件清理**(持久留存)。
- **转储格式(定案 #6,M2.5x)**:`MeowOS/notifications/` 写为 **appended 日志行**(每条通知一行,CSV 风格:`id,app_id,分类,标题,时间,…`),**按总大小滚动截断**(保留最新 **10MB**)。与既有「10s 转储」衔接:创建 10s 后即按此格式追加一行 `[源:用户 2026-08-30]`。
- **启动时清板载 + 清内存通知表**:开机(含异常关机后)清理板载残留通知数据,并**清空内存通知表**(在既有「异常关机:开机时清理板载残留」基础上**补充内存表一并清**);正常关机/重启前先转储未上卡通知再清板载(沿用既有规则)`[源:用户 2026-08-30]`。
- **无 TF 卡**:系统可运行(内存态通知即可),不依赖卡。
## 9. 通知中心 UI(阶段 B)
- 状态栏下滑打开通知中心(用户已定),列表显示通知(app 图标 + summary + body + target Activity),点击按路由表解析跳转(M3 导航栈),下拉关闭/清除。**此部分依赖 M2 存储 + M3,后置。**
## 10. 分步实施建议
1. **M2a 通知存储 + 原生 IPC**:按上面的配额(category 级)+ TTL 10s 转储钩子 + 系统事件源(系统作 App)。→ 可先落地。
2. **M2b D-Bus 桥 meow_notify_dbus**(org.freedesktop.Notifications 桥接)。
3. **M2c 转储 TF 卡 + 10MB 保留 + 关机前转储/开机清理**。
4. M5 通知中心 UI(阶段 B)+ media 通知(MPRIS)。