Scaffold Android project per BRIEF.md

Single-module Kotlin/Compose app with manual DI container. Pure-Kotlin
measurement math (orientation mapping, two-sample per-mode calibration,
EMA smoothing, lock hysteresis, display deadband) fully unit-tested.
Sensor fallback: game rotation vector -> gravity -> low-passed
accelerometer. Live Level (manual Surface|Edge) and Angle (hold-to-zero)
scaffolds; Ruler/Tools placeholders; stub Pro entitlement.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jay
2026-07-11 18:34:57 -04:00
parent bcda2856f7
commit 2a48d79c77
41 changed files with 2244 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
# On the Level
Offline-first Android pocket toolset: a trustworthy level, angle meter, and
calibrated screen ruler (Pro). Kotlin + Jetpack Compose, single module, no backend.
- **[BRIEF.md](BRIEF.md)** — the authoritative v1 product & technical brief
- **[AUDIT.md](AUDIT.md)** — audit of the brief; the amendments it lists are incorporated
- **resources/** — concept board (visual direction)
## Building
Open in Android Studio, or:
```sh
./gradlew assembleDebug # build
./gradlew testDebugUnitTest # measurement-math unit tests
```
## Scaffold status
The project skeleton follows BRIEF.md §Sensor and measurement architecture.
Implemented and tested:
- `core/sensors` — sensor selection (game rotation vector → gravity → low-passed
accelerometer), device-frame gravity stream, and the pure measurement math:
orientation mapping, two-sample per-mode calibration, EMA smoothing,
lock hysteresis/dwell/debounce, display deadband. All unit-tested.
- `core/settings` — DataStore preferences and per-mode calibration persistence.
- `core/billing` — entitlement interface with a stub (free-tier) implementation.
- `feature/level`, `feature/angle` — live numeric scaffolds wired to the real
sensor pipeline, with manual Surface|Edge selection, lock state, hold-to-zero.
- `feature/ruler`, `feature/tools` — static placeholders.
Not yet implemented (deliberately — see TODO markers):
- The tactile vial visuals and the spring-animated **display value** (value 3 of 3
in the brief); scaffold screens render the deadbanded stable value directly.
- Guided calibration flow UI (math and persistence are done).
- Edge-mode readout counter-rotation on the portrait-locked activity.
- Play Billing implementation of `ProEntitlementRepository`.
- Screen ruler measurement UI and per-display scale persistence.
- Audio cue, reduced-motion behaviors, preferences UI.