Commit Graph

12 Commits

Author SHA1 Message Date
Brummel 5176ea26f4 Refactor CaseRow styling and text behavior
Improve the visual presentation of individual case entries by adjusting
styling and text handling. This includes setting a minimum height for
rows, applying consistent padding, and enabling text truncation with an
ellipsis for longer oneliner descriptions.
2026-04-24 12:46:55 +02:00
Brummel 3b2b62865c Fix: Disable auto-centering on ScalingLazyColumn 2026-04-24 12:24:42 +02:00
Brummel 46880e1b06 chore(watch): require explicit target in run.sh and prompt on ambiguity
Drop the legacy "(none)" target fallback that quietly picked the first
attached device. Every device-bound subcommand now requires a `watch` or
`emulator` prefix (or DOCTATE_TARGET env var).

The emulator path never auto-picks a running emulator: even with exactly
one running, the menu shows so the user can boot a different AVD
instead. ADB_SERIAL / WEAR_AVD still bypass the menu for scripted runs.

Menu results now travel through a global RESOLVED_SERIAL/PICKED instead
of stdout+$(), so `die` inside the resolvers aborts the main shell
directly rather than getting swallowed by a command-substitution subshell.
2026-04-24 12:12:30 +02:00
Brummel b02cc0c870 Add Wear OS Tile and Complication support - PoC
This commit introduces support for Wear OS Tiles and Complications,
enabling users to view case information and launch the app directly from
their watch face.

Key changes include:
- **New Complication Service:** `DoctateComplicationService.kt` provides
  a simple complication that displays "Doctate" and launches the app's
  case list upon tap.
- **New Tile Service:** `DoctateTileService.kt` serves a dynamic tile
  showing the current case's one-liner. It includes tappable areas to
  navigate to the case list, create a new case, or continue an existing
  one.
- **UI Navigation:** `AppNav.kt` and related files (`CaseListScreen.kt`,
  `MainActivity.kt`, `NavCommand.kt`) set up the navigation structure
  for the Wear OS app, handling intents from the Tile and Complication.
- **Data Structures:** `CaseEntry.kt` defines the minimal data structure
  for case information displayed on the watch.
- **In-Memory Data Store:** `CaseStoreStub.kt` acts as a temporary,
  in-memory store for case data, ensuring consistency across the
  activity, Tile, and Complication.
- **Dependency Updates:** Added necessary Wear OS libraries to
  `build.gradle.kts` and `libs.versions.toml`.
- **AndroidManifest:** Configured the `MainActivity` to handle
  `singleTask` launch mode and added necessary intent filters for
  complications.
- **Demo Data:** Seeded `CaseStoreStub` with demo data for initial
  testing and visualization.
2026-04-23 23:07:03 +02:00
Brummel cca41fe5ea chore: untrack .idea/ (IDE workspace state, not team-shared)
These files mutate on every IDE click and leak per-developer state
(last deployed device, recent activity) into commits. A single root
`.idea/` ignore replaces the scattered per-file rules in
watch/wearos/.gitignore.
2026-04-23 17:57:26 +02:00
Brummel 3429e8bdf7 feat(watch): support real Pixel Watch 2 via ADB-WiFi + LAN dev server
Real hardware has no USB and can't resolve 10.0.2.2, so we pair over
ADB-WiFi and point the app at the dev laptop's LAN URL. run.sh gains a
`watch`/`emulator` target prefix so both devices can be attached in
parallel without serial-picking roulette.

- network_security_config.xml: whitelist 192.168.178.27 for cleartext
- build.gradle.kts: resolveProp() threads Gradle CLI `-P` overrides
  into BuildConfig (SERVER_URL, API_KEY) ahead of local.properties
- run.sh: adb_cmd wrapper honours ADB_SERIAL; new `devices` and
  `connect [ip:port]` subcommands; `.watch_serial` caches the paired
  endpoint so `./run.sh watch install` just works on subsequent runs
