Files
eng-pad/PROGRESS.md
Kyle Isom 5eeedff464 Implement Phase 6: undo/redo with command pattern
- UndoableAction interface with AddStrokeAction and DeleteStrokeAction
- UndoManager: undo/redo stacks (depth 50), canUndo/canRedo StateFlows
- EditorViewModel: stroke operations routed through UndoManager,
  visual callbacks sync canvas view without full DB reload
- Toolbar: undo/redo buttons with enabled state
- 9 unit tests for UndoManager

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 14:40:24 -07:00

96 lines
4.5 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.
# PROGRESS.md — eng-pad Implementation Progress
This file tracks completed work and decisions. Updated after every step.
See PROJECT_PLAN.md for the full step list.
## Completed
### Phase 0: Project Documents (2026-03-24)
- [x] 0.1: Created DESIGN.md — full technical design covering architecture,
data model, coordinate system, rendering, input handling, and source tree.
- [x] 0.2: Created PROJECT_PLAN.md — discrete steps grouped by phase with
checkboxes and file references.
- [x] 0.3: Created PROGRESS.md — this file.
- [x] 0.4: Updated CLAUDE.md — build commands, source tree, project doc
pointers.
### Phase 1: Project Skeleton + Data Layer (2026-03-24)
- [x] 1.1: Generated Android project — Gradle 8.14.2, AGP 8.10.1, Kotlin 2.1.20
- [x] 1.2: Version catalog with Compose BOM 2026.03.00, Room 2.8.4,
Navigation 2.9.7, Lifecycle 2.10.0
- [x] 1.3: Lint configured — warningsAsErrors, AGP version check suppressed
(AGP 9.x needs Gradle 9.x)
- [x] 1.4: Room entities: Notebook, Page, Stroke, PageSize enum
- [x] 1.5: Converters: FloatArray ↔ ByteArray (packed little-endian)
- [x] 1.6: DAOs: NotebookDao, PageDao, StrokeDao
- [x] 1.7: EngPadDatabase (Room, version 1)
- [x] 1.8: NotebookRepository, PageRepository
- [x] 1.9: Unit tests: StrokeBlobTest (6 tests), PageSizeTest (4 tests) — all pass
- Foojay resolver added for automatic JDK toolchain download
- compileSdk/targetSdk bumped to 36 (required by latest androidx dependencies)
### Phase 2: Notebook List Screen (2026-03-24)
- [x] 2.1: MainActivity with Compose NavHost (three routes: notebooks, pages, editor)
- [x] 2.2: NotebookListViewModel with StateFlow, create/delete operations
- [x] 2.3: NotebookListScreen — lazy list, create dialog (title + page size radio),
long-press delete with confirmation, empty state
- [x] 2.4: Auto-create page 1 in NotebookRepository.create()
- [x] 2.5: Navigation wired — tap notebook → pages stub, editor stub
- EngPadTheme: high-contrast light color scheme (black on white for e-ink)
### Phase 3: Canvas — Basic Drawing (2026-03-24)
- [x] 3.13.4: PadCanvasView — stylus input with historical points, Path/Paint
stroke rendering, backing bitmap at 1/4 resolution, 60pt grid, Matrix
coordinate transform (canonical ↔ screen)
- [x] 3.5: CanvasState — tool enum (PEN_FINE, PEN_MEDIUM, ERASER, SELECT),
zoom/pan state, pen width constants (4.49pt, 5.91pt)
- [x] 3.6: EditorViewModel — loads strokes from Room, saves on completion
- [x] 3.7: EditorScreen + Toolbar — Compose wrapper with AndroidView,
FilterChip toolbar for pen size and eraser selection
- [x] 3.8: NavGraph updated — pages route auto-navigates to first page's editor,
page size passed through route params
- Used KTX Canvas extensions (withMatrix, withScale, createBitmap) per lint
- ClickableViewAccessibility suppressed on PadCanvasView (drawing view)
### Phase 4: Zoom and Pan (2026-03-24)
- [x] 4.1: ScaleGestureDetector with focal-point zoom (0.5×4×)
- [x] 4.2: Finger drag for pan with multi-pointer tracking (handles finger
swaps during pinch gestures)
- [x] 4.3: Input routing by tool type already in place from Phase 3
- Zoom/pan state managed locally in PadCanvasView for responsiveness,
synced to ViewModel on gesture end
### Phase 5: Eraser (2026-03-24)
- [x] 5.15.3: Stroke-level eraser with bounding box hit test (42pt radius),
processes historical touch points for thorough erasing, deletes from
view + Room DB, rebuilds backing bitmap
### Phase 6: Undo/Redo (2026-03-24)
- [x] 6.1: UndoableAction interface, AddStrokeAction, DeleteStrokeAction
- [x] 6.2: UndoManager with undo/redo stacks (depth 50), StateFlow for canUndo/canRedo
- [x] 6.3: EditorViewModel rewired — stroke add/delete go through UndoManager,
visual callbacks sync canvas view without full reload
- [x] 6.4: 9 unit tests for UndoManager (perform, undo, redo, depth limit, clear, no-ops)
- Toolbar now has undo/redo buttons with enabled state
## In Progress
Phase 7: Selection
## Decisions & Deviations
- **Language**: Kotlin (chosen over Java for better Compose/coroutine support).
- **Storage**: Room/SQLite with packed float BLOBs for stroke points.
- **Palm rejection**: Hardware only (EMR digitizer handles it).
- **Pressure sensitivity**: None — two fixed pen sizes (0.38mm, 0.5mm).
- **Coordinate system**: 300 DPI canonical points (scaled to 72 DPI for PDF export).
- **UI framework**: Compose for chrome, custom View for canvas (Compose
Canvas lacks MotionEvent access needed for stylus input).