450 Commits

Author SHA1 Message Date
xfy
b13e018503 release: v1.4.0 v1.4.0 2026-07-23 16:36:13 +08:00
xfy
e16b7e6587 perf: 优化日历翻页重组、农历批量查询与 Canvas 绘制内存分配 2026-07-23 16:30:27 +08:00
xfy
69bffd8d20 perf(core): 更新 Baseline Profile 与 Startup Profile AOT 编译规则文件 2026-07-23 16:27:05 +08:00
xfy
cc831f85cc feat(macrobenchmark): 更新 Baseline Profile 脚本覆盖年月视图穿梭与日期记录器 2026-07-23 16:04:02 +08:00
xfy
a0df5168f6 feat: 将日期记录器默认视图模式修改为网格 2026-07-23 15:57:41 +08:00
xfy
eadb8eb682 fix: add ProGuard dontwarn rule for sketch and fix deprecation warnings 2026-07-23 15:54:15 +08:00
xfy
19c9feb6de fix(ui): 修复滑动切换年份后再进年视图导致的页码联动错位 bug 2026-07-23 15:45:00 +08:00
xfy
e663ed5c8e fix(ui): 修复切换年月视图动画期间滑动导致的小月历错位 bug 2026-07-23 15:16:38 +08:00
xfy
53086f38e0 feat(ui): 基于 SharedTransitionLayout 重构年月视图穿梭缩放动画 2026-07-23 15:14:20 +08:00
xfy
de1e3178f6 fix(ui): 重构排序对话框布局,解决水平溢出挤压错位问题 2026-07-23 15:09:52 +08:00
xfy
80e4e5e86c fix(ui): 修复视图切换器平滑弹簧滑动动画与几何胶囊同心对齐 2026-07-23 15:08:46 +08:00
xfy
37cf5ffc4c feat(ui): 重构日期记录器界面,升级沉浸式时光画廊与三态视图模式 2026-07-23 15:06:42 +08:00
xfy
afd94604ad fix(photo-editor): 修复外层 Card 未按图片比例自适应导致的上下黑边 2026-07-23 15:03:58 +08:00
xfy
b7607eebd9 fix(photo-editor): 修复照片旋转二次叠加与黑边问题 2026-07-23 15:02:11 +08:00
xfy
0a6b9449a3 fix(ui): 修复照片编辑页错位、亮色主题统一与添加切换过渡动画
- 切换动画:ToolPanel 引入 AnimatedContent,在 旋转 / 裁剪 / 涂鸦 模式切换时平滑淡入滑动过渡
- 修复错位:将“撤销”按钮从限制宽高的 OutlinedIconButton 改为 OutlinedButton(contentPadding),解决“撤销”汉字被压缩竖向换行错位的问题
- 亮色主题统一:将界面配色调整为与鸭鸭日历应用一致的亮色 Material 3 Theme (MaterialTheme.colorScheme.surface / surfaceContainer)
2026-07-23 14:59:05 +08:00
xfy
088860861e feat(ui): 重新设计照片编辑界面 (PhotoEditorScreen)
- 采用暗黑模式专业工作室色调 (0xFF121316),提升照片编辑对比度与专注感
- 优化顶部 TopAppBar:重命名为“照片图层编辑”,包含返回与顶部“完成”快捷保存入口
- 优化模式切换栏:SegmentedButton 采用深色背景与选中高亮效果 (旋转 / 裁剪 / 涂鸦)
- 引入 Studio 视口卡片:圆角黑底边框视口 (RoundedCornerShape(20.dp)),带有处理中全屏 Loading 覆盖层
- 升级底部 ToolPanel 操作面板:
  - 旋转模式:双向 90° 旋转按钮 + 实时角度 Chip (如 90°)
  - 裁剪模式:确认裁剪区域与开启裁剪动作引导
  - 涂鸦模式:扩展 7 色绚丽画笔调色盘 (带选中勾选徽章) 与撤销笔触功能
