- Route to set_ham_mode only when the licensed toggle transitions
OFF→ON; subsequent saves of an already-licensed node use set_owner so
other owner edits still propagate and the node doesn't reboot on
every save (F-1)
- Enforce the local-node-only contract in AdminControllerImpl, not just
the ViewModel: setHamMode ignores remote destinations (F-3)
- Show 'Your amateur radio call sign, up to 8 characters' as the
field's supporting text in ham mode, giving sighted and screen-reader
users the constraint (F-4, F-6)
- Document that saveUserConfig is the preferred entry point over
setOwner (F-7)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Align AdminController.setHamMode KDoc with the implementation: the
impl echoes the local LoRa values itself; caller-supplied
tx_power/frequency are ignored (F-2, F-15)
- Fall back to the default LoRaConfig message instead of hand-coded
proto defaults (F-9)
- Cover the lora-absent/unknown-node fallback branches and the
null-myNodeInfo routing guard with tests (F-10, F-11)
- Hoist the clear-on-toggle condition into a named boolean (F-13)
- Deduplicate MyNodeInfo test fixtures into one helper (F-8)
- Concrete wording for the protobufs#941 extension note (F-16)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
When the licensed amateur radio toggle is on for the locally connected
node, the User config screen repurposes the long-name field as the
callsign (max 8 chars, iOS parity) and saving sends
AdminMessage(set_ham_mode) instead of set_owner. Current LoRa
tx_power/override_frequency are echoed into the HamParameters so a
re-send while already licensed never wipes the node's overrides
(firmware applies them verbatim). The node entry is optimistically
updated pending the device's authoritative NodeInfo.
Closes#5759
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
configureCommon() applied setMultipleConnectionPool(maxNumOfReaders = 4)
to every database, including the in-memory ones used by tests. A read on
a pooled reader connection can observe a snapshot older than the latest
write on the writer connection, so a read immediately after a write may
return stale rows.
DeviceLinkRepositoryImplTest.reconcilePrunesShortCodesNoLongerInCatalog
read [a, b] (the pre-prune state) instead of [a] after a deleteNotIn —
passing locally but flaking on CI depending on connection-assignment
timing (failed shard-core on #5738; the identical code passed on #5780).
In-memory builders now pass multiConnection = false so reads serialize
behind writes on one connection. Production/file databases keep the
multi-reader pool.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The google-flavor AppFunctionsModule registered AppFunctionStateSync
with createdAtStart = true. Eager creation needs the androidContext
binding and immediately spawns the prefs-observing sync coroutine —
so any Koin graph built outside a running app failed with
NoDefinitionFoundException for android.content.Context. That broke
KoinVerificationTest.verifyTypedBootstrapLoadsModuleGraph (the typed
koinApplication<AndroidKoinApp>() bootstrap instantiates eager
singletons), failing the shard-app CI job on this branch.
The definition is now a plain @Single (the graph stays lazily
constructible) and GoogleMeshUtilApplication.onCreate resolves it once
after startKoin has bound androidContext — same production behavior,
explicit instead of implicit. It was the repo's only createdAtStart.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: James Rich <james.a.rich@gmail.com>
#5275 created :feature:discovery with implementation(projects.core.proto), but
main's #5675 replaced the :core:proto submodule with the org.meshtastic:protobufs
Maven artifact. Rebasing left a stale module reference. Switched to
implementation(libs.meshtastic.protobufs), matching the convention (cf. feature/node).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Enables the full validate-and-build pipeline on PRs whose base is a
release branch (e.g. release/2.8.0), not just main, so milestone PRs
retargeted onto the release branch get per-PR CI before merge.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Opening commit for the release/2.8.0 stabilization branch. versionCode
remains git-derived (offset 29314197 + commit count); only the base
version name is bumped here. CI overrides this with the release tag.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>