2021-12-24 23:41:18 -08:00
|
|
|
|
//
|
2025-10-05 17:51:18 -07:00
|
|
|
|
// UserMessageList.swift
|
|
|
|
|
|
// MeshtasticApple
|
2022-01-01 08:03:46 -08:00
|
|
|
|
//
|
2025-10-05 17:51:18 -07:00
|
|
|
|
// Created by Garth Vander Houwen on 12/24/21.
|
2022-01-01 08:03:46 -08:00
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
import SwiftUI
|
2026-04-16 12:10:00 -07:00
|
|
|
|
import SwiftData
|
2024-06-03 02:17:55 -07:00
|
|
|
|
import OSLog
|
2025-10-05 17:51:18 -07:00
|
|
|
|
import MeshtasticProtobufs // Added to ensure RoutingError is accessible if needed
|
2022-01-01 08:03:46 -08:00
|
|
|
|
|
2022-11-05 08:26:27 -07:00
|
|
|
|
struct UserMessageList: View {
|
2024-07-10 21:17:14 -05:00
|
|
|
|
@EnvironmentObject var appState: AppState
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
|
@EnvironmentObject var accessoryManager: AccessoryManager
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
@Environment(\.scenePhase) var scenePhase
|
2026-04-16 12:10:00 -07:00
|
|
|
|
@Environment(\.modelContext) private var context
|
2024-02-05 23:31:54 -07:00
|
|
|
|
@FocusState var messageFieldFocused: Bool
|
2026-04-16 12:10:00 -07:00
|
|
|
|
@Bindable var user: UserEntity
|
2022-01-01 22:55:25 -08:00
|
|
|
|
@State private var replyMessageId: Int64 = 0
|
2025-05-02 16:54:16 -07:00
|
|
|
|
@State private var messageToHighlight: Int64 = 0
|
2025-10-05 17:51:18 -07:00
|
|
|
|
@State private var redrawTapbacksTrigger = UUID()
|
|
|
|
|
|
@AppStorage("preferredPeripheralNum") private var preferredPeripheralNum = -1
|
2026-04-16 12:10:00 -07:00
|
|
|
|
private var allPrivateMessages: [MessageEntity] {
|
|
|
|
|
|
let sent = user.sentMessages ?? []
|
|
|
|
|
|
let received = user.receivedMessages ?? []
|
|
|
|
|
|
return (sent + received)
|
|
|
|
|
|
.filter { !$0.isEmoji }
|
|
|
|
|
|
.sorted { $0.messageTimestamp < $1.messageTimestamp }
|
2025-10-05 17:51:18 -07:00
|
|
|
|
}
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
|
2025-10-05 17:51:18 -07:00
|
|
|
|
func handleInteractionComplete() {
|
|
|
|
|
|
markMessagesAsRead()
|
|
|
|
|
|
redrawTapbacksTrigger = UUID()
|
|
|
|
|
|
}
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
|
2025-10-05 17:51:18 -07:00
|
|
|
|
func markMessagesAsRead() {
|
|
|
|
|
|
do {
|
|
|
|
|
|
for unreadMessage in allPrivateMessages.filter({ !$0.read }) {
|
|
|
|
|
|
unreadMessage.read = true
|
|
|
|
|
|
}
|
|
|
|
|
|
try context.save()
|
|
|
|
|
|
Logger.data.info("📖 [App] All unread direct messages marked as read for user \(user.num, privacy: .public).")
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
|
|
|
|
|
|
if let connectedPeripheralNum = accessoryManager.activeDeviceNum,
|
|
|
|
|
|
let connectedNode = getNodeInfo(id: connectedPeripheralNum, context: context),
|
|
|
|
|
|
let connectedUser = connectedNode.user {
|
|
|
|
|
|
appState.unreadDirectMessages = connectedUser.unreadMessages(context: context, skipLastMessageCheck: true) // skipLastMessageCheck=true because we don't update lastMessage on our own connected node
|
|
|
|
|
|
}
|
2025-10-05 17:51:18 -07:00
|
|
|
|
} catch {
|
|
|
|
|
|
Logger.data.error("Failed to read direct messages: \(error.localizedDescription, privacy: .public)")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
|
|
|
|
|
|
private func routerIsShowingThisUser() -> Bool {
|
perf: Quick-win performance optimizations for node list and Core Data lookups (#1650)
* feat: improve routing performance with split state, fetch batching, node cache, and debounce
- Split Router's single @Published navigationState into per-tab properties
to reduce spurious re-renders across unrelated views
- Add fetchBatchSize=50 and relationshipKeyPathsForPrefetching to node list
- Optimize in-body array re-sort from 2 filter passes to single pass
- Add in-memory node object ID cache on Router for O(1) lookups
- Add fetchLimit=1 to getNodeInfo for early termination
- Debounce rapid node selection changes with 100ms Task delay
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/9bfe91f2-8ed7-4d2c-bb2e-4ed3dfd3a16c
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Address code review: add debounce constant and thread-safety comment
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/9bfe91f2-8ed7-4d2c-bb2e-4ed3dfd3a16c
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Migrate test project to Swift Testing and add connect view and router tests (#1643)
* Migrate to Swift Testing and add connect view tests
- Convert RouterTests.swift from XCTest to Swift Testing (@Suite, @Test, #expect, #require)
- Create ConnectViewTests.swift with tests for connect view child types:
- Device struct (creation, signal strength, RSSI, description, codable)
- TransportType enum (cases, raw values, codable)
- ConnectionState enum (equality, codable)
- BLESignalStrength enum (raw values, init)
- TransportStatus enum (equality)
- NavigationState (defaults, tabs, sub-states)
- InvalidVersion view (creation with versions)
- ConnectedDevice view (connected/disconnected/MQTT states)
- CircleText view (default/custom sizes, emoji)
- BatteryCompact view (levels, nil, charging, plugged in)
- SignalStrengthIndicator view (dimensions, strength levels)
- Update Xcode project to include new test file
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/d7bb7a89-2105-4fcb-96bc-7ec794467c74
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Fix signal strength test boundary conditions
The getSignalStrength() method uses NSNumber.compare(.orderedDescending),
which is a strict greater-than check. Fix the boundary test cases:
- RSSI -65 is .normal (not .strong), since -65 is not > -65
- RSSI -85 is .weak (not .normal), since -85 is not > -85
- Add -64 → .strong and -84 → .normal as adjacent boundary tests
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/4fcbc01e-cbea-4d11-b2c0-e923c6730d69
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Improve and complete router tests with comprehensive coverage
Added tests for:
- Custom initial state
- Invalid scheme / unknown path handling (state unchanged)
- navigateToNodeDetail public method
- Messages edge cases: channelId only, userNum only, messageId only, non-numeric params
- Nodes with non-numeric nodenum
- Map with both nodenum+waypointId (nodeId priority), non-numeric params
- Parameterized settings test covering all 31 SettingsNavigationState cases
- State transitions: consecutive routes, invalid scheme preserves existing state
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/f69b7352-21aa-494c-8864-31fc0f4b21b8
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Localizable update
* Merge translations file
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
* Fix merge conflicts in PR #1614 (Spanish translations) (#1644)
* 20% of strings translated to spanish
* add more translations
* add rest of translations
* small fixes
---------
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* fix typo in hop limit option description (#1631)
O hop -> 0 hop
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Tak server improvements (#1603)
* added read only mode cot to meshtastic parsing and warning to not enable on pub channel
* better icons
* fully fixed markers
* telemetry support
* Update Meshtastic/Helpers/TAK/TAKServerManager.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fixes
* fixes
* Resolve merge conflicts for PR #1603 (TAK server improvements) (#1645)
* Delete Messages fix
* Bump version to 2.7.9
* Bump widgets version
* TAK Server channel index picker
Create a settings picker for the TAK Server's channel index. This allows users to specify TAK traffic to use the non-primary channel to help reduce channel congestion.
* Changed capitalization from 'environment' to 'Environment' for section header. (#1591)
* Add Danish (da) translations — resolves merge conflicts from PR #1609 (#1612)
* Initial plan
* Add Danish (da) translations from PR #1609
Resolves merge conflicts from PR #1609 by adding Danish translations to the
Localizable.xcstrings file. The PR adds Danish translation strings throughout
the app while preserving all existing translations for other languages.
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Migrate test project to Swift Testing and add connect view and router tests (#1643)
* Migrate to Swift Testing and add connect view tests
- Convert RouterTests.swift from XCTest to Swift Testing (@Suite, @Test, #expect, #require)
- Create ConnectViewTests.swift with tests for connect view child types:
- Device struct (creation, signal strength, RSSI, description, codable)
- TransportType enum (cases, raw values, codable)
- ConnectionState enum (equality, codable)
- BLESignalStrength enum (raw values, init)
- TransportStatus enum (equality)
- NavigationState (defaults, tabs, sub-states)
- InvalidVersion view (creation with versions)
- ConnectedDevice view (connected/disconnected/MQTT states)
- CircleText view (default/custom sizes, emoji)
- BatteryCompact view (levels, nil, charging, plugged in)
- SignalStrengthIndicator view (dimensions, strength levels)
- Update Xcode project to include new test file
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/d7bb7a89-2105-4fcb-96bc-7ec794467c74
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Fix signal strength test boundary conditions
The getSignalStrength() method uses NSNumber.compare(.orderedDescending),
which is a strict greater-than check. Fix the boundary test cases:
- RSSI -65 is .normal (not .strong), since -65 is not > -65
- RSSI -85 is .weak (not .normal), since -85 is not > -85
- Add -64 → .strong and -84 → .normal as adjacent boundary tests
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/4fcbc01e-cbea-4d11-b2c0-e923c6730d69
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Improve and complete router tests with comprehensive coverage
Added tests for:
- Custom initial state
- Invalid scheme / unknown path handling (state unchanged)
- navigateToNodeDetail public method
- Messages edge cases: channelId only, userNum only, messageId only, non-numeric params
- Nodes with non-numeric nodenum
- Map with both nodenum+waypointId (nodeId priority), non-numeric params
- Parameterized settings test covering all 31 SettingsNavigationState cases
- State transitions: consecutive routes, invalid scheme preserves existing state
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/f69b7352-21aa-494c-8864-31fc0f4b21b8
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Localizable update
* Merge translations file
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
* Fix merge conflicts in PR #1614 (Spanish translations) (#1644)
* 20% of strings translated to spanish
* add more translations
* add rest of translations
* small fixes
---------
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* fix typo in hop limit option description (#1631)
O hop -> 0 hop
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Austin Hargis <25471876+austinhargis@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: axunes <axunes@axunes.net>
* Fix merge conflicts
* Merge main into tak-server-improvements to resolve PR #1603 conflicts (#1646)
* Delete Messages fix
* Bump version to 2.7.9
* Bump widgets version
* TAK Server channel index picker
Create a settings picker for the TAK Server's channel index. This allows users to specify TAK traffic to use the non-primary channel to help reduce channel congestion.
* Changed capitalization from 'environment' to 'Environment' for section header. (#1591)
* Add Danish (da) translations — resolves merge conflicts from PR #1609 (#1612)
* Initial plan
* Add Danish (da) translations from PR #1609
Resolves merge conflicts from PR #1609 by adding Danish translations to the
Localizable.xcstrings file. The PR adds Danish translation strings throughout
the app while preserving all existing translations for other languages.
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Migrate test project to Swift Testing and add connect view and router tests (#1643)
* Migrate to Swift Testing and add connect view tests
- Convert RouterTests.swift from XCTest to Swift Testing (@Suite, @Test, #expect, #require)
- Create ConnectViewTests.swift with tests for connect view child types:
- Device struct (creation, signal strength, RSSI, description, codable)
- TransportType enum (cases, raw values, codable)
- ConnectionState enum (equality, codable)
- BLESignalStrength enum (raw values, init)
- TransportStatus enum (equality)
- NavigationState (defaults, tabs, sub-states)
- InvalidVersion view (creation with versions)
- ConnectedDevice view (connected/disconnected/MQTT states)
- CircleText view (default/custom sizes, emoji)
- BatteryCompact view (levels, nil, charging, plugged in)
- SignalStrengthIndicator view (dimensions, strength levels)
- Update Xcode project to include new test file
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/d7bb7a89-2105-4fcb-96bc-7ec794467c74
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Fix signal strength test boundary conditions
The getSignalStrength() method uses NSNumber.compare(.orderedDescending),
which is a strict greater-than check. Fix the boundary test cases:
- RSSI -65 is .normal (not .strong), since -65 is not > -65
- RSSI -85 is .weak (not .normal), since -85 is not > -85
- Add -64 → .strong and -84 → .normal as adjacent boundary tests
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/4fcbc01e-cbea-4d11-b2c0-e923c6730d69
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Improve and complete router tests with comprehensive coverage
Added tests for:
- Custom initial state
- Invalid scheme / unknown path handling (state unchanged)
- navigateToNodeDetail public method
- Messages edge cases: channelId only, userNum only, messageId only, non-numeric params
- Nodes with non-numeric nodenum
- Map with both nodenum+waypointId (nodeId priority), non-numeric params
- Parameterized settings test covering all 31 SettingsNavigationState cases
- State transitions: consecutive routes, invalid scheme preserves existing state
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/f69b7352-21aa-494c-8864-31fc0f4b21b8
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Localizable update
* Merge translations file
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
* Fix merge conflicts in PR #1614 (Spanish translations) (#1644)
* 20% of strings translated to spanish
* add more translations
* add rest of translations
* small fixes
---------
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* fix typo in hop limit option description (#1631)
O hop -> 0 hop
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Austin Hargis <25471876+austinhargis@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: axunes <axunes@axunes.net>
* Merge main into tak-server-improvements to resolve PR #1603 conflicts (#1647)
* Delete Messages fix
* Bump version to 2.7.9
* Bump widgets version
* TAK Server channel index picker
Create a settings picker for the TAK Server's channel index. This allows users to specify TAK traffic to use the non-primary channel to help reduce channel congestion.
* Changed capitalization from 'environment' to 'Environment' for section header. (#1591)
* Add Danish (da) translations — resolves merge conflicts from PR #1609 (#1612)
* Initial plan
* Add Danish (da) translations from PR #1609
Resolves merge conflicts from PR #1609 by adding Danish translations to the
Localizable.xcstrings file. The PR adds Danish translation strings throughout
the app while preserving all existing translations for other languages.
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Migrate test project to Swift Testing and add connect view and router tests (#1643)
* Migrate to Swift Testing and add connect view tests
- Convert RouterTests.swift from XCTest to Swift Testing (@Suite, @Test, #expect, #require)
- Create ConnectViewTests.swift with tests for connect view child types:
- Device struct (creation, signal strength, RSSI, description, codable)
- TransportType enum (cases, raw values, codable)
- ConnectionState enum (equality, codable)
- BLESignalStrength enum (raw values, init)
- TransportStatus enum (equality)
- NavigationState (defaults, tabs, sub-states)
- InvalidVersion view (creation with versions)
- ConnectedDevice view (connected/disconnected/MQTT states)
- CircleText view (default/custom sizes, emoji)
- BatteryCompact view (levels, nil, charging, plugged in)
- SignalStrengthIndicator view (dimensions, strength levels)
- Update Xcode project to include new test file
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/d7bb7a89-2105-4fcb-96bc-7ec794467c74
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Fix signal strength test boundary conditions
The getSignalStrength() method uses NSNumber.compare(.orderedDescending),
which is a strict greater-than check. Fix the boundary test cases:
- RSSI -65 is .normal (not .strong), since -65 is not > -65
- RSSI -85 is .weak (not .normal), since -85 is not > -85
- Add -64 → .strong and -84 → .normal as adjacent boundary tests
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/4fcbc01e-cbea-4d11-b2c0-e923c6730d69
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Improve and complete router tests with comprehensive coverage
Added tests for:
- Custom initial state
- Invalid scheme / unknown path handling (state unchanged)
- navigateToNodeDetail public method
- Messages edge cases: channelId only, userNum only, messageId only, non-numeric params
- Nodes with non-numeric nodenum
- Map with both nodenum+waypointId (nodeId priority), non-numeric params
- Parameterized settings test covering all 31 SettingsNavigationState cases
- State transitions: consecutive routes, invalid scheme preserves existing state
Agent-Logs-Url: https://github.com/meshtastic/Meshtastic-Apple/sessions/f69b7352-21aa-494c-8864-31fc0f4b21b8
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* Localizable update
* Merge translations file
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
* Fix merge conflicts in PR #1614 (Spanish translations) (#1644)
* 20% of strings translated to spanish
* add more translations
* add rest of translations
* small fixes
---------
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
* fix typo in hop limit option description (#1631)
O hop -> 0 hop
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Austin Hargis <25471876+austinhargis@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: axunes <axunes@axunes.net>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Austin Hargis <25471876+austinhargis@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: axunes <axunes@axunes.net>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: garthvh <1795163+garthvh@users.noreply.github.com>
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
Co-authored-by: Joel Pérez Izquierdo <joelperez91@gmail.com>
Co-authored-by: axunes <axunes@axunes.net>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: niccellular <79813408+niccellular@users.noreply.github.com>
Co-authored-by: Austin Hargis <25471876+austinhargis@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2026-04-04 18:51:00 -07:00
|
|
|
|
guard appState.router.selectedTab == .messages else { return false }
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
return scenePhase == .active
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-24 22:06:28 -08:00
|
|
|
|
var body: some View {
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
// Cast user.messageList to an array for easier indexing and ForEach.
|
|
|
|
|
|
let messages: [MessageEntity] = Array(allPrivateMessages)
|
|
|
|
|
|
|
|
|
|
|
|
// Precompute previous message
|
|
|
|
|
|
let previousByID: [Int64: MessageEntity?] = {
|
|
|
|
|
|
var dict = [Int64: MessageEntity?]()
|
|
|
|
|
|
var prev: MessageEntity?
|
|
|
|
|
|
for m in messages { dict[m.messageId] = prev; prev = m }
|
|
|
|
|
|
return dict
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
2023-09-16 08:48:36 -07:00
|
|
|
|
VStack {
|
2022-01-01 15:45:00 -08:00
|
|
|
|
ScrollViewReader { scrollView in
|
2025-10-05 17:51:18 -07:00
|
|
|
|
ScrollView {
|
|
|
|
|
|
LazyVStack {
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
ForEach(messages, id: \.messageId) { message in
|
|
|
|
|
|
let previousMessage: MessageEntity? = previousByID[message.messageId] ?? nil
|
2025-10-05 17:51:18 -07:00
|
|
|
|
|
|
|
|
|
|
UserMessageRow(
|
|
|
|
|
|
message: message,
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
allMessages: messages,
|
2025-10-05 17:51:18 -07:00
|
|
|
|
previousMessage: previousMessage,
|
|
|
|
|
|
preferredPeripheralNum: preferredPeripheralNum,
|
|
|
|
|
|
user: user,
|
|
|
|
|
|
replyMessageId: $replyMessageId,
|
|
|
|
|
|
messageFieldFocused: $messageFieldFocused,
|
|
|
|
|
|
messageToHighlight: $messageToHighlight,
|
|
|
|
|
|
scrollView: scrollView,
|
|
|
|
|
|
onInteractionComplete: handleInteractionComplete
|
|
|
|
|
|
)
|
|
|
|
|
|
.onAppear {
|
2025-10-10 14:07:36 -07:00
|
|
|
|
// Only mark as read if the app is in the foreground
|
|
|
|
|
|
if !message.read && UIApplication.shared.applicationState == .active {
|
|
|
|
|
|
message.read = true
|
|
|
|
|
|
LocalNotificationManager().cancelNotificationForMessageId(message.messageId)
|
|
|
|
|
|
// Race condition, sometimes the app doesn't update unread count if we run this too early
|
|
|
|
|
|
// So, run it in the main queue after everything saves and stabilizes
|
|
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
|
|
markMessagesAsRead()
|
|
|
|
|
|
scrollView.scrollTo("bottomAnchor", anchor: .bottom)
|
|
|
|
|
|
}
|
2025-04-02 17:44:01 -07:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2.7.6 Working Changes (#1479)
* Bump version
* Message list performance fixes into 2.7.6 (#1475)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
* Use mDNS text records for node name
* TCP IP and port on the connection screen
* Hide app icon chooser on mac
* Infinite loop hang bugfixes and performance improvements for both `UserMessageList` and `ChannelMessageList` (#1465)
* 2.7.5 Working Changes (#1460)
* Remove extra want config call when adding a contact
* App badge and unnecessary notification fixes (#1455)
* - Fix for app badge not going to zero if a message arrives while you have that chat open
- Fix for push notifications popping up when a message is received while that chat is open
* Fix for cancelling notifications, works now. And scroll to bottom of conversation upon new message
* Fix: Channels help grammer fix (#1452)
* remove outdated TCP not available on Apple devices (#1450)
* Update initial onboarding view
* remove toggle gating for mac
* Update crash reporting opt out in real time
* Update onboarding text
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* UserEntity: add mostRecentMessage and unreadMessages with early exit when lastMessage is nil, and fetch 1 row (not N) otherwise
* UserList: replace 5 slow calls to user.messageList with new fast calls
* NodeList: always put the connected node at the top of list (if it matches the node filters)
* ChannelEntity: add faster mostRecentPrivateMessage and unreadMessages which fetch 1 row (not N)
* ChannelList: replace 5 calls to channel.allPrivateMessage with new fast calls
* Fix incorrect appState.unreadDirectMessages calculations
* MyInfoEntity: also fix unreadMessages count here to be fast, and use it for appState.unreadChannelMessages
* UserMessageList: use @FetchRequest to prevent the N^2 behavior that was happening in calls to allPrivateMessages
* Refactor ChannelEntityExtension and MyInfoEntityExtension to be more similar to UserEntityExtension
* Remove SwiftUI-infinite-loop-causing `.id(redrawTapbacksTrigger)` in ChannelMessageList and UserMessageList (duplicate row ids)
* MyInfoEntityExtension: exclude emoji tapbacks (which never get marked as read anyway) from unread message count
* Add SaveChannelLinkData so MessageText and MeshtasticApp can use .sheet(item: ...) and avoid infinite loop hang due to Binding rebuild
* ChannelMessageList and UserMessageList: switch to stable messageId for ForEach SwiftUI row identity
* ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification
* ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear
* ChannelMessageList and UserMessageList: block spurious markMessagesAsRead when this View is not active
---------
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
* message-list-performance: revert scrolling changes (#1472)
* Revert e0f0b4a0f749d2e83946f2c1297e5c97c9fdf46e (ChannelMessageList and UserMessageList: scroll to bottom onFirstAppear)
* Revert "ChannelMessageList and UserMessageList: debouncedScrollToBottom; keyboardWillShowNotification/keyboardDidShowNotification"
This reverts commit ee1a7c44157eb6970ec2111fc1ac4d67a44a8238.
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
* Explicitly set unmessagable, seems unnessary
* Add back missing mesh map features
* Fix: "Retrieving nodes" significantly slower after reconnect extracted from #1424 (#1477)
* Fix: "Retrieving nodes" significantly slower after reconnect (#1424)
The node database retrieval was calling context.save() for every single
NodeInfo packet received (250 saves for 250 nodes). This caused severe
performance degradation on reconnect when CoreData had accumulated state.
Root Cause:
- nodeInfoPacket() called context.save() immediately for each node
- With 250 nodes, this meant 250 individual CoreData save operations
- On first connection, CoreData is fresh and fast
- On reconnect, CoreData has accumulated change tracking, undo management,
and memory pressure, making each save progressively slower
- This resulted in 10+ second retrieval times vs 1-2 seconds initially
Solution:
- Added deferSave parameter to nodeInfoPacket() function
- During database retrieval (.retrievingDatabase state), defer all saves
- Perform a single batch save when database retrieval completes
(when NONCE_ONLY_DB configCompleteID is received)
- This reduces 250 saves to 1 save
Performance Impact:
- Eliminates N individual saves during node database sync
- Reduces database retrieval time back to 1-2 seconds on reconnect
- Matches first-connection performance consistently
Fixes #1424
* Revert *MessageListUnified files
---------
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Hide route lines filter from mesh map
* Mesh Map: fuzz imprecise locations so they're distinguishable and clickable at the highest zoom levels (#1478)
Co-authored-by: Garth Vander Houwen <garth@meshtastic.com>
* Fix bad merge
* Update Meshtastic/Extensions/CoreData/UserEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Nodes/Helpers/Map/MapContent/MeshMapContent.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/MyInfoEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Extensions/CoreData/ChannelEntityExtension.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Keep list of previous manual connections (#1484)
* Keep list of previous manual connections
* More descriptive manual connection rows
* Merge fixes and new way to show IP on Connect view
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Show who relayed messages (#1486)
* Add identification for node that relayed text messages and add count for ammount of relayers of your message
* Ack Relays
* upsertPositionPacket: don't use future timestamps to set node's lastHeard (#1488)
* R1 NEO
* Neo
* Update Meshtastic/Views/Settings/AppSettings.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove bad if
* Git rid of extra environment variable
* Update Meshtastic/Accessory/Transports/TCP/TCPTransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* MeshMap performance: quick wins (#1490)
* MeshMap: change onMapCameraChange frequency to .onEnd so that zooming doesn't cause continuous SwiftUI reevaluation on every frame
* MeshMapContent: factor out reducedPrecisionMapCircles into a separate function
* MeshMapContent: when multiple reducedPrecisionCircles have the same (lat,lon,radius), just draw one (big perf boost in dense areas)
* NodeMap performance improvements for high # positions history (#1480)
* NodeMapContent: move Route Lines out of ForEach
* NodeMapContent: move Convex Hull out of ForEach
* NodeMapContent: Replace `position.nodePosition?` with `node`
* NodeMapContent: drop unnecessary LazyVStack in showNodeHistory
* NodeMapContent: hoist out nodeColorSwift
* Move lineCoords, loraCoords calculations within showRouteLines, showConvexHull respectively
* Hoist out repeated node.metadata?.positionFlags lookups / PositionFlags creation
* NodeMapContent: remove unused @State
* NodeMapSwiftUI: add NodeMapContentEquatableWrapper and NodeMapContentSignature to prevent frequent NodeMapContent recomputation and infinite render loops
* NodeMapSwiftUI: disable animation during SwiftUI transactions
* NodeMapContent: hoist nodeBorderColor and set allowsHitTesting(false) on history point views
* NodeMapContent: prerenderHistoryPointCircle and prerenderHistoryPointArrow to avoid thousands of vector draw operations
* NodeMapContent: Shared coordinate list for Route Lines and Convex Hull
* NodeMapContent.prerenderHistoryPointArrow: add .frame(width: 16, height: 16)
* Fix wantRangeTestPackets to correctly follow rangeTestConfig.enabled (#1489)
* Fix interval drop down formatter
* Clean up channel qr code functionality.
* perferredPeripheralId fix
* Set opt in
* Retry once 5 second timer. dont throw the error
* Queue for peripherals
* Fix: hoplimit of dms would always fallback to hops away of the node even when configured hops was higher (#1495)
* fix hops setting in dms
* Fix hops for exchange position
* Final fix
* Don't favorite client base
* Update device hardware
* Prevent nil environment metrics
* Bump datadog sdk
* fix setting device telemetry enabled (#1515)
* Update Muzi R1 Neo to actively supported
* fix setting device telemetry enabled
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Don't subscribe to mqtt topic if downlink is not on (#1501)
* Dont sub if no downlink
* moved reload mqtt connect config
* Preview enabled in connected devices (#1509)
* Update Muzi R1 Neo to actively supported
* Preview enabled in connected devices
* Fixing indentation
* Fixing indentation
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* UpdateCoreData.updateAnyPacketFrom: mirror firmware's lastHeard/snr/rssi/hopsAway update logic from NodeDB::updateFrom (#1492)
* `CLIENT_BASE` add-favorite/role-change confirmation dialog (#1493)
* FavoriteNodeButton: refactor task out
* AccessoryManager.connectedDeviceRole helper
* FavoriteNodeButton: show confirmation dialog when a CLIENT_BASE is trying to add a favorite
* addContactFromURL: add comment referencing upcoming change in https://github.com/meshtastic/firmware/pull/8495
* DeviceConfig: role picker: show a warning when selecting CLIENT_BASE, similar to warning shown for ROUTER
* Adjust device configuration Client Base warning text
* Compass view (#1521)
* Added compass view
* Added Compass View
* Node colors in compass
* Update Muzi R1 Neo to actively supported
* Update PositionPopover.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Helpers/CompassView.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Remove discovery queue
* revert problematic retry functionalliy
* format file
* Update & improve zh-Hans translation (#1523)
* Update Muzi R1 Neo to actively supported
* update & improve zh-Hans translation
rt
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Update protobufs to 2.7.1
* Add long-turbo preset
* Disable Range Test module when primary channel is public/unsecured (#1512)
* Update Muzi R1 Neo to actively supported
* Disable Range Test module when primary channel is public/unsecured
Updated RangeTestConfig.swift to determine whether the primary channel (index 0) is operating without encryption or with a 1-byte minimal PSK.
Disabled Range Test UI controls when on a public/default channel to prevent user interaction.
Added safety enforcement in the save operation: Range Test enabled flag is automatically forced to false before sending updates to the device.
Introduced a computed property isPrimaryChannelPublic following existing code patterns and security indicators (e.g., hexDescription PSK length).
Matches the behavior implemented in the Android client for consistent policy across platforms.
---------
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
* Add new device images
* Remove print statement, get rid of cut and paste error
---------
Co-authored-by: Gnome Adrift <646322+gnomeadrift@users.noreply.github.com>
Co-authored-by: Zain Kergaye <62440012+ZainKergaye@users.noreply.github.com>
Co-authored-by: NillRudd <102033730+NillRudd@users.noreply.github.com>
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Mike Robbins <mrobbins@alum.mit.edu>
Co-authored-by: Martin Bogomolni <martinbogo@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Jonathan Bennett <jbennett@incomsystems.biz>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
Co-authored-by: Charles Pinesky <25388414+Vaidios@users.noreply.github.com>
Co-authored-by: Radio <35003866+radiolee@users.noreply.github.com>
Co-authored-by: Jason Houk <dubsectordevelopment@gmail.com>
2025-12-21 12:15:01 -08:00
|
|
|
|
|
2025-04-24 18:11:58 -07:00
|
|
|
|
}
|
2025-10-05 17:51:18 -07:00
|
|
|
|
// Invisible spacer to detect reaching bottom
|
|
|
|
|
|
Color.clear
|
|
|
|
|
|
.frame(height: 1)
|
|
|
|
|
|
.id("bottomAnchor")
|
2025-02-06 20:01:26 -05:00
|
|
|
|
}
|
2025-10-05 17:51:18 -07:00
|
|
|
|
}
|
|
|
|
|
|
.defaultScrollAnchor(.bottom)
|
|
|
|
|
|
.defaultScrollAnchorTopAlignment()
|
|
|
|
|
|
.defaultScrollAnchorBottomSizeChanges()
|
|
|
|
|
|
.scrollDismissesKeyboard(.immediately)
|
|
|
|
|
|
.onChange(of: messageFieldFocused) {
|
|
|
|
|
|
if messageFieldFocused {
|
|
|
|
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
|
|
|
|
|
scrollView.scrollTo("bottomAnchor", anchor: .bottom)
|
2025-04-24 18:11:58 -07:00
|
|
|
|
}
|
2022-10-17 18:52:49 -07:00
|
|
|
|
}
|
2024-10-05 15:50:57 -07:00
|
|
|
|
}
|
2022-01-01 15:45:00 -08:00
|
|
|
|
}
|
2024-02-05 23:31:54 -07:00
|
|
|
|
TextMessageField(
|
2024-02-17 13:26:09 -07:00
|
|
|
|
destination: .user(user),
|
2024-02-05 23:31:54 -07:00
|
|
|
|
replyMessageId: $replyMessageId,
|
|
|
|
|
|
isFocused: $messageFieldFocused
|
2025-09-08 20:19:29 -07:00
|
|
|
|
)
|
2022-01-01 15:45:00 -08:00
|
|
|
|
}
|
2025-09-08 20:19:29 -07:00
|
|
|
|
.navigationBarTitleDisplayMode(.inline)
|
2022-01-01 08:03:46 -08:00
|
|
|
|
.toolbar {
|
2025-08-13 21:09:11 -07:00
|
|
|
|
if !user.keyMatch {
|
|
|
|
|
|
ToolbarItem(placement: .bottomBar) {
|
|
|
|
|
|
VStack {
|
|
|
|
|
|
HStack {
|
|
|
|
|
|
Image(systemName: "key.slash.fill")
|
|
|
|
|
|
.symbolRenderingMode(.multicolor)
|
|
|
|
|
|
.foregroundStyle(.red)
|
|
|
|
|
|
.font(.caption2)
|
|
|
|
|
|
Text("There is an issue with this contact's public key.")
|
|
|
|
|
|
.foregroundStyle(.secondary)
|
|
|
|
|
|
.font(.caption2)
|
|
|
|
|
|
}
|
|
|
|
|
|
Link(destination: URL(string: "meshtastic:///nodes?nodenum=\(user.num)")!) {
|
|
|
|
|
|
Text("Details...")
|
|
|
|
|
|
.font(.caption2)
|
|
|
|
|
|
.offset(y: -15)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.offset(y: -15)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-01-01 08:03:46 -08:00
|
|
|
|
ToolbarItem(placement: .principal) {
|
|
|
|
|
|
HStack {
|
2023-09-02 18:02:51 -07:00
|
|
|
|
CircleText(text: user.shortName ?? "?", color: Color(UIColor(hex: UInt32(user.num))), circleSize: 44)
|
2025-10-05 17:51:18 -07:00
|
|
|
|
Text(user.longName ?? "Unknown").font(.headline)
|
2022-01-01 08:03:46 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
|
|
|
|
ZStack {
|
|
|
|
|
|
ConnectedDevice(
|
Transports Interface to Support TCP for all Platforms and Serial on Mac (#1341)
* Initial implementation of transports
* Initial LogRadio implementation
* Fixes for Settings view (caused by debug commenting)
* Refinement of the object and actor model
* Connect view text and tab updates
* Fix mac catalyst and tests
* Warning and logging clean-up
* In progress commit
* Serial Transport and Reconnect draft work
* Serial transport and reconnection draft work
* Quick fix for BLE - still more work to do
* interim commit
* More in progress changes
* Minor improvements
* Pretty good initial implementation
* Bump version beyond the app store
* Fix for disconnection swipeAction
* Tweaks to TCPConnection implementation
* Retry for NONCE_ONLY_DB
* Revert json string change
* Simplified some of the API + "Anti-discovery"
* Tweaks for devices leaving the discovery process
* Bump version
* iOS26 Tweaks
* Tweaks and bug fixes
* Add link with slash sf symbol
* update symbol image on connect view
* BLE disconnect handling
* Log privacy attributes
* Onboarding and minor fixes.
* change database to nodes, add emoji to tcp logs
* Error handling improvements
* More logging emojis
* Suppressed unnecessary errors on disconnect
* Heartbeat emoji
* Add bluetooth symbol
* add privacy attributes to [TCP] logs, add custom bluetooth logo
* Improve routing logs
* Emoji for connect logs
* Heartbeat emoji
* Add CBCentralManagerScanOptionAllowDuplicatesKey options to central for bluetooth
* fix nav errors by switching from observableobject to state
* Update connection indicator icon
* fix for BLE disconnects
* Connection process fixes
* More fixes/tweaks to connection process
* Strict concurrency
* Fix some warnings, remove wifi warning
* delete stale keys
* interim commit
* Update privacy for log, fix wrong space
* fix a couple of linting items
* Switch to targeted
* interim commit
* BLE Signal strenth on connect view
* Remove BLE RSSI from long press menu
* Modem lights
* minor spacing tweak
* Additional BLE logging and a scanning fix.
* Discovery and BLE RSSI improvements
* Background suspension
* Update isConnected to enable UI during db load
* update protobufs
* Replace config if statements with switches, Fix unknown module config logging, make dark mode modem circle stroke color white so they are visible
* Additional logging cleanup
* hast
* Set unmessagable to true if the longname has the unmessagable emoji
* Connect error handling improvements
* Admin popup list icon and activity lights updates
* Revert use of .toolbar back to .navigationBarItems
* More public logging
* Better BLE error handling
* Node DB progress meter
* minor tweak to activity light interaction timing
* Fix comment linting, remove stale keys
* Remove stale keys
* Easy linting fixes
* Two more simple linting fixes
* clean up meshtasticapp
* More public logging
* Replay config
* Logging
* Fix for unselected node on Settings
* Tweak to progress meter based on device idiom
* Update protos
* Session replay redaction of messages
* Serial fix for old devices, and a let statement
* Mask text too
* Fix typo
* BLE poweredOff is now an auto-reconnectable error
* Update logging
* Fix for peerRemovedPairingInformation
* Logging for BLE peripheral:didUpdateValueFor errors.
* Fix for inconsistent swipe disconnect behavior
* periperal:didUpdateValueFor error handling
* Fix for BLEConnection continuation guarding
* BLEConnection actor deadlock on disconnect
* Heartbeat nonce
* Fix for swipe disconnect and task cancellation
* Fix for swipe actions not honoring .disabled()
* Tell BLETransport when BLEConnection is cancelled
* Update navigation logging
* Logging updates
* Bump version to 2.7.0
* Organize into folders and heartbeat stuff
* Minor improvements to manual TCP connection
* Auto-connect toggle
* Possible BLE bug, still waiting to see in logs
* Concurrency tweaks
* Concurrency improvements
* requestDeviceMetadata fix. fixes remote admin
* Minor typo fixes
* "All" button for log filters: category and level
* More robust continuation handling for BLE
* @FetchRequest based ChannelMessageList
* Update info.plist and device hardware file
* Move auto connect toggle to app settings and debug mode, tint properly with the accent color
* Add label to auto connect toggle
* Update log for node info received from ourselves over the mesh
* Remove unused scrollViewProxy
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update target for connect view
* Properly Set datadog environment
* Comment out ble manager
* Adjust cyclomatic complexity thresholds in .swiftlint.yml
* Linting fixes, delete ble manager
* Make session replay debug only
---------
Co-authored-by: jake-b <jake-b@users.noreply.github.com>
Co-authored-by: jake <jake@jakes-Mac-mini.local>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-27 08:09:02 -07:00
|
|
|
|
deviceConnected: accessoryManager.isConnected,
|
|
|
|
|
|
name: accessoryManager.activeConnection?.device.shortName ?? "?")
|
2022-01-01 08:03:46 -08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-12-24 22:06:28 -08:00
|
|
|
|
}
|
2022-01-01 08:03:46 -08:00
|
|
|
|
}
|