main
dev
chore/365-cut-1.2.1
fix/363-pin-db-path
feat/351-contact-settings-menu
feat/349-window-geometry
feat/355-migration-merge
integration/290-306-335
release/1.1.2-rc.3-allplatforms
fix/309-path-len-decode
chore/298-path-logging
fix/285-ingest-timelog
fix/252-block-outgoing-dm
feat/64-observer-config
feat/batch1-ux
chore/offband-rebrand
v1.2.1
v1.2.0
v1.1.2-rc.3-allplatforms
v1.1.2-rc.3
v1.1.2-rc.2
v1.0.0
observer-g2-rc3
observer-g2-rc4
observer-g2-rc5
observer-g2-rc6
observer-g2-rc7
observer-g2-rc8
observer-g2-rc9
v1.1.0-rc.1
v1.1.0-rc.2
v1.1.0-rc.3
v1.1.2-beta.1
v1.1.2-beta.2
v1.1.2-beta.3
v1.1.2-ble-test
v1.1.2-queuediag
v1.1.2-rc.1
v1.1.2-rc.1-b45-nearbyrep
v1.1.2-rc.1-b46-pathhash
v1.1.2-rc.1-b47-tracewidth
v1.1.2-rc.1-b48-repeatertrace
v1.1.2-rc.1-b49-maptrace
v1.1.2-rc.1-b50-tracefix
v1.1.2-rc.1-b51-originstrip
v1.1.2-rc.1-b52-channelqr
v1.1.2-rc.1-b53-viarepeater
v1.1.2-rc.1-b54-rxfed
v1.1.2-rc.1-b55-topology
v1.1.2-rc.1-b57-routeux
v1.1.2-rc.1-b58-toporeadout
v1.1.2-rc.3-b59-pathlen
${ noResults }
5 Commits (4dbceb3366c48f35c7d392f4e7ce1206226e9fb6)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
4dbceb3366 |
fix(#291): back must not drop a connected user on the radio list
Two bugs, reported together from an S25 FE test. **Back popped to the scanner.** The previous commit made back pop whenever the route could be popped. The primary views sit on top of the scanner, so from the channel list back landed on the radio-connect screen. That is a regression I introduced: the `PopScope(canPop: !isConnected)` I removed existed to prevent exactly this, and I removed it without establishing why it was there. Back now distinguishes the two cases. A primary view (one carrying the bottom bar) hands back to the OS and backgrounds the app. A detail screen (a channel chat, which has no selectedIndex and is genuinely pushed) pops to its list. Reaching the scanner is what Disconnect is for, not what Back is for. **The scanner was a dead end while connected.** It only routed into the app on a connection transition, behind a one-shot flag that never reset while connected. So once showing with a live connection it stayed there, and pressing Connect did nothing, since there was nothing left to connect. It now routes in whenever it is the visible route and a connection is live, guarded against double-push by a dedicated flag rather than reusing _changedNavigation, which separately gates the disconnect-on-dispose cleanup. Known limitation, pre-existing and unchanged: this auto-entry is bluetooth only. USB and TCP connect from their own screens, which navigate themselves. flutter analyze clean, dart format clean, 469 tests pass. |
2 days ago |
|
|
9aaebce77c |
fix(#291): map name toggle, panel footer everywhere, and back-button behavior
Owner hardware test on an S25 FE and Windows turned up five issues. Three of them shared one root cause. **Map: always show names.** New mapAlwaysShowNames setting, toggled from the map panel. Names were shown only past zoom 14; the override wins at any zoom. Evaluated at build rather than only on camera movement, so flipping the switch repaints immediately instead of waiting for the next pan. **Panel footer on every screen.** Disconnect and Settings now also appear inside a channel. The footer is app-level, so it belongs anywhere the panel is, not just the primary views. **Back button (three reported symptoms, one cause).** Channels, Contacts and Map each wrapped themselves in `PopScope(canPop: !isConnected)`, so while connected the system back press was swallowed whole. That explains all three: an open drawer would not close, Android would not background the app, and on Windows the pinned layout has no Scaffold drawer, so the app bar auto-implied a back arrow whose press PopScope then discarded - a button that visibly did nothing. AppShell now owns back handling for every screen that uses it, in order: close an open drawer, else pop the route (a pushed chat returns to its list), else hand back to the OS via SystemNavigator.pop() so Android returns to the home screen or the previous app. The three per-screen PopScope wrappers are removed. AppShell becomes stateful to hold the scaffold key this needs. flutter analyze clean, dart format clean, 469 tests pass. Not yet re-tested on hardware. |
2 days ago |
|
|
6ccbc71c20 |
feat(#290): move Disconnect and Settings into the panel footer
Epic C, rescoped. The original plan was to eliminate the overflow menu and move everything into the drawer. An inventory showed that premise was wrong: the ellipsis is six different menus sharing an icon, and most of what they hold is screen-level (force flood mode, path management, delete all discovered). Those cannot live in a global nav panel, which has no notion of which contact or channel is meant. Only Disconnect and Settings are app-level, which is exactly why they were duplicated across three screens. Those move; everything else stays put. - AppShell gains optional onDisconnect / onSettings, rendered as a pinned footer in the nav panel. Disconnect keeps the error colour it had as a red menu entry, since it drops the radio connection. - Channels, Contacts and Map pass both and drop those two menu entries. - Map's overflow menu is removed entirely, having nothing left. - Channels keeps its menu only for Manage Communities, which was already conditional on having joined a community. - Contacts keeps its menu for Discovered contacts. - No detail screen menu is touched. Pinned on a wide screen, Disconnect and Settings are now visible without opening anything. flutter analyze clean, dart format clean, 469 tests pass. Not yet run on hardware. |
2 days ago |
|
|
5c95a768e0 |
fix(#289): make the nav panel pinnable inside a channel too
The channel chat screen had a plain Drawer bolted onto it, so the panel could only be pinned open on the four primary views. Pinning it while reading a channel is the wide-screen case that was actually asked for: keeping the channel list and its unread counts visible without pulling it out. - AppShell now serves pushed detail screens as well: selectedIndex and onDestinationSelected are optional, and the bottom bar is omitted when they are absent (a pushed chat screen has no bottom bar). - New appBarBuilder(context, pinned) lets a screen vary its app bar with the dock state. ChannelChatScreen uses it to drop its hamburger when the panel is already pinned open, since there is nothing left to summon. - ChannelChatScreen builds on AppShell instead of a bare Scaffold, so it gets the same transient/pinned layout as everything else. The four primary views are untouched; the new parameters are additive. flutter analyze clean, dart format applied. Not yet run on hardware. |
3 days ago |
|
|
431b93f0fd |
feat(#292): shared app shell with hamburger nav drawer and pin
Epic A of the navigation redesign (#102). Adds AppShell, which owns the bottom QuickSwitchBar that Channels, Contacts, Map and Line-of-Sight each mounted separately, plus a left nav drawer: a transient slide-out on narrow layouts and a dockable panel that can be pinned open at >= 720px. - New lib/widgets/app_shell.dart. Reuses the 720px breakpoint established by settings_shell.dart. Pinned wide lays the panel out beside the body (Row), unpinned uses a standard Scaffold drawer so the hamburger is injected automatically; automaticallyImplyLeading:false was removed from the four app bars to allow that. - Pin state persists via UiViewStateService.navDrawerPinned. The load is placed before the channel-sort block in initialize(), which returns early and would otherwise skip it. - drawerContent is an empty slot here; the channel list fills it in Epic B (#289). Per owner decisions on #102 (2026-07-16): the bottom bar stays a bottom bar at every width (no left rail), and the drawer carries no view switcher, since the bottom bar owns view switching. flutter analyze clean, dart format applied. Not yet run on hardware. |
3 days ago |