- .gitignore: ignore `.watch_serial`
2026-04-23 17:54:15 +02:00
Brummel ed993a5c6d feat(watch): vertical PoC — record, upload, playback end-to-end
Completes the 5-second-record-and-upload flow:
- RecordingViewModel orchestrates recorder, countdown, and upload
- MediaRecorder wrapper produces 16kHz/AAC-LC m4a (Whisper-compatible)
- Compose RecordingScreen renders the state pyramid
  (Idle / RequestingPermission / Recording / Uploading / Success / Error)
- UiState + pure reducer with full JVM unit-test coverage
- run.sh "test" subcommand wraps the unit and instrumented tiers
  (set SKIP_INSTRUMENTED=1 to bypass the on-device tier)

Verified end-to-end: emulator captures "Hallo, hallo", lands at
tmpdata/<user>/<case>/*.m4a, Whisper transcribes, Ollama classifies,
document.md is written — full pipeline in ~5s.

Known: MockWebServer-based UploadClientTest hangs in setUp on the
Wear OS 34 emulator (likely SELinux socket policy). Deferred — the
real-server end-to-end already validates the wire protocol.
2026-04-23 16:30:57 +02:00
Brummel 8306dd8c47 feat(watch): scaffold upload client and app service locator
Builds the network foundation for the Wear OS vertical PoC:
OkHttp-based UploadClient mirroring doctate-client-core's wire protocol
(multipart /api/upload, X-API-Key, transient/terminal classification),
BuildConfig-backed Settings sourced from local.properties, CaseId factory,
DoctateApp service locator, MockWebServer-based UploadClientTest for
wire-format assertions, plus the manifest/permissions/network-security-
config plumbing for emulator-loopback cleartext.

MainActivity is still the placeholder UI; audio recording, ViewModel,
and recording screen come in follow-up commits.
2026-04-23 15:25:53 +02:00
Brummel 673e0aeb9d Add deviceManager.xml to project settings
Adds the deviceManager.xml file, which configures device sorting within
the IDE, to the `.idea` directory. This ensures consistent device
management across different developer environments.
2026-04-23 12:57:57 +02:00
Brummel 41adb89763 chore(watch): add run.sh helper for build/install/run
Inner-loop tooling so the dev cycle does not require Android Studio.
Subcommands: build, install, start, stop, logcat, shot, clean
(default = install + start). Auto-detects JAVA_HOME (bundled JBR) and
adb. Boots an emulator on demand when no device is attached: interactive
menu of available AVDs, with WEAR_AVD=<name> env-var bypass for
non-interactive use. Waits for sys.boot_completed (180s timeout) before
installing.
2026-04-23 12:29:11 +02:00
Brummel 9a72619f23 chore(watch): set header text to "Doctate!" 2026-04-23 12:29:06 +02:00
Brummel 8956b74c09 feat(watch): scaffold Wear OS app via Android Studio
Initial skeleton for the Pixel Watch dictation client (Plan Phase 5b).
Generated by Android Studio's "Empty Wear App" template, kept verbatim
to defer bikeshedding until real friction appears.

Toolchain pinned via wrapper / version catalog:
  AGP 9.2.0, Kotlin 2.2.10, Gradle 9.4.1, JDK 21 (auto-provisioned).
  compileSdk 36, minSdk 30 — covers Pixel Watch 1/2/3.

UI starter: Wear Compose Material3 1.5.6 with TransformingLazyColumn
and EdgeButton — already close to the planned per-case full-screen
list pattern.

Manifest declares the app standalone, so the Wear OS Network Proxy
will tunnel uploads transparently when the watch lacks LTE/WiFi.
No Phone-side companion module required.

Multi-module split (:core-domain, :core-audio, :core-sync, :core-http,
:core-storage, :app-mobile) intentionally postponed — current single
:app module is the smallest thing that compiles, which gives us a
known-good baseline before restructuring.

AS's default .gitignore left as-is. A handful of .idea/ project-config
files (compiler.xml, gradle.xml, misc.xml, codeStyles, runConfigurations)
are committed by AS's design; revisit if machine-specific paths or
multi-machine drift become painful.
2026-04-23 11:52:45 +02:00