- 完全兼容 editor_save 自动化测试 tag
2026-07-23 14:55:50 +08:00
xfy
57da898ed7 feat(ui): 重新设计记录编辑页面 (RecordEditScreen)
- 重构 RecordEditScreen 布局:新增 Hero 照片卡片,分组卡片化基本信息(标题与笔记)与日期设定(拍摄日期与关联日历)
- 引入图形化 OutlinedTextField(带图标、提示与标题快速清除)与交互式 DatePickerTile(带星期显示与清除关联)
- 优化顶部 TopAppBar 操作:添加顶部右上角“保存”快捷入口,配合底部固定“保存记录”主按钮
- 保持现有所有 testTag 兼容性
2026-07-23 14:54:01 +08:00
xfy
9ad9e39164 feat(ui): 重新设计日期记录器详情页并优化 Flow 实时监听
- 重构 RecordDetailScreen:新增 Hero 大图卡片(带全屏放大与涂鸦编辑快捷入口)、优雅标题 header、双列元信息卡片(带星期与日历关联状态)及格式化笔记卡片
- 优化底部操作栏:提供直观的编辑信息、涂鸦编辑与删除按扭
- ViewModel 变更:将 DateRecordDetailViewModel 从 single-snapshot first() 改为持续 collect,支持编辑返回后实时刷新数据
- 新增 DateRecordDetailViewModelTest 单元测试
2026-07-23 14:51:29 +08:00
xfy
c3510cde39 fix(recorder): 修复日期记录器多选模式下拖动多选中断问题 2026-07-23 14:42:49 +08:00
xfy
c6377d85f9 perf(ui): 优化多选与长按拖拽灵敏度,实现极速响应跨行连续多选 2026-07-23 14:39:27 +08:00
xfy
1700615508 fix(ui): 改用 PointerEventPass.Initial 监听底层手势,彻底解决模拟器与鼠标长按滑动多选失效问题 2026-07-23 14:35:41 +08:00
xfy
51a7a43b47 fix(ui): 移除子卡片事件拦截,恢复模拟器与触摸屏按住滑动多选手势 2026-07-23 14:33:56 +08:00
xfy
4ada46a549 feat(ui): 支持按住跨行滑动连续多选记录 2026-07-23 14:31:33 +08:00
xfy
b333c527da feat(ui): 为日期记录器网格添加元素删除与平移过渡动画 2026-07-23 14:28:01 +08:00
xfy
a2a631c141 feat(ui): 支持长按单个记录直接进入多选模式并选中 2026-07-23 14:26:19 +08:00
xfy
cfac607862 feat(ui): 为日期记录器多选模式添加过渡动画 2026-07-23 14:21:39 +08:00
xfy
b6146a29ae feat(photo-editor): 旋转图片时加平滑动画,裁剪填满零黑边
- 旋转角用 Animatable + tween(300ms) 平滑过渡,容器宽高比用
  animateFloatAsState 在目标稳态比例间过渡,消除硬切
- 黑边根因:旋转矩形填不满自身 AABB 的四角(45° 时黑色占 51%)。
  用户选「裁剪填满」方案:图片显示 rotatedBitmap(目标态),
  graphicsLayer 旋转 + coverScale 放大使四角覆盖容器 → 零黑边
- 提取旋转几何为纯函数 RotationGeometry(无 Android 依赖):
  stableAspect + coverScale,便于单测
- 回归测试 RotationGeometryTest 锁住「任意角度旋转图片四角
  覆盖容器四角」断言(maxViolation <= 1e-4),防止黑边回归
- 稳态(offset=0) scale=1 零裁剪;动画中(±45°) scale≈1.65 裁边缘

保存逻辑未变:PhotoProcessor.render 仍用 rotationDegrees 烘焙。
2026-07-22 18:31:48 +08:00
xfy
ca00839c9b docs(agents): 新增功能完成后跑 installDebug 的验证步骤
要求每写完一个功能跑一次 ./gradlew :app:installDebug 做冒烟安装,
并明确允许失败(无设备/模拟器等情况),非硬性 gate。
2026-07-22 18:05:41 +08:00
xfy
023ae44364 docs(agents): 新增按功能点提交的工作流规则
要求每完成一个功能点提交一次(不攒批),提交粒度与信息由 AI 自主
决定,但只暂存相关文件、勿 git add .。
2026-07-22 17:39:59 +08:00
xfy
7d8e0fca61 docs(agents): 重写 AGENTS.md 仓库指南
基于对 core 源码、测试、构建配置、脚本文档的并行扫描综合而成。
修正过时的依赖版本(Compose BOM 2026.06.01、tyme4kt 1.5.0),补充
Activity+Intent 导航模型、namespace 怪癖、StateFlow 状态模式、测试
覆盖范围与缺口、benchmark 构建类型、发布流程等。
2026-07-22 17:34:59 +08:00
xfy
ffafee550e Merge branch 'feat/record-detail-image-lightbox' 2026-07-22 15:23:53 +08:00
xfy
70c97ed9d5 revert(photo-editor): 恢复点击裁剪 icon 进入裁剪的交互
撤销"切到裁剪 tab 自动进入裁剪"的改动,保留原来的两步操作:
点击下方裁剪 icon 进入裁剪模式,再次点击 ✓ 确认裁剪。

