diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift
index 7eb6daaf..0182d71f 100644
--- a/Meshtastic/Helpers/MeshPackets.swift
+++ b/Meshtastic/Helpers/MeshPackets.swift
@@ -686,6 +686,7 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage
let content = UNMutableNotificationContent()
content.title = "Critically Low Battery!"
content.body = "Time to charge your radio, there is \(telemetry.batteryLevel)% battery remaining."
+ content.userInfo["target"] = "node"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let uuidString = UUID().uuidString
let request = UNNotificationRequest(identifier: uuidString, content: content, trigger: trigger)
@@ -748,6 +749,7 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
newMessage.rssi = packet.rxRssi
newMessage.isEmoji = packet.decoded.emoji == 1
newMessage.channel = Int32(packet.channel)
+ newMessage.portNum = Int32(packet.decoded.portnum.rawValue)
if packet.decoded.replyID > 0 {
newMessage.replyID = Int64(packet.decoded.replyID)
@@ -774,7 +776,6 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
messageSaved = true
if messageSaved {
-
if newMessage.fromUser != nil && newMessage.toUser != nil && !(newMessage.fromUser?.mute ?? false) {
// Create an iOS Notification for the received DM message and schedule it immediately
let manager = LocalNotificationManager()
@@ -783,7 +784,9 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
id: ("notification.id.\(newMessage.messageId)"),
title: "\(newMessage.fromUser?.longName ?? "unknown".localized)",
subtitle: "AKA \(newMessage.fromUser?.shortName ?? "???")",
- content: messageText)
+ content: messageText,
+ target: "message"
+ )
]
manager.schedule()
print("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "unknown".localized)")
@@ -810,7 +813,8 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, context: NSM
id: ("notification.id.\(newMessage.messageId)"),
title: "\(newMessage.fromUser?.longName ?? "unknown".localized)",
subtitle: "AKA \(newMessage.fromUser?.shortName ?? "???")",
- content: messageText)
+ content: messageText,
+ target: "message")
]
manager.schedule()
print("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "unknown".localized)")
@@ -876,7 +880,7 @@ func waypointPacket (packet: MeshPacket, context: NSManagedObjectContext) {
title: "New Waypoint Received",
subtitle: "\(icon) \(waypoint.name ?? "Dropped Pin")",
content: "\(waypoint.longDescription ?? "\(latitude), \(longitude)")",
- target: "waypoint"
+ target: "map"
)
]
manager.schedule()
diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV16.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV16.xcdatamodel/contents
index 87e34883..1e80b42a 100644
--- a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV16.xcdatamodel/contents
+++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModelV16.xcdatamodel/contents
@@ -141,6 +141,7 @@
+
diff --git a/Meshtastic/MeshtasticAppDelegate.swift b/Meshtastic/MeshtasticAppDelegate.swift
index c04a1b51..a86e9bf9 100644
--- a/Meshtastic/MeshtasticAppDelegate.swift
+++ b/Meshtastic/MeshtasticAppDelegate.swift
@@ -22,16 +22,17 @@ class MeshtasticAppDelegate: NSObject, UIApplicationDelegate, UNUserNotification
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
let userInfo = response.notification.request.content.userInfo
- if let targetValue = userInfo["target"] as? String, targetValue == "waypoint"
- {
- openWaypoint()
+ let targetValue = userInfo["target"] as? String
+ if targetValue == "map" {
+ AppState.shared.tabSelection = Tab.map
}
-
+ else if targetValue == "message" {
+ AppState.shared.tabSelection = Tab.messages
+ }
+ else if targetValue == "node" {
+ AppState.shared.tabSelection = Tab.nodes
+ }
+
completionHandler()
}
-
- private func openWaypoint()
- {
- AppState.shared.tabSelection = Tab.map
- }
}
diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift
index c11a02b1..83e30709 100644
--- a/Meshtastic/Views/Messages/ChannelMessageList.swift
+++ b/Meshtastic/Views/Messages/ChannelMessageList.swift
@@ -63,12 +63,24 @@ struct ChannelMessageList: View {
VStack(alignment: currentUser ? .trailing : .leading) {
let markdownText: LocalizedStringKey = LocalizedStringKey.init(message.messagePayloadMarkdown ?? (message.messagePayload ?? "EMPTY MESSAGE"))
let linkBlue = Color(red: 0.4627, green: 0.8392, blue: 1) /* #76d6ff */
+ let isDetectionSensorMessage = message.portNum == Int32(PortNum.detectionSensorApp.rawValue)
+
Text(markdownText)
.tint(linkBlue)
.padding(10)
.foregroundColor(.white)
.background(currentUser ? .accentColor : Color(.gray))
.cornerRadius(15)
+ .overlay(
+ VStack {
+ isDetectionSensorMessage ? Image(systemName: "sensor.fill")
+ .padding()
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
+ .foregroundStyle(Color.orange)
+ .offset(x: 20, y: -20)
+ : nil
+ }
+ )
.contextMenu {
VStack {
Text("channel")+Text(": \(message.channel)")
diff --git a/Meshtastic/Views/Nodes/NodeMap.swift b/Meshtastic/Views/Nodes/NodeMap.swift
index 16043adc..eb830668 100644
--- a/Meshtastic/Views/Nodes/NodeMap.swift
+++ b/Meshtastic/Views/Nodes/NodeMap.swift
@@ -16,6 +16,7 @@ struct NodeMap: View {
@EnvironmentObject var bleManager: BLEManager
@ObservedObject var tileManager = OfflineTileManager.shared
+ @StateObject var appState = AppState.shared
@State var selectedMapLayer: MapLayer = UserDefaults.mapLayer
@State var enableMapRecentering: Bool = UserDefaults.enableMapRecentering