From f5ad2454bb8f02e07ef83976a0a3940d1201519f Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Fri, 12 Sep 2025 23:03:38 -0700 Subject: [PATCH] 2.7.1 Working Changes 2 (#1393) * Bump version * Offset for map controls on the mesh map * Only mark messages as read if they are unread (#1388) * Only mark messages as read if they are unread * More cheap optimizations * Fix map control positions on the route recorder * Add seperate state variable for delete all channel messges button since the channelSelection is being used for navigation * Use a seperate state variable to track what user messages are being deleted for as userSelection is being used for navigation * Get the ringtone if external notifications is enabled * Fix RTTTL typo * Dont show modem lights popover if we are on macOS 26 cause it crashes * Fix annoying connect bottom background bug * Update mesh map detents * Move divider inside of the hstack keyboard toolbar * Update Meshtastic/Helpers/MeshPackets.swift Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Remove extra environment variable that is not getting used * Fix ack time for 24hour locales, only hide TLS setting for the public MQTT broker * Icon Composer Icon (#1374) * Icon Composer Icon * Tweaks to icon --------- Co-authored-by: Jake-B * Move if statement out of if statement * Update Meshtastic/Views/Helpers/RXTXIndicatorView.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: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: jake-b <1012393+jake-b@users.noreply.github.com> Co-authored-by: Jake-B --- Meshtastic.xcodeproj/project.pbxproj | 10 + .../Assets/Icon Grid Inner Circle.svg | 15 ++ .../Assets/Icon Grid Inner Stroke.svg | 15 ++ .../Assets/Icon Grid Middle Circle.svg | 15 ++ .../Assets/Icon Grid Middle Stroke 3.svg | 7 + .../Assets/Icon Grid Outer Circle.svg | 15 ++ .../Assets/Icon Grid Outer Stroke 2.svg | 7 + .../AppIcon.icon/Assets/Icon Grid.svg | 61 ++++++ .../AppIcon.icon/Assets/Meshtastic Logo.svg | 12 ++ Meshtastic/Resources/AppIcon.icon/icon.json | 186 ++++++++++++++++++ .../Assets/Icon Grid Inner Circle.svg | 15 ++ .../Assets/Icon Grid Inner Stroke.svg | 15 ++ .../Assets/Icon Grid Middle Circle.svg | 15 ++ .../Assets/Icon Grid Middle Stroke 3.svg | 7 + .../Assets/Icon Grid Outer Circle.svg | 15 ++ .../Assets/Icon Grid Outer Stroke 2.svg | 7 + .../AppIconDebug.icon/Assets/Icon Grid.svg | 61 ++++++ .../Assets/Meshtastic Logo.svg | 12 ++ .../Resources/AppIconDebug.icon/icon.json | 183 +++++++++++++++++ .../Views/Helpers/RXTXIndicatorView.swift | 2 +- .../Messages/MessageContextMenuItems.swift | 2 +- Meshtastic/Views/Messages/MessageText.swift | 6 + .../Settings/Config/Module/MQTTConfig.swift | 12 +- 23 files changed, 687 insertions(+), 8 deletions(-) create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Circle.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Stroke.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Circle.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Stroke 3.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Circle.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Stroke 2.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/Assets/Meshtastic Logo.svg create mode 100644 Meshtastic/Resources/AppIcon.icon/icon.json create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Circle.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Stroke.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Circle.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Stroke 3.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Circle.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Stroke 2.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/Assets/Meshtastic Logo.svg create mode 100644 Meshtastic/Resources/AppIconDebug.icon/icon.json diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index a2333832..76cc973d 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -24,6 +24,8 @@ 231B3F272D0885240069A07D /* MetricsColumnDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231B3F262D0885240069A07D /* MetricsColumnDetail.swift */; }; 232ED4C32E2C5E89009DA392 /* TCPTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232ED4C22E2C5E89009DA392 /* TCPTransport.swift */; }; 232ED4C52E2C5EDD009DA392 /* TCPConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232ED4C42E2C5EDD009DA392 /* TCPConnection.swift */; }; + 2339EA982E6C65570032C234 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = 2339EA972E6C65570032C234 /* AppIcon.icon */; }; + 2339EA9A2E6C65DC0032C234 /* AppIconDebug.icon in Resources */ = {isa = PBXBuildFile; fileRef = 2339EA992E6C65DC0032C234 /* AppIconDebug.icon */; }; 233E99B62D849C3D00CC3A77 /* WeatherConditionsCompactWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233E99B52D849C3D00CC3A77 /* WeatherConditionsCompactWidget.swift */; }; 233E99B82D849C6500CC3A77 /* HumidityCompactWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233E99B72D849C6500CC3A77 /* HumidityCompactWidget.swift */; }; 233E99BA2D849C7000CC3A77 /* PressureCompactWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233E99B92D849C7000CC3A77 /* PressureCompactWidget.swift */; }; @@ -329,6 +331,8 @@ 231B3F262D0885240069A07D /* MetricsColumnDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetricsColumnDetail.swift; sourceTree = ""; }; 232ED4C22E2C5E89009DA392 /* TCPTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCPTransport.swift; sourceTree = ""; }; 232ED4C42E2C5EDD009DA392 /* TCPConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TCPConnection.swift; sourceTree = ""; }; + 2339EA972E6C65570032C234 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = ""; }; + 2339EA992E6C65DC0032C234 /* AppIconDebug.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIconDebug.icon; sourceTree = ""; }; 233E99B32D84969500CC3A77 /* MeshtasticDataModelV 50.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 50.xcdatamodel"; sourceTree = ""; }; 233E99B52D849C3D00CC3A77 /* WeatherConditionsCompactWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherConditionsCompactWidget.swift; sourceTree = ""; }; 233E99B72D849C6500CC3A77 /* HumidityCompactWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HumidityCompactWidget.swift; sourceTree = ""; }; @@ -1192,6 +1196,8 @@ DDC2E18926CE24F70042C5E4 /* Resources */ = { isa = PBXGroup; children = ( + 2339EA992E6C65DC0032C234 /* AppIconDebug.icon */, + 2339EA972E6C65570032C234 /* AppIcon.icon */, DDB75A192A05EB67006ED576 /* alpha.png */, DDC2E15B26CE248F0042C5E4 /* Assets.xcassets */, DD0E21002B8A6BC500F2D100 /* DeviceHardware.json */, @@ -1510,6 +1516,8 @@ DDC2E15F26CE248F0042C5E4 /* Preview Assets.xcassets in Resources */, 25AECD4F2C2F723200862C8E /* Localizable.xcstrings in Resources */, DDDE5A1329AFEAB900490C6C /* Assets.xcassets in Resources */, + 2339EA9A2E6C65DC0032C234 /* AppIconDebug.icon in Resources */, + 2339EA982E6C65570032C234 /* AppIcon.icon in Resources */, DDB75A1A2A05EB67006ED576 /* alpha.png in Resources */, DDC2E15C26CE248F0042C5E4 /* Assets.xcassets in Resources */, DD0E21012B8A6F1300F2D100 /* DeviceHardware.json in Resources */, @@ -2028,6 +2036,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Meshtastic/Meshtastic.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -2061,6 +2070,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + ASSETCATALOG_OTHER_FLAGS = "--enable-icon-stack-fallback-generation=disabled"; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Meshtastic/Meshtastic.entitlements; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Circle.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Circle.svg new file mode 100644 index 00000000..cfa31aff --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Stroke.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Stroke.svg new file mode 100644 index 00000000..33921482 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Inner Stroke.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Circle.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Circle.svg new file mode 100644 index 00000000..855a80a6 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Stroke 3.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Stroke 3.svg new file mode 100644 index 00000000..fd44920e --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Middle Stroke 3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Circle.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Circle.svg new file mode 100644 index 00000000..532e8f71 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Stroke 2.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Stroke 2.svg new file mode 100644 index 00000000..3692f999 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid Outer Stroke 2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid.svg new file mode 100644 index 00000000..d14cc1f6 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Icon Grid.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/Assets/Meshtastic Logo.svg b/Meshtastic/Resources/AppIcon.icon/Assets/Meshtastic Logo.svg new file mode 100644 index 00000000..faa78ec7 --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/Assets/Meshtastic Logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIcon.icon/icon.json b/Meshtastic/Resources/AppIcon.icon/icon.json new file mode 100644 index 00000000..569a1a8c --- /dev/null +++ b/Meshtastic/Resources/AppIcon.icon/icon.json @@ -0,0 +1,186 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.20392,0.78039,0.34902,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "fill-specializations" : [ + { + "value" : { + "automatic-gradient" : "extended-gray:0.00000,1.00000" + } + }, + { + "appearance" : "dark", + "value" : { + "automatic-gradient" : "display-p3:0.51705,0.94704,0.59696,1.00000" + } + }, + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "glass" : true, + "hidden" : false, + "image-name" : "Meshtastic Logo.svg", + "name" : "Meshtastic Logo" + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid Inner Stroke.svg", + "name" : "Icon Grid Inner Stroke", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.7 + } + ] + }, + { + "hidden" : true, + "image-name" : "Icon Grid Inner Circle.svg", + "name" : "Icon Grid Inner Circle" + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid Middle Stroke 3.svg", + "name" : "Icon Grid Middle Stroke 3", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.7 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid Middle Circle.svg", + "name" : "Icon Grid Middle Circle", + "opacity-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 0.15 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid Outer Stroke 2.svg", + "name" : "Icon Grid Outer Stroke 2", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.7 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid Outer Circle.svg", + "name" : "Icon Grid Outer Circle", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.2 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : true, + "image-name" : "Icon Grid.svg", + "name" : "Icon Grid", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.7 + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 25 + ] + } + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + -3.6015625, + -31.94921875 + ] + }, + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Circle.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Circle.svg new file mode 100644 index 00000000..cfa31aff --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Stroke.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Stroke.svg new file mode 100644 index 00000000..33921482 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Inner Stroke.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Circle.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Circle.svg new file mode 100644 index 00000000..855a80a6 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Stroke 3.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Stroke 3.svg new file mode 100644 index 00000000..fd44920e --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Middle Stroke 3.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Circle.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Circle.svg new file mode 100644 index 00000000..532e8f71 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Circle.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Stroke 2.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Stroke 2.svg new file mode 100644 index 00000000..3692f999 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid Outer Stroke 2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid.svg new file mode 100644 index 00000000..d14cc1f6 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Icon Grid.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/Assets/Meshtastic Logo.svg b/Meshtastic/Resources/AppIconDebug.icon/Assets/Meshtastic Logo.svg new file mode 100644 index 00000000..faa78ec7 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/Assets/Meshtastic Logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Meshtastic/Resources/AppIconDebug.icon/icon.json b/Meshtastic/Resources/AppIconDebug.icon/icon.json new file mode 100644 index 00000000..bf99f316 --- /dev/null +++ b/Meshtastic/Resources/AppIconDebug.icon/icon.json @@ -0,0 +1,183 @@ +{ + "fill" : { + "automatic-gradient" : "extended-srgb:0.20392,0.78039,0.34902,1.00000" + }, + "groups" : [ + { + "layers" : [ + { + "fill-specializations" : [ + { + "value" : { + "automatic-gradient" : "extended-gray:0.00000,1.00000" + } + }, + { + "appearance" : "dark", + "value" : { + "automatic-gradient" : "display-p3:0.51705,0.94704,0.59696,1.00000" + } + }, + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "glass" : true, + "hidden" : false, + "image-name" : "Meshtastic Logo.svg", + "name" : "Meshtastic Logo" + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : false, + "image-name" : "Icon Grid Inner Stroke.svg", + "name" : "Icon Grid Inner Stroke", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 1 + } + ] + }, + { + "hidden" : false, + "image-name" : "Icon Grid Inner Circle.svg", + "name" : "Icon Grid Inner Circle" + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "image-name" : "Icon Grid Middle Stroke 3.svg", + "name" : "Icon Grid Middle Stroke 3", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 1 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : false, + "image-name" : "Icon Grid Middle Circle.svg", + "name" : "Icon Grid Middle Circle", + "opacity-specializations" : [ + { + "value" : 1 + }, + { + "appearance" : "tinted", + "value" : 0.15 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "image-name" : "Icon Grid Outer Stroke 2.svg", + "name" : "Icon Grid Outer Stroke 2", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 1 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "automatic-gradient" : "extended-gray:1.00000,1.00000" + } + } + ], + "hidden" : false, + "image-name" : "Icon Grid Outer Circle.svg", + "name" : "Icon Grid Outer Circle", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 0.2 + } + ] + }, + { + "fill-specializations" : [ + { + "appearance" : "tinted", + "value" : { + "solid" : "extended-gray:1.00000,1.00000" + } + } + ], + "image-name" : "Icon Grid.svg", + "name" : "Icon Grid", + "opacity-specializations" : [ + { + "appearance" : "tinted", + "value" : 1 + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + 0, + 25 + ] + } + } + ], + "position" : { + "scale" : 1, + "translation-in-points" : [ + -3.6015625, + -31.94921875 + ] + }, + "shadow" : { + "kind" : "neutral", + "opacity" : 0.5 + }, + "translucency" : { + "enabled" : true, + "value" : 0.5 + } + } + ], + "supported-platforms" : { + "circles" : [ + "watchOS" + ], + "squares" : "shared" + } +} \ No newline at end of file diff --git a/Meshtastic/Views/Helpers/RXTXIndicatorView.swift b/Meshtastic/Views/Helpers/RXTXIndicatorView.swift index d7e57326..25168718 100644 --- a/Meshtastic/Views/Helpers/RXTXIndicatorView.swift +++ b/Meshtastic/Views/Helpers/RXTXIndicatorView.swift @@ -31,7 +31,7 @@ struct RXTXIndicatorWidget: View { } #if targetEnvironment(macCatalyst) if #available(macOS 26.0, *) { - // Dont show popover that crashes on mac 26 + // Don't show popover that crashes on mac 26 } else { self.isPopoverOpen.toggle() } diff --git a/Meshtastic/Views/Messages/MessageContextMenuItems.swift b/Meshtastic/Views/Messages/MessageContextMenuItems.swift index ce27d808..33554de7 100644 --- a/Meshtastic/Views/Messages/MessageContextMenuItems.swift +++ b/Meshtastic/Views/Messages/MessageContextMenuItems.swift @@ -92,7 +92,7 @@ struct MessageContextMenuItems: View { let ackDate = Date(timeIntervalSince1970: TimeInterval(message.ackTimestamp)) let sixMonthsAgo = Calendar.current.date(byAdding: .month, value: -6, to: Date()) if ackDate >= sixMonthsAgo! { - Text("Ack Time: \(ackDate.formattedDate(format: "h:mm:ss.SSSS a"))") + Text("Ack Time: \(ackDate.formattedDate(format: MessageText.timeFormatString))") .foregroundColor(.gray) } } diff --git a/Meshtastic/Views/Messages/MessageText.swift b/Meshtastic/Views/Messages/MessageText.swift index 24028b29..19d0c715 100644 --- a/Meshtastic/Views/Messages/MessageText.swift +++ b/Meshtastic/Views/Messages/MessageText.swift @@ -10,7 +10,13 @@ struct MessageText: View { options: 0, locale: Locale.current ) + static let localeTimeFormat = DateFormatter.dateFormat( + fromTemplate: "jmmssa", + options: 0, + locale: Locale.current + ) static let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mm:ss:a") + static let timeFormatString = (localeTimeFormat ?? "j:mm:ss:a") @Environment(\.managedObjectContext) var context @EnvironmentObject var accessoryManager: AccessoryManager diff --git a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift index 5914f4f8..9ccfbb9c 100644 --- a/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift +++ b/Meshtastic/Views/Settings/Config/Module/MQTTConfig.swift @@ -237,13 +237,13 @@ struct MQTTConfig: View { .keyboardType(.default) .scrollDismissesKeyboard(.interactively) .listRowSeparator(/*@START_MENU_TOKEN@*/.visible/*@END_MENU_TOKEN@*/) - if !proxyToClientEnabled { - Toggle(isOn: $tlsEnabled) { - Label("TLS Enabled", systemImage: "checkmark.shield.fill") - Text("Your MQTT Server must support TLS.") - } - .toggleStyle(SwitchToggleStyle(tint: .accentColor)) + } + if address != "mqtt.meshtastic.org" && !proxyToClientEnabled { + Toggle(isOn: $tlsEnabled) { + Label("TLS Enabled", systemImage: "checkmark.shield.fill") + Text("Your MQTT Server must support TLS.") } + .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } } Text("For all Mqtt functionality other than the map report you must also set uplink and downlink for each channel you want to bridge over Mqtt.")