ViewModel 恢复 toggleCrop,删除无用的 enterCrop/exitCrop;
保留裁剪框拖动的 bug 修复(本地累积值 + rememberUpdatedState)。
2026-07-22 15:20:13 +08:00
xfy
d3ebd6829b fix(photo-editor): 修复裁剪框拖动的闭包快照陷阱
pointerInput(Unit) 的手势 lambda 只在首次组合捕获一次 state,
后续 onDragStart 读的是过期快照,导致再次拖动从中心开始。

改用本地累积值绕开 StateFlow 往返:onDragStart 把 state 快照到
mutableFloatStateOf,onDrag 每帧在累积值上叠加增量,onDragEnd
一次性提交。onDragStart 通过 rememberUpdatedState 读最新 state。

enterCrop 改为幂等(已启用则保留当前框),避免 LaunchedEffect
因 editorState 变化重触时冲掉用户拖动结果。
2026-07-22 15:18:19 +08:00
xfy
b8509381d9 fix(photo-editor): 修复裁剪 tab 流程与裁剪框拖动
两个问题:
1. 切到裁剪 tab 后还要再点裁剪 icon 才进入裁剪——改为切 tab 即自动进入,
   底部按钮由"开关裁剪"改为"✓ 确认裁剪",点击烘焙裁剪并保留在 tab。
2. 裁剪框无法移动——重写 CropOverlay 拖动逻辑:
   - 加 BODY 整体平移(拖框内区域平移整框)
   - onDrag 每帧从 state 读实时裁剪值叠加增量,修复闭包快照导致的抖动
   - dragHandle 内聚到组件内部,消除跨重组延迟
   - 抽出 hitHandle/moveCrop,四角与整体均带边界约束防交叉越界

ViewModel 新增 enterCrop/exitCrop/applyCrop,删除 toggleCrop。
2026-07-22 14:34:42 +08:00
xfy
cec8debff0 feat(date-recorder): 详情页图片灯箱,支持缩放/旋转手势
点击详情页大图弹出全屏深色遮罩,集成 panpf/zoomimage 的
SketchZoomAsyncImage,支持双指缩放、平移、捻合旋转(松手吸附
0/90/180/270°)与双击复位,点空白或返回键关闭。

新增 zoomimage-compose-sketch4 1.6.0 依赖(与项目 sketch 同作者,
SketchZoomAsyncImage 是 AsyncImage 超集,额外提供缩放/旋转/大图分片)。
2026-07-22 14:26:27 +08:00
xfy
d47a38bc19 feat(date-recorder): 美化记录器界面,卡片图上叠加文字、排序菜单精简
- 网格卡片:照片铺满整卡,底部渐变蒙层叠加标题与拍摄日期
- 网格改为自适应约 3 列,间距 8dp→4dp,卡片圆角 12dp→8dp
- 排序菜单 6 项精简为 3 个字段项,点击已选字段切换升降序
- 新增 RecordSortOrder.nextAfter 纯函数及单元测试
2026-07-20 18:28:39 +08:00
xfy
b589800eda refactor: 记录编辑页复用共享 formatLocalDate 2026-07-20 17:25:08 +08:00
xfy
0d83fef3a9 feat: 新建记录标题预填拍摄日期并支持联动 2026-07-20 17:23:33 +08:00
xfy
94e81bffb1 docs: 新建记录标题预填默认值设计规格 2026-07-20 15:54:59 +08:00
xfy
b1064f95b7 feat(date-recorder): use camera and crop icons for record/crop buttons
- DateRecorder FAB: Icons.Filled.Add -> Icons.Filled.PhotoCamera
  (与 onOpenCamera / '拍照记录' 语义一致)
- PhotoEditor crop toggle: 纯文字 -> Icons.Filled.Crop / CropFree 图标
  (Crop 关闭态, CropFree 开启态, contentDescription 保留无障碍语义)
2026-07-17 16:31:39 +08:00
xfy
81aeb8e894 fix(date-recorder): split handwriting strokes on finger lift
endStroke() was a no-op, so addStrokePoint() kept appending every new
pointer-down to the previous stroke (its only segmentation cue was
points.isEmpty()). A second drag after lift got joined into the first,
and toPath() drew them as a single polyline.

