From 1c19ae11e6760ae7cc4a6f0195bf9dc070a45161 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Mon, 4 Sep 2023 20:17:09 -0700 Subject: [PATCH] Clean up object graph updates --- Meshtastic/Extensions/Date.swift | 6 ++- Meshtastic/Helpers/BLEManager.swift | 4 +- Meshtastic/Helpers/MeshPackets.swift | 42 +++++++++---------- Meshtastic/MeshtasticApp.swift | 1 + Meshtastic/Persistence/UpdateCoreData.swift | 2 +- .../Views/Map/Custom/MapViewSwiftUI.swift | 4 +- .../Views/Messages/ChannelMessageList.swift | 4 +- Meshtastic/Views/Nodes/DeviceMetricsLog.swift | 2 +- Meshtastic/Views/Nodes/NodeDetail.swift | 6 --- Meshtastic/Views/Nodes/PositionLog.swift | 11 +++-- 10 files changed, 43 insertions(+), 39 deletions(-) diff --git a/Meshtastic/Extensions/Date.swift b/Meshtastic/Extensions/Date.swift index bac54654..29a60320 100644 --- a/Meshtastic/Extensions/Date.swift +++ b/Meshtastic/Extensions/Date.swift @@ -15,6 +15,10 @@ extension Date { func formattedDate(format: String) -> String { let dateformat = DateFormatter() dateformat.dateFormat = format - return dateformat.string(from: self) + if self > Calendar.current.date(byAdding: .year, value: -5, to: Date())! { + return dateformat.string(from: self) + } else { + return "unknown.age".localized + } } } diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index e3d3e43b..ab010d52 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -28,6 +28,8 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate @Published var isSwitchedOn: Bool = false @Published var automaticallyReconnect: Bool = true @Published var mqttProxyConnected: Bool = false + + @StateObject var appState = AppState.shared public var minimumVersion = "2.0.0" public var connectedVersion: String public var isConnecting: Bool = false @@ -516,6 +518,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate let version = decodedInfo.metadata.firmwareVersion[...(lastDotIndex ?? String.Index(utf16Offset: 6, in: decodedInfo.metadata.firmwareVersion))] nowKnown = true connectedVersion = String(version.dropLast()) + appState.firmwareVersion = connectedVersion } let supportedVersion = connectedVersion == "0.0.0" || self.minimumVersion.compare(connectedVersion, options: .numeric) == .orderedAscending || minimumVersion.compare(connectedVersion, options: .numeric) == .orderedSame @@ -718,7 +721,6 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if toUserNum > 0 { newMessage.toUser = fetchedUsers.first(where: { $0.num == toUserNum }) newMessage.toUser?.lastMessage = Date() - newMessage.toUser?.objectWillChange.send() } newMessage.fromUser = fetchedUsers.first(where: { $0.num == fromUserNum }) newMessage.isEmoji = isEmoji diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 7ee8569e..042fc9d1 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -535,26 +535,26 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana fetchedMessage![0].ackSNR = packet.rxSnr fetchedMessage![0].ackTimestamp = Int32(packet.rxTime) - if fetchedMessage![0].toUser != nil { - fetchedMessage![0].toUser?.objectWillChange.send() - } else { - let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") - fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", connectedNodeNum) - do { - let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] - if fetchedMyInfo?.count ?? 0 > 0 { - - for ch in fetchedMyInfo![0].channels!.array as? [ChannelEntity] ?? [] { - - if ch.index == packet.channel { - ch.objectWillChange.send() - } - } - } - } catch { - - } - } +// if fetchedMessage![0].toUser != nil { +// //fetchedMessage![0].toUser?.objectWillChange.send() +// } else { +// let fetchMyInfoRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MyInfoEntity") +// fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", connectedNodeNum) +// do { +// let fetchedMyInfo = try context.fetch(fetchMyInfoRequest) as? [MyInfoEntity] +// if fetchedMyInfo?.count ?? 0 > 0 { +// +// for ch in fetchedMyInfo![0].channels!.array as? [ChannelEntity] ?? [] { +// +// if ch.index == packet.channel { +// // ch.objectWillChange.send() +// } +// } +// } +// } catch { +// +// } +// } } else { return @@ -765,7 +765,7 @@ func textMessageAppPacket(packet: MeshPacket, blockRangeTest: Bool, connectedNod messageSaved = true if messageSaved { - var appState = AppState.shared + let appState = AppState.shared if newMessage.fromUser != nil && newMessage.toUser != nil && !(newMessage.fromUser?.mute ?? false) { // Set Unread Message Indicators if packet.to == connectedNode { diff --git a/Meshtastic/MeshtasticApp.swift b/Meshtastic/MeshtasticApp.swift index 6092371e..04af0914 100644 --- a/Meshtastic/MeshtasticApp.swift +++ b/Meshtastic/MeshtasticApp.swift @@ -124,5 +124,6 @@ class AppState: ObservableObject { @Published var tabSelection: Tab = .ble @Published var unreadDirectMessages: Int = 0 @Published var unreadChannelMessages: Int = 0 + @Published var firmwareVersion: String = "0.0.0" @Published var connectedNode: NodeInfoEntity? } diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 72bf71a6..1baa6ebc 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -143,7 +143,7 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) print("💥 Error Inserting New Core Data MyInfoEntity: \(nsError)") } newNode.myInfo = myInfoEntity - newNode.objectWillChange.send() + //newNode.objectWillChange.send() } else { // Update an existing node diff --git a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift index 1620f184..62e834b0 100644 --- a/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift +++ b/Meshtastic/Views/Map/Custom/MapViewSwiftUI.swift @@ -409,9 +409,7 @@ struct MapViewSwiftUI: UIViewRepresentable { } func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { switch view.annotation { - case let positionAnnotation as PositionEntity: - print(positionAnnotation) - case let waypointAnnotation as WaypointEntity: + case _ as WaypointEntity: // Only Allow Edit for waypoint annotations with a id if view.tag > 0 { parent.onWaypointEdit(view.tag) diff --git a/Meshtastic/Views/Messages/ChannelMessageList.swift b/Meshtastic/Views/Messages/ChannelMessageList.swift index be3c2911..8780dacb 100644 --- a/Meshtastic/Views/Messages/ChannelMessageList.swift +++ b/Meshtastic/Views/Messages/ChannelMessageList.swift @@ -24,8 +24,8 @@ struct ChannelMessageList: View { var maxbytes = 228 @FocusState var focusedField: Field? - @StateObject var myInfo: MyInfoEntity - @StateObject var channel: ChannelEntity + @ObservedObject var myInfo: MyInfoEntity + @ObservedObject var channel: ChannelEntity @State var showDeleteMessageAlert = false @State private var deleteMessageId: Int64 = 0 @State private var replyMessageId: Int64 = 0 diff --git a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift index a0ef93be..25a161a4 100644 --- a/Meshtastic/Views/Nodes/DeviceMetricsLog.swift +++ b/Meshtastic/Views/Nodes/DeviceMetricsLog.swift @@ -157,7 +157,7 @@ struct DeviceMetricsLog: View { .font(.caption) Text("\(String(format: "%.2f", dm.airUtilTx))%") .font(.caption) - Text(dm.time?.formattedDate(format: dateFormatString) ?? "Unknown time") + Text(dm.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized) .font(.caption) } } diff --git a/Meshtastic/Views/Nodes/NodeDetail.swift b/Meshtastic/Views/Nodes/NodeDetail.swift index cf3b30f8..89814e4a 100644 --- a/Meshtastic/Views/Nodes/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/NodeDetail.swift @@ -64,11 +64,9 @@ struct NodeDetail: View { waypointCoordinate = WaypointCoordinate(id: .init(), coordinate: nil, waypointId: Int64(wpId)) } }, - // visibleMapRect: $mapRect, selectedMapLayer: selectedMapLayer, positions: lastTenThousand, waypoints: Array(waypoints), - // mapViewType: mapType, userTrackingMode: MKUserTrackingMode.none, showNodeHistory: meshMapShowNodeHistory, showRouteLines: meshMapShowRouteLines, @@ -221,10 +219,6 @@ struct NodeDetail: View { deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.shortName : "?") }) - .onAppear { - self.bleManager.context = context - // mapType = .standard// MeshMapTypes(rawValue: meshMapType)?.MKMapTypeValue() ?? .standard - } .task(id: node.num) { if !loadedWeather { do { diff --git a/Meshtastic/Views/Nodes/PositionLog.swift b/Meshtastic/Views/Nodes/PositionLog.swift index 0f28ba3e..4cd48761 100644 --- a/Meshtastic/Views/Nodes/PositionLog.swift +++ b/Meshtastic/Views/Nodes/PositionLog.swift @@ -19,7 +19,11 @@ struct PositionLog: View { @State var exportString = "" var node: NodeInfoEntity @State private var isPresentingClearLogConfirm = false - @State private var sortOrder = [KeyPathComparator(\PositionEntity.latitude)] + //@State private var sortOrder = [KeyPathComparator(\PositionEntity.latitude)] + + @State var sortOrder: [KeyPathComparator] = [ + .init(\.latitude, order: SortOrder.forward) + ] var body: some View { NavigationStack { let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmma", options: 0, locale: Locale.current) @@ -27,7 +31,7 @@ struct PositionLog: View { if UIDevice.current.userInterfaceIdiom == .pad && !useGrid || UIDevice.current.userInterfaceIdiom == .mac { // Add a table for mac and ipad let positions = node.positions?.reversed() as? [PositionEntity] ?? [] - Table(positions) { + Table(positions, sortOrder: $sortOrder) { TableColumn("Latitude") { position in Text(String(format: "%.5f", position.latitude ?? 0)) } @@ -58,6 +62,7 @@ struct PositionLog: View { } .width(min: 180) } + } else { ScrollView { // Use a grid on iOS as a table only shows a single column @@ -97,7 +102,7 @@ struct PositionLog: View { .font(.caption2) Text(altitude.formatted()) .font(.caption2) - Text(mappin.time?.formattedDate(format: dateFormatString) ?? "Unknown time") + Text(mappin.time?.formattedDate(format: dateFormatString) ?? "unknown.age".localized) .font(.caption2) } }