b13e018503
release: v1.4.0
v1.4.0
2026-07-23 16:36:13 +08:00
e16b7e6587
perf: 优化日历翻页重组、农历批量查询与 Canvas 绘制内存分配
2026-07-23 16:30:27 +08:00
69bffd8d20
perf(core): 更新 Baseline Profile 与 Startup Profile AOT 编译规则文件
2026-07-23 16:27:05 +08:00
cc831f85cc
feat(macrobenchmark): 更新 Baseline Profile 脚本覆盖年月视图穿梭与日期记录器
2026-07-23 16:04:02 +08:00
a0df5168f6
feat: 将日期记录器默认视图模式修改为网格
2026-07-23 15:57:41 +08:00
eadb8eb682
fix: add ProGuard dontwarn rule for sketch and fix deprecation warnings
2026-07-23 15:54:15 +08:00
19c9feb6de
fix(ui): 修复滑动切换年份后再进年视图导致的页码联动错位 bug
2026-07-23 15:45:00 +08:00
e663ed5c8e
fix(ui): 修复切换年月视图动画期间滑动导致的小月历错位 bug
2026-07-23 15:16:38 +08:00
53086f38e0
feat(ui): 基于 SharedTransitionLayout 重构年月视图穿梭缩放动画
2026-07-23 15:14:20 +08:00
de1e3178f6
fix(ui): 重构排序对话框布局,解决水平溢出挤压错位问题
2026-07-23 15:09:52 +08:00
80e4e5e86c
fix(ui): 修复视图切换器平滑弹簧滑动动画与几何胶囊同心对齐
2026-07-23 15:08:46 +08:00
37cf5ffc4c
feat(ui): 重构日期记录器界面,升级沉浸式时光画廊与三态视图模式
2026-07-23 15:06:42 +08:00
afd94604ad
fix(photo-editor): 修复外层 Card 未按图片比例自适应导致的上下黑边
2026-07-23 15:03:58 +08:00
b7607eebd9
fix(photo-editor): 修复照片旋转二次叠加与黑边问题
2026-07-23 15:02:11 +08:00
0a6b9449a3
fix(ui): 修复照片编辑页错位、亮色主题统一与添加切换过渡动画
...
- 切换动画:ToolPanel 引入 AnimatedContent,在 旋转 / 裁剪 / 涂鸦 模式切换时平滑淡入滑动过渡
- 修复错位:将“撤销”按钮从限制宽高的 OutlinedIconButton 改为 OutlinedButton(contentPadding),解决“撤销”汉字被压缩竖向换行错位的问题
- 亮色主题统一:将界面配色调整为与鸭鸭日历应用一致的亮色 Material 3 Theme (MaterialTheme.colorScheme.surface / surfaceContainer)
2026-07-23 14:59:05 +08:00
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
57da898ed7
feat(ui): 重新设计记录编辑页面 (RecordEditScreen)
...
- 重构 RecordEditScreen 布局:新增 Hero 照片卡片,分组卡片化基本信息(标题与笔记)与日期设定(拍摄日期与关联日历)
- 引入图形化 OutlinedTextField(带图标、提示与标题快速清除)与交互式 DatePickerTile(带星期显示与清除关联)
- 优化顶部 TopAppBar 操作:添加顶部右上角“保存”快捷入口,配合底部固定“保存记录”主按钮
- 保持现有所有 testTag 兼容性
2026-07-23 14:54:01 +08:00
9ad9e39164
feat(ui): 重新设计日期记录器详情页并优化 Flow 实时监听
...
- 重构 RecordDetailScreen:新增 Hero 大图卡片(带全屏放大与涂鸦编辑快捷入口)、优雅标题 header、双列元信息卡片(带星期与日历关联状态)及格式化笔记卡片
- 优化底部操作栏:提供直观的编辑信息、涂鸦编辑与删除按扭
- ViewModel 变更:将 DateRecordDetailViewModel 从 single-snapshot first() 改为持续 collect,支持编辑返回后实时刷新数据
- 新增 DateRecordDetailViewModelTest 单元测试
2026-07-23 14:51:29 +08:00
c3510cde39
fix(recorder): 修复日期记录器多选模式下拖动多选中断问题
2026-07-23 14:42:49 +08:00
c6377d85f9
perf(ui): 优化多选与长按拖拽灵敏度,实现极速响应跨行连续多选
2026-07-23 14:39:27 +08:00
1700615508
fix(ui): 改用 PointerEventPass.Initial 监听底层手势,彻底解决模拟器与鼠标长按滑动多选失效问题
2026-07-23 14:35:41 +08:00
51a7a43b47
fix(ui): 移除子卡片事件拦截,恢复模拟器与触摸屏按住滑动多选手势
2026-07-23 14:33:56 +08:00
4ada46a549
feat(ui): 支持按住跨行滑动连续多选记录
2026-07-23 14:31:33 +08:00
b333c527da
feat(ui): 为日期记录器网格添加元素删除与平移过渡动画
2026-07-23 14:28:01 +08:00
a2a631c141
feat(ui): 支持长按单个记录直接进入多选模式并选中
2026-07-23 14:26:19 +08:00
cfac607862
feat(ui): 为日期记录器多选模式添加过渡动画
2026-07-23 14:21:39 +08:00
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
ca00839c9b
docs(agents): 新增功能完成后跑 installDebug 的验证步骤
...
要求每写完一个功能跑一次 ./gradlew :app:installDebug 做冒烟安装,
并明确允许失败(无设备/模拟器等情况),非硬性 gate。
2026-07-22 18:05:41 +08:00
023ae44364
docs(agents): 新增按功能点提交的工作流规则
...
要求每完成一个功能点提交一次(不攒批),提交粒度与信息由 AI 自主
决定,但只暂存相关文件、勿 git add .。
2026-07-22 17:39:59 +08:00
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
ffafee550e
Merge branch 'feat/record-detail-image-lightbox'
2026-07-22 15:23:53 +08:00
70c97ed9d5
revert(photo-editor): 恢复点击裁剪 icon 进入裁剪的交互
...
撤销"切到裁剪 tab 自动进入裁剪"的改动,保留原来的两步操作:
点击下方裁剪 icon 进入裁剪模式,再次点击 ✓ 确认裁剪。
ViewModel 恢复 toggleCrop,删除无用的 enterCrop/exitCrop;
保留裁剪框拖动的 bug 修复(本地累积值 + rememberUpdatedState)。
2026-07-22 15:20:13 +08:00
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
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
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
d47a38bc19
feat(date-recorder): 美化记录器界面,卡片图上叠加文字、排序菜单精简
...
- 网格卡片:照片铺满整卡,底部渐变蒙层叠加标题与拍摄日期
- 网格改为自适应约 3 列,间距 8dp→4dp,卡片圆角 12dp→8dp
- 排序菜单 6 项精简为 3 个字段项,点击已选字段切换升降序
- 新增 RecordSortOrder.nextAfter 纯函数及单元测试
2026-07-20 18:28:39 +08:00
b589800eda
refactor: 记录编辑页复用共享 formatLocalDate
2026-07-20 17:25:08 +08:00
0d83fef3a9
feat: 新建记录标题预填拍摄日期并支持联动
2026-07-20 17:23:33 +08:00
94e81bffb1
docs: 新建记录标题预填默认值设计规格
2026-07-20 15:54:59 +08:00
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
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
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
b2942a3ca9
chre: lint CLAUDE.md to AGENTS.md
2026-07-17 13:25:13 +08:00
2e61fea21b
chore: add .zcode to git ginore
2026-07-17 13:24:46 +08:00
a1c71c2b93
chore: remove useless docs
2026-07-17 13:24:18 +08:00
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
c665adfeff
release: v1.3.0
v1.3.0
2026-07-09 17:21:57 +08:00
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
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
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