Add isFinished flag to HandStroke and implement real endStroke() that
marks the current stroke finished. withAddedPoint() now starts a new
segment when the previous stroke is null, empty, or finished.
2026-07-17 16:01:44 +08:00
xfy
50da18460f fix(date-recorder): correct photo EXIF orientation and fix capture crash
- PhotoProcessor: read EXIF orientation and rotate bitmap on load so
  camera JPEGs display upright
- CameraScreen: set target rotation so CameraX writes correct EXIF
- CameraScreen: fix RejectedExecutionException by not shutting down the
  capture executor on dispose (CameraX may still post to it after)
- CameraScreen: route capture callback through main handler for thread
  safety before triggering Activity navigation
- CameraScreen: defer camera binding until PreviewView is attached to
  avoid repeated Surface abandon/recreate and camera rebind loops
- CameraScreen: use an overlay (not component swap) for the capturing
  state so the bound ImageCapture is not torn down mid-capture
- deps: add androidx.exifinterface for EXIF reading
2026-07-17 15:36:36 +08:00
xfy
b2942a3ca9 chre: lint CLAUDE.md to AGENTS.md 2026-07-17 13:25:13 +08:00
xfy
2e61fea21b chore: add .zcode to git ginore 2026-07-17 13:24:46 +08:00
xfy
a1c71c2b93 chore: remove useless docs 2026-07-17 13:24:18 +08:00
xfy
8963b6162b feat(date-recorder): photo journal tool with camera, editor, and album grid
新增"日期记录器"工具:相册式记录管理,支持拍照→编辑→记录信息的完整流程。

数据层:
- Room 2.8.4 首个数据库(KSP 2.3.10),DateRecord 实体含标题/备注/拍摄日期/关联日期
- DateRecordConverters 处理 kotlinx-datetime ↔ ISO 字符串
- DateRecorderRepository 封装 DAO + filesDir 照片文件管理

UI 层:
- CameraScreen: CameraX 1.5.3 应用内预览,运行时权限请求,前后摄切换
- PhotoEditorScreen: 纯 Compose 自实现旋转/裁剪/手写三 Tab 编辑器
- DateRecorderScreen: LazyVerticalGrid 相册网格 + 多选 + 6 种排序 + 批量删除
- RecordEditScreen / RecordDetailScreen: 记录信息编辑与详情查看

基础设施:
- CAMERA 权限 + FileProvider(filesDir 存储,免存储权限)
- 5 个 Activity 延续项目 Activity+Intent 滑动转场模式
- 2 个单测:排序逻辑 6 种组合 + 降采样计算
2026-07-17 13:21:45 +08:00
xfy
c665adfeff release: v1.3.0 v1.3.0 2026-07-09 17:21:57 +08:00
xfy
afea8bf109 feat: refactor shift pattern with atomic rephase and swipeable calendar
班次设置页重构与体验增强:

数据模型重构:
- phaseBreaks + override 两独立字段 → 原子 RephaseFlip(date, flippedTo, rephaseFrom)
- 解决幽灵重排/撤销误删/断点链不级联三大问题

体验改进:
- 角标颜色按类别配对(onPrimary/onError/onTertiary)
- 迷你月历动态行数(复用 getMonthGridInfo)
- 恢复默认改 Snackbar 撤销(首次引入 SnackbarHost)
- 锚点日期与周期行右侧对齐修复
- 点击年月标题弹 DatePicker 选月份跳转
- HorizontalPager 滑动翻月 + 高度插值平滑过渡
2026-07-09 17:16:45 +08:00
xfy
2a3089bf47 feat(shift): smooth height interpolation for mini calendar swipe
滑动翻月时高度平滑过渡,不再跳变:
- 复用主日历的 interpolatedWeeks 行数插值逻辑
  (currentPageOffsetFraction 在当前页与目标页行数间 lerp)
- 行高由 BoxWithConstraints 宽度推算(格宽=宽/7,aspectRatio(1f) 使行高=格宽)
- HorizontalPager 套 Modifier.height(px).clipToBounds(),跟随手指实时变高
- 迷你月历简化版:无折叠动画,只保留展开态 gridHeightPx = rowH * weeks
2026-07-09 17:14:54 +08:00
xfy
7b1290dd66 feat(shift): swipeable mini calendar via HorizontalPager
迷你月历接入 HorizontalPager,支持左右滑动翻月:
- 复用主日历 START_PAGE/pageToYearMonth/yearMonthToPage 工具
- viewYear/viewMonth 由 pagerState.currentPage 派生
- 箭头按钮改为 animateScrollToPage
- DatePicker 选月后 animateScrollToPage 跳转
- 网格提取为 MonthGrid 单页组件
2026-07-09 17:07:38 +08:00