Add 3D Touch items (#267)
- Enable/Disable VPN - Reconnect (if enabled) Move lifecycle operations to SceneDelegate.
This commit is contained in:
parent
4a2dec9c6a
commit
7346bfc65c
|
@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- 3D Touch items. [#267](https://github.com/passepartoutvpn/passepartout-apple/pull/267)
|
||||||
- Prompt for password interactively. [#3](https://github.com/passepartoutvpn/passepartout-apple/issues/3)
|
- Prompt for password interactively. [#3](https://github.com/passepartoutvpn/passepartout-apple/issues/3)
|
||||||
- Ukranian translations (Dmitry Chirkin). [#243](https://github.com/passepartoutvpn/passepartout-apple/pull/243)
|
- Ukranian translations (Dmitry Chirkin). [#243](https://github.com/passepartoutvpn/passepartout-apple/pull/243)
|
||||||
- Restore DNS "Domain" setting. [#260](https://github.com/passepartoutvpn/passepartout-apple/pull/260)
|
- Restore DNS "Domain" setting. [#260](https://github.com/passepartoutvpn/passepartout-apple/pull/260)
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
0E0BD27627B2EB2200583AC5 /* DonateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0BD27527B2EB2200583AC5 /* DonateView.swift */; };
|
0E0BD27627B2EB2200583AC5 /* DonateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0BD27527B2EB2200583AC5 /* DonateView.swift */; };
|
||||||
0E0BD27927B2EBE500583AC5 /* ShortcutsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0BD27827B2EBE500583AC5 /* ShortcutsView.swift */; };
|
0E0BD27927B2EBE500583AC5 /* ShortcutsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0BD27827B2EBE500583AC5 /* ShortcutsView.swift */; };
|
||||||
0E0C0729236087A100155AAC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E0C072B236087A100155AAC /* InfoPlist.strings */; };
|
0E0C0729236087A100155AAC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0E0C072B236087A100155AAC /* InfoPlist.strings */; };
|
||||||
|
0E0F4C5A29C761850022E884 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F4C5929C761850022E884 /* SceneDelegate.swift */; };
|
||||||
|
0E0F4C5C29C76B790022E884 /* SceneDelegate+Shortcuts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0F4C5B29C76B790022E884 /* SceneDelegate+Shortcuts.swift */; };
|
||||||
0E12BC8F27F62C8600B2F912 /* Validators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12BC8E27F62C8500B2F912 /* Validators.swift */; };
|
0E12BC8F27F62C8600B2F912 /* Validators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E12BC8E27F62C8500B2F912 /* Validators.swift */; };
|
||||||
0E1B5F5C29C506AD00FE7D18 /* ProfileView+Diagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1B5F5B29C506AC00FE7D18 /* ProfileView+Diagnostics.swift */; };
|
0E1B5F5C29C506AD00FE7D18 /* ProfileView+Diagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1B5F5B29C506AC00FE7D18 /* ProfileView+Diagnostics.swift */; };
|
||||||
0E1F5628287F0ECB00F8ADD7 /* ProviderProfileItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1F5627287F0ECB00F8ADD7 /* ProviderProfileItem.swift */; };
|
0E1F5628287F0ECB00F8ADD7 /* ProviderProfileItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1F5627287F0ECB00F8ADD7 /* ProviderProfileItem.swift */; };
|
||||||
|
@ -304,6 +306,8 @@
|
||||||
0E0BD27827B2EBE500583AC5 /* ShortcutsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsView.swift; sourceTree = "<group>"; };
|
0E0BD27827B2EBE500583AC5 /* ShortcutsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsView.swift; sourceTree = "<group>"; };
|
||||||
0E0C072A236087A100155AAC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
0E0C072A236087A100155AAC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
0E0C072C236087C800155AAC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
0E0C072C236087C800155AAC /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
|
0E0F4C5929C761850022E884 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
0E0F4C5B29C76B790022E884 /* SceneDelegate+Shortcuts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SceneDelegate+Shortcuts.swift"; sourceTree = "<group>"; };
|
||||||
0E12BC8E27F62C8500B2F912 /* Validators.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Validators.swift; sourceTree = "<group>"; };
|
0E12BC8E27F62C8500B2F912 /* Validators.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Validators.swift; sourceTree = "<group>"; };
|
||||||
0E1B5F5B29C506AC00FE7D18 /* ProfileView+Diagnostics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProfileView+Diagnostics.swift"; sourceTree = "<group>"; };
|
0E1B5F5B29C506AC00FE7D18 /* ProfileView+Diagnostics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProfileView+Diagnostics.swift"; sourceTree = "<group>"; };
|
||||||
0E1C0A52238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
0E1C0A52238FFF97009FC087 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
|
@ -875,6 +879,8 @@
|
||||||
0E0C072B236087A100155AAC /* InfoPlist.strings */,
|
0E0C072B236087A100155AAC /* InfoPlist.strings */,
|
||||||
0E3FC6852867A3F9009B851C /* AppDelegate.swift */,
|
0E3FC6852867A3F9009B851C /* AppDelegate.swift */,
|
||||||
0E2A8D4727ADF87F00207D04 /* PassepartoutApp.swift */,
|
0E2A8D4727ADF87F00207D04 /* PassepartoutApp.swift */,
|
||||||
|
0E0F4C5929C761850022E884 /* SceneDelegate.swift */,
|
||||||
|
0E0F4C5B29C76B790022E884 /* SceneDelegate+Shortcuts.swift */,
|
||||||
);
|
);
|
||||||
path = App;
|
path = App;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -1420,6 +1426,7 @@
|
||||||
0E5349C827C176D100C71BB3 /* EndpointView+WireGuard.swift in Sources */,
|
0E5349C827C176D100C71BB3 /* EndpointView+WireGuard.swift in Sources */,
|
||||||
0EBC076027EC587900208AD9 /* SwiftGen+Strings.swift in Sources */,
|
0EBC076027EC587900208AD9 /* SwiftGen+Strings.swift in Sources */,
|
||||||
0E0392772818732D00827C10 /* BuildProducts.swift in Sources */,
|
0E0392772818732D00827C10 /* BuildProducts.swift in Sources */,
|
||||||
|
0E0F4C5C29C76B790022E884 /* SceneDelegate+Shortcuts.swift in Sources */,
|
||||||
0E5683B927C2825D00EAF1CD /* DiagnosticsView.swift in Sources */,
|
0E5683B927C2825D00EAF1CD /* DiagnosticsView.swift in Sources */,
|
||||||
0E3FC6862867A3F9009B851C /* AppDelegate.swift in Sources */,
|
0E3FC6862867A3F9009B851C /* AppDelegate.swift in Sources */,
|
||||||
0E71ACFD27C1321A00F85C4B /* ActivityView.swift in Sources */,
|
0E71ACFD27C1321A00F85C4B /* ActivityView.swift in Sources */,
|
||||||
|
@ -1456,6 +1463,7 @@
|
||||||
0ED7D62F2867328A009F2F8F /* Constants+Library.swift in Sources */,
|
0ED7D62F2867328A009F2F8F /* Constants+Library.swift in Sources */,
|
||||||
0E5467FA2867AA0A00F74D1C /* MacBundleDelegate.swift in Sources */,
|
0E5467FA2867AA0A00F74D1C /* MacBundleDelegate.swift in Sources */,
|
||||||
0E0BD27327B2EA2C00583AC5 /* MainView.swift in Sources */,
|
0E0BD27327B2EA2C00583AC5 /* MainView.swift in Sources */,
|
||||||
|
0E0F4C5A29C761850022E884 /* SceneDelegate.swift in Sources */,
|
||||||
0EB17EBA27D2560300D473B5 /* PassepartoutProviders+Extensions.swift in Sources */,
|
0EB17EBA27D2560300D473B5 /* PassepartoutProviders+Extensions.swift in Sources */,
|
||||||
0E3B7FDA27E51A0200C66F13 /* ProfileView+Provider.swift in Sources */,
|
0E3B7FDA27E51A0200C66F13 /* ProfileView+Provider.swift in Sources */,
|
||||||
0E5468062867AEC500F74D1C /* MacMenu.swift in Sources */,
|
0E5468062867AEC500F74D1C /* MacMenu.swift in Sources */,
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import PassepartoutLibrary
|
||||||
|
|
||||||
class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
|
class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
|
||||||
private let mac = MacBundle.shared
|
private let mac = MacBundle.shared
|
||||||
|
@ -39,4 +40,10 @@ class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
|
||||||
#endif
|
#endif
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
|
||||||
|
let sceneConfiguration = UISceneConfiguration(name: "SceneDelegate", sessionRole: connectingSceneSession.role)
|
||||||
|
sceneConfiguration.delegateClass = SceneDelegate.self
|
||||||
|
return sceneConfiguration
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -380,6 +380,23 @@ extension View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: Shortcuts
|
||||||
|
|
||||||
|
extension ShortcutType {
|
||||||
|
var themeImageName: String {
|
||||||
|
switch self {
|
||||||
|
case .enableVPN:
|
||||||
|
return "power"
|
||||||
|
|
||||||
|
case .disableVPN:
|
||||||
|
return "xmark"
|
||||||
|
|
||||||
|
case .reconnectVPN:
|
||||||
|
return "arrow.clockwise"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: Animations
|
// MARK: Animations
|
||||||
|
|
||||||
extension View {
|
extension View {
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
//
|
||||||
|
// SceneDelegate+Shortcuts.swift
|
||||||
|
// Passepartout
|
||||||
|
//
|
||||||
|
// Created by Davide De Rosa on 3/19/23.
|
||||||
|
// Copyright (c) 2023 Davide De Rosa. All rights reserved.
|
||||||
|
//
|
||||||
|
// https://github.com/passepartoutvpn
|
||||||
|
//
|
||||||
|
// This file is part of Passepartout.
|
||||||
|
//
|
||||||
|
// Passepartout is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Passepartout is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import PassepartoutLibrary
|
||||||
|
|
||||||
|
enum ShortcutType: String {
|
||||||
|
case enableVPN
|
||||||
|
|
||||||
|
case disableVPN
|
||||||
|
|
||||||
|
case reconnectVPN
|
||||||
|
}
|
||||||
|
|
||||||
|
extension SceneDelegate {
|
||||||
|
func rebuildShortcutItems() {
|
||||||
|
let items: [UIApplicationShortcutItem]
|
||||||
|
if VPNManager.shared.currentState.isEnabled {
|
||||||
|
items = [
|
||||||
|
ShortcutType.disableVPN.shortcutItem(withTitle: L10n.Shortcuts.Add.Items.DisableVpn.caption),
|
||||||
|
ShortcutType.reconnectVPN.shortcutItem(withTitle: L10n.Global.Strings.reconnect)
|
||||||
|
]
|
||||||
|
} else if ProfileManager.shared.hasActiveProfile {
|
||||||
|
items = [
|
||||||
|
ShortcutType.enableVPN.shortcutItem(withTitle: L10n.Shortcuts.Add.Items.EnableVpn.caption)
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
items = []
|
||||||
|
}
|
||||||
|
UIApplication.shared.shortcutItems = items
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleShortcutItem(_ shortcutItem: UIApplicationShortcutItem) {
|
||||||
|
switch shortcutItem.type {
|
||||||
|
case ShortcutType.enableVPN.rawValue:
|
||||||
|
Task {
|
||||||
|
try await VPNManager.shared.connectWithActiveProfile(toServer: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
case ShortcutType.disableVPN.rawValue:
|
||||||
|
Task {
|
||||||
|
await VPNManager.shared.disable()
|
||||||
|
}
|
||||||
|
|
||||||
|
case ShortcutType.reconnectVPN.rawValue:
|
||||||
|
Task {
|
||||||
|
await VPNManager.shared.reconnect()
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private extension ShortcutType {
|
||||||
|
func shortcutItem(withTitle title: String) -> UIApplicationShortcutItem {
|
||||||
|
UIApplicationShortcutItem(
|
||||||
|
type: rawValue,
|
||||||
|
localizedTitle: title,
|
||||||
|
localizedSubtitle: nil,
|
||||||
|
icon: .init(systemImageName: themeImageName)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
//
|
||||||
|
// SceneDelegate.swift
|
||||||
|
// Passepartout
|
||||||
|
//
|
||||||
|
// Created by Davide De Rosa on 3/19/23.
|
||||||
|
// Copyright (c) 2023 Davide De Rosa. All rights reserved.
|
||||||
|
//
|
||||||
|
// https://github.com/passepartoutvpn
|
||||||
|
//
|
||||||
|
// This file is part of Passepartout.
|
||||||
|
//
|
||||||
|
// Passepartout is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Passepartout is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import PassepartoutLibrary
|
||||||
|
|
||||||
|
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
||||||
|
func sceneDidEnterBackground(_ scene: UIScene) {
|
||||||
|
ProfileManager.shared.persist()
|
||||||
|
#if targetEnvironment(macCatalyst)
|
||||||
|
MacBundle.shared.utils.sendAppToBackground()
|
||||||
|
#endif
|
||||||
|
rebuildShortcutItems()
|
||||||
|
}
|
||||||
|
|
||||||
|
func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
|
||||||
|
handleShortcutItem(shortcutItem)
|
||||||
|
}
|
||||||
|
}
|
|
@ -53,7 +53,6 @@ extension OrganizerView {
|
||||||
Text("Scene")
|
Text("Scene")
|
||||||
.hidden()
|
.hidden()
|
||||||
.onAppear(perform: onAppear)
|
.onAppear(perform: onAppear)
|
||||||
.onChange(of: scenePhase, perform: onScenePhase)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func onAppear() {
|
private func onAppear() {
|
||||||
|
@ -79,22 +78,5 @@ extension OrganizerView {
|
||||||
profileManager.currentProfileId = activeProfileId
|
profileManager.currentProfileId = activeProfileId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func onScenePhase(_ phase: ScenePhase) {
|
|
||||||
switch phase {
|
|
||||||
case .background:
|
|
||||||
persist()
|
|
||||||
#if targetEnvironment(macCatalyst)
|
|
||||||
MacBundle.shared.utils.sendAppToBackground()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func persist() {
|
|
||||||
profileManager.persist()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue