## 1. Spec And Context Validation - [x] 1.1 阅读 Python 参考实现,确认签名、请求体、URL、超时和成功判定 - [x] 1.2 阅读当前 Android 工程结构,确认 Java、Gradle、权限和短信接收链路现状 - [x] 1.3 生成飞书 webhook 推送 OpenSpec proposal、design、tasks 和 capability spec - [x] 1.4 用 `npx openspec validate add-feishu-webhook-push` 校验规格结构 - [x] 1.5 后续提交或 push 前检查 diff,避免引入非预期 EOF newline 变化 ## 2. Dependencies And Manifest - [x] 2.1 在 `app/build.gradle` 新增 OkHttp 依赖 - [x] 2.2 在 `AndroidManifest.xml` 新增 `android.permission.INTERNET` - [x] 2.3 不引入 Retrofit、RxJava、协程或 WorkManager ## 3. Signing And Request Model - [x] 3.1 新增签名方法,使用 `timestamp + "\n" + secret` 作为 HMAC key,空消息体,HmacSHA256,Base64 NO_WRAP - [x] 3.2 新增请求体构造方法,输出与 Python 参考实现一致的 interactive markdown JSON - [x] 3.3 新增 webhook URL 拼接方法,处理空 id 和首尾空格 - [x] 3.4 避免在日志中输出 secret、sign 和完整 webhook URL ## 4. Network Client - [x] 4.1 新增 `FeishuWebhookClient` - [x] 4.2 使用 OkHttp POST JSON - [x] 4.3 设置 10 秒请求超时 - [x] 4.4 HTTP 200 且响应 JSON `code == 0` 时返回成功 - [x] 4.5 分类返回配置缺失、签名失败、网络异常、超时、HTTP 错误、JSON 解析失败和飞书业务错误 - [x] 4.6 网络请求只在后台线程执行 ## 5. Config And State - [x] 5.1 新增 `FeishuWebhookConfigStore`,通过 `/sdcard/Android/data/{applicationId}/config/feishu.json` 保存 enabled、webhook id 和 secret - [x] 5.2 新增最近推送状态,包含时间、成功状态、错误类型和错误摘要 - [x] 5.3 UI 展示 secret 时使用掩码 - [x] 5.4 默认推送完整短信原文,便于远端调试 - [x] 5.5 `feishu.json` 不存在时生成默认模板 `def_config_feishu.json` ## 6. UI And Manual Test - [x] 6.1 在 `MainActivity` 增加飞书推送配置区域 - [x] 6.2 增加 webhook id 和 secret 输入入口 - [x] 6.3 增加启用/停用远端推送开关 - [x] 6.4 增加“测试推送”按钮,发送固定 markdown 测试内容 - [x] 6.5 展示最近一次推送结果,并与短信接收结果分开 ## 7. SMS Flow Integration - [x] 7.1 短信原文读取成功后构造默认 markdown 摘要 - [x] 7.2 `SmsReceiver` 保存本地结果后触发异步推送 - [x] 7.3 推送失败不影响本地短信捕获、解析和 UI 刷新 - [x] 7.4 默认推送内容包含短信原文、来源、发送方掩码和时间 ## 8. Tests - [x] 8.1 增加签名单元测试,固定输入输出对齐 Python 实现 - [x] 8.2 增加请求体构造测试 - [x] 8.3 增加响应解析测试,覆盖成功、业务错误和非法 JSON - [x] 8.4 增加配置缺失测试 - [x] 8.5 不要求本轮编译;代码完成后通知用户 ## 9. Delivery Criteria - [x] 9.1 OpenSpec validate 通过 - [x] 9.2 相关上下文逻辑分析通过 - [x] 9.3 相关测试通过 - [x] 9.4 代码实现完成后通知用户,不强制编译