diff --git a/package-lock.json b/package-lock.json index cb6e20252c..6c79a084d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -115,7 +115,7 @@ "outline-i18n": "Jigsaw-Code/outline-i18n#v0.0.7", "postcss": "^7.0.39", "postcss-rtl": "^1.7.3", - "prettier": "^2.8.0", + "prettier": "2.8", "pretty-quick": "^2.0.1", "puppeteer": "^13.1.2", "replace-in-file": "^6.3.5", diff --git a/src/cordova/apple/OutlineAppleLib/Package.swift b/src/cordova/apple/OutlineAppleLib/Package.swift index fbb04078cb..009a081f38 100644 --- a/src/cordova/apple/OutlineAppleLib/Package.swift +++ b/src/cordova/apple/OutlineAppleLib/Package.swift @@ -15,10 +15,6 @@ let package = Package( name: "OutlineLauncher", targets: ["OutlineLauncher"] ), - .library( - name: "OutlineAppKitBridge", - targets: ["OutlineAppKitBridge"] - ), .library( name: "PacketTunnelProvider", targets: ["PacketTunnelProvider"] @@ -31,20 +27,14 @@ let package = Package( targets: [ .target( name: "OutlineLauncher", - dependencies: - ["CocoaLumberjack", - .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), - "OutlineCatalystApp"] - ), - .target( - name: "OutlineCatalystApp", dependencies: [ - "OutlineAppKitBridge", + "CocoaLumberjack", .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), + "OutlineCatalystApp", ] ), .target( - name: "OutlineAppKitBridge", + name: "OutlineCatalystApp", dependencies: [ .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), "OutlineNotification", @@ -52,11 +42,12 @@ let package = Package( ), .target( name: "PacketTunnelProvider", - dependencies: - ["CocoaLumberjack", - .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), - "Tun2socks", - "OutlineTunnel"], + dependencies: [ + "CocoaLumberjack", + .product(name: "CocoaLumberjackSwift", package: "CocoaLumberjack"), + "Tun2socks", + "OutlineTunnel", + ], cSettings: [ .headerSearchPath("Internal"), ] diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridge.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridge.swift deleted file mode 100644 index 9067e14b04..0000000000 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridge.swift +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2023 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#if os(macOS) - import AppKit - import CocoaLumberjackSwift - import ServiceManagement - - public class AppKitBridge: NSObject, AppKitBridgeProtocol { - private var statusItemController: StatusItemController? - static let kAppGroup = "QT8Z3Q9V3A.org.outline.macos.client" - static let kAppLauncherName = "launcher3" - - override public required init() { - super.init() - } - - /// Terminates the application. - @objc public func terminate() { - NSApp.terminate(self) - } - - /// Set the connection status in the app's menu in the system-wide menu bar. - @objc public func setConnectionStatus(_ status: ConnectionStatus) { - if statusItemController == nil { - DDLogInfo("[AppKitBridge] No status item controller found. Creating one now.") - statusItemController = StatusItemController() - } - statusItemController!.setStatus(status: status) - } - - /// Enables or disables the embedded app launcher as a login item. - @objc public func setAppLauncherEnabled(_ isEnabled: Bool) { - guard let launcherBundleId = getLauncherBundleId() else { - return DDLogError("[AppKitBridge] Unable to set launcher for missing bundle ID.") - } - - if !SMLoginItemSetEnabled(launcherBundleId as! CFString, isEnabled) { - return DDLogError("[AppKitBridge] Failed to set enable=\(isEnabled) for launcher \(launcherBundleId).") - } - - return DDLogInfo("[AppKitBridge] Successfully set enable=\(isEnabled) for launcher \(launcherBundleId).") - } - - /// Loads the main application from a given launcher bundle. - @objc public func loadMainApp(_ launcherBundleId: String) { - // Retrieve the main app's bundle ID programmatically from the embedded launcher bundle ID. - let mainAppBundleId = getMainBundleId(launcherBundleId) - DDLogInfo("[AppKitBridge] Loading main app \(mainAppBundleId) from launcher \(launcherBundleId).") - - let descriptor = NSAppleEventDescriptor(string: launcherBundleId) - NSWorkspace.shared.launchApplication(withBundleIdentifier: mainAppBundleId, - options: [.withoutActivation, .andHide], - additionalEventParamDescriptor: descriptor, - launchIdentifier: nil) - } - } - - /// Returns the embedded launcher application's bundle ID. - private func getLauncherBundleId() -> String? { - guard let bundleId = Bundle.main.bundleIdentifier else { - DDLogError("[AppKitBridge] Failed to retrieve the application's bundle ID.") - return nil - } - return String(format: "%@.%@", bundleId, AppKitBridge.kAppLauncherName) - } - - /// Returns the main application's bundle ID from the embedded launcher bundle ID. - private func getMainBundleId(_ launcherBundleId: String) -> String { - return (launcherBundleId as NSString).deletingPathExtension - } -#endif diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/StatusItemController.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/StatusItemController.swift deleted file mode 100644 index e053c3f3c7..0000000000 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/StatusItemController.swift +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2023 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#if os(macOS) - import AppKit - import CocoaLumberjackSwift - import OutlineNotification - - var StatusItem = NSStatusItem() - - class StatusItemController: NSObject { - let connectionStatusMenuItem = NSMenuItem(title: MenuTitle.statusDisconnected, - action: nil, - keyEquivalent: "") - - private enum AppIconImage { - static let statusConnected = getImage(name: "status_bar_button_image_connected") - static let statusDisconnected = getImage(name: "status_bar_button_image") - } - - private enum MenuTitle { - static let open = NSLocalizedString( - "tray_open_window", - bundle: .module, - comment: "Tray menu entry to show the application window.") - static let quit = NSLocalizedString( - "quit", - bundle: .module, - comment: "Tray menu entry to quit the application.") - static let statusConnected = NSLocalizedString( - "connected_server_state", - bundle: .module, - comment: "Tray menu entry indicating a server is currently connected and in use.") - static let statusDisconnected = NSLocalizedString( - "disconnected_server_state", - bundle: .module, - comment: "Tray menu entry indicating no server is currently connected.") - } - - override init() { - super.init() - - DDLogInfo("[StatusItemController] Creating status menu") - StatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) - setStatus(status: .disconnected) - - let menu = NSMenu() - let openMenuItem = NSMenuItem(title: MenuTitle.open, action: #selector(openApplication), keyEquivalent: "o") - openMenuItem.target = self - menu.addItem(openMenuItem) - menu.addItem(connectionStatusMenuItem) - menu.addItem(NSMenuItem.separator()) - let closeMenuItem = NSMenuItem(title: MenuTitle.quit, action: #selector(closeApplication), keyEquivalent: "q") - closeMenuItem.target = self - menu.addItem(closeMenuItem) - StatusItem.menu = menu - } - - func setStatus(status: ConnectionStatus) { - let isConnected = status == .connected - let appIconImage = isConnected ? AppIconImage.statusConnected : AppIconImage.statusDisconnected - appIconImage.isTemplate = true - StatusItem.button?.image = appIconImage - - let connectionStatusTitle = isConnected ? MenuTitle.statusConnected : MenuTitle.statusDisconnected - connectionStatusMenuItem.title = connectionStatusTitle - } - - @objc func openApplication(_: AnyObject?) { - DDLogInfo("[StatusItemController] Opening application") - NSApp.activate(ignoringOtherApps: true) - guard let uiWindow = getUiWindow() else { - return - } - uiWindow.makeKeyAndOrderFront(self) - } - - @objc func closeApplication(_: AnyObject?) { - DDLogInfo("[StatusItemController] Closing application") - NotificationCenter.default.post(name: .kAppQuit, object: nil) - NSApplication.shared.terminate(self) - } - } - - private func getUiWindow() -> NSWindow? { - for window in NSApp.windows { - if String(describing: window).contains("UINSWindow") { - return window - } - } - return nil - } - - private func getImage(name: String) -> NSImage { - guard let image = Bundle.module.image(forResource: NSImage.Name(name)) else { - fatalError("Unable to load image asset named \(name).") - } - return image - } - -#endif diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/AppKitBundleLoader.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/AppKitBundleLoader.swift deleted file mode 100644 index a98024d9e9..0000000000 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/AppKitBundleLoader.swift +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2023 The Outline Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import CocoaLumberjackSwift -import Foundation -import OutlineAppKitBridge - -enum BridgeBundle { - static let fileName = "AppKitBridge.bundle" - static let className = "OutlineAppKitBridge.AppKitBridge" -} - -public func createAppKitBridge() -> AppKitBridgeProtocol { - guard let bundleURL = Bundle.main.builtInPlugInsURL?.appendingPathComponent(BridgeBundle.fileName) else { - preconditionFailure("[AppKitBundleLoader] \(BridgeBundle.fileName) should exist") - } - guard let bundle = Bundle(url: bundleURL) else { - preconditionFailure("[AppKitBundleLoader] \(BridgeBundle.fileName) should exist") - } - DDLogInfo("[AppKitBundleLoader] AppKit bundle loaded successfully") - let className = BridgeBundle.className - guard let appKitBridgeClass = bundle.classNamed(className) as? AppKitBridgeProtocol.Type else { - preconditionFailure("[AppKitBundleLoader] Cannot initialise \(className) from \(BridgeBundle.fileName)") - } - return appKitBridgeClass.init() -} diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/OutlineCatalystApp.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/CatalystApp.swift similarity index 64% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/OutlineCatalystApp.swift rename to src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/CatalystApp.swift index a9624eb190..63b7d78c8c 100644 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/OutlineCatalystApp.swift +++ b/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/CatalystApp.swift @@ -13,10 +13,10 @@ // limitations under the License. #if targetEnvironment(macCatalyst) + import CocoaLumberjack import CocoaLumberjackSwift import Foundation - import OutlineAppKitBridge import OutlineNotification import ServiceManagement @@ -25,7 +25,7 @@ public static func initApp() { DDLog.add(DDOSLogger.sharedInstance) - let appKitBridge: AppKitBridgeProtocol = createAppKitBridge() + let appKitController = loadAppKitIntegrationFramework() // Configure the window. let scenes = UIApplication.shared.connectedScenes @@ -39,23 +39,43 @@ // Initiate the connection status menu in unknown state by default. // TODO: Check status in case the the VPN is already running. - appKitBridge.setConnectionStatus(.unknown) + appKitController._AppKitBridge_setConnectionStatus(.unknown) NotificationCenter.default.addObserver(forName: NSNotification.kVpnConnected, object: nil, queue: nil) { _ in - appKitBridge.setConnectionStatus(.connected) + appKitController._AppKitBridge_setConnectionStatus(.connected) } NotificationCenter.default.addObserver(forName: NSNotification.kVpnDisconnected, object: nil, queue: nil) { _ in - appKitBridge.setConnectionStatus(.disconnected) + appKitController._AppKitBridge_setConnectionStatus(.disconnected) } // Enable app launcher to start on boot. - appKitBridge.setAppLauncherEnabled(true) + appKitController._AppKitBridge_setAppLauncherEnabled(true) + } + } + + public func loadAppKitIntegrationFramework() -> NSObject { + if let frameworksPath = Bundle.main.privateFrameworksPath { + let bundlePath = "\(frameworksPath)/AppKitIntegration.framework" + do { + try Bundle(path: bundlePath)?.loadAndReturnError() + + let bundle = Bundle(path: bundlePath)! + DDLogInfo("[CatalystApp] AppKit bundle loaded successfully") + + if let appKitControllerClass = bundle.classNamed("AppKitIntegration.AppKitController") as? NSObject.Type { + return appKitControllerClass.init() + } + } catch { + DDLogInfo("[CatalystApp] Error loading: \(error)") + } } + preconditionFailure("[CatalystApp] Unable to load") } + #endif diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridgeProtocol.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/NSObject+Outline.swift similarity index 63% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridgeProtocol.swift rename to src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/NSObject+Outline.swift index 2df694d8cc..4e22efa63f 100644 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/AppKitBridgeProtocol.swift +++ b/src/cordova/apple/OutlineAppleLib/Sources/OutlineCatalystApp/NSObject+Outline.swift @@ -15,14 +15,15 @@ import Foundation @objc -public protocol AppKitBridgeProtocol: NSObjectProtocol { - init() - - func terminate() - - func setConnectionStatus(_ status: ConnectionStatus) - - func setAppLauncherEnabled(_ isEnabled: Bool) +public enum ConnectionStatus: Int { + case unknown + case connected + case disconnected +} - func loadMainApp(_ launcherBundleId: String) +public extension NSObject { + @objc func _AppKitBridge_terminate() {} + @objc func _AppKitBridge_setConnectionStatus(_: ConnectionStatus) {} + @objc func _AppKitBridge_setAppLauncherEnabled(_: Bool) {} + @objc func _AppKitBridge_loadMainApp(_: String) {} } diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineLauncher/AppDelegate.swift b/src/cordova/apple/OutlineAppleLib/Sources/OutlineLauncher/AppDelegate.swift index 06aafc23b2..067cecbec1 100644 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineLauncher/AppDelegate.swift +++ b/src/cordova/apple/OutlineAppleLib/Sources/OutlineLauncher/AppDelegate.swift @@ -24,11 +24,11 @@ func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { DDLog.add(DDOSLogger.sharedInstance) - let appKitBridge = createAppKitBridge() + let appKitController = loadAppKitIntegrationFramework() shouldLaunchMainApp { shouldLaunch in defer { DDLogInfo("Exiting launcher...") - appKitBridge.terminate() + appKitController._AppKitBridge_terminate() } if !shouldLaunch { DDLogInfo("Not launching, Outline not connected at shutdown") @@ -40,7 +40,7 @@ DDLogError("Failed to retrieve the bundle ID for the launcher app.") return } - appKitBridge.loadMainApp(launcherBundleId) + appKitController._AppKitBridge_loadMainApp(launcherBundleId) } return true } diff --git a/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj b/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj index c4d27dcb8c..d2e873ee72 100755 --- a/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj +++ b/src/cordova/apple/xcode/ios/Outline.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -16,22 +16,26 @@ 301BF552109A68D80062928A /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 301BF535109A57CC0062928A /* libCordova.a */; }; 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 302D95EF14D2391D003F00A1 /* MainViewController.m */; }; 302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 302D95F014D2391D003F00A1 /* MainViewController.xib */; }; - 3B0347531F212F0200C8EF1F /* VpnExtension.appex in Embed App Extensions (2 items) */ = {isa = PBXBuildFile; fileRef = 3B0347481F212F0100C8EF1F /* VpnExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 3B0347531F212F0200C8EF1F /* VpnExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 3B0347481F212F0100C8EF1F /* VpnExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 52CE53E7295B6A310064D03D /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 52CE53E6295B6A310064D03D /* Sentry */; }; 52E783062A5880CF00355E64 /* PacketTunnelProvider in Frameworks */ = {isa = PBXBuildFile; productRef = 52E783052A5880CF00355E64 /* PacketTunnelProvider */; }; 5F7F90AE0E924FD7B065C415 /* CDVStatusBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 0394302BA6114B2AB648D4FF /* CDVStatusBar.m */; }; 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */; }; - A271D4202A7069D8009981B2 /* OutlineLauncher in Frameworks */ = {isa = PBXBuildFile; productRef = A271D41F2A7069D8009981B2 /* OutlineLauncher */; }; - A271D4222A706CB9009981B2 /* OutlineAppKitBridge in Frameworks */ = {isa = PBXBuildFile; productRef = A271D4212A706CB9009981B2 /* OutlineAppKitBridge */; }; + A246B7E52B07AADD00ECACD5 /* AppKitIntegration.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A246B7DD2B07AACF00ECACD5 /* AppKitIntegration.framework */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + A25FB7DC2B0D4420009B6B5F /* AppKitIntegration.h in Headers */ = {isa = PBXBuildFile; fileRef = A272490D2B0D20530018A598 /* AppKitIntegration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A25FB7E92B0D7631009B6B5F /* OutlineLauncher.app in Copy OutlineLauncher */ = {isa = PBXBuildFile; fileRef = A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + A26F9C362B0D9CA000BCD3E6 /* OutlineLauncher in Frameworks */ = {isa = PBXBuildFile; productRef = A26F9C352B0D9CA000BCD3E6 /* OutlineLauncher */; }; A271D42D2A708240009981B2 /* AppDelegate+Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = A271D42C2A708240009981B2 /* AppDelegate+Outline.m */; }; - A271D4302A708278009981B2 /* CocoaLumberjack in Frameworks */ = {isa = PBXBuildFile; productRef = A271D42F2A708278009981B2 /* CocoaLumberjack */; }; - A271D4322A708278009981B2 /* CocoaLumberjackSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A271D4312A708278009981B2 /* CocoaLumberjackSwift */; }; A271D4342A70829D009981B2 /* OutlineAppleLib in Frameworks */ = {isa = PBXBuildFile; productRef = A271D4332A70829D009981B2 /* OutlineAppleLib */; }; - A27F43AA29F6EC43002C3678 /* config.xml in CopyFiles */ = {isa = PBXBuildFile; fileRef = F840E1F0165FE0F500CFE078 /* config.xml */; }; - A27F43AB29F6EC43002C3678 /* www in CopyFiles */ = {isa = PBXBuildFile; fileRef = 301BF56E109A69640062928A /* www */; }; - A2A83B392A1C5B2E00755F56 /* OutlineLauncher.app in Copy OutlineLauncher */ = {isa = PBXBuildFile; fileRef = A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - A2B8C14D2A58B70E0054487E /* AppKitBridge.bundle in Embed PlugIns */ = {isa = PBXBuildFile; fileRef = A2DBB2F62A00D2DD0017E696 /* AppKitBridge.bundle */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - A2DBB2FB2A00D2F90017E696 /* AppKitBridge.bundle in Embed App Extensions (2 items) */ = {isa = PBXBuildFile; fileRef = A2DBB2F62A00D2DD0017E696 /* AppKitBridge.bundle */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + A272490F2B0D24200018A598 /* StatusItemController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2AC1A502B0821A7004E13CB /* StatusItemController.swift */; }; + A27B364F2B07C40100004A08 /* AppKitIntegration.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A246B7DD2B07AACF00ECACD5 /* AppKitIntegration.framework */; platformFilter = maccatalyst; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + A27B36512B07C51500004A08 /* CocoaLumberjack in Frameworks */ = {isa = PBXBuildFile; productRef = A27B36502B07C51500004A08 /* CocoaLumberjack */; }; + A27B36532B07C51500004A08 /* CocoaLumberjackSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A27B36522B07C51500004A08 /* CocoaLumberjackSwift */; }; + A27F43AA29F6EC43002C3678 /* config.xml in Copy Files */ = {isa = PBXBuildFile; fileRef = F840E1F0165FE0F500CFE078 /* config.xml */; }; + A27F43AB29F6EC43002C3678 /* www in Copy Files */ = {isa = PBXBuildFile; fileRef = 301BF56E109A69640062928A /* www */; }; + A2AC1A4F2B082197004E13CB /* AppKitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2AC1A4E2B082197004E13CB /* AppKitController.swift */; }; + A2AC1A9C2B082526004E13CB /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A2AC1A582B082526004E13CB /* Localizable.strings */; }; + A2AC1A9D2B082526004E13CB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A2AC1A9B2B082526004E13CB /* Assets.xcassets */; }; FC8C310B1FAA814A004262BE /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC8C310A1FAA814A004262BE /* NetworkExtension.framework */; }; FC8C310C1FAA88FB004262BE /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC8C310A1FAA814A004262BE /* NetworkExtension.framework */; }; /* End PBXBuildFile section */ @@ -65,21 +69,21 @@ remoteGlobalIDString = C0C01EB21E3911D50056E6CB; remoteInfo = Cordova; }; - A2B8C14E2A58B70E0054487E /* PBXContainerItemProxy */ = { + A246B7E62B07AADD00ECACD5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; - remoteGlobalIDString = A2DBB2F52A00D2DD0017E696; - remoteInfo = AppKitBridge; + remoteGlobalIDString = A246B7DC2B07AACF00ECACD5; + remoteInfo = AppKitIntegration; }; - A2DBB3032A00D5F90017E696 /* PBXContainerItemProxy */ = { + A246B7FD2B07B25C00ECACD5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; - remoteGlobalIDString = A2DBB2F52A00D2DD0017E696; - remoteInfo = AppKitBridge; + remoteGlobalIDString = A246B7DC2B07AACF00ECACD5; + remoteInfo = AppKitIntegration; }; - A2F6068D2A1C6D4A0039183A /* PBXContainerItemProxy */ = { + A2A3EE0D2B0DB62000F8E544 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; proxyType = 1; @@ -89,49 +93,60 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 3B0347571F212F0200C8EF1F /* Embed App Extensions (2 items) */ = { + 3B0347571F212F0200C8EF1F /* Embed App Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - A2DBB2FB2A00D2F90017E696 /* AppKitBridge.bundle in Embed App Extensions (2 items) */, - 3B0347531F212F0200C8EF1F /* VpnExtension.appex in Embed App Extensions (2 items) */, + 3B0347531F212F0200C8EF1F /* VpnExtension.appex in Embed App Extensions */, ); - name = "Embed App Extensions (2 items)"; + name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; }; - A27F43A929F6EC1C002C3678 /* CopyFiles */ = { + A246B7E82B07AADD00ECACD5 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; - dstSubfolderSpec = 7; + dstSubfolderSpec = 10; files = ( - A27F43AA29F6EC43002C3678 /* config.xml in CopyFiles */, - A27F43AB29F6EC43002C3678 /* www in CopyFiles */, + A246B7E52B07AADD00ECACD5 /* AppKitIntegration.framework in Embed Frameworks */, ); + name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - A2A83B382A1C5B0C00755F56 /* Copy OutlineLauncher */ = { + A25FB7E82B0D75CD009B6B5F /* Copy OutlineLauncher */ = { isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; + buildActionMask = 2147483647; dstPath = Contents/Library/LoginItems; dstSubfolderSpec = 1; files = ( - A2A83B392A1C5B2E00755F56 /* OutlineLauncher.app in Copy OutlineLauncher */, + A25FB7E92B0D7631009B6B5F /* OutlineLauncher.app in Copy OutlineLauncher */, ); name = "Copy OutlineLauncher"; runOnlyForDeploymentPostprocessing = 0; }; - A2B8C1502A58B70E0054487E /* Embed PlugIns */ = { + A27B364E2B07C3F400004A08 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; - dstSubfolderSpec = 13; + dstSubfolderSpec = 10; files = ( - A2B8C14D2A58B70E0054487E /* AppKitBridge.bundle in Embed PlugIns */, + A27B364F2B07C40100004A08 /* AppKitIntegration.framework in Embed Frameworks */, ); - name = "Embed PlugIns"; + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + A27F43A929F6EC1C002C3678 /* Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + A27F43AA29F6EC43002C3678 /* config.xml in Copy Files */, + A27F43AB29F6EC43002C3678 /* www in Copy Files */, + ); + name = "Copy Files"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ @@ -161,11 +176,81 @@ 91E45572BB494E9299D2DD41 /* CDVClipboard.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = CDVClipboard.m; path = "cordova-plugin-clipboard/CDVClipboard.m"; sourceTree = ""; }; 936C2951B7544BC8A20B6746 /* CDVClipboard.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = CDVClipboard.h; path = "cordova-plugin-clipboard/CDVClipboard.h"; sourceTree = ""; }; 941052A220F54953928FF2E2 /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + A246B7DD2B07AACF00ECACD5 /* AppKitIntegration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppKitIntegration.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OutlineLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; }; A26D26382A1C41B4009838E0 /* OutlineLauncher.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OutlineLauncher.entitlements; sourceTree = ""; }; A271D42C2A708240009981B2 /* AppDelegate+Outline.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+Outline.m"; sourceTree = ""; }; A271D42E2A708253009981B2 /* AppDelegate+Outline.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+Outline.h"; sourceTree = ""; }; - A2DBB2F62A00D2DD0017E696 /* AppKitBridge.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppKitBridge.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + A272490D2B0D20530018A598 /* AppKitIntegration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppKitIntegration.h; sourceTree = ""; }; + A2AC1A4E2B082197004E13CB /* AppKitController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppKitController.swift; sourceTree = ""; }; + A2AC1A502B0821A7004E13CB /* StatusItemController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusItemController.swift; sourceTree = ""; }; + A2AC1A592B082526004E13CB /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A5A2B082526004E13CB /* ur */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ur; path = ur.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A5B2B082526004E13CB /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A5C2B082526004E13CB /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A5D2B082526004E13CB /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A5E2B082526004E13CB /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A5F2B082526004E13CB /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A602B082526004E13CB /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A612B082526004E13CB /* mr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mr; path = mr.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A622B082526004E13CB /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = mk.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A632B082526004E13CB /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = sq.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A642B082526004E13CB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A652B082526004E13CB /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A662B082526004E13CB /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A672B082526004E13CB /* am */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = am; path = am.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A682B082526004E13CB /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A692B082526004E13CB /* sw */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sw; path = sw.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A6A2B082526004E13CB /* is */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = is; path = is.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A6B2B082526004E13CB /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A6C2B082526004E13CB /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A6D2B082526004E13CB /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A6E2B082526004E13CB /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A6F2B082526004E13CB /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A702B082526004E13CB /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A712B082526004E13CB /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A722B082526004E13CB /* sr-Latn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sr-Latn"; path = "sr-Latn.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A732B082526004E13CB /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = kk.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A742B082526004E13CB /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sr; path = sr.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A752B082526004E13CB /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = ms.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A762B082526004E13CB /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A772B082526004E13CB /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = ta.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A782B082526004E13CB /* ne */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ne; path = ne.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A792B082526004E13CB /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7A2B082526004E13CB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7B2B082526004E13CB /* km */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = km; path = km.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7C2B082526004E13CB /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7D2B082526004E13CB /* fil */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fil; path = fil.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7E2B082526004E13CB /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = hy.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A7F2B082526004E13CB /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A802B082526004E13CB /* mn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mn; path = mn.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A812B082526004E13CB /* my */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = my; path = my.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A822B082526004E13CB /* no */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = no; path = no.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A832B082526004E13CB /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A842B082526004E13CB /* ka */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ka; path = ka.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A852B082526004E13CB /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A862B082526004E13CB /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A872B082526004E13CB /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A882B082526004E13CB /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A892B082526004E13CB /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8A2B082526004E13CB /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8B2B082526004E13CB /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8C2B082526004E13CB /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8D2B082526004E13CB /* af */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = af; path = af.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8E2B082526004E13CB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A8F2B082526004E13CB /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A902B082526004E13CB /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A912B082526004E13CB /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A922B082526004E13CB /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A932B082526004E13CB /* az */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = az; path = az.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A942B082526004E13CB /* bn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bn; path = bn.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A952B082526004E13CB /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; + A2AC1A962B082526004E13CB /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A972B082526004E13CB /* bs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bs; path = bs.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A982B082526004E13CB /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A992B082526004E13CB /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A9A2B082526004E13CB /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; + A2AC1A9B2B082526004E13CB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; AAFAFA54943F490EAF4CD5BC /* OutlinePlugin.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = OutlinePlugin.swift; path = "cordova-plugin-outline/OutlinePlugin.swift"; sourceTree = ""; }; EB87FDF31871DA8E0020F90C /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../../www; sourceTree = ""; }; EB87FDF41871DAF40020F90C /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = ../../config.xml; sourceTree = ""; }; @@ -181,11 +266,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A271D4302A708278009981B2 /* CocoaLumberjack in Frameworks */, + A27B36512B07C51500004A08 /* CocoaLumberjack in Frameworks */, 301BF552109A68D80062928A /* libCordova.a in Frameworks */, FC8C310C1FAA88FB004262BE /* NetworkExtension.framework in Frameworks */, - A271D4322A708278009981B2 /* CocoaLumberjackSwift in Frameworks */, A271D4342A70829D009981B2 /* OutlineAppleLib in Frameworks */, + A27B36532B07C51500004A08 /* CocoaLumberjackSwift in Frameworks */, 52CE53E7295B6A310064D03D /* Sentry in Frameworks */, 1CE7466BA73B4CCB838EBE21 /* libz.tbd in Frameworks */, ); @@ -204,15 +289,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A271D4202A7069D8009981B2 /* OutlineLauncher in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A2DBB2F32A00D2DD0017E696 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A271D4222A706CB9009981B2 /* OutlineAppKitBridge in Frameworks */, + A26F9C362B0D9CA000BCD3E6 /* OutlineLauncher in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -222,6 +299,7 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + A2C58D0B2B069CC8008222FC /* AppKitBridge */, 302D95EE14D2391D003F00A1 /* MainViewController.h */, 302D95EF14D2391D003F00A1 /* MainViewController.m */, 302D95F014D2391D003F00A1 /* MainViewController.xib */, @@ -239,8 +317,8 @@ children = ( 1D6058910D05DD3D006BFB54 /* Outline.app */, 3B0347481F212F0100C8EF1F /* VpnExtension.appex */, - A2DBB2F62A00D2DD0017E696 /* AppKitBridge.bundle */, A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */, + A246B7DD2B07AACF00ECACD5 /* AppKitIntegration.framework */, ); name = Products; sourceTree = ""; @@ -348,6 +426,34 @@ path = OutlineLauncher; sourceTree = ""; }; + A2AC1A562B082526004E13CB /* Resources */ = { + isa = PBXGroup; + children = ( + A2AC1A572B082526004E13CB /* Strings */, + A2AC1A9B2B082526004E13CB /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + A2AC1A572B082526004E13CB /* Strings */ = { + isa = PBXGroup; + children = ( + A2AC1A582B082526004E13CB /* Localizable.strings */, + ); + path = Strings; + sourceTree = ""; + }; + A2C58D0B2B069CC8008222FC /* AppKitBridge */ = { + isa = PBXGroup; + children = ( + A2AC1A562B082526004E13CB /* Resources */, + A2AC1A4E2B082197004E13CB /* AppKitController.swift */, + A2AC1A502B0821A7004E13CB /* StatusItemController.swift */, + A272490D2B0D20530018A598 /* AppKitIntegration.h */, + ); + path = AppKitBridge; + sourceTree = ""; + }; EB87FDF11871DA420020F90C /* Staging */ = { isa = PBXGroup; children = ( @@ -367,33 +473,45 @@ }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + A272490C2B0D20200018A598 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A25FB7DC2B0D4420009B6B5F /* AppKitIntegration.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ 1D6058900D05DD3D006BFB54 /* Outline */ = { isa = PBXNativeTarget; buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "Outline" */; buildPhases = ( - A27F43A929F6EC1C002C3678 /* CopyFiles */, + A27F43A929F6EC1C002C3678 /* Copy Files */, 1D60588D0D05DD3D006BFB54 /* Resources */, 1D60588E0D05DD3D006BFB54 /* Sources */, 1D60588F0D05DD3D006BFB54 /* Frameworks */, - A2A83B382A1C5B0C00755F56 /* Copy OutlineLauncher */, - 3B0347571F212F0200C8EF1F /* Embed App Extensions (2 items) */, + A25FB7E82B0D75CD009B6B5F /* Copy OutlineLauncher */, + 3B0347571F212F0200C8EF1F /* Embed App Extensions */, + A246B7E82B07AADD00ECACD5 /* Embed Frameworks */, FC0FFD6C1FCCE21E00EB0129 /* Remove unused framework architectures */, ); buildRules = ( ); dependencies = ( - A2F6068E2A1C6D4A0039183A /* PBXTargetDependency */, - A2DBB3042A00D5F90017E696 /* PBXTargetDependency */, + A2A3EE0E2B0DB62000F8E544 /* PBXTargetDependency */, 301BF551109A68C00062928A /* PBXTargetDependency */, 3B0347521F212F0200C8EF1F /* PBXTargetDependency */, + A246B7E72B07AADD00ECACD5 /* PBXTargetDependency */, ); name = Outline; packageProductDependencies = ( 52CE53E6295B6A310064D03D /* Sentry */, - A271D42F2A708278009981B2 /* CocoaLumberjack */, - A271D4312A708278009981B2 /* CocoaLumberjackSwift */, A271D4332A70829D009981B2 /* OutlineAppleLib */, + A27B36502B07C51500004A08 /* CocoaLumberjack */, + A27B36522B07C51500004A08 /* CocoaLumberjackSwift */, ); productName = Outline; productReference = 1D6058910D05DD3D006BFB54 /* Outline.app */; @@ -418,45 +536,45 @@ productReference = 3B0347481F212F0100C8EF1F /* VpnExtension.appex */; productType = "com.apple.product-type.app-extension"; }; - A26D262C2A1C41B1009838E0 /* OutlineLauncher */ = { + A246B7DC2B07AACF00ECACD5 /* AppKitIntegration */ = { isa = PBXNativeTarget; - buildConfigurationList = A26D26392A1C41B4009838E0 /* Build configuration list for PBXNativeTarget "OutlineLauncher" */; + buildConfigurationList = A246B7E12B07AACF00ECACD5 /* Build configuration list for PBXNativeTarget "AppKitIntegration" */; buildPhases = ( - A25EB8812A8437D700B92EE0 /* Sources */, - A26D262A2A1C41B1009838E0 /* Frameworks */, - A2B8C1502A58B70E0054487E /* Embed PlugIns */, + A272490C2B0D20200018A598 /* Headers */, + A246B7D92B07AACF00ECACD5 /* Sources */, + A246B7DB2B07AACF00ECACD5 /* Resources */, ); buildRules = ( ); dependencies = ( - A2B8C14F2A58B70E0054487E /* PBXTargetDependency */, ); - name = OutlineLauncher; + name = AppKitIntegration; packageProductDependencies = ( - A271D41F2A7069D8009981B2 /* OutlineLauncher */, ); - productName = OutlineLauncher; - productReference = A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */; - productType = "com.apple.product-type.application"; + productName = AppKitIntegration; + productReference = A246B7DD2B07AACF00ECACD5 /* AppKitIntegration.framework */; + productType = "com.apple.product-type.framework"; }; - A2DBB2F52A00D2DD0017E696 /* AppKitBridge */ = { + A26D262C2A1C41B1009838E0 /* OutlineLauncher */ = { isa = PBXNativeTarget; - buildConfigurationList = A2DBB2F72A00D2DD0017E696 /* Build configuration list for PBXNativeTarget "AppKitBridge" */; + buildConfigurationList = A26D26392A1C41B4009838E0 /* Build configuration list for PBXNativeTarget "OutlineLauncher" */; buildPhases = ( - A2DBB2F22A00D2DD0017E696 /* Sources */, - A2DBB2F32A00D2DD0017E696 /* Frameworks */, + A25EB8812A8437D700B92EE0 /* Sources */, + A26D262A2A1C41B1009838E0 /* Frameworks */, + A27B364E2B07C3F400004A08 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + A246B7FE2B07B25C00ECACD5 /* PBXTargetDependency */, ); - name = AppKitBridge; + name = OutlineLauncher; packageProductDependencies = ( - A271D4212A706CB9009981B2 /* OutlineAppKitBridge */, + A26F9C352B0D9CA000BCD3E6 /* OutlineLauncher */, ); - productName = AppKitBridge; - productReference = A2DBB2F62A00D2DD0017E696 /* AppKitBridge.bundle */; - productType = "com.apple.product-type.bundle"; + productName = OutlineLauncher; + productReference = A26D262D2A1C41B1009838E0 /* OutlineLauncher.app */; + productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -484,12 +602,12 @@ }; }; }; - A26D262C2A1C41B1009838E0 = { - CreatedOnToolsVersion = 14.3; + A246B7DC2B07AACF00ECACD5 = { + CreatedOnToolsVersion = 15.0.1; }; - A2DBB2F52A00D2DD0017E696 = { + A26D262C2A1C41B1009838E0 = { CreatedOnToolsVersion = 14.3; - LastSwiftMigration = 1430; + LastSwiftMigration = 1500; }; }; }; @@ -500,6 +618,72 @@ knownRegions = ( en, Base, + de, + ur, + he, + ar, + el, + "zh-Hans", + ja, + fa, + mr, + mk, + sq, + uk, + "en-GB", + am, + es, + sw, + is, + sl, + da, + "es-419", + et, + it, + bg, + sk, + "sr-Latn", + kk, + sr, + ms, + si, + ta, + ne, + sv, + cs, + km, + ko, + fil, + hy, + "zh-Hant", + mn, + my, + no, + nb, + hu, + ka, + tr, + pl, + "pt-BR", + vi, + lv, + lo, + lt, + ru, + af, + fr, + fi, + id, + nl, + th, + az, + bn, + "pt-PT", + ro, + bs, + hr, + hi, + ca, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; packageReferences = ( @@ -517,8 +701,8 @@ targets = ( 1D6058900D05DD3D006BFB54 /* Outline */, 3B0347471F212F0100C8EF1F /* VpnExtension */, - A2DBB2F52A00D2DD0017E696 /* AppKitBridge */, A26D262C2A1C41B1009838E0 /* OutlineLauncher */, + A246B7DC2B07AACF00ECACD5 /* AppKitIntegration */, ); }; /* End PBXProject section */ @@ -551,6 +735,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + A246B7DB2B07AACF00ECACD5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A2AC1A9D2B082526004E13CB /* Assets.xcassets in Resources */, + A2AC1A9C2B082526004E13CB /* Localizable.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -592,14 +785,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A25EB8812A8437D700B92EE0 /* Sources */ = { + A246B7D92B07AACF00ECACD5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A272490F2B0D24200018A598 /* StatusItemController.swift in Sources */, + A2AC1A4F2B082197004E13CB /* AppKitController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A2DBB2F22A00D2DD0017E696 /* Sources */ = { + A25EB8812A8437D700B92EE0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -619,26 +814,102 @@ target = 3B0347471F212F0100C8EF1F /* VpnExtension */; targetProxy = 3B0347511F212F0200C8EF1F /* PBXContainerItemProxy */; }; - A2B8C14F2A58B70E0054487E /* PBXTargetDependency */ = { + A246B7E72B07AADD00ECACD5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; platformFilter = maccatalyst; - target = A2DBB2F52A00D2DD0017E696 /* AppKitBridge */; - targetProxy = A2B8C14E2A58B70E0054487E /* PBXContainerItemProxy */; + target = A246B7DC2B07AACF00ECACD5 /* AppKitIntegration */; + targetProxy = A246B7E62B07AADD00ECACD5 /* PBXContainerItemProxy */; }; - A2DBB3042A00D5F90017E696 /* PBXTargetDependency */ = { + A246B7FE2B07B25C00ECACD5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; platformFilter = maccatalyst; - target = A2DBB2F52A00D2DD0017E696 /* AppKitBridge */; - targetProxy = A2DBB3032A00D5F90017E696 /* PBXContainerItemProxy */; + target = A246B7DC2B07AACF00ECACD5 /* AppKitIntegration */; + targetProxy = A246B7FD2B07B25C00ECACD5 /* PBXContainerItemProxy */; }; - A2F6068E2A1C6D4A0039183A /* PBXTargetDependency */ = { + A2A3EE0E2B0DB62000F8E544 /* PBXTargetDependency */ = { isa = PBXTargetDependency; platformFilter = maccatalyst; target = A26D262C2A1C41B1009838E0 /* OutlineLauncher */; - targetProxy = A2F6068D2A1C6D4A0039183A /* PBXContainerItemProxy */; + targetProxy = A2A3EE0D2B0DB62000F8E544 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ +/* Begin PBXVariantGroup section */ + A2AC1A582B082526004E13CB /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + A2AC1A592B082526004E13CB /* de */, + A2AC1A5A2B082526004E13CB /* ur */, + A2AC1A5B2B082526004E13CB /* he */, + A2AC1A5C2B082526004E13CB /* ar */, + A2AC1A5D2B082526004E13CB /* el */, + A2AC1A5E2B082526004E13CB /* zh-Hans */, + A2AC1A5F2B082526004E13CB /* ja */, + A2AC1A602B082526004E13CB /* fa */, + A2AC1A612B082526004E13CB /* mr */, + A2AC1A622B082526004E13CB /* mk */, + A2AC1A632B082526004E13CB /* sq */, + A2AC1A642B082526004E13CB /* en */, + A2AC1A652B082526004E13CB /* uk */, + A2AC1A662B082526004E13CB /* en-GB */, + A2AC1A672B082526004E13CB /* am */, + A2AC1A682B082526004E13CB /* es */, + A2AC1A692B082526004E13CB /* sw */, + A2AC1A6A2B082526004E13CB /* is */, + A2AC1A6B2B082526004E13CB /* sl */, + A2AC1A6C2B082526004E13CB /* da */, + A2AC1A6D2B082526004E13CB /* es-419 */, + A2AC1A6E2B082526004E13CB /* et */, + A2AC1A6F2B082526004E13CB /* it */, + A2AC1A702B082526004E13CB /* bg */, + A2AC1A712B082526004E13CB /* sk */, + A2AC1A722B082526004E13CB /* sr-Latn */, + A2AC1A732B082526004E13CB /* kk */, + A2AC1A742B082526004E13CB /* sr */, + A2AC1A752B082526004E13CB /* ms */, + A2AC1A762B082526004E13CB /* si */, + A2AC1A772B082526004E13CB /* ta */, + A2AC1A782B082526004E13CB /* ne */, + A2AC1A792B082526004E13CB /* sv */, + A2AC1A7A2B082526004E13CB /* cs */, + A2AC1A7B2B082526004E13CB /* km */, + A2AC1A7C2B082526004E13CB /* ko */, + A2AC1A7D2B082526004E13CB /* fil */, + A2AC1A7E2B082526004E13CB /* hy */, + A2AC1A7F2B082526004E13CB /* zh-Hant */, + A2AC1A802B082526004E13CB /* mn */, + A2AC1A812B082526004E13CB /* my */, + A2AC1A822B082526004E13CB /* no */, + A2AC1A832B082526004E13CB /* hu */, + A2AC1A842B082526004E13CB /* ka */, + A2AC1A852B082526004E13CB /* tr */, + A2AC1A862B082526004E13CB /* pl */, + A2AC1A872B082526004E13CB /* pt-BR */, + A2AC1A882B082526004E13CB /* vi */, + A2AC1A892B082526004E13CB /* lv */, + A2AC1A8A2B082526004E13CB /* lo */, + A2AC1A8B2B082526004E13CB /* lt */, + A2AC1A8C2B082526004E13CB /* ru */, + A2AC1A8D2B082526004E13CB /* af */, + A2AC1A8E2B082526004E13CB /* fr */, + A2AC1A8F2B082526004E13CB /* fi */, + A2AC1A902B082526004E13CB /* id */, + A2AC1A912B082526004E13CB /* nl */, + A2AC1A922B082526004E13CB /* th */, + A2AC1A932B082526004E13CB /* az */, + A2AC1A942B082526004E13CB /* bn */, + A2AC1A952B082526004E13CB /* pt-PT */, + A2AC1A962B082526004E13CB /* ro */, + A2AC1A972B082526004E13CB /* bs */, + A2AC1A982B082526004E13CB /* hr */, + A2AC1A992B082526004E13CB /* hi */, + A2AC1A9A2B082526004E13CB /* ca */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ 1D6058940D05DD3E006BFB54 /* Debug */ = { isa = XCBuildConfiguration; @@ -844,10 +1115,12 @@ }; name = Release; }; - A26D263A2A1C41B4009838E0 /* Debug */ = { + A246B7E22B07AACF00ECACD5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3047A50F1AB8059700498E2A /* build-debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -857,16 +1130,19 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = OutlineLauncher/OutlineLauncher.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; DEVELOPMENT_TEAM = QT8Z3Q9V3A; - ENABLE_HARDENED_RUNTIME = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -876,36 +1152,40 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_LSApplicationCategoryType = ""; - INFOPLIST_KEY_LSBackgroundOnly = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", + "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 13.3; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.launcher3; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.AppKitIntegration; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - A26D263B2A1C41B4009838E0 /* Release */ = { + A246B7E32B07AACF00ECACD5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3047A5101AB8059700498E2A /* build-release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; @@ -915,47 +1195,53 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = OutlineLauncher/OutlineLauncher.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; DEVELOPMENT_TEAM = QT8Z3Q9V3A; - ENABLE_HARDENED_RUNTIME = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_LSApplicationCategoryType = ""; - INFOPLIST_KEY_LSBackgroundOnly = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", + "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 13.3; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.launcher3; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.AppKitIntegration; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = macosx; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - A2DBB2F82A00D2DD0017E696 /* Debug */ = { + A26D263A2A1C41B4009838E0 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3047A50F1AB8059700498E2A /* build-debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -968,12 +1254,15 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = OutlineLauncher/OutlineLauncher.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = QT8Z3Q9V3A; + ENABLE_HARDENED_RUNTIME = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -984,27 +1273,36 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = ""; + INFOPLIST_KEY_LSBackgroundOnly = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INFOPLIST_KEY_NSPrincipalClass = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 13.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.AppKitBridge; + PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.launcher3; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OBJC_BRIDGING_HEADER = "Outline/Classes/AppKitBridge/AppKitBridge-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - WRAPPER_EXTENSION = bundle; + TARGETED_DEVICE_FAMILY = 2; }; name = Debug; }; - A2DBB2F92A00D2DD0017E696 /* Release */ = { + A26D263B2A1C41B4009838E0 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3047A5101AB8059700498E2A /* build-release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -1017,32 +1315,44 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = OutlineLauncher/OutlineLauncher.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = QT8Z3Q9V3A; + ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_LSApplicationCategoryType = ""; + INFOPLIST_KEY_LSBackgroundOnly = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INFOPLIST_KEY_NSPrincipalClass = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 13.3; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.AppKitBridge; + PRODUCT_BUNDLE_IDENTIFIER = org.outline.macos.client.launcher3; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_OBJC_BRIDGING_HEADER = "Outline/Classes/AppKitBridge/AppKitBridge-Bridging-Header.h"; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; - WRAPPER_EXTENSION = bundle; + TARGETED_DEVICE_FAMILY = 2; }; name = Release; }; @@ -1082,10 +1392,11 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SKIP_INSTALL = NO; + SWIFT_OBJC_BRIDGING_HEADER = ""; }; name = Debug; }; @@ -1125,10 +1436,11 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; SDKROOT = iphoneos; SKIP_INSTALL = NO; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = ""; }; name = Release; }; @@ -1153,20 +1465,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A26D26392A1C41B4009838E0 /* Build configuration list for PBXNativeTarget "OutlineLauncher" */ = { + A246B7E12B07AACF00ECACD5 /* Build configuration list for PBXNativeTarget "AppKitIntegration" */ = { isa = XCConfigurationList; buildConfigurations = ( - A26D263A2A1C41B4009838E0 /* Debug */, - A26D263B2A1C41B4009838E0 /* Release */, + A246B7E22B07AACF00ECACD5 /* Debug */, + A246B7E32B07AACF00ECACD5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A2DBB2F72A00D2DD0017E696 /* Build configuration list for PBXNativeTarget "AppKitBridge" */ = { + A26D26392A1C41B4009838E0 /* Build configuration list for PBXNativeTarget "OutlineLauncher" */ = { isa = XCConfigurationList; buildConfigurations = ( - A2DBB2F82A00D2DD0017E696 /* Debug */, - A2DBB2F92A00D2DD0017E696 /* Release */, + A26D263A2A1C41B4009838E0 /* Debug */, + A26D263B2A1C41B4009838E0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1211,28 +1523,24 @@ isa = XCSwiftPackageProductDependency; productName = PacketTunnelProvider; }; - A271D41F2A7069D8009981B2 /* OutlineLauncher */ = { + A26F9C352B0D9CA000BCD3E6 /* OutlineLauncher */ = { isa = XCSwiftPackageProductDependency; productName = OutlineLauncher; }; - A271D4212A706CB9009981B2 /* OutlineAppKitBridge */ = { + A271D4332A70829D009981B2 /* OutlineAppleLib */ = { isa = XCSwiftPackageProductDependency; - productName = OutlineAppKitBridge; + productName = OutlineAppleLib; }; - A271D42F2A708278009981B2 /* CocoaLumberjack */ = { + A27B36502B07C51500004A08 /* CocoaLumberjack */ = { isa = XCSwiftPackageProductDependency; package = 52CBB890295BD8F200D0073F /* XCRemoteSwiftPackageReference "CocoaLumberjack" */; productName = CocoaLumberjack; }; - A271D4312A708278009981B2 /* CocoaLumberjackSwift */ = { + A27B36522B07C51500004A08 /* CocoaLumberjackSwift */ = { isa = XCSwiftPackageProductDependency; package = 52CBB890295BD8F200D0073F /* XCRemoteSwiftPackageReference "CocoaLumberjack" */; productName = CocoaLumberjackSwift; }; - A271D4332A70829D009981B2 /* OutlineAppleLib */ = { - isa = XCSwiftPackageProductDependency; - productName = OutlineAppleLib; - }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; diff --git a/src/cordova/apple/xcode/ios/Outline.xcodeproj/xcshareddata/xcschemes/Outline.xcscheme b/src/cordova/apple/xcode/ios/Outline.xcodeproj/xcshareddata/xcschemes/Outline.xcscheme index e1b609e05b..28940f2c24 100644 --- a/src/cordova/apple/xcode/ios/Outline.xcodeproj/xcshareddata/xcschemes/Outline.xcscheme +++ b/src/cordova/apple/xcode/ios/Outline.xcodeproj/xcshareddata/xcschemes/Outline.xcscheme @@ -26,10 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - + + - - String? { + guard let bundleId = Bundle.main.bundleIdentifier else { + NSLog("[AppKitController] Failed to retrieve the application's bundle ID.") + return nil + } + return String(format: "%@.%@", bundleId, AppKitController.kAppLauncherName) +} + +/// Returns the main application's bundle ID from the embedded launcher bundle ID. +private func getMainBundleId(_ launcherBundleId: String) -> String { + return (launcherBundleId as NSString).deletingPathExtension +} diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/ConnectionStatus.swift b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/AppKitIntegration.h similarity index 69% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/ConnectionStatus.swift rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/AppKitIntegration.h index bf0171db45..9fb2129d2f 100644 --- a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/ConnectionStatus.swift +++ b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/AppKitIntegration.h @@ -12,8 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -@objc public enum ConnectionStatus: Int { - case unknown - case connected - case disconnected -} +#import + +//! Project version number for AppKitIntegration. +FOUNDATION_EXPORT double AppKitIntegrationVersionNumber; + +//! Project version string for AppKitIntegration. +FOUNDATION_EXPORT const unsigned char AppKitIntegrationVersionString[]; diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/Contents.json b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/Contents.json similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/Contents.json rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/Contents.json diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/Contents.json b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/Contents.json similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/Contents.json rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/Contents.json diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/outline-black-off-2x.png b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/outline-black-off-2x.png similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/outline-black-off-2x.png rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image.imageset/outline-black-off-2x.png diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/Contents.json b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/Contents.json similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/Contents.json rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/Contents.json diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/outline-black-on-2x.png b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/outline-black-on-2x.png similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/outline-black-on-2x.png rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Assets.xcassets/status_bar_button_image_connected.imageset/outline-black-on-2x.png diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/af.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/af.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/af.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/af.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/am.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/am.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/am.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/am.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ar.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ar.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ar.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ar.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/az.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/az.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/az.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/az.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bg.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bg.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bg.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bg.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bn.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bn.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bn.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bn.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bs.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bs.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/bs.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/bs.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ca.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ca.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ca.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ca.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/cs.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/cs.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/cs.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/cs.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/da.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/da.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/da.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/da.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/de.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/de.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/de.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/de.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/el.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/el.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/el.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/el.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/en-GB.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/en-GB.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/en-GB.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/en-GB.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/en.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/en.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/en.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/en.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/es-419.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/es-419.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/es-419.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/es-419.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/es.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/es.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/es.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/es.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/et.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/et.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/et.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/et.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fa.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fa.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fa.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fa.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fi.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fi.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fi.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fi.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fil.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fil.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fil.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fil.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fr.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fr.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/fr.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/fr.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/he.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/he.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/he.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/he.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hi.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hi.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hi.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hi.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hr.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hr.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hr.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hr.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hu.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hu.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hu.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hu.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hy.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hy.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/hy.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/hy.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/id.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/id.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/id.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/id.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/is.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/is.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/is.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/is.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/it.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/it.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/it.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/it.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ja.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ja.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ja.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ja.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ka.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ka.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ka.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ka.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/kk.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/kk.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/kk.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/kk.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/km.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/km.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/km.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/km.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ko.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ko.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ko.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ko.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lo.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lo.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lo.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lo.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lt.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lt.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lt.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lt.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lv.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lv.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/lv.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/lv.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mk.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mk.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mk.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mk.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mn.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mn.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mn.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mn.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mr.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mr.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/mr.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/mr.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ms.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ms.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ms.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ms.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/my.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/my.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/my.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/my.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ne.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ne.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ne.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ne.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/nl.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/nl.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/nl.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/nl.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/no.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/no.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/no.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/no.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pl.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pl.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pl.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pl.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pt-BR.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pt-BR.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pt-BR.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pt-BR.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pt-PT.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pt-PT.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/pt-PT.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/pt-PT.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ro.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ro.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ro.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ro.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ru.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ru.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ru.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ru.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/si.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/si.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/si.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/si.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sk.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sk.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sk.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sk.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sl.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sl.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sl.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sl.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sq.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sq.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sq.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sq.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sr-Latn.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sr-Latn.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sr-Latn.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sr-Latn.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sr.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sr.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sr.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sr.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sv.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sv.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sv.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sv.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sw.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sw.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/sw.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/sw.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ta.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ta.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ta.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ta.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/th.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/th.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/th.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/th.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/tr.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/tr.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/tr.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/tr.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/uk.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/uk.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/uk.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/uk.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ur.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ur.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/ur.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/ur.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/vi.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/vi.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/vi.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/vi.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/zh-Hans.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/zh-Hans.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/zh-Hans.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/zh-Hans.lproj/Localizable.strings diff --git a/src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/zh-Hant.lproj/Localizable.strings b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/zh-Hant.lproj/Localizable.strings similarity index 100% rename from src/cordova/apple/OutlineAppleLib/Sources/OutlineAppKitBridge/Resources/Strings/zh-Hant.lproj/Localizable.strings rename to src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/Resources/Strings/zh-Hant.lproj/Localizable.strings diff --git a/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/StatusItemController.swift b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/StatusItemController.swift new file mode 100644 index 0000000000..995228d1db --- /dev/null +++ b/src/cordova/apple/xcode/ios/Outline/Classes/AppKitBridge/StatusItemController.swift @@ -0,0 +1,119 @@ +// Copyright 2023 The Outline Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import AppKit + +@objc +public enum ConnectionStatus: Int { + case unknown + case connected + case disconnected +} + +var StatusItem = NSStatusItem() + +class StatusItemController: NSObject { + let connectionStatusMenuItem = NSMenuItem(title: MenuTitle.statusDisconnected, + action: nil, + keyEquivalent: "") + + private enum AppIconImage { + static let statusConnected = getImage(name: "status_bar_button_image_connected") + static let statusDisconnected = getImage(name: "status_bar_button_image") + } + + private enum MenuTitle { + static let open = NSLocalizedString( + "tray_open_window", + bundle: Bundle(for: StatusItemController.self), + comment: "Tray menu entry to show the application window." + ) + static let quit = NSLocalizedString( + "quit", + bundle: Bundle(for: StatusItemController.self), + comment: "Tray menu entry to quit the application." + ) + static let statusConnected = NSLocalizedString( + "connected_server_state", + bundle: Bundle(for: StatusItemController.self), + comment: "Tray menu entry indicating a server is currently connected and in use." + ) + static let statusDisconnected = NSLocalizedString( + "disconnected_server_state", + bundle: Bundle(for: StatusItemController.self), + comment: "Tray menu entry indicating no server is currently connected." + ) + } + + override init() { + super.init() + + NSLog("[StatusItemController] Creating status menu") + StatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) + setStatus(status: .disconnected) + + let menu = NSMenu() + let openMenuItem = NSMenuItem(title: MenuTitle.open, action: #selector(openApplication), keyEquivalent: "o") + openMenuItem.target = self + menu.addItem(openMenuItem) + menu.addItem(connectionStatusMenuItem) + menu.addItem(NSMenuItem.separator()) + let closeMenuItem = NSMenuItem(title: MenuTitle.quit, action: #selector(closeApplication), keyEquivalent: "q") + closeMenuItem.target = self + menu.addItem(closeMenuItem) + StatusItem.menu = menu + } + + func setStatus(status: ConnectionStatus) { + NSLog("[StatusItemController] Setting status: \(status)") + let isConnected = status == .connected + let appIconImage = isConnected ? AppIconImage.statusConnected : AppIconImage.statusDisconnected + appIconImage.isTemplate = true + StatusItem.button?.image = appIconImage + + let connectionStatusTitle = isConnected ? MenuTitle.statusConnected : MenuTitle.statusDisconnected + connectionStatusMenuItem.title = connectionStatusTitle + } + + @objc func openApplication(_: AnyObject?) { + NSLog("[StatusItemController] Opening application") + NSApp.activate(ignoringOtherApps: true) + guard let uiWindow = getUiWindow() else { + return + } + uiWindow.makeKeyAndOrderFront(self) + } + + @objc func closeApplication(_: AnyObject?) { + NSLog("[StatusItemController] Closing application") + NotificationCenter.default.post(name: Notification.Name("appQuit"), object: nil) + NSApplication.shared.terminate(self) + } +} + +private func getUiWindow() -> NSWindow? { + for window in NSApp.windows { + if String(describing: window).contains("UINSWindow") { + return window + } + } + return nil +} + +private func getImage(name: String) -> NSImage { + guard let image = Bundle(for: StatusItemController.self).image(forResource: NSImage.Name(name)) else { + fatalError("Unable to load image asset named \(name).") + } + return image +}