aboutsummaryrefslogtreecommitdiff
path: root/DWA140Menu/AppDelegate.swift
blob: aacb4157d7fde372605dc9050bfa011f9a5961e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
//
//  AppDelegate.swift
//  DWA140Menu
//
//  Created by FivePixels on 9/3/18.
//  Copyright © 2018 FivePixels. All rights reserved.
//

import Cocoa
import Foundation
import Defaults
import LaunchAtLogin
import SystemConfiguration

extension Defaults.Keys {
    static let launchAtLogin = Defaults.Key<Bool>("launchAtLogin", default: false)
}

let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
var launchAtLoginMenuItem = NSMenuItem()
var interfaceName : String = ""
let dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, "iked" as CFString, nil, nil)
let ipv4key = SCDynamicStoreCopyValue(dynRef, "State:/Network/Global/IPv4" as CFString)
var isDeviceInterfaceConnected : Bool?
var deviceIPAddress : String = ""

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {
    
    @objc func openSourcePage() {
        NSWorkspace.shared.open((URL(string:"https://github.com/fivepixels/dwa140shortcut") ?? nil)!)
    }
    
    @objc func openDWAPreferencePane() {
        let fileManager = FileManager.default
        let allUsersPath = "/Library/PreferencePanes/DWA-140WirelessUtility.prefpane"
        let currentUserPath = "~/Library/PreferencePanes/DWA-140WirelessUtility.prefPane"
        if fileManager.fileExists(atPath: allUsersPath) {
            NSWorkspace.shared.open(URL(fileURLWithPath: allUsersPath)) }
        else if fileManager.fileExists(atPath: currentUserPath) {
            NSWorkspace.shared.open(URL(fileURLWithPath: currentUserPath))
        } else {
            showNotification(title: "DWA-140 Shortcut Error", withText: "The preference pane does not exist.")
        }
    }
    
    @objc func openNetworkPreferencePane() {
        NSWorkspace.shared.open(URL(fileURLWithPath: "/System/Library/PreferencePanes/Network.prefPane"))
    }
    
    @objc func refreshApplication() {
        let url = URL(fileURLWithPath: Bundle.main.resourcePath!)
        let path = url.deletingLastPathComponent().deletingLastPathComponent().absoluteString
        let task = Process()
        task.launchPath = "/usr/bin/open"
        task.arguments = [path]
        task.launch()
        exit(0)
    }
    
    @objc func toggleLaunchAtLogin() {
        let launchAtLogin = defaults[.launchAtLogin]
        launchAtLoginMenuItem.title = "Start at Login"
        launchAtLoginMenuItem.state = !launchAtLogin ? .on : .off
        LaunchAtLogin.isEnabled = !launchAtLogin
        defaults[.launchAtLogin] = !launchAtLogin
        if !launchAtLogin {
            showNotification(title: "DWA-140 Shortcut", withText: "This application now opens as soon as you login. 😀")
        }
    }
    
    @objc func showNotification(title: String, withText: String) -> Void {
        let notification = NSUserNotification()
        notification.title = title
        notification.informativeText = withText
        notification.soundName = NSUserNotificationDefaultSoundName
        NSUserNotificationCenter.default.delegate = self
        NSUserNotificationCenter.default.deliver(notification)
    }
    
    func getInterface() -> String {
        // thanks NetUtils-Swift :p
        if var dict1 = ipv4key as? [String: AnyObject] {
            if (dict1["PrimaryInterface"] == nil) {
                interfaceName = "none"
            }
            interfaceName = (dict1["PrimaryInterface"] as! String)
        }
        return interfaceName
    }
    
    func constructMenu() {
        let applicationMenu = NSMenu()
        applicationMenu.addItem(NSMenuItem(title: "DWA-140 Shortcut", action: #selector(openSourcePage), keyEquivalent: ""))
        launchAtLoginMenuItem = NSMenuItem(title: "Start at Login", action: #selector(self.toggleLaunchAtLogin), keyEquivalent: "")
        launchAtLoginMenuItem.state = defaults[.launchAtLogin] ? .on : .off
        applicationMenu.addItem(launchAtLoginMenuItem)
        applicationMenu.addItem(NSMenuItem.separator())
        applicationMenu.addItem(NSMenuItem(title: isInterfaceConnected(), action: nil, keyEquivalent: ""))
        applicationMenu.addItem(NSMenuItem.separator())
        applicationMenu.addItem(NSMenuItem(title: "Refresh Status", action: #selector(refreshApplication), keyEquivalent: "r"))
        applicationMenu.addItem(NSMenuItem(title: "Open DWA-140", action: #selector(openDWAPreferencePane), keyEquivalent: "t"))
        applicationMenu.addItem(NSMenuItem(title: "Network Preferences", action: #selector(openNetworkPreferencePane), keyEquivalent: ""))
        applicationMenu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: ""))
        statusItem.menu = applicationMenu
        
    }
    
    func isInterfaceConnected() -> String {
        if getInterface() == "en0" {
            isDeviceInterfaceConnected = true
            DispatchQueue.main.async {
                self.setStatusIcon(icon: "WiFiConnected")
            }
            return "USB WiFi is connected."
        } else {
            isDeviceInterfaceConnected = false
            DispatchQueue.main.async {
                self.setStatusIcon(icon: "WiFiDisconnected")
            }
            return "USB Wifi is disconnected."
        }
    }
    
    func userNotificationCenter(_ center: NSUserNotificationCenter,
                                shouldPresent notification: NSUserNotification) -> Bool {
        return true
    }
    
    func setStatusIcon(icon: String) {
        if let button = statusItem.button {
            if button.image?.name() != icon {
                button.image = NSImage(named: NSImage.Name(icon))
            }
        }
    }
    
    func applicationDidFinishLaunching(_ notification: Notification) {
        constructMenu()
    }
    
    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}