Reference README, brand + Material 3 app, and the first hardware-driven app fixes - #1
Merged
Merged
Conversation
Table of contents, requirements and supported boards, quick start, architecture and layer-by-layer breakdown, the sensor protocol interfaces, one documented subsection per board module with code samples verified against the sources, the logging guide (download, MMS flush, CSV, calibration, board state, anonymous signals, polled readables, processor handles), firmware updates and MetaBoot, Room persistence, data modes, BLE packet format, testing, demo mode, design notes and known gaps. HARDWARE.md test count refreshed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Exact brand palette (#FE9500 primary plus teal-green success, gold warning, coral danger, dusty-blue info) as light and dark Material 3 schemes with dynamic color off; chart channel colors unchanged. - Adaptive launcher icon from the "m" brand artwork: the glyph's enclosing circle is positioned inside the 66 dp safe zone (verified under circle and squircle masks), monochrome layer, legacy mipmaps. - Branded scan background: solid orange field, light-mode veil, five scan ripples from the bottom-leading corner, watermark "m"; device rows as Material cards on top. - Native Material patterns throughout (TopAppBar, grouped ListItem cards, FilterChips, Switch, Snackbar, AlertDialog confirms, sliders, system share sheet); status/battery/RSSI chips; per-screen section ordering aligned across the app family. Presentation only — no logic or ViewModel changes; 120 app tests unchanged and green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Demo mode is gone from every user-facing surface: no toggle, no simulated boards on the scan screen, no demo candidates in group logging, no settings hints; Bluetooth-off shows a plain empty state. DemoBleTransport moves to the app's test source set, where it remains the fixture that drives the real device stack for 23 JVM end-to-end tests (logging round-trips, group capture, process-restart recovery). README and HARDWARE.md no longer advertise an app demo mode. The app manifest never declared android.permission.INTERNET, so the firmware server's catalog fetch was refused on-device. Declared, with the reason. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shows what the board's logging module holds: LOG_LENGTH entry count and every armed logger (id, module, register, chunk) — including stale ones left by earlier sessions or other apps — with Refresh and a confirmed Clear Logs & Loggers action (stops on-board logging, drops entries, removes all loggers). After a clear the count is set to zero locally rather than re-read, since the MMS reports a housekeeping sentinel for up to a minute. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The screen was driven purely by the app's local session records, so it showed Start while the board was already logging (loggers armed by an earlier run, another app, or a lost record) and Download after the data had been cleared out from under a stale record. LogSessionViewModel now reconciles with the board on entry: loggers armed with no local running session surfaces a new BoardLogging phase (status card + a Stop board action); local pending records with no loggers and no entries on the board are dropped. SDK gains stopAndRemoveLoggers() — disable logging and remove all loggers while keeping flash entries recoverable — with a wire-byte test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The per-logger detail was rendered through the two-column label/value row, and its width starved the label into a one-character column. Each logger is now a ListItem (headline + supporting byte-range line). The default AppScaffold top bar was transparent at rest — its scrolled color swap depends on a scrollBehavior that was never wired — so list content scrolled up underneath the title; it is now opaque. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The download progress and result cards were the last items in the LazyColumn, below the full sensor picker — a download would run to completion (7 s for 2,560 entries on a MetaMotion S) with nothing visible on screen, so it looked like the button did nothing. Status card, then the Download section (pending records, live progress with entry count and percent, completion with per-session rows), then the sensor picker. Top-bar action for a board-owned session is now Stop, with the status card explaining that the session was started earlier. Verified end to end on hardware: Start → Stop → Download shows live 23% → complete, 747 samples saved to Session History. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 16-sensor picker was a flat wall of cards on both the Live Stream and Logging screens, pushing everything below it (active loggers, download) two screens down. Motion & Fusion is split into two groups, and each of the three groups sits behind a tappable header that starts expanded only when one of its sensors is selected — the common case is one open group of three rows and two folded lines. Collapsed headers still show a "N selected" count. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ging section, test counts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
TL;DR
The first public iteration of the app and docs, plus everything a real-board test pass with the app turned up.
Docs
App — brand and presentation
#FE9500palette + semantic colors as light/dark Material 3 schemes (dynamic color off); adaptive "m" launcher icon (glyph verified inside the 66 dp safe zone); branded scan background; native Material components and section ordering aligned across the app family.App — fixes from testing on a Pixel 7 + MetaMotion S
INTERNETpermission declared (firmware catalog fetch was refused on-device).DemoBleTransportmoved to the test source set (still drives 23 end-to-end JVM tests).stopAndRemoveLoggers()with a wire-byte test.ListItems.Structure
README.md,HARDWARE.mdapp/.../ui/theme/,res/mipmap-*, manifestINTERNETapp/.../ui/{scan,device,stream,logging,sessions,controls,settings,firmware}/,ui/components/app/.../vm/{LogSessionViewModel,SettingsViewModel}.ktapp/src/test/.../demo/DemoBleTransport.ktmetawear-protocol/.../DeviceLogging.kt(+LoggingTest.kt)stopAndRemoveLoggers()Test plan
:app:assembleDebug,:metawear-core:assembleDebugAndroidTestbuild; lint 0 errorsapp/src/mainhas no demo references