Commit Graph
8024 Commits
Author SHA1 Message Date
James RichandClaude Opus 5 db83c03df6 refactor(mirror): harden rect reassembly and extract the compositor
Third adversarial review pass over the client side.

Rect reassembly moves out of DisplayMirrorManagerImpl into
MirrorRectCompositor: the manager was carrying two unrelated state
machines and 14 methods. Every rect field is now validated before
anything is allocated (total_size is device-controlled), geometry is
latched from the chunk at offset 0 so a later chunk cannot transpose
the blit, continuations must match the buffer that was actually
allocated rather than their own claim, and bounds use the subtraction
form because rect_x + rect_width overflows for hostile values. A rect
that omits width or height covers the full panel in that axis.

remoteKeyInput no longer swallows modified keys, so Cmd+Q, Ctrl+C and
Alt+Tab stay with the desktop instead of being forwarded to the device.

MirrorFrameRenderer tracks colorized runs as a raw Int with a sentinel
rather than a boxed Color?, and MirrorFrame.hashCode includes the
format so a mono and an RGB565 frame of the same size cannot collide.

Drops mirror_view_only, orphaned since MUI gained remote input.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 67d29570f2 fix(debug): send typed characters to the mirrored device
The mirror's keyboard capture only mapped navigation keys and silently
dropped everything else, so text entry did nothing: printable characters
never left the client even though the firmware already injects kb_char.
Characters now go out as ANYKEY with the code point, Backspace goes as a
character (so text fields delete rather than navigating back, which stays
Esc's job), and the handling moves into a Modifier.remoteKeyInput
extension.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 8e839085f4 feat(debug): re-enable remote controls for MUI mirrors
device-ui now accepts injected input (virtual LVGL pointer + group-attached
keypad bridged from the InputBroker), so the view-only treatment goes away:
the D-pad navigates MUI widgets, taps forward panel coordinates, and the
keyboard types. The mirror_view_only string stays for the future
capability-flag path.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 a4bd47944e feat(debug): view-only mirror treatment for MUI devices
RGB565 frames identify LVGL/MUI devices, whose UIs read their own input
drivers rather than the InputBroker remote events inject into — so the
mirror hides the D-pad, keyboard, swipe, and touch affordances and says
so, until an input-injection path exists. Utility helpers and the input
codes move to DisplayMirrorUtils.kt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 ebcba96042 feat(debug): render MUI dirty-rect streams (Format.RGB565)
DisplayMirrorManager reassembles RGB565 rect chunks (sequence, geometry,
and panel-bound validation) and composites them into a persistent
little-endian RGB565 canvas emitted per completed rect; the renderer gains
a true-color branch using the same run-length row drawing. Mono frames are
untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 21bc10affb refactor(debug): pre-PR review fixes for the mirror
Circular D-pad ring replaces the cross cluster (wedge hit-testing with a
radial dead band, hold-to-repeat, per-wedge semantics, haptics), keyboard
capture becomes an explicit chip with tap-to-toggle, and taps on touch
devices forward real panel coordinates (long-press = SELECT, matching the
physical touch driver). Manager gains reset() (wired to ViewModel creation
and disconnect), a palette region cap, and first-chunk geometry pinning;
renderer uses bit-replicated RGB565 and run-length row drawing with the
pixel resolver extracted pure and tested; KeyUp of captured keys is
consumed; ViewModel moved to its own file; all strings localized; the
stray .bak test file is gone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 8753bdb47e feat(debug): adaptive mirror layout and keyboard-capture exit
Controls sit beside the mirror when the content width allows (>=760dp,
BoxWithConstraints) and stack below it otherwise; tapping the mirror now
toggles keyboard capture instead of only acquiring it, with the hint text
naming the way out.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 3c8e94b40b feat(debug): color-accurate mirror via DisplayPalette
DisplayMirrorManager reassembles FromRadio.display_palette chunks
(signature-keyed, defaults captured on the offset-0 chunk) into a
MirrorPalette; frames carry palette_signature and the renderer resolves
each pixel through the region table (last overlapping region wins,
matching firmware precedence) with RGB565 conversion, falling back to
monochrome when the referenced palette hasn't arrived. Renderer split
into MirrorFrameRenderer.kt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 4b06abfd17 feat(debug): TV-remote-grade mirror controls and DisplayInfo awareness
Replace the flat button stack with the researched control surface:
cross-shaped 5-way cluster (56dp circular keys, 8dp gaps, Material
Symbols chevrons with contentDescriptions), directions auto-repeat on
hold (500ms then 10Hz — slow enough for the radio to render), OK
long-press sends SELECT_LONG, Back sits below per TV-remote convention.
The mirror itself becomes an input surface: click to capture the
keyboard (arrows / Enter / Esc, with a visible focus ring and hint) and
swipe in a cardinal direction to navigate. Consumes the new
DeviceMetadata.display: shows an e-ink hint steering toward one-shot
Refresh. Adds keyboard_arrow_left/right icons (Material Symbols rounded,
transposed from the existing up glyph).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 d0d35d2a43 feat(metadata): describe the display in DeviceMetadata.display
Populates the new DisplayInfo during the handshake — dimensions from the
live display device, MONO_VLSB frame format, PanelClass from the panel
defines (EINK/HUB75/TFT/LCD/OLED), has_touch from HAS_TOUCHSCREEN — so
clients can gate mirroring UI and adapt to the panel. Absent on
display-less builds. Regenerates protos (DisplayInfo, DisplayFrame rect
fields reserved for dirty-rect streaming).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 e34dea7ac1 refactor(debug): harden screen mirror from adversarial review
Manager: validate format (MONO_VLSB only) and geometry (width/height must
describe exactly total_size bytes) so malformed device input can't reach
aspectRatio and crash; unit tests for reassembly, drops, restarts.
AdminController: setDisplayMirror/sendInputEvent become non-suspend
immediate sends (teardown-safe, input never queues behind bulk admin) and
gain requestDisplayFrame. Mirror tab: render each frame once into a 1:1
ImageBitmap scaled with FilterQuality.None (kills the fractional-scale
seams), gate controls on connection state, reset the toggle on disconnect,
stop the stream on tab dispose and ViewModel clear, add a one-shot Refresh,
inject AdminController/ConnectionStateProvider instead of RadioController.
Dispatch: display_frame test coverage incl. revoked-session.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 9d5d07d4c6 fix(debug): keep the Mirror tab's D-pad above the fold
Cap the mirror canvas at 512.dp (4x for a 128px OLED) instead of filling
the window width, fold the frame info into the toggle row, and pair
Down/Back so the controls fit without scrolling on desktop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
James RichandClaude Fable 5 c33fa4d225 feat(debug): PoC live device screen mirror + remote D-pad (Mirror tab)
Consumes the DisplayFrame PoC protobufs (2.99.0-screen-mirror-poc-SNAPSHOT
from mavenLocal, useMavenLocal committed on this branch): DisplayMirrorManager
reassembles FromRadio.display_frame chunks into MirrorFrame snapshots,
AdminController gains setDisplayMirror + sendInputEvent, and the Debug panel
gains a Mirror tab rendering the device's 1bpp framebuffer live with a D-pad
driving the firmware InputBroker. PoC: tab strings deliberately unlocalized.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-09 11:19:43 -05:00
renovate[bot] 9bac697f6b chore(deps): update actions/setup-java digest to de7274f (#7087) 2026-09-09 11:01:34 -05:00
renovate[bot] 84fee03b41 chore(deps): update org.meshtastic:protobufs to v2.8.0.23-gca2cb1a-snapshot (#7080) 2026-09-09 08:18:34 -05:00
James Rich 286d71975f chore: Scheduled updates (Graphs, Baseline Profile) (#7083) 2026-09-09 06:37:47 -05:00
renovate[bot] cc5d6b8d40 chore(deps): update datadog.gradle to v1.31.0 (#7085) 2026-09-09 06:17:53 -05:00
renovate[bot] 92405ef031 chore(deps): update develocity to v4.5.1 (#7084) 2026-09-09 06:17:34 -05:00
James Rich 1fe80834e1 fix(network): never send heartbeat nonce 1, the firmware NodeInfo-ping trigger (#7078) 2026-09-08 22:56:12 +00:00
James Rich e51b727344 fix(messaging): keep the composer IME session stable while the node list changes (#7079) 2026-09-08 22:17:42 +00:00
James Rich 64fffac6ce fix(settings): fetch Mesh Beacon config from remote-admin nodes (#7077) 2026-09-08 22:17:40 +00:00
github-actions[bot] dfe6c767c7 docs: update CHANGELOG.md (#7076) 2026-09-08 15:45:29 -05:00
renovate[bot] 31c244a010 chore(deps): update co.touchlab:kermit to v2.2.0 (#7075) 2026-09-08 15:22:51 -05:00
James Rich 4fd8d451ca chore: Scheduled updates (Firmware, Hardware, Translations) (#7074) 2026-09-08 15:06:22 -05:00
James Rich 0d15707f9a fix(firmware): move firmware artifact fetching onto the R2 hosts (#7073) 2026-09-08 15:06:06 -05:00
github-actions[bot] 892fb08980 docs: update CHANGELOG.md (#7064) 2026-09-08 10:12:31 -05:00
James Rich 95d0311e9e chore: Scheduled updates (Firmware, Hardware, Translations) (#7071) 2026-09-08 10:08:48 -05:00
James Rich 796c9df53f fix(test): stop androidApp unit tests opening the app database (#7070) 2026-09-08 14:37:52 +00:00
James Rich 16c0236d3b chore: Scheduled updates (Firmware, Hardware, Translations) (#7069) 2026-09-08 14:30:34 +00:00
James Rich 8d97982018 chore: device link disclosure (#7068) 2026-09-08 14:23:22 +00:00
TexasandClaude Opus 5 fecc241b10 fix(takserver): skip compressed v1 TAK packets to stop duplicate contacts (#7020)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 13:42:12 +00:00
renovate[bot] 56413c9748 chore(deps): update org.meshtastic:protobufs to v2.8.0.18-gf008c45-snapshot (#7065) 2026-09-08 08:14:13 -05:00
James Rich 23ccc3bad2 chore: Scheduled updates (Firmware, Hardware, Translations) (#7066) 2026-09-08 08:13:36 -05:00
James Rich b4c851ac38 chore: Scheduled updates (Graphs, Baseline Profile) (#7067) 2026-09-08 08:13:15 -05:00
James Rich e23b9f7a80 chore: Scheduled updates (Graphs, Baseline Profile) (#7061) 2026-09-07 06:17:00 -05:00
James Rich e8f93899d5 chore: Scheduled updates (Firmware, Hardware, Translations) (#7057) 2026-09-07 06:16:49 -05:00
James Rich 5a0cb5cf41 feat: mark nodes not heard since the LoRa config changed (#7055) 2026-09-07 10:44:43 +00:00
James Rich a5f7c5d917 feat(firmware): factory erase through the OTAFIX bootloader when the drive advertises it (#7058) 2026-09-06 14:46:59 +00:00
James Rich ca6752a4a4 docs(nodes): unknown nodes stay visible but are not messageable (#7056) 2026-09-06 06:53:19 -05:00
James Rich 1e83d32734 chore: Scheduled updates (Graphs, Baseline Profile) (#7054) 2026-09-06 03:36:55 -07:00
github-actions[bot] 5efe2cc512 docs: update CHANGELOG.md (#7036) 2026-09-05 19:11:50 -05:00
James Rich 3ea0bc9f53 chore: Scheduled updates (Firmware, Hardware, Translations) (#7052) 2026-09-05 19:09:54 -05:00
renovate[bot] 1f2d91b5e6 chore(deps): update org.jetbrains:markdown to v0.7.12 (#7051) 2026-09-05 15:39:47 -05:00
James Rich 7e74dcec3f fix(node): gate direct messages on holding a public key (#7050) 2026-09-05 20:11:30 +00:00
James Rich 9c01d041ed chore: Scheduled updates (Graphs, Baseline Profile) (#7049) 2026-09-05 12:11:21 -05:00
James Rich 12080598b8 chore: Scheduled updates (Firmware, Hardware, Translations) (#7048) 2026-09-05 12:10:52 -05:00
James Rich 0cfb05ad2c feat(node): add an update-status shortcut to the local node menu (#7047) 2026-09-05 16:05:35 +00:00
Benjamin Faershtein 703867bca2 fix(desktop): use standard SPDX license identifier for RPM packaging (#7043) 2026-09-05 15:59:55 +00:00
James Rich d78c0ece0e refactor(map): retire the maps-utils workarounds its 5.1 fixes made stale (#7046) 2026-09-05 15:46:47 +00:00
James Rich 9781e337f1 fix(mqtt): downgrade unparseable-payload decode logs from error to warn (#7040) 2026-09-05 15:28:59 +00:00