From 193c824e836c242e007af1504eb68a4358bdbcaa Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Mon, 29 Jun 2020 18:26:40 +0200 Subject: [PATCH 01/14] Simpler menu item creating with an extension --- HeliPort.xcodeproj/project.pbxproj | 14 +++++++- HeliPort/Appearance/StatusMenu.swift | 34 +++++-------------- HeliPort/{ => Supporting files}/Log.swift | 0 .../NSMenuItem+Extensions.swift | 16 +++++++++ 4 files changed, 37 insertions(+), 27 deletions(-) rename HeliPort/{ => Supporting files}/Log.swift (100%) create mode 100644 HeliPort/Supporting files/NSMenuItem+Extensions.swift diff --git a/HeliPort.xcodeproj/project.pbxproj b/HeliPort.xcodeproj/project.pbxproj index 91d8e7e7..8fecac41 100644 --- a/HeliPort.xcodeproj/project.pbxproj +++ b/HeliPort.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ BCFA32ED2424D2BF00E23603 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BCFA32EC2424D2BF00E23603 /* Assets.xcassets */; }; BCFA32F02424D2BF00E23603 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = BCFA32EE2424D2BF00E23603 /* MainMenu.xib */; }; D47DD664F9B2939B57C54DF4 /* Pods_HeliPort.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEE10AB0115816EC5C117043 /* Pods_HeliPort.framework */; }; + F34B2B8D24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */; }; F379276F24A0A4A50087FF2B /* CredentialsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379276E24A0A4A50087FF2B /* CredentialsManager.swift */; }; F379277124A0A52E0087FF2B /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277024A0A52E0087FF2B /* Log.swift */; }; F379277424A0DADD0087FF2B /* WifiPopupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */; }; @@ -81,6 +82,7 @@ BCFA32F12424D2BF00E23603 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BCFA32F22424D2BF00E23603 /* HeliPort.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HeliPort.entitlements; sourceTree = ""; }; DEE10AB0115816EC5C117043 /* Pods_HeliPort.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HeliPort.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMenuItem+Extensions.swift"; sourceTree = ""; }; F379276E24A0A4A50087FF2B /* CredentialsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialsManager.swift; sourceTree = ""; }; F379277024A0A52E0087FF2B /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WifiPopupWindow.swift; sourceTree = ""; }; @@ -196,11 +198,20 @@ BCFA32F22424D2BF00E23603 /* HeliPort.entitlements */, 7557CDF324935260000F0F71 /* Credits.rtf */, F379276E24A0A4A50087FF2B /* CredentialsManager.swift */, - F379277024A0A52E0087FF2B /* Log.swift */, + F34B2B8B24AA4C08009AB1BB /* Supporting files */, ); path = HeliPort; sourceTree = ""; }; + F34B2B8B24AA4C08009AB1BB /* Supporting files */ = { + isa = PBXGroup; + children = ( + F379277024A0A52E0087FF2B /* Log.swift */, + F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */, + ); + path = "Supporting files"; + sourceTree = ""; + }; F86A895E243CD13100CBABC2 /* TestService */ = { isa = PBXGroup; children = ( @@ -460,6 +471,7 @@ 75FDF38B2481D22000B2A601 /* NetworkInfo.swift in Sources */, BCAF807F243DBA8C0034C8C7 /* JoinPopWindow.swift in Sources */, F379277424A0DADD0087FF2B /* WifiPopupWindow.swift in Sources */, + F34B2B8D24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 9c2a5122..97e63159 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -27,11 +27,6 @@ class StatusMenu: NSMenu, NSMenuDelegate { var networkListUpdateTimer: Timer? var statusUpdateTimer: Timer? - let statusItem = NSMenuItem( - title: NSLocalizedString("Wi-Fi: Status unavailable", comment: ""), - action: nil, - keyEquivalent: "" - ) var status: UInt32 = 0 { didSet { var statusText = "" @@ -55,27 +50,14 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - let switchItem = NSMenuItem( - title: NSLocalizedString("Turn Wi-Fi Off", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ) - let bsdItem = NSMenuItem( - title: NSLocalizedString("Interface Name: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - let macItem = NSMenuItem( - title: NSLocalizedString("Address: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - let itlwmVerItem = NSMenuItem( - title: NSLocalizedString("Version: ", comment: "") + "(null)", - action: nil, - keyEquivalent: "" - ) - var networkItemList = [NSMenuItem]() + private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) + private let switchItem = NSMenuItem(title: NSLocalizedString("Turn Wi-Fi Off", comment: "")) + private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") + private let macItem = NSMenuItem(title: NSLocalizedString("Address: ", comment: "") + "(null)") + private let itlwmVerItem = NSMenuItem(title: NSLocalizedString("Version: ", comment: "") + "(null)") + + private var networkItemList = [NSMenuItem]() + let maxNetworkListLength = MAX_NETWORK_LIST_LENGTH let networkItemListSeparator: NSMenuItem = { let networkItemListSeparator = NSMenuItem.separator() diff --git a/HeliPort/Log.swift b/HeliPort/Supporting files/Log.swift similarity index 100% rename from HeliPort/Log.swift rename to HeliPort/Supporting files/Log.swift diff --git a/HeliPort/Supporting files/NSMenuItem+Extensions.swift b/HeliPort/Supporting files/NSMenuItem+Extensions.swift new file mode 100644 index 00000000..16377e1e --- /dev/null +++ b/HeliPort/Supporting files/NSMenuItem+Extensions.swift @@ -0,0 +1,16 @@ +// +// NSMenuItem+Extensions.swift +// HeliPort +// +// Created by Igor Kulman on 29/06/2020. +// Copyright © 2020 OpenIntelWireless. All rights reserved. +// + +import Foundation +import Cocoa + +extension NSMenuItem { + convenience init(title: String) { + self.init(title: title, action: nil, keyEquivalent: "") + } +} From 9ee0f048af45d7a9df0b284d110e6084999d7b15 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Mon, 29 Jun 2020 18:27:00 +0200 Subject: [PATCH 02/14] Simpler Status menu init usage --- HeliPort/AppDelegate.swift | 2 +- HeliPort/Appearance/StatusMenu.swift | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/HeliPort/AppDelegate.swift b/HeliPort/AppDelegate.swift index 5b3ab577..59fce18c 100644 --- a/HeliPort/AppDelegate.swift +++ b/HeliPort/AppDelegate.swift @@ -26,7 +26,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { let statusBar = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) statusBar.button?.image = NSImage.init(named: "WiFiStateDisconnected") statusBar.button?.image?.isTemplate = true - statusBar.menu = StatusMenu.init(title: "") + statusBar.menu = StatusMenu() StatusBarIcon.statusBar = statusBar } diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 97e63159..0c862d6f 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -96,8 +96,8 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - override init(title: String) { - super.init(title: title) + init() { + super.init(title: "") minimumWidth = CGFloat(285.0) delegate = self setupMenuHeaderAndFooter() @@ -118,6 +118,10 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + func setupMenuHeaderAndFooter() { addItem(bsdItem) addItem(macItem) @@ -360,8 +364,4 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } } - - required init(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } } From 2f5cd6524533a31d73c5dbe814eafa4bce9cde7d Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Mon, 29 Jun 2020 18:35:00 +0200 Subject: [PATCH 03/14] Removing boilerplate code for creating status menu items --- HeliPort/Appearance/StatusMenu.swift | 197 ++++++++++++--------------- 1 file changed, 88 insertions(+), 109 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 0c862d6f..7196574d 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -17,7 +17,7 @@ import Foundation import Cocoa import Sparkle -class StatusMenu: NSMenu, NSMenuDelegate { +final class StatusMenu: NSMenu, NSMenuDelegate { let heliPortUpdater = SUUpdater() let networkListUpdatePeriod: Double = 5 @@ -50,6 +50,8 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } + // - MARK: Menu items + private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) private let switchItem = NSMenuItem(title: NSLocalizedString("Turn Wi-Fi Off", comment: "")) private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") @@ -96,6 +98,8 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } + // - MARK: Init + init() { super.init(title: "") minimumWidth = CGFloat(285.0) @@ -122,27 +126,16 @@ class StatusMenu: NSMenu, NSMenuDelegate { fatalError("init(coder:) has not been implemented") } - func setupMenuHeaderAndFooter() { + // - MARK: Setup + + private func setupMenuHeaderAndFooter() { addItem(bsdItem) addItem(macItem) addItem(itlwmVerItem) - addItem( - withTitle: NSLocalizedString("Enable Wi-Fi Logging", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - addItem( - withTitle: NSLocalizedString("Create Diagnostics Report...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Open Wireless Diagnostics...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self + addClickItem(title: NSLocalizedString("Enable Wi-Fi Logging", comment: "")) + addClickItem(title: NSLocalizedString("Create Diagnostics Report...", comment: "")) + addClickItem(title: NSLocalizedString("Open Wireless Diagnostics...", comment: "")) addItem(NSMenuItem.separator()) @@ -159,43 +152,15 @@ class StatusMenu: NSMenu, NSMenuDelegate { addItem(networkItemListSeparator) - addItem( - withTitle: NSLocalizedString("Join Other Network...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Create Network...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Open Network Preferences...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self + addClickItem(title: NSLocalizedString("Join Other Network...", comment: "")) + addClickItem(title: NSLocalizedString("Create Network...", comment: "")) + addClickItem(title: NSLocalizedString("Open Network Preferences...", comment: "")) addItem(NSMenuItem.separator()) - addItem( - withTitle: NSLocalizedString("About HeliPort", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Check for Updates...", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ).target = self - - addItem( - withTitle: NSLocalizedString("Quit HeliPort", comment: ""), - action: #selector(clickMenuItem(_:)), - keyEquivalent: "Q" - ).target = self + addClickItem(title: NSLocalizedString("About HeliPort", comment: "")) + addClickItem(title: NSLocalizedString("Check for Updates...", comment: "")) + addClickItem(title: NSLocalizedString("Quit HeliPort", comment: ""), keyEquivalent: "Q") } func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) { @@ -231,6 +196,69 @@ class StatusMenu: NSMenu, NSMenuDelegate { networkListUpdateTimer?.invalidate() } + private func addClickItem(title: String, keyEquivalent: String = "") { + addItem( + withTitle: title, + action: #selector(clickMenuItem(_:)), + keyEquivalent: keyEquivalent + ).target = self + } + + private func getDeviceInfo() { + DispatchQueue.global(qos: .background).async { + var bsdName = NSLocalizedString("Unavailable", comment: "") + var macAddr = NSLocalizedString("Unavailable", comment: "") + var itlwmVer = NSLocalizedString("Unavailable", comment: "") + var platformInfo = platform_info_t() + + if is_power_on() { + print("Wi-Fi open") + } else { + print("Wi-Fi close") + } + + if get_platform_info(&platformInfo) { + bsdName = String(cString: &platformInfo.device_info_str.0) + macAddr = NetworkManager.getMACAddressFromBSD(bsd: bsdName) ?? macAddr + itlwmVer = String(cString: &platformInfo.driver_info_str.0) + } + + DispatchQueue.main.async { + self.bsdItem.title = NSLocalizedString("Interface Name: ", comment: "") + bsdName + self.macItem.title = NSLocalizedString("Address: ", comment: "") + macAddr + self.itlwmVerItem.title = NSLocalizedString("Version: ", comment: "") + itlwmVer + } + } + } + + private func addNetworkItemPlaceholder() -> NSMenuItem { + let item = addItem( + withTitle: "placeholder", + action: #selector(clickMenuItem(_:)), + keyEquivalent: "" + ) + item.view = WifiMenuItemView( + networkInfo: NetworkInfo( + ssid: "placeholder", + connected: false, + rssi: 0 + ) + ) + guard let view = item.view as? WifiMenuItemView else { + return item + } + view.visible = false + view.translatesAutoresizingMaskIntoConstraints = false + guard let supView = view.superview else { + return item + } + view.widthAnchor.constraint(equalTo: supView.widthAnchor).isActive = true + view.heightAnchor.constraint(equalTo: supView.heightAnchor).isActive = true + return item + } + + // - MARK: Action handlers + @objc func clickMenuItem(_ sender: NSMenuItem) { print(sender.title) switch sender.title { @@ -272,34 +300,11 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - func getDeviceInfo() { - DispatchQueue.global(qos: .background).async { - var bsdName = NSLocalizedString("Unavailable", comment: "") - var macAddr = NSLocalizedString("Unavailable", comment: "") - var itlwmVer = NSLocalizedString("Unavailable", comment: "") - var platformInfo = platform_info_t() - if is_power_on() { - print("Wi-Fi open") - } else { - print("Wi-Fi close") - } - if get_platform_info(&platformInfo) { - bsdName = String(cString: &platformInfo.device_info_str.0) - macAddr = NetworkManager.getMACAddressFromBSD(bsd: bsdName) ?? macAddr - itlwmVer = String(cString: &platformInfo.driver_info_str.0) - } - DispatchQueue.main.async { - self.bsdItem.title = NSLocalizedString("Interface Name: ", comment: "") + bsdName - self.macItem.title = NSLocalizedString("Address: ", comment: "") + macAddr - self.itlwmVerItem.title = NSLocalizedString("Version: ", comment: "") + itlwmVer - } - } - } - - @objc func updateStatus() { - if !isNetworkEnabled { + @objc private func updateStatus() { + guard isNetworkEnabled else { return } + DispatchQueue.global(qos: .background).async { var status: UInt32 = 0xFF if get_80211_state(&status) { @@ -310,37 +315,11 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - func addNetworkItemPlaceholder() -> NSMenuItem { - let item = addItem( - withTitle: "placeholder", - action: #selector(clickMenuItem(_:)), - keyEquivalent: "" - ) - item.view = WifiMenuItemView( - networkInfo: NetworkInfo( - ssid: "placeholder", - connected: false, - rssi: 0 - ) - ) - guard let view = item.view as? WifiMenuItemView else { - return item - } - view.visible = false - view.translatesAutoresizingMaskIntoConstraints = false - guard let supView = view.superview else { - return item - } - view.widthAnchor.constraint(equalTo: supView.widthAnchor).isActive = true - view.heightAnchor.constraint(equalTo: supView.heightAnchor).isActive = true - return item - } - - @objc func updateNetworkInfo() { - if !isNetworkEnabled { + @objc private func updateNetworkInfo() { + guard isNetworkEnabled else { return } - + DispatchQueue.global(qos: .background).async { var info = station_info_t() get_station_info(&info) @@ -348,8 +327,8 @@ class StatusMenu: NSMenu, NSMenuDelegate { } } - @objc func updateNetworkList() { - if !isNetworkEnabled { + @objc private func updateNetworkList() { + guard isNetworkEnabled else { return } From e9dc417990e6992f87f19071c463fe8b6e467e97 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Mon, 29 Jun 2020 18:38:21 +0200 Subject: [PATCH 04/14] Code structuring cleanup --- HeliPort/Appearance/StatusMenu.swift | 59 ++++++++++++++++------------ 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 7196574d..a85ed098 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -18,16 +18,19 @@ import Cocoa import Sparkle final class StatusMenu: NSMenu, NSMenuDelegate { - let heliPortUpdater = SUUpdater() - let networkListUpdatePeriod: Double = 5 - let statusUpdatePeriod: Double = 2 + // - MARK: Properties - var headerLength: Int = 0 - var networkListUpdateTimer: Timer? - var statusUpdateTimer: Timer? + private let heliPortUpdater = SUUpdater() - var status: UInt32 = 0 { + private let networkListUpdatePeriod: Double = 5 + private let statusUpdatePeriod: Double = 2 + + private var headerLength: Int = 0 + private var networkListUpdateTimer: Timer? + private var statusUpdateTimer: Timer? + + private var status: UInt32 = 0 { didSet { var statusText = "" switch status { @@ -50,24 +53,16 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } } - // - MARK: Menu items - - private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) - private let switchItem = NSMenuItem(title: NSLocalizedString("Turn Wi-Fi Off", comment: "")) - private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") - private let macItem = NSMenuItem(title: NSLocalizedString("Address: ", comment: "") + "(null)") - private let itlwmVerItem = NSMenuItem(title: NSLocalizedString("Version: ", comment: "") + "(null)") - private var networkItemList = [NSMenuItem]() - let maxNetworkListLength = MAX_NETWORK_LIST_LENGTH - let networkItemListSeparator: NSMenuItem = { + private let maxNetworkListLength = MAX_NETWORK_LIST_LENGTH + private let networkItemListSeparator: NSMenuItem = { let networkItemListSeparator = NSMenuItem.separator() networkItemListSeparator.isHidden = true return networkItemListSeparator }() - var showAllOptions: Bool = false { + private var showAllOptions: Bool = false { willSet(visible) { for idx in 0...6 { items[idx].isHidden = !visible @@ -78,26 +73,36 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } } - var isNetworkListEmpty: Bool = true { + private var isNetworkListEmpty: Bool = true { willSet(empty) { networkItemListSeparator.isHidden = empty - if empty { - for item in self.networkItemList { - if let view = item.view as? WifiMenuItemView { - view.visible = false - } + guard empty else { + return + } + + for item in self.networkItemList { + if let view = item.view as? WifiMenuItemView { + view.visible = false } } } } - var isNetworkEnabled: Bool = true { + private var isNetworkEnabled: Bool = true { willSet(newState) { switchItem.title = NSLocalizedString(newState ? "Turn Wi-Fi Off" : "Turn Wi-Fi On", comment: "") self.isNetworkListEmpty = !newState } } + // - MARK: Menu items + + private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) + private let switchItem = NSMenuItem(title: NSLocalizedString("Turn Wi-Fi Off", comment: "")) + private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") + private let macItem = NSMenuItem(title: NSLocalizedString("Address: ", comment: "") + "(null)") + private let itlwmVerItem = NSMenuItem(title: NSLocalizedString("Version: ", comment: "") + "(null)") + // - MARK: Init init() { @@ -163,6 +168,8 @@ final class StatusMenu: NSMenu, NSMenuDelegate { addClickItem(title: NSLocalizedString("Quit HeliPort", comment: ""), keyEquivalent: "Q") } + // - MARK: Overrides + func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) { for item in networkItemList { if let view = item.view as? WifiMenuItemView { @@ -196,6 +203,8 @@ final class StatusMenu: NSMenu, NSMenuDelegate { networkListUpdateTimer?.invalidate() } + // - MARK: Actions + private func addClickItem(title: String, keyEquivalent: String = "") { addItem( withTitle: title, From 935847d7e06457866db9cb756e398b3db5d6b518 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 08:57:00 +0200 Subject: [PATCH 05/14] Using new logger in Status menu --- HeliPort/Appearance/StatusMenu.swift | 10 +++++----- HeliPort/Supporting files/Log.swift | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index a85ed098..cb57771c 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -221,9 +221,9 @@ final class StatusMenu: NSMenu, NSMenuDelegate { var platformInfo = platform_info_t() if is_power_on() { - print("Wi-Fi open") + Log.debug("Wi-Fi powered on") } else { - print("Wi-Fi close") + Log.debug("Wi-Fi powered off") } if get_platform_info(&platformInfo) { @@ -269,7 +269,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { // - MARK: Action handlers @objc func clickMenuItem(_ sender: NSMenuItem) { - print(sender.title) + Log.debug("Clicked \(sender.title)") switch sender.title { case NSLocalizedString("Turn Wi-Fi On", comment: ""): isNetworkEnabled = true @@ -305,7 +305,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { case NSLocalizedString("Quit HeliPort", comment: ""): exit(0) default: - print("Default") + Log.error("Invalid menu item clicked") } } @@ -332,7 +332,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { DispatchQueue.global(qos: .background).async { var info = station_info_t() get_station_info(&info) - print(String(format: "current rate=%03d", info.rate)) + Log.debug(String(format: "current rate=%03d", info.rate)) } } diff --git a/HeliPort/Supporting files/Log.swift b/HeliPort/Supporting files/Log.swift index a49b74f4..cb688f58 100644 --- a/HeliPort/Supporting files/Log.swift +++ b/HeliPort/Supporting files/Log.swift @@ -13,4 +13,8 @@ final class Log { static func debug(_ message: String) { os_log("%@", log: .default, type: .debug, message) } + + static func error(_ message: String) { + os_log("%@", log: .default, type: .error, message) + } } From 71c3ec254dc25b56b812a67931a4d1cbba0cf1a8 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 09:04:36 +0200 Subject: [PATCH 06/14] Simpler state localization --- HeliPort.xcodeproj/project.pbxproj | 4 +++ HeliPort/Appearance/StatusMenu.swift | 30 ++++++++----------- .../itl_80211_state+Status.swift | 26 ++++++++++++++++ 3 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 HeliPort/Supporting files/itl_80211_state+Status.swift diff --git a/HeliPort.xcodeproj/project.pbxproj b/HeliPort.xcodeproj/project.pbxproj index 8fecac41..2220e37b 100644 --- a/HeliPort.xcodeproj/project.pbxproj +++ b/HeliPort.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ F379276F24A0A4A50087FF2B /* CredentialsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379276E24A0A4A50087FF2B /* CredentialsManager.swift */; }; F379277124A0A52E0087FF2B /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277024A0A52E0087FF2B /* Log.swift */; }; F379277424A0DADD0087FF2B /* WifiPopupWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */; }; + F3915F0724AB1A1B00E6614D /* itl_80211_state+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */; }; F84E327924457FAE00D07895 /* ItlNetworkUserClient.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F84E327724457FAE00D07895 /* ItlNetworkUserClient.hpp */; }; F86A8960243CD13300CBABC2 /* TestService.hpp in Headers */ = {isa = PBXBuildFile; fileRef = F86A895F243CD13300CBABC2 /* TestService.hpp */; }; F86A8962243CD13400CBABC2 /* TestService.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F86A8961243CD13400CBABC2 /* TestService.cpp */; }; @@ -86,6 +87,7 @@ F379276E24A0A4A50087FF2B /* CredentialsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialsManager.swift; sourceTree = ""; }; F379277024A0A52E0087FF2B /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; F379277324A0DADD0087FF2B /* WifiPopupWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WifiPopupWindow.swift; sourceTree = ""; }; + F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "itl_80211_state+Status.swift"; sourceTree = ""; }; F84E327624457FAE00D07895 /* ItlNetworkUserClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ItlNetworkUserClient.cpp; sourceTree = ""; }; F84E327724457FAE00D07895 /* ItlNetworkUserClient.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = ItlNetworkUserClient.hpp; sourceTree = ""; }; F86A895D243CD13000CBABC2 /* TestService.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestService.kext; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -206,6 +208,7 @@ F34B2B8B24AA4C08009AB1BB /* Supporting files */ = { isa = PBXGroup; children = ( + F3915F0624AB1A1B00E6614D /* itl_80211_state+Status.swift */, F379277024A0A52E0087FF2B /* Log.swift */, F34B2B8C24AA4C1E009AB1BB /* NSMenuItem+Extensions.swift */, ); @@ -465,6 +468,7 @@ 501FA512249B8F77002B5B54 /* WifiPlistManager.swift in Sources */, BCA4DFAB2438CF25002A862A /* WiFiPopoverView.swift in Sources */, BCF712F9243C8BE800BE3C05 /* StatusBarIconManager.swift in Sources */, + F3915F0724AB1A1B00E6614D /* itl_80211_state+Status.swift in Sources */, BCFA32EB2424D2BE00E23603 /* AppDelegate.swift in Sources */, BCCB2AA4243708090005BB82 /* WiFiMenuItemView.swift in Sources */, BCA4DFAD243A307B002A862A /* StatusMenu.swift in Sources */, diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index cb57771c..0836f1cb 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -30,26 +30,20 @@ final class StatusMenu: NSMenu, NSMenuDelegate { private var networkListUpdateTimer: Timer? private var statusUpdateTimer: Timer? - private var status: UInt32 = 0 { + private var status: itl_80211_state = ITL80211_S_INIT { didSet { - var statusText = "" + statusItem.title = NSLocalizedString(status.description, comment: "") + switch status { - case ITL80211_S_INIT.rawValue: - statusText = "Wi-Fi: On" + case ITL80211_S_INIT: StatusBarIcon.disconnected() - case ITL80211_S_SCAN.rawValue: - statusText = "Wi-Fi: Looking for Networks..." - case ITL80211_S_AUTH.rawValue, ITL80211_S_ASSOC.rawValue: - statusText = "Wi-Fi: Connecting" + case ITL80211_S_SCAN, ITL80211_S_AUTH, ITL80211_S_ASSOC: StatusBarIcon.connecting() - case ITL80211_S_RUN.rawValue: - statusText = "Wi-Fi: Connected" + case ITL80211_S_RUN: StatusBarIcon.connected() default: - statusText = "Wi-Fi: Off" StatusBarIcon.off() } - statusItem.title = NSLocalizedString(statusText, comment: "") } } @@ -310,16 +304,18 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } @objc private func updateStatus() { - guard isNetworkEnabled else { + guard isNetworkEnabled else { return } DispatchQueue.global(qos: .background).async { var status: UInt32 = 0xFF - if get_80211_state(&status) { - DispatchQueue.main.async { - self.status = status - } + guard get_80211_state(&status) else { + return + } + + DispatchQueue.main.async { + self.status = itl_80211_state(rawValue: status) } } } diff --git a/HeliPort/Supporting files/itl_80211_state+Status.swift b/HeliPort/Supporting files/itl_80211_state+Status.swift new file mode 100644 index 00000000..d7dca9ff --- /dev/null +++ b/HeliPort/Supporting files/itl_80211_state+Status.swift @@ -0,0 +1,26 @@ +// +// itl_80211_state+Status.swift +// HeliPort +// +// Created by Igor Kulman on 30/06/2020. +// Copyright © 2020 OpenIntelWireless. All rights reserved. +// + +import Foundation + +extension itl_80211_state: CustomStringConvertible { + public var description: String { + switch self { + case ITL80211_S_INIT: + return "Wi-Fi: On" + case ITL80211_S_SCAN: + return "Wi-Fi: Looking for Networks..." + case ITL80211_S_AUTH, ITL80211_S_ASSOC: + return "Wi-Fi: Connecting" + case ITL80211_S_RUN: + return "Wi-Fi: Connected" + default: + return "Wi-Fi: Off" + } + } +} From bae76d2bc410a2556aea1287d26f4da04813a19f Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:03:57 +0200 Subject: [PATCH 07/14] Convenience initializer fo join window --- HeliPort/Appearance/JoinPopWindow.swift | 17 +++++++++++++++++ HeliPort/Appearance/StatusMenu.swift | 14 ++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/HeliPort/Appearance/JoinPopWindow.swift b/HeliPort/Appearance/JoinPopWindow.swift index 75477c63..e10f494f 100644 --- a/HeliPort/Appearance/JoinPopWindow.swift +++ b/HeliPort/Appearance/JoinPopWindow.swift @@ -37,6 +37,19 @@ final class JoinPopWindow: NSWindow, NSTextFieldDelegate { private let joinButton: NSButton private let cancelButton: NSButton + convenience init() { + self.init( + contentRect: NSRect( + x: 0, + y: 0, + width: 450, + height: 247 + ), + styleMask: .titled, + backing: .buffered, + defer: false) + } + override init( contentRect: NSRect, styleMask style: NSWindow.StyleMask, @@ -547,4 +560,8 @@ final class JoinPopWindow: NSWindow, NSTextFieldDelegate { controlJoinButton() } + + func show() { + makeKeyAndOrderFront(self) + } } diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 9c322851..178d7c92 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -277,18 +277,8 @@ final class StatusMenu: NSMenu, NSMenuDelegate { case NSLocalizedString("Turn Wi-Fi Off", comment: ""): power_off() case NSLocalizedString("Join Other Network...", comment: ""): - let joinPop = JoinPopWindow.init( - contentRect: NSRect( - x: 0, - y: 0, - width: 450, - height: 247 - ), - styleMask: .titled, - backing: .buffered, - defer: false - ) - joinPop.makeKeyAndOrderFront(self) + let joinPop = JoinPopWindow() + joinPop.show() case NSLocalizedString("Create Network...", comment: ""): let alert = NSAlert() alert.messageText = NSLocalizedString("FUNCTION NOT IMPLEMENTED", comment: "") From b7917b6fbf231a664a2629329156de18ba21db19 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:08:49 +0200 Subject: [PATCH 08/14] Formatting fix --- HeliPort/Appearance/StatusMenu.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 178d7c92..25cd8e97 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -49,7 +49,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { StatusBarIcon.connected() default: StatusBarIcon.off() - } + } } } From 579bf8f6fbf1acb8cae9c25d3fe0a2d807f81c0c Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:08:59 +0200 Subject: [PATCH 09/14] Adding forgotten access qualifiers --- HeliPort/Appearance/StatusMenu.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 25cd8e97..1ad548e1 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -240,7 +240,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } } - func addNetworkItemPlaceholder() -> NSMenuItem { + private func addNetworkItemPlaceholder() -> NSMenuItem { let item = addItem( withTitle: "placeholder", action: #selector(clickMenuItem(_:)), @@ -268,7 +268,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { // - MARK: Action handlers - @objc func clickMenuItem(_ sender: NSMenuItem) { + @objc private func clickMenuItem(_ sender: NSMenuItem) { Log.debug("Clicked \(sender.title)") switch sender.title { From 53a11fe3ed4c98fb17faa7a5aa7a91b7c685f8b1 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:32:51 +0200 Subject: [PATCH 10/14] No status bar icon change while scanning --- HeliPort/Appearance/StatusMenu.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 1ad548e1..2575a157 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -43,10 +43,13 @@ final class StatusMenu: NSMenu, NSMenuDelegate { switch status { case ITL80211_S_INIT: StatusBarIcon.disconnected() - case ITL80211_S_SCAN, ITL80211_S_AUTH, ITL80211_S_ASSOC: + case ITL80211_S_AUTH, ITL80211_S_ASSOC: StatusBarIcon.connecting() case ITL80211_S_RUN: StatusBarIcon.connected() + case ITL80211_S_SCAN: + // no change in status bar icon when scanning + break default: StatusBarIcon.off() } From 6b73b9cb05f448008174187dad545753f7d4c6b3 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:53:36 +0200 Subject: [PATCH 11/14] Making Wifi switch item clickable again --- HeliPort/Appearance/StatusMenu.swift | 5 ++++- HeliPort/Supporting files/NSMenuItem+Extensions.swift | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 2575a157..354c529d 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -101,7 +101,10 @@ final class StatusMenu: NSMenu, NSMenuDelegate { // - MARK: Menu items private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) - private let switchItem = NSMenuItem(title: NSLocalizedString("Turn Wi-Fi Off", comment: "")) + private let switchItem = NSMenuItem( + title: NSLocalizedString("Turn Wi-Fi Off", comment: ""), + action: #selector(clickMenuItem(_:)) + ) private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") private let macItem = NSMenuItem(title: NSLocalizedString("Address: ", comment: "") + "(null)") private let itlwmVerItem = NSMenuItem(title: NSLocalizedString("Version: ", comment: "") + "(null)") diff --git a/HeliPort/Supporting files/NSMenuItem+Extensions.swift b/HeliPort/Supporting files/NSMenuItem+Extensions.swift index 16377e1e..6e2c5c19 100644 --- a/HeliPort/Supporting files/NSMenuItem+Extensions.swift +++ b/HeliPort/Supporting files/NSMenuItem+Extensions.swift @@ -13,4 +13,8 @@ extension NSMenuItem { convenience init(title: String) { self.init(title: title, action: nil, keyEquivalent: "") } + + convenience init(title: String, action: Selector) { + self.init(title: title, action: action, keyEquivalent: "") + } } From f20179e7a45025501404bd2bc931cdb72d2cb466 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 14:55:42 +0200 Subject: [PATCH 12/14] Fix for Wifi switch item offering to turn Wifi off when it is off when app is started --- HeliPort/Appearance/StatusMenu.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 354c529d..8f89a091 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -312,9 +312,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { get_80211_state(&status) DispatchQueue.main.async { - if get_power_ret { - self.isNetworkEnabled = powerState - } + self.isNetworkEnabled = get_power_ret self.status = itl_80211_state(rawValue: status) } } From 8b8077cabe1ff0b36b963608ae138a9d6131efd2 Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 15:15:00 +0200 Subject: [PATCH 13/14] Revert "Fix for Wifi switch item offering to turn Wifi off when it is off when app is started" This reverts commit f20179e7a45025501404bd2bc931cdb72d2cb466. --- HeliPort/Appearance/StatusMenu.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 8f89a091..354c529d 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -312,7 +312,9 @@ final class StatusMenu: NSMenu, NSMenuDelegate { get_80211_state(&status) DispatchQueue.main.async { - self.isNetworkEnabled = get_power_ret + if get_power_ret { + self.isNetworkEnabled = powerState + } self.status = itl_80211_state(rawValue: status) } } From 946876e0b6776913e35db23f7aff56ddb0df1d1f Mon Sep 17 00:00:00 2001 From: Igor Kulman Date: Tue, 30 Jun 2020 15:17:36 +0200 Subject: [PATCH 14/14] Network card set as off by default until the state is correctly read --- HeliPort/Appearance/StatusMenu.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/HeliPort/Appearance/StatusMenu.swift b/HeliPort/Appearance/StatusMenu.swift index 354c529d..6530ce89 100644 --- a/HeliPort/Appearance/StatusMenu.swift +++ b/HeliPort/Appearance/StatusMenu.swift @@ -32,7 +32,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { private var status: itl_80211_state = ITL80211_S_INIT { didSet { - guard isNetworkEnabled else { + guard isNetworkCardEnabled else { StatusBarIcon.off() statusItem.title = NSLocalizedString("Wi-Fi: Off", comment: "") return @@ -91,7 +91,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } } - private var isNetworkEnabled: Bool = true { + private var isNetworkCardEnabled: Bool = false { willSet(newState) { switchItem.title = NSLocalizedString(newState ? "Turn Wi-Fi Off" : "Turn Wi-Fi On", comment: "") self.isNetworkListEmpty = !newState @@ -102,7 +102,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { private let statusItem = NSMenuItem(title: NSLocalizedString("Wi-Fi: Status unavailable", comment: "")) private let switchItem = NSMenuItem( - title: NSLocalizedString("Turn Wi-Fi Off", comment: ""), + title: NSLocalizedString("Turn Wi-Fi On", comment: ""), action: #selector(clickMenuItem(_:)) ) private let bsdItem = NSMenuItem(title: NSLocalizedString("Interface Name: ", comment: "") + "(null)") @@ -313,7 +313,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { DispatchQueue.main.async { if get_power_ret { - self.isNetworkEnabled = powerState + self.isNetworkCardEnabled = powerState } self.status = itl_80211_state(rawValue: status) } @@ -321,7 +321,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } @objc private func updateNetworkInfo() { - guard isNetworkEnabled else { + guard isNetworkCardEnabled else { return } @@ -333,7 +333,7 @@ final class StatusMenu: NSMenu, NSMenuDelegate { } @objc private func updateNetworkList() { - guard isNetworkEnabled else { + guard isNetworkCardEnabled else { return }