From e710bcab47306731fa5a1cdf5e87780db75ddd5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20B=C3=B6ttger?= Date: Sun, 18 May 2025 11:44:25 +0200 Subject: [PATCH] Indicate if no network connection --- QuickDrop.xcodeproj/project.pbxproj | 20 +++++++------- QuickDrop/AppDelegate.swift | 26 +++++++++++++++++- .../MenuBarIconSlash.imageset/Contents.json | 25 +++++++++++++++++ .../MenuBarIconSlash.imageset/menubar1x.png | Bin 0 -> 1601 bytes .../MenuBarIconSlash.imageset/menubar2x.png | Bin 0 -> 2157 bytes QuickDrop/Base.lproj/Localizable.strings | 1 + ...op.entitlements => QuickDrop.entitlements} | 0 QuickDrop/ar.lproj/Localizable.strings | 1 + QuickDrop/de.lproj/Localizable.strings | 1 + QuickDrop/es.lproj/Localizable.strings | 1 + QuickDrop/fr.lproj/Localizable.strings | 1 + QuickDrop/hu.lproj/Localizable.strings | 1 + QuickDrop/it.lproj/Localizable.strings | 1 + QuickDrop/ja.lproj/Localizable.strings | 1 + QuickDrop/ko.lproj/Localizable.strings | 1 + QuickDrop/nl.lproj/Localizable.strings | 1 + QuickDrop/pt-BR.lproj/Localizable.strings | 1 + QuickDrop/pt-PT.lproj/Localizable.strings | 1 + QuickDrop/ro.lproj/Localizable.strings | 1 + QuickDrop/ru.lproj/Localizable.strings | 1 + QuickDrop/th.lproj/Localizable.strings | 1 + QuickDrop/uk.lproj/Localizable.strings | 1 + QuickDrop/zh-Hans.lproj/Localizable.strings | 1 + 23 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/Contents.json create mode 100644 QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/menubar1x.png create mode 100644 QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/menubar2x.png rename QuickDrop/{NearDrop.entitlements => QuickDrop.entitlements} (100%) diff --git a/QuickDrop.xcodeproj/project.pbxproj b/QuickDrop.xcodeproj/project.pbxproj index 7ba7c07..7d3d62c 100644 --- a/QuickDrop.xcodeproj/project.pbxproj +++ b/QuickDrop.xcodeproj/project.pbxproj @@ -166,7 +166,7 @@ 69DA9A0E29E0BF5100A442DA /* QuickDrop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuickDrop.app; sourceTree = BUILT_PRODUCTS_DIR; }; 69DA9A1129E0BF5100A442DA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 69DA9A1329E0BF5200A442DA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 69DA9A1829E0BF5200A442DA /* NearDrop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NearDrop.entitlements; sourceTree = ""; }; + 69DA9A1829E0BF5200A442DA /* QuickDrop.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = QuickDrop.entitlements; sourceTree = ""; }; 69DA9A1E29E0C0B300A442DA /* NearbyConnectionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearbyConnectionManager.swift; sourceTree = ""; }; 69DA9A2029E0CC4E00A442DA /* Data+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = ""; }; 69DA9A2229E17F0400A442DA /* InboundNearbyConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboundNearbyConnection.swift; sourceTree = ""; }; @@ -330,7 +330,7 @@ 69DA9A1329E0BF5200A442DA /* Assets.xcassets */, 69D2C33629E78DF400EC7E30 /* Localizable.stringsdict */, 69D2C32B29E77F2200EC7E30 /* Localizable.strings */, - 69DA9A1829E0BF5200A442DA /* NearDrop.entitlements */, + 69DA9A1829E0BF5200A442DA /* QuickDrop.entitlements */, 69D2C32E29E7898C00EC7E30 /* MainMenu.xib */, ); path = QuickDrop; @@ -825,8 +825,8 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; - SHARED_BUILD = 36; - SHARED_VERSION = 1.8; + SHARED_BUILD = 37; + SHARED_VERSION = 1.9; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; @@ -884,8 +884,8 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; - SHARED_BUILD = 36; - SHARED_VERSION = 1.8; + SHARED_BUILD = 37; + SHARED_VERSION = 1.9; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; @@ -897,7 +897,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = NearDrop/NearDrop.entitlements; + CODE_SIGN_ENTITLEMENTS = QuickDrop/QuickDrop.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -907,7 +907,7 @@ DEVELOPMENT_TEAM = 92SDAWLN76; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = NearDrop/Info.plist; + INFOPLIST_FILE = QuickDrop/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = QuickDrop; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_LSUIElement = YES; @@ -936,7 +936,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = NearDrop/NearDrop.entitlements; + CODE_SIGN_ENTITLEMENTS = QuickDrop/QuickDrop.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -946,7 +946,7 @@ DEVELOPMENT_TEAM = 92SDAWLN76; ENABLE_HARDENED_RUNTIME = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = NearDrop/Info.plist; + INFOPLIST_FILE = QuickDrop/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = QuickDrop; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_LSUIElement = YES; diff --git a/QuickDrop/AppDelegate.swift b/QuickDrop/AppDelegate.swift index 67c798c..fbaf989 100644 --- a/QuickDrop/AppDelegate.swift +++ b/QuickDrop/AppDelegate.swift @@ -28,11 +28,20 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele private var iapManager: IAPManager? var showsFirewallAlert = false + var visibleItem: NSMenuItem? = nil + let hasConnectionMonitor = NWPathMonitor() func applicationDidFinishLaunching(_: Notification) { let menu = NSMenu() - menu.addItem(withTitle: NSLocalizedString("VisibleToEveryone", value: "Visible to everyone", comment: ""), action: nil, keyEquivalent: "") + let visibleItem = NSMenuItem( + title: "VisibleToEveryone".localized(), + action: nil, + keyEquivalent: "" + ) + self.visibleItem = visibleItem + menu.addItem(visibleItem) + menu.addItem(withTitle: String(format: NSLocalizedString("DeviceName", value: "Device name: %@", comment: ""), arguments: [Host.current().localizedName ?? "Mac"]), action: nil, keyEquivalent: "") menu.addItem(NSMenuItem.separator()) @@ -108,6 +117,21 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele let queue = DispatchQueue(label: "NetworkMonitor") monitor.start(queue: queue) + + hasConnectionMonitor.pathUpdateHandler = { path in + DispatchQueue.main.async { + if path.status == .satisfied { + self.statusItem?.button?.image = NSImage(named: "MenuBarIcon") + self.visibleItem?.title = "VisibleToEveryone".localized() + } else { + self.statusItem?.button?.image = NSImage(named: "MenuBarIconSlash") + self.visibleItem?.title = "NoNetworkConnection".localized() + } + } + } + + let queue2 = DispatchQueue(label: "NetworkConnectionMonitor") + hasConnectionMonitor.start(queue: queue2) } func performDeviceToDeviceCheck() { diff --git a/QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/Contents.json b/QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/Contents.json new file mode 100644 index 0000000..5d0b42b --- /dev/null +++ b/QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/Contents.json @@ -0,0 +1,25 @@ +{ + "images" : [ + { + "filename" : "menubar1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menubar2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/menubar1x.png b/QuickDrop/Assets.xcassets/MenuBarIconSlash.imageset/menubar1x.png new file mode 100644 index 0000000000000000000000000000000000000000..a69261e5b4678e8ddcb1a8ad2408f077fcc42fb3 GIT binary patch literal 1601 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 O|59;SbZAA0JnMh