- PageListScreen: adaptive grid of page cards with correct aspect ratio - PageListViewModel: pages flow + add page - NavGraph: pages route loads notebook metadata, shows PageListScreen, tap page navigates to editor with page size parameter Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
111 lines
5.1 KiB
Markdown
111 lines
5.1 KiB
Markdown
# 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.1–3.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.1–5.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
|
||
|
||
### Phase 7: Selection — Move, Copy, Delete (2026-03-24)
|
||
|
||
- [x] 7.1–7.2: Rectangle selection with dashed rect and blue highlight
|
||
- [x] 7.3: Delete, drag-to-move, copy operations with toolbar buttons
|
||
- [x] 7.4: Full undo integration — DeleteMultipleStrokesAction, MoveStrokesAction,
|
||
CopyStrokesAction
|
||
- Drag existing selection to move, tap outside to deselect
|
||
|
||
### Phase 8: Multi-Page Navigation (2026-03-24)
|
||
|
||
- [x] 8.1: PageListScreen — adaptive grid of page cards with correct aspect ratio
|
||
- [x] 8.2: Add new page via FAB
|
||
- [x] 8.3: NavGraph refactored — pages route loads notebook metadata then shows
|
||
PageListScreen, tap page navigates to editor with page size
|
||
|
||
## In Progress
|
||
|
||
Phase 9: PDF Export
|
||
|
||
## 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).
|