【贡献PR】CalDAV删除与同步核心修复、多日聚合日程与体验重构优化
#5https://github.com/cwxsss/SyncCalendar/tree/upstream-contribution
📌 变更概述
本项目针对生产环境中用户高频反馈的「CalDAV删除失败/复活」、「删除后系统日历与桌面卡片不同步」、「日程详情弹层重叠露底穿帮」以及「缺乏多日聚合概览」等关键问题进行了深度排查与系统性重构。
所有修改均基于官方最新 upstream/master(包含卸载清理增强 commit 199b6c1),已严格剥离任何非通用内容,保持官方默认命名与规范,可直接无冲突合并。
🛠️ 详细改动清单
1. CalDAV 同步引擎与删除逻辑深度修复(高危)
修复 CalDAV 资源删除 404:在解析 REPORT 时保存远端真实文件名(remotePath),彻底解决以往向服务器发 DELETE 请求时因硬编码 encodeURIComponent(uid) + '.ics' 找不到文件导致 404、服务器日程无法删除的严重缺陷;补齐 origin 拼接逻辑。
重复日程整系列与单次排除:
修复单次排除(EXDATE)时展开为 0 条错误回退至主事件的问题;
增加对齐吸附(Snap),确保生成的 EXDATE 绝对匹配服务器真实发生时刻;
增加 EventDb.markDeletedByUid / EventDb.getMasterByUid,确保重复日程选择「删除全部」时能向服务器发送完整的 DELETE 资源请求并从本地彻底物理清库。
防止本地修改被远端旧数据覆盖(防复活):
优化增量同步 applyRemote,对本地处于 dirty 待推送及 deleted 待删除状态的日程增加白名单保护,防止远端尚未同步完的旧数据将其当作新日程重新 insert 导致死灰复燃。
DELETE 404/410 物理清库:
向服务器发 DELETE 请求若返回 404/410,判定服务端已无此日程,直接对本地数据库执行物理 purge 清除。
2. 系统日历镜像与桌面服务卡片联动
系统日历镜像联动即时清理:用户开启「镜像到系统日历」时,在应用内(无论详情弹窗还是编辑页)删除日程后,立即自动触发 SystemCalendarMirror.syncNow 比对并清除系统日历对应事件。
桌面服务卡片即时刷新:删除日程后联动刷新所有 2x4、4x4、6x4 桌面服务卡片,确保桌面小组件同步清空已删日程。
桌面服务卡片支持未来 3/7 天日程展示,并支持点击直达对应日期与时间轴。
3. 主界面视图与交互体验重构
顶部【今天 / 三天 / 七天】三段式胶囊选择器与多日聚合展示:
顶部升级为三段式胶囊切换器,自适应浅色/深色主题;
毫秒级从内存聚合展示未来 3 天或未来 7 天日程,去重并按发生时间先后排序;
智能显示范围跨度标题(如「未来3天 (10月31日 - 11月2日)」)及条数,卡片时间前智能拼接日期前缀防混淆;点击月历具体单日格子可平滑退回单日查看。
重构日程详情删除交互(彻底消除弹层重叠露底穿帮):
废除原生 ActionSheet,重构为半模态窗原地多态切换架构(detail / scope / confirm);
提供高品质圆角卡片选择「仅删除这一次 / 删除此次及以后 / 删除全部」,彻底消除多层弹窗冲突与露底穿帮。
月视图滑动防闪跳与小红点稳定性:
由 Swiper 动画结束回调接管回正与缓存填充,彻底消除翻页时的闪跳与日期突变;
修复日历格子中小红点偶发丢失问题,引入渲染感知 key 并扩充跨月前后数据缓存。
新增全月展开大日历视图模式。
4. 性能提升与提审合规
增加 isLoadingAll 数据加载防重锁,建立按天哈希索引表(𝑂(1)O(1) 查找),大幅减少无谓计算和界面卡顿;
移除受限的 READ_WHOLE_CALENDAR 权限声明,确保符合华为 AGC 应用市场审核规范。
📌 变更概述
本项目针对生产环境中用户高频反馈的「CalDAV删除失败/复活」、「删除后系统日历与桌面卡片不同步」、「日程详情弹层重叠露底穿帮」以及「缺乏多日聚合概览」等关键问题进行了深度排查与系统性重构。
所有修改均基于官方最新 upstream/master(包含卸载清理增强 commit 199b6c1),已严格剥离任何非通用内容,保持官方默认命名与规范,可直接无冲突合并。
🛠️ 详细改动清单
1. CalDAV 同步引擎与删除逻辑深度修复(高危)
修复 CalDAV 资源删除 404:在解析 REPORT 时保存远端真实文件名(remotePath),彻底解决以往向服务器发 DELETE 请求时因硬编码 encodeURIComponent(uid) + '.ics' 找不到文件导致 404、服务器日程无法删除的严重缺陷;补齐 origin 拼接逻辑。
重复日程整系列与单次排除:
修复单次排除(EXDATE)时展开为 0 条错误回退至主事件的问题;
增加对齐吸附(Snap),确保生成的 EXDATE 绝对匹配服务器真实发生时刻;
增加 EventDb.markDeletedByUid / EventDb.getMasterByUid,确保重复日程选择「删除全部」时能向服务器发送完整的 DELETE 资源请求并从本地彻底物理清库。
防止本地修改被远端旧数据覆盖(防复活):
优化增量同步 applyRemote,对本地处于 dirty 待推送及 deleted 待删除状态的日程增加白名单保护,防止远端尚未同步完的旧数据将其当作新日程重新 insert 导致死灰复燃。
DELETE 404/410 物理清库:
向服务器发 DELETE 请求若返回 404/410,判定服务端已无此日程,直接对本地数据库执行物理 purge 清除。
2. 系统日历镜像与桌面服务卡片联动
系统日历镜像联动即时清理:用户开启「镜像到系统日历」时,在应用内(无论详情弹窗还是编辑页)删除日程后,立即自动触发 SystemCalendarMirror.syncNow 比对并清除系统日历对应事件。
桌面服务卡片即时刷新:删除日程后联动刷新所有 2x4、4x4、6x4 桌面服务卡片,确保桌面小组件同步清空已删日程。
桌面服务卡片支持未来 3/7 天日程展示,并支持点击直达对应日期与时间轴。
3. 主界面视图与交互体验重构
顶部【今天 / 三天 / 七天】三段式胶囊选择器与多日聚合展示:
顶部升级为三段式胶囊切换器,自适应浅色/深色主题;
毫秒级从内存聚合展示未来 3 天或未来 7 天日程,去重并按发生时间先后排序;
智能显示范围跨度标题(如「未来3天 (10月31日 - 11月2日)」)及条数,卡片时间前智能拼接日期前缀防混淆;点击月历具体单日格子可平滑退回单日查看。
重构日程详情删除交互(彻底消除弹层重叠露底穿帮):
废除原生 ActionSheet,重构为半模态窗原地多态切换架构(detail / scope / confirm);
提供高品质圆角卡片选择「仅删除这一次 / 删除此次及以后 / 删除全部」,彻底消除多层弹窗冲突与露底穿帮。
月视图滑动防闪跳与小红点稳定性:
由 Swiper 动画结束回调接管回正与缓存填充,彻底消除翻页时的闪跳与日期突变;
修复日历格子中小红点偶发丢失问题,引入渲染感知 key 并扩充跨月前后数据缓存。
新增全月展开大日历视图模式。
4. 性能提升与提审合规
增加 isLoadingAll 数据加载防重锁,建立按天哈希索引表(𝑂(1)O(1) 查找),大幅减少无谓计算和界面卡顿;
移除受限的 READ_WHOLE_CALENDAR 权限声明,确保符合华为 AGC 应用市场审核规范。