Skip to content

Commit 71d9caf

Browse files
committed
Merge remote-tracking branch 'origin/main' into poc/maplibre
2 parents 5d96d06 + 9d7af54 commit 71d9caf

File tree

77 files changed

+2386
-273
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+2386
-273
lines changed

.github/workflows/release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ jobs:
137137
- name: Setup Fastlane
138138
uses: ruby/setup-ruby@v1
139139
with:
140-
ruby-version: '3.2'
140+
ruby-version: '3.4.7'
141141
bundler-cache: true
142142

143143
- name: Build and Deploy Google Play to Internal Track with Fastlane
@@ -203,7 +203,7 @@ jobs:
203203
- name: Setup Fastlane
204204
uses: ruby/setup-ruby@v1
205205
with:
206-
ruby-version: '3.2'
206+
ruby-version: '3.4.7'
207207
bundler-cache: true
208208

209209
- name: Build F-Droid with Fastlane

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,7 @@ keystore.properties
4141

4242
/build-logic/convention/build/*
4343
/build-logic/build/
44+
45+
# Personal build scripts
46+
build-and-install-android.sh
47+
wireless-install.sh

Gemfile.lock

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,40 @@
11
GEM
22
remote: https://rubygems.org/
33
specs:
4-
CFPropertyList (3.0.7)
5-
base64
6-
nkf
7-
rexml
4+
CFPropertyList (3.0.8)
5+
abbrev (0.1.2)
86
addressable (2.8.7)
97
public_suffix (>= 2.0.2, < 7.0)
108
artifactory (3.0.17)
119
atomos (0.1.3)
1210
aws-eventstream (1.4.0)
13-
aws-partitions (1.1179.0)
14-
aws-sdk-core (3.236.0)
11+
aws-partitions (1.1187.0)
12+
aws-sdk-core (3.239.1)
1513
aws-eventstream (~> 1, >= 1.3.0)
1614
aws-partitions (~> 1, >= 1.992.0)
1715
aws-sigv4 (~> 1.9)
1816
base64
1917
bigdecimal
2018
jmespath (~> 1, >= 1.6.1)
2119
logger
22-
aws-sdk-kms (1.116.0)
23-
aws-sdk-core (~> 3, >= 3.234.0)
20+
aws-sdk-kms (1.118.0)
21+
aws-sdk-core (~> 3, >= 3.239.1)
2422
aws-sigv4 (~> 1.5)
25-
aws-sdk-s3 (1.202.0)
23+
aws-sdk-s3 (1.205.0)
2624
aws-sdk-core (~> 3, >= 3.234.0)
2725
aws-sdk-kms (~> 1)
2826
aws-sigv4 (~> 1.5)
2927
aws-sigv4 (1.12.1)
3028
aws-eventstream (~> 1, >= 1.0.2)
3129
babosa (1.0.4)
32-
base64 (0.3.0)
30+
base64 (0.2.0)
3331
bigdecimal (3.3.1)
3432
claide (1.1.0)
3533
colored (1.2)
3634
colored2 (3.1.2)
3735
commander (4.6.0)
3836
highline (~> 2.0.0)
37+
csv (3.3.5)
3938
declarative (0.0.20)
4039
digest-crc (0.7.0)
4140
rake (>= 12.0.0, < 14.0.0)
@@ -55,9 +54,9 @@ GEM
5554
faraday-rack (~> 1.0)
5655
faraday-retry (~> 1.0)
5756
ruby2_keywords (>= 0.0.4)
58-
faraday-cookie_jar (0.0.7)
57+
faraday-cookie_jar (0.0.8)
5958
faraday (>= 0.8.0)
60-
http-cookie (~> 1.0.0)
59+
http-cookie (>= 1.0.0)
6160
faraday-em_http (1.0.0)
6261
faraday-em_synchrony (1.0.1)
6362
faraday-excon (1.1.0)
@@ -72,15 +71,18 @@ GEM
7271
faraday_middleware (1.2.1)
7372
faraday (~> 1.0)
7473
fastimage (2.4.0)
75-
fastlane (2.228.0)
74+
fastlane (2.229.1)
7675
CFPropertyList (>= 2.3, < 4.0.0)
76+
abbrev (~> 0.1.2)
7777
addressable (>= 2.8, < 3.0.0)
7878
artifactory (~> 3.0)
7979
aws-sdk-s3 (~> 1.0)
8080
babosa (>= 1.0.3, < 2.0.0)
81+
base64 (~> 0.2.0)
8182
bundler (>= 1.12.0, < 3.0.0)
8283
colored (~> 1.2)
8384
commander (~> 4.6)
85+
csv (~> 3.3)
8486
dotenv (>= 2.1.1, < 3.0.0)
8587
emoji_regex (>= 0.1, < 4.0)
8688
excon (>= 0.71.0, < 1.0.0)
@@ -100,7 +102,9 @@ GEM
100102
jwt (>= 2.1.0, < 3)
101103
mini_magick (>= 4.9.4, < 5.0.0)
102104
multipart-post (>= 2.0.0, < 3.0.0)
105+
mutex_m (~> 0.3.0)
103106
naturally (~> 2.2)
107+
nkf (~> 0.2.0)
104108
optparse (>= 0.1.1, < 1.0.0)
105109
plist (>= 3.1.0, < 4.0.0)
106110
rubyzip (>= 2.0.0, < 3.0.0)
@@ -159,7 +163,7 @@ GEM
159163
httpclient (2.9.0)
160164
mutex_m
161165
jmespath (1.6.2)
162-
json (2.15.2)
166+
json (2.16.0)
163167
jwt (2.10.2)
164168
base64
165169
logger (1.7.0)

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ dependencies {
216216
implementation(projects.feature.map)
217217
implementation(projects.feature.node)
218218
implementation(projects.feature.settings)
219+
implementation(projects.feature.firmware)
219220

220221
implementation(libs.androidx.compose.material3.adaptive)
221222
implementation(libs.androidx.compose.material3.navigationSuite)
@@ -230,6 +231,7 @@ dependencies {
230231
implementation(libs.androidx.lifecycle.viewmodel.compose)
231232
implementation(libs.androidx.lifecycle.runtime.compose)
232233
implementation(libs.androidx.navigation.compose)
234+
implementation(libs.androidx.paging.compose)
233235
implementation(libs.coil.network.okhttp)
234236
implementation(libs.coil.svg)
235237
implementation(libs.androidx.hilt.lifecycle.viewmodel.compose)

app/detekt-baseline.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
<ID>CyclomaticComplexMethod:SettingsNavigation.kt$@Suppress("LongMethod") fun NavGraphBuilder.settingsGraph(navController: NavHostController)</ID>
1616
<ID>EmptyClassBlock:DebugLogFile.kt$BinaryLogFile${ }</ID>
1717
<ID>EmptyFunctionBlock:NopInterface.kt$NopInterface${ }</ID>
18-
<ID>EmptyFunctionBlock:NsdManager.kt$&lt;no name provided&gt;${ }</ID>
1918
<ID>EmptyFunctionBlock:TrustAllX509TrustManager.kt$TrustAllX509TrustManager${}</ID>
2019
<ID>FinalNewline:BLEException.kt$com.geeksville.mesh.service.BLEException.kt</ID>
2120
<ID>FinalNewline:Coroutines.kt$com.geeksville.mesh.concurrent.Coroutines.kt</ID>
@@ -64,7 +63,6 @@
6463
<ID>MagicNumber:TCPInterface.kt$TCPInterface$180</ID>
6564
<ID>MagicNumber:TCPInterface.kt$TCPInterface$500</ID>
6665
<ID>MagicNumber:UIState.kt$4</ID>
67-
<ID>MatchingDeclarationName:MeshServiceStarter.kt$ServiceStarter : Worker</ID>
6866
<ID>MaxLineLength:MeshService.kt$MeshService$"Config complete id mismatch: received=$configCompleteId expected one of [$configOnlyNonce,$nodeInfoNonce]"</ID>
6967
<ID>MaxLineLength:MeshService.kt$MeshService$"setOwner Id: $id longName: ${longName.anonymize} shortName: $shortName isLicensed: $isLicensed isUnmessagable: $isUnmessagable"</ID>
7068
<ID>MaxLineLength:MeshService.kt$MeshService.&lt;no name provided&gt;$"sendData dest=${p.to}, id=${p.id} &lt;- ${bytes.size} bytes (connectionState=${connectionStateHolder.connectionState.value})"</ID>
@@ -122,7 +120,6 @@
122120
<ID>TooGenericExceptionCaught:MQTTRepository.kt$MQTTRepository$ex: Exception</ID>
123121
<ID>TooGenericExceptionCaught:MeshService.kt$MeshService$ex: Exception</ID>
124122
<ID>TooGenericExceptionCaught:MeshService.kt$MeshService.&lt;no name provided&gt;$ex: Exception</ID>
125-
<ID>TooGenericExceptionCaught:MeshServiceStarter.kt$ServiceStarter$ex: Exception</ID>
126123
<ID>TooGenericExceptionCaught:NordicBleInterface.kt$NordicBleInterface$e: Exception</ID>
127124
<ID>TooGenericExceptionCaught:NordicBleInterface.kt$NordicBleInterface$t: Throwable</ID>
128125
<ID>TooGenericExceptionCaught:RadioInterfaceService.kt$RadioInterfaceService$t: Throwable</ID>

app/src/main/assets/firmware_releases.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"title": "Meshtastic Firmware 2.7.15.567b8ea Alpha",
3030
"page_url": "https://github.com/meshtastic/firmware/releases/tag/v2.7.15.567b8ea",
3131
"zip_url": "https://github.com/meshtastic/firmware/releases/download/v2.7.15.567b8ea/firmware-esp32-2.7.15.567b8ea.zip",
32-
"release_notes": "## 🚀 What's Changed\r\n* Clean up GPS toggle logging by @jp-bennett in https://github.com/meshtastic/firmware/pull/8629\r\n* Reset the calibration data back to 0 when doing a compass calibration by @jp-bennett in https://github.com/meshtastic/firmware/pull/8648\r\n* Chore(deps): update dorny/test-reporter action to v2.2.0 by @renovate[bot] in https://github.com/meshtastic/firmware/pull/8637\r\n* Fix RPM builds by @vidplace7 in https://github.com/meshtastic/firmware/pull/8659\r\n* Linux: Fix silly EPEL9 mistake by @vidplace7 in https://github.com/meshtastic/firmware/pull/8660\r\n* Fix ble rssi crash by @thebentern in https://github.com/meshtastic/firmware/pull/8661\r\n* Mqtt: do not try to send packets when it disconnected by @omgbebebe in https://github.com/meshtastic/firmware/pull/8658\r\n* Persist favourites on NodeDB reset by @ford-jones in https://github.com/meshtastic/firmware/pull/8292\r\n* Don't ack messages when mqtt client proxy is on but only uplink by @RCGV1 in https://github.com/meshtastic/firmware/pull/8578\r\n* Add API types, state, and log message in Debug screen. Added persistent \"Connected\" icon by @jp-bennett in https://github.com/meshtastic/firmware/pull/8576\r\n* Drop PKI acks if there is no downlink on MQTTClientProxy by @RCGV1 in https://github.com/meshtastic/firmware/pull/8580\r\n* Add the Heltec v4 expansion box. by @Quency-D in https://github.com/meshtastic/firmware/pull/8539\r\n* Update to Pro-micro variants by @NomDeTom in https://github.com/meshtastic/firmware/pull/8600\r\n* Cleanup unnecessary global dereferencing in CryptoEngine by @jasonbcox in https://github.com/meshtastic/firmware/pull/8611\r\n* Fix null pointer dereference in radio chip region check by @Andrik45719 in https://github.com/meshtastic/firmware/pull/8613\r\n* Feat/6704 neighbor info on demand by @DaneEvans in https://github.com/meshtastic/firmware/pull/8523\r\n* Remove fixed scaling in Digital Clock by @Xaositek in https://github.com/meshtastic/firmware/pull/8620\r\n* Allow Preserving Favorites in BaseUI menus by @Xaositek in https://github.com/meshtastic/firmware/pull/8647\r\n* native: Try to look for a config file based on Raspberry Pi HAT vendor by @Stary2001 in https://github.com/meshtastic/firmware/pull/8608\r\n* Remove gating for Display Options by @Xaositek in https://github.com/meshtastic/firmware/pull/8651\r\n* mqtt: do not try to send packets when it disconnected by @omgbebebe in https://github.com/meshtastic/firmware/pull/8658\r\n\r\n## New Contributors\r\n* @weebl2000 made their first contribution in https://github.com/meshtastic/firmware/pull/8560\r\n* @omgbebebe made their first contribution in https://github.com/meshtastic/firmware/pull/8658\r\n* @viric made their first contribution in https://github.com/meshtastic/firmware/pull/7882\r\n\r\n**Full Changelog**: https://github.com/meshtastic/firmware/compare/v2.7.13.597fa0b...v2.7.15.567b8ea"
32+
"release_notes": "> [!WARNING]\r\n> If you experience immediate bluetooth pairing failures or failure to fully boot after updating, this likely indicates that you need to do a full erase and flash. Consider backing up your settings before updating.\r\n\r\n> [!IMPORTANT]\r\n> This release marks the end of legacy (non-private) DMs. Direct messages will only be allowed using PKI going forward.\r\n> This release also disables device telemetry broadcasts over the mesh by default. If you want to opt back in, you will need to re-enable this in the apps. \r\n\r\n## 🚀 What's Changed\r\n* Clean up GPS toggle logging by @jp-bennett in https://github.com/meshtastic/firmware/pull/8629\r\n* Reset the calibration data back to 0 when doing a compass calibration by @jp-bennett in https://github.com/meshtastic/firmware/pull/8648\r\n* Chore(deps): update dorny/test-reporter action to v2.2.0 by @renovate[bot] in https://github.com/meshtastic/firmware/pull/8637\r\n* Fix RPM builds by @vidplace7 in https://github.com/meshtastic/firmware/pull/8659\r\n* Linux: Fix silly EPEL9 mistake by @vidplace7 in https://github.com/meshtastic/firmware/pull/8660\r\n* Fix ble rssi crash by @thebentern in https://github.com/meshtastic/firmware/pull/8661\r\n* Mqtt: do not try to send packets when it disconnected by @omgbebebe in https://github.com/meshtastic/firmware/pull/8658\r\n* Persist favourites on NodeDB reset by @ford-jones in https://github.com/meshtastic/firmware/pull/8292\r\n* Don't ack messages when mqtt client proxy is on but only uplink by @RCGV1 in https://github.com/meshtastic/firmware/pull/8578\r\n* Add API types, state, and log message in Debug screen. Added persistent \"Connected\" icon by @jp-bennett in https://github.com/meshtastic/firmware/pull/8576\r\n* Drop PKI acks if there is no downlink on MQTTClientProxy by @RCGV1 in https://github.com/meshtastic/firmware/pull/8580\r\n* Add the Heltec v4 expansion box. by @Quency-D in https://github.com/meshtastic/firmware/pull/8539\r\n* Update to Pro-micro variants by @NomDeTom in https://github.com/meshtastic/firmware/pull/8600\r\n* Cleanup unnecessary global dereferencing in CryptoEngine by @jasonbcox in https://github.com/meshtastic/firmware/pull/8611\r\n* Fix null pointer dereference in radio chip region check by @Andrik45719 in https://github.com/meshtastic/firmware/pull/8613\r\n* Feat/6704 neighbor info on demand by @DaneEvans in https://github.com/meshtastic/firmware/pull/8523\r\n* Remove fixed scaling in Digital Clock by @Xaositek in https://github.com/meshtastic/firmware/pull/8620\r\n* Allow Preserving Favorites in BaseUI menus by @Xaositek in https://github.com/meshtastic/firmware/pull/8647\r\n* native: Try to look for a config file based on Raspberry Pi HAT vendor by @Stary2001 in https://github.com/meshtastic/firmware/pull/8608\r\n* Remove gating for Display Options by @Xaositek in https://github.com/meshtastic/firmware/pull/8651\r\n* mqtt: do not try to send packets when it disconnected by @omgbebebe in https://github.com/meshtastic/firmware/pull/8658\r\n\r\n## New Contributors\r\n* @weebl2000 made their first contribution in https://github.com/meshtastic/firmware/pull/8560\r\n* @omgbebebe made their first contribution in https://github.com/meshtastic/firmware/pull/8658\r\n* @viric made their first contribution in https://github.com/meshtastic/firmware/pull/7882\r\n\r\n**Full Changelog**: https://github.com/meshtastic/firmware/compare/v2.7.13.597fa0b...v2.7.15.567b8ea"
3333
},
3434
{
3535
"id": "v2.7.14.e959000",
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Copyright (c) 2025 Meshtastic LLC
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.geeksville.mesh.navigation
19+
20+
import androidx.navigation.NavController
21+
import androidx.navigation.NavGraphBuilder
22+
import androidx.navigation.compose.composable
23+
import androidx.navigation.navigation
24+
import org.meshtastic.core.navigation.FirmwareRoutes
25+
import org.meshtastic.feature.firmware.FirmwareUpdateScreen
26+
27+
fun NavGraphBuilder.firmwareGraph(navController: NavController) {
28+
navigation<FirmwareRoutes.FirmwareGraph>(startDestination = FirmwareRoutes.FirmwareUpdate) {
29+
composable<FirmwareRoutes.FirmwareUpdate> { FirmwareUpdateScreen(navController) }
30+
}
31+
}

app/src/main/java/com/geeksville/mesh/navigation/SettingsNavigation.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ fun NavGraphBuilder.settingsGraph(navController: NavHostController) {
135135
ModuleRoute.SERIAL -> SerialConfigScreen(viewModel, onBack = navController::popBackStack)
136136

137137
ModuleRoute.EXT_NOTIFICATION ->
138-
ExternalNotificationConfigScreen(viewModel, onBack = navController::popBackStack)
138+
ExternalNotificationConfigScreen(viewModel = viewModel, onBack = navController::popBackStack)
139139

140140
ModuleRoute.STORE_FORWARD ->
141141
StoreForwardConfigScreen(viewModel, onBack = navController::popBackStack)

app/src/main/java/com/geeksville/mesh/service/MeshService.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,13 +1719,30 @@ class MeshService : Service() {
17191719
// Just replace/add any entry
17201720
updateNodeInfo(info.num) {
17211721
if (info.hasUser()) {
1722-
it.user =
1723-
info.user.copy {
1724-
if (isLicensed) clearPublicKey()
1725-
if (info.viaMqtt) longName = "$longName (MQTT)"
1726-
}
1727-
it.longName = it.user.longName
1728-
it.shortName = it.user.shortName
1722+
// Check if this is a default/unknown user from firmware (node was evicted and re-created)
1723+
val isDefaultName = info.user.longName.matches(Regex("^Meshtastic [0-9a-fA-F]{4}$"))
1724+
val isDefaultHwModel = info.user.hwModel == MeshProtos.HardwareModel.UNSET
1725+
val hasExistingUser = it.user.id.isNotEmpty() && it.user.hwModel != MeshProtos.HardwareModel.UNSET
1726+
1727+
// If firmware sends a default user (evicted node), preserve our existing user data
1728+
val shouldPreserveExisting = hasExistingUser && isDefaultName && isDefaultHwModel
1729+
1730+
if (shouldPreserveExisting) {
1731+
// Firmware sent us a placeholder - keep all our existing user data
1732+
Timber.d(
1733+
"Preserving existing user data for node ${info.num}: " +
1734+
"kept='${it.user.longName}' (hwModel=${it.user.hwModel}), " +
1735+
"skipped default='${info.user.longName}' (hwModel=UNSET)",
1736+
)
1737+
} else {
1738+
it.user =
1739+
info.user.copy {
1740+
if (isLicensed) clearPublicKey()
1741+
if (info.viaMqtt) longName = "$longName (MQTT)"
1742+
}
1743+
it.longName = it.user.longName
1744+
it.shortName = it.user.shortName
1745+
}
17291746
}
17301747

17311748
if (info.hasPosition()) {

app/src/main/java/com/geeksville/mesh/ui/Main.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ import com.geeksville.mesh.model.UIViewModel
8686
import com.geeksville.mesh.navigation.channelsGraph
8787
import com.geeksville.mesh.navigation.connectionsGraph
8888
import com.geeksville.mesh.navigation.contactsGraph
89+
import com.geeksville.mesh.navigation.firmwareGraph
8990
import com.geeksville.mesh.navigation.mapGraph
9091
import com.geeksville.mesh.navigation.nodesGraph
9192
import com.geeksville.mesh.navigation.settingsGraph
@@ -433,6 +434,7 @@ fun MainScreen(uIViewModel: UIViewModel = hiltViewModel(), scanModel: BTScanMode
433434
channelsGraph(navController)
434435
connectionsGraph(navController)
435436
settingsGraph(navController)
437+
firmwareGraph(navController)
436438
}
437439
}
438440
}

0 commit comments

Comments
 (0)