2a48d79c77
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>
43 lines
1.9 KiB
Markdown
43 lines
1.9 KiB
Markdown
# 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.
|