diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj index 18a881c9..1b17101c 100644 --- a/Passepartout.xcodeproj/project.pbxproj +++ b/Passepartout.xcodeproj/project.pbxproj @@ -37,7 +37,6 @@ 0E1F562B287F0EF100F8ADD7 /* ProviderProfileItem+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E1F5629287F0EEE00F8ADD7 /* ProviderProfileItem+ViewModel.swift */; }; 0E293851285A70AC002A6E0E /* AppPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E293850285A70AC002A6E0E /* AppPreference.swift */; }; 0E293857285A73BC002A6E0E /* AppContext+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E293856285A73BC002A6E0E /* AppContext+Shared.swift */; }; - 0E29385C285A8B30002A6E0E /* CoreContext+Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E29385B285A8B30002A6E0E /* CoreContext+Shared.swift */; }; 0E2A8D4927ADF87F00207D04 /* PassepartoutApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2A8D4727ADF87F00207D04 /* PassepartoutApp.swift */; }; 0E2A8D4F27B04BBA00207D04 /* OrganizerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2A8D4E27B04BB900207D04 /* OrganizerView.swift */; }; 0E2AC24522EC3AC10037B4B0 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0E2AC24422EC3AC10037B4B0 /* Settings.bundle */; }; @@ -328,7 +327,6 @@ 0E23B4A12298559800304C30 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 0E293850285A70AC002A6E0E /* AppPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreference.swift; sourceTree = ""; }; 0E293856285A73BC002A6E0E /* AppContext+Shared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppContext+Shared.swift"; sourceTree = ""; }; - 0E29385B285A8B30002A6E0E /* CoreContext+Shared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CoreContext+Shared.swift"; sourceTree = ""; }; 0E2A8D4727ADF87F00207D04 /* PassepartoutApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PassepartoutApp.swift; sourceTree = ""; }; 0E2A8D4E27B04BB900207D04 /* OrganizerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrganizerView.swift; sourceTree = ""; }; 0E2AC24422EC3AC10037B4B0 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; @@ -583,23 +581,12 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0E293859285A7489002A6E0E /* Context */ = { - isa = PBXGroup; - children = ( - 0E021D9A284E68580077EF5D /* CoreContext.swift */, - 0E29385B285A8B30002A6E0E /* CoreContext+Shared.swift */, - 0E7A8C092A1D410400780F4B /* PersistenceManager.swift */, - ); - path = Context; - sourceTree = ""; - }; 0E29385A285A749E002A6E0E /* Context */ = { isa = PBXGroup; children = ( 0E021D9B284E68580077EF5D /* AppContext.swift */, 0E293856285A73BC002A6E0E /* AppContext+Shared.swift */, - 0E1AD5CB2A2682DA002AE6E6 /* AppError.swift */, - 0E293850285A70AC002A6E0E /* AppPreference.swift */, + 0E021D9A284E68580077EF5D /* CoreContext.swift */, ); path = Context; sourceTree = ""; @@ -706,6 +693,32 @@ path = Views; sourceTree = ""; }; + 0E3A593F2A54ACC900B3FE40 /* Managers */ = { + isa = PBXGroup; + children = ( + 0E9C232F27F47032007D5FC7 /* IntentsManager.swift */, + 0E7A8C092A1D410400780F4B /* PersistenceManager.swift */, + 0E53249627D26B51002565C3 /* ProductManager.swift */, + ); + path = Managers; + sourceTree = ""; + }; + 0E3A59402A54AD4300B3FE40 /* Domain */ = { + isa = PBXGroup; + children = ( + 0E1AD5CB2A2682DA002AE6E6 /* AppError.swift */, + 0E293850285A70AC002A6E0E /* AppPreference.swift */, + 0E0392762818732D00827C10 /* BuildProducts.swift */, + 0EA591142733DDDA0096F796 /* Intents.intentdefinition */, + 0EA591122733DD4E0096F796 /* IntentDispatcher.swift */, + 0E9C233227F47E95007D5FC7 /* IntentDispatcher+Activities.swift */, + 0EB17EA327D2263700D473B5 /* LocalProduct.swift */, + 0E7A8C072A1D40BA00780F4B /* Picker+OpenVPN.swift */, + 0E7A8C082A1D40BA00780F4B /* Picker+Network.swift */, + ); + path = Domain; + sourceTree = ""; + }; 0E41BD98286711C3006346B4 /* Launcher */ = { isa = PBXGroup; children = ( @@ -733,7 +746,7 @@ 0E5467F12867A52B00F74D1C /* Mac */ = { isa = PBXGroup; children = ( - 0E96D2FA2871D93B005EFBCF /* Models */, + 0E96D2FA2871D93B005EFBCF /* Managers */, 0E5467F92867AA0A00F74D1C /* MacBundleDelegate.swift */, 0E5467F22867A54600F74D1C /* MacBundle.swift */, ); @@ -743,7 +756,7 @@ 0E5467F52867A55F00F74D1C /* Mac */ = { isa = PBXGroup; children = ( - 0E96D2F72871D868005EFBCF /* Models */, + 0E96D2F72871D868005EFBCF /* Managers */, 0E5467F62867A57000F74D1C /* MacBridge.swift */, 0E5468052867AEC500F74D1C /* MacMenu.swift */, 0E5467FF2867AC9900F74D1C /* MacUtils.swift */, @@ -777,7 +790,7 @@ path = Mac; sourceTree = ""; }; - 0E54680C286B675F00F74D1C /* Menu */ = { + 0E54680C286B675F00F74D1C /* Views */ = { isa = PBXGroup; children = ( 0E96D2EB2871A0AD005EFBCF /* HostProfileItem.swift */, @@ -798,7 +811,7 @@ 0E96D2DF28718E44005EFBCF /* VPNItemGroup.swift */, 0E96D2E128718E78005EFBCF /* VPNItemGroup+ViewModel.swift */, ); - path = Menu; + path = Views; sourceTree = ""; }; 0E57F62F20C83FC5008323CF = { @@ -827,26 +840,7 @@ name = Products; sourceTree = ""; }; - 0E7A8C062A1D40BA00780F4B /* Pickers */ = { - isa = PBXGroup; - children = ( - 0E7A8C072A1D40BA00780F4B /* Picker+OpenVPN.swift */, - 0E7A8C082A1D40BA00780F4B /* Picker+Network.swift */, - ); - path = Pickers; - sourceTree = ""; - }; - 0E92781227E7CD530057BB81 /* InApp */ = { - isa = PBXGroup; - children = ( - 0E0392762818732D00827C10 /* BuildProducts.swift */, - 0EB17EA327D2263700D473B5 /* LocalProduct.swift */, - 0E53249627D26B51002565C3 /* ProductManager.swift */, - ); - path = InApp; - sourceTree = ""; - }; - 0E96D2F72871D868005EFBCF /* Models */ = { + 0E96D2F72871D868005EFBCF /* Managers */ = { isa = PBXGroup; children = ( 0E96D2F82871D874005EFBCF /* LightProfileManager.swift */, @@ -854,10 +848,10 @@ 0E04F0052883462E00BFCE1C /* LightUtils.swift */, 0E96D30128720067005EFBCF /* LightVPNManager.swift */, ); - path = Models; + path = Managers; sourceTree = ""; }; - 0E96D2FA2871D93B005EFBCF /* Models */ = { + 0E96D2FA2871D93B005EFBCF /* Managers */ = { isa = PBXGroup; children = ( 0E96D2FB2871D94E005EFBCF /* DefaultLightProfileManager.swift */, @@ -865,7 +859,7 @@ 0E04F0082883466500BFCE1C /* DefaultLightUtils.swift */, 0E96D3042872010A005EFBCF /* DefaultLightVPNManager.swift */, ); - path = Models; + path = Managers; sourceTree = ""; }; 0E96D3122872185E005EFBCF /* Constants */ = { @@ -895,11 +889,11 @@ children = ( 0ECB78D4285F505D00B0E460 /* Constants */, 0E29385A285A749E002A6E0E /* Context */, + 0E3A59402A54AD4300B3FE40 /* Domain */, 0E49F6C927DB398100385834 /* Extensions */, - 0E92781227E7CD530057BB81 /* InApp */, - 0EA591112733DD4E0096F796 /* Intents */, + 0E3A593F2A54ACC900B3FE40 /* Managers */, + 0E34A2B827CAA8EA00C73B67 /* L10n */, 0E5467F12867A52B00F74D1C /* Mac */, - 0E7A8C062A1D40BA00780F4B /* Pickers */, 0E2C171C27CB6307007E8488 /* Reusable */, 0E35C0AE280EF8A80071FA35 /* Views */, 0E6059CA27FCC5DE003F4063 /* Assets.xcassets */, @@ -907,10 +901,11 @@ 0E6059C927FCC5DE003F4063 /* Providers.xcassets */, 0E2AC24422EC3AC10037B4B0 /* Settings.bundle */, 0EDE8DE220C86A13004C739C /* App.entitlements */, - 0EDDEC7C28D0DC130017802E /* LaunchScreen.storyboard */, 0E09E35C2834172800BE1BAE /* Credits.rtf */, 0E57F64720C83FC7008323CF /* Info.plist */, 0E0C072B236087A100155AAC /* InfoPlist.strings */, + 0E9E5AE227B44CF1008C95DA /* Localizable.strings */, + 0EDDEC7C28D0DC130017802E /* LaunchScreen.storyboard */, 0E3FC6852867A3F9009B851C /* AppDelegate.swift */, 0E2A8D4727ADF87F00207D04 /* PassepartoutApp.swift */, 0E0F4C5929C761850022E884 /* SceneDelegate.swift */, @@ -919,17 +914,6 @@ path = App; sourceTree = ""; }; - 0EA591112733DD4E0096F796 /* Intents */ = { - isa = PBXGroup; - children = ( - 0EA591142733DDDA0096F796 /* Intents.intentdefinition */, - 0EA591122733DD4E0096F796 /* IntentDispatcher.swift */, - 0E9C233227F47E95007D5FC7 /* IntentDispatcher+Activities.swift */, - 0E9C232F27F47032007D5FC7 /* IntentsManager.swift */, - ); - path = Intents; - sourceTree = ""; - }; 0EB13BAD290E825E003CB654 /* PassepartoutTests */ = { isa = PBXGroup; children = ( @@ -942,10 +926,7 @@ isa = PBXGroup; children = ( 0ECB78D3285F4F9600B0E460 /* Constants */, - 0E293859285A7489002A6E0E /* Context */, - 0E34A2B827CAA8EA00C73B67 /* L10n */, 0E5467F52867A55F00F74D1C /* Mac */, - 0E9E5AE227B44CF1008C95DA /* Localizable.strings */, ); path = AppShared; sourceTree = ""; @@ -974,8 +955,8 @@ children = ( 0E96D3122872185E005EFBCF /* Constants */, 0E5468022867AD2100F74D1C /* Mac */, - 0E54680C286B675F00F74D1C /* Menu */, 0E5467FB2867AC4900F74D1C /* Reusable */, + 0E54680C286B675F00F74D1C /* Views */, 0E96D30628720AA1005EFBCF /* Assets.xcassets */, 0EA1D84628805EAE00F3CA48 /* Flags.xcassets */, 0ECB78E1285F53ED00B0E460 /* Info.plist */, @@ -1446,7 +1427,6 @@ 0EA591162733DDDA0096F796 /* Intents.intentdefinition in Sources */, 0E34AC7827F840890042F2AB /* OrganizerView+Scene.swift in Sources */, 0E0BD27927B2EBE500583AC5 /* ShortcutsView.swift in Sources */, - 0E29385C285A8B30002A6E0E /* CoreContext+Shared.swift in Sources */, 0E92D7C627F103300033CB7B /* ProfileView+Configuration.swift in Sources */, 0E2DE71C27DCCFE80067B9E1 /* TunnelKit+Identifiable.swift in Sources */, 0ED1D6DE27DBA42100983466 /* DiagnosticsView+WireGuard.swift in Sources */, diff --git a/Passepartout/App/Context/AppContext+Shared.swift b/Passepartout/App/Context/AppContext+Shared.swift index b9bf07c3..f77783d0 100644 --- a/Passepartout/App/Context/AppContext+Shared.swift +++ b/Passepartout/App/Context/AppContext+Shared.swift @@ -26,10 +26,38 @@ import Foundation import PassepartoutLibrary +// safer alternative to @EnvironmentObject + extension AppContext { - static let shared = AppContext(coreContext: .shared) + private static let coreContext = CoreContext(store: UserDefaultsStore(defaults: .standard, key: \.key)) + + static let shared = AppContext(coreContext: coreContext) } extension ProductManager { static let shared = AppContext.shared.productManager } + +extension UpgradeManager { + static let shared = AppContext.shared.upgradeManager +} + +extension ProfileManager { + static let shared = AppContext.shared.profileManager +} + +extension ProviderManager { + + @MainActor + static let shared = AppContext.shared.providerManager +} + +extension VPNManager { + static let shared = AppContext.shared.vpnManager +} + +extension ObservableVPNState { + + @MainActor + static let shared = AppContext.shared.vpnManager.currentState +} diff --git a/Passepartout/App/Context/AppContext.swift b/Passepartout/App/Context/AppContext.swift index a47820ba..f51f72dd 100644 --- a/Passepartout/App/Context/AppContext.swift +++ b/Passepartout/App/Context/AppContext.swift @@ -29,6 +29,8 @@ import PassepartoutLibrary @MainActor final class AppContext { + private let coreContext: CoreContext + let productManager: ProductManager private let reviewer: Reviewer @@ -36,6 +38,8 @@ final class AppContext { private var cancellables: Set = [] init(coreContext: CoreContext) { + self.coreContext = coreContext + productManager = ProductManager( appType: Constants.InApp.appType, buildProducts: Constants.InApp.buildProducts @@ -46,12 +50,28 @@ final class AppContext { // post - configureObjects(coreContext: coreContext) + configureObjects() + } + + var upgradeManager: UpgradeManager { + coreContext.upgradeManager + } + + var providerManager: ProviderManager { + coreContext.providerManager + } + + var profileManager: ProfileManager { + coreContext.profileManager + } + + var vpnManager: VPNManager { + coreContext.vpnManager } } private extension AppContext { - func configureObjects(coreContext: CoreContext) { + func configureObjects() { coreContext.vpnManager.isOnDemandRulesSupported = { self.isEligibleForOnDemandRules() } @@ -71,7 +91,7 @@ private extension AppContext { .sink { Task { pp_log.info("Refunds detected, uninstalling VPN profile") - await coreContext.vpnManager.uninstall() + await self.coreContext.vpnManager.uninstall() } }.store(in: &cancellables) } diff --git a/Passepartout/AppShared/Context/CoreContext.swift b/Passepartout/App/Context/CoreContext.swift similarity index 89% rename from Passepartout/AppShared/Context/CoreContext.swift rename to Passepartout/App/Context/CoreContext.swift index 7556f935..a10ced28 100644 --- a/Passepartout/AppShared/Context/CoreContext.swift +++ b/Passepartout/App/Context/CoreContext.swift @@ -31,20 +31,6 @@ import TunnelKitManager @MainActor final class CoreContext { - let store: KeyValueStore - - private let providersPersistence: ProvidersPersistence - - private let vpnPersistence: VPNPersistence - - var urlsForProviders: [URL]? { - providersPersistence.containerURLs - } - - var urlsForProfiles: [URL]? { - vpnPersistence.containerURLs - } - let upgradeManager: UpgradeManager let providerManager: ProviderManager @@ -56,8 +42,6 @@ final class CoreContext { private var cancellables: Set = [] init(store: KeyValueStore) { - self.store = store - let logger = SwiftyBeaverLogger( logFile: Constants.Log.App.url, logLevel: Constants.Log.level, @@ -67,10 +51,10 @@ final class CoreContext { pp_log.info("Logging to: \(logger.logFile!)") let persistenceManager = PersistenceManager(store: store) - vpnPersistence = persistenceManager.vpnPersistence( + let vpnPersistence = persistenceManager.vpnPersistence( withName: Constants.Persistence.profilesContainerName ) - providersPersistence = persistenceManager.providersPersistence( + let providersPersistence = persistenceManager.providersPersistence( withName: Constants.Persistence.providersContainerName ) @@ -126,8 +110,10 @@ final class CoreContext { configureObjects() } +} - private func configureObjects() { +private extension CoreContext { + func configureObjects() { providerManager.rateLimitMilliseconds = Constants.RateLimit.providerManager vpnManager.tunnelLogPath = Constants.Log.Tunnel.path vpnManager.tunnelLogFormat = Constants.Log.Tunnel.format diff --git a/Passepartout/App/Context/AppError.swift b/Passepartout/App/Domain/AppError.swift similarity index 100% rename from Passepartout/App/Context/AppError.swift rename to Passepartout/App/Domain/AppError.swift diff --git a/Passepartout/App/Context/AppPreference.swift b/Passepartout/App/Domain/AppPreference.swift similarity index 100% rename from Passepartout/App/Context/AppPreference.swift rename to Passepartout/App/Domain/AppPreference.swift diff --git a/Passepartout/App/Intents/Base.lproj/Intents.intentdefinition b/Passepartout/App/Domain/Base.lproj/Intents.intentdefinition similarity index 100% rename from Passepartout/App/Intents/Base.lproj/Intents.intentdefinition rename to Passepartout/App/Domain/Base.lproj/Intents.intentdefinition diff --git a/Passepartout/App/InApp/BuildProducts.swift b/Passepartout/App/Domain/BuildProducts.swift similarity index 100% rename from Passepartout/App/InApp/BuildProducts.swift rename to Passepartout/App/Domain/BuildProducts.swift diff --git a/Passepartout/App/Intents/IntentDispatcher+Activities.swift b/Passepartout/App/Domain/IntentDispatcher+Activities.swift similarity index 100% rename from Passepartout/App/Intents/IntentDispatcher+Activities.swift rename to Passepartout/App/Domain/IntentDispatcher+Activities.swift diff --git a/Passepartout/App/Intents/IntentDispatcher.swift b/Passepartout/App/Domain/IntentDispatcher.swift similarity index 100% rename from Passepartout/App/Intents/IntentDispatcher.swift rename to Passepartout/App/Domain/IntentDispatcher.swift diff --git a/Passepartout/App/InApp/LocalProduct.swift b/Passepartout/App/Domain/LocalProduct.swift similarity index 100% rename from Passepartout/App/InApp/LocalProduct.swift rename to Passepartout/App/Domain/LocalProduct.swift diff --git a/Passepartout/App/Pickers/Picker+Network.swift b/Passepartout/App/Domain/Picker+Network.swift similarity index 100% rename from Passepartout/App/Pickers/Picker+Network.swift rename to Passepartout/App/Domain/Picker+Network.swift diff --git a/Passepartout/App/Pickers/Picker+OpenVPN.swift b/Passepartout/App/Domain/Picker+OpenVPN.swift similarity index 100% rename from Passepartout/App/Pickers/Picker+OpenVPN.swift rename to Passepartout/App/Domain/Picker+OpenVPN.swift diff --git a/Passepartout/App/Intents/de.lproj/Intents.strings b/Passepartout/App/Domain/de.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/de.lproj/Intents.strings rename to Passepartout/App/Domain/de.lproj/Intents.strings diff --git a/Passepartout/App/Intents/el.lproj/Intents.strings b/Passepartout/App/Domain/el.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/el.lproj/Intents.strings rename to Passepartout/App/Domain/el.lproj/Intents.strings diff --git a/Passepartout/App/Intents/en.lproj/Intents.strings b/Passepartout/App/Domain/en.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/en.lproj/Intents.strings rename to Passepartout/App/Domain/en.lproj/Intents.strings diff --git a/Passepartout/App/Intents/es.lproj/Intents.strings b/Passepartout/App/Domain/es.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/es.lproj/Intents.strings rename to Passepartout/App/Domain/es.lproj/Intents.strings diff --git a/Passepartout/App/Intents/fr.lproj/Intents.strings b/Passepartout/App/Domain/fr.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/fr.lproj/Intents.strings rename to Passepartout/App/Domain/fr.lproj/Intents.strings diff --git a/Passepartout/App/Intents/it.lproj/Intents.strings b/Passepartout/App/Domain/it.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/it.lproj/Intents.strings rename to Passepartout/App/Domain/it.lproj/Intents.strings diff --git a/Passepartout/App/Intents/nl.lproj/Intents.strings b/Passepartout/App/Domain/nl.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/nl.lproj/Intents.strings rename to Passepartout/App/Domain/nl.lproj/Intents.strings diff --git a/Passepartout/App/Intents/pl.lproj/Intents.strings b/Passepartout/App/Domain/pl.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/pl.lproj/Intents.strings rename to Passepartout/App/Domain/pl.lproj/Intents.strings diff --git a/Passepartout/App/Intents/pt.lproj/Intents.strings b/Passepartout/App/Domain/pt.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/pt.lproj/Intents.strings rename to Passepartout/App/Domain/pt.lproj/Intents.strings diff --git a/Passepartout/App/Intents/ru.lproj/Intents.strings b/Passepartout/App/Domain/ru.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/ru.lproj/Intents.strings rename to Passepartout/App/Domain/ru.lproj/Intents.strings diff --git a/Passepartout/App/Intents/sv.lproj/Intents.strings b/Passepartout/App/Domain/sv.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/sv.lproj/Intents.strings rename to Passepartout/App/Domain/sv.lproj/Intents.strings diff --git a/Passepartout/App/Intents/uk.lproj/Intents.strings b/Passepartout/App/Domain/uk.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/uk.lproj/Intents.strings rename to Passepartout/App/Domain/uk.lproj/Intents.strings diff --git a/Passepartout/App/Intents/zh-Hans.lproj/Intents.strings b/Passepartout/App/Domain/zh-Hans.lproj/Intents.strings similarity index 100% rename from Passepartout/App/Intents/zh-Hans.lproj/Intents.strings rename to Passepartout/App/Domain/zh-Hans.lproj/Intents.strings diff --git a/Passepartout/AppShared/L10n/Core+L10n.swift b/Passepartout/App/L10n/Core+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/Core+L10n.swift rename to Passepartout/App/L10n/Core+L10n.swift diff --git a/Passepartout/AppShared/L10n/Errors+L10n.swift b/Passepartout/App/L10n/Errors+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/Errors+L10n.swift rename to Passepartout/App/L10n/Errors+L10n.swift diff --git a/Passepartout/AppShared/L10n/OpenVPN+L10n.swift b/Passepartout/App/L10n/OpenVPN+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/OpenVPN+L10n.swift rename to Passepartout/App/L10n/OpenVPN+L10n.swift diff --git a/Passepartout/AppShared/L10n/Providers+L10n.swift b/Passepartout/App/L10n/Providers+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/Providers+L10n.swift rename to Passepartout/App/L10n/Providers+L10n.swift diff --git a/Passepartout/AppShared/L10n/TunnelKit+L10n.swift b/Passepartout/App/L10n/TunnelKit+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/TunnelKit+L10n.swift rename to Passepartout/App/L10n/TunnelKit+L10n.swift diff --git a/Passepartout/AppShared/L10n/Unlocalized.swift b/Passepartout/App/L10n/Unlocalized.swift similarity index 100% rename from Passepartout/AppShared/L10n/Unlocalized.swift rename to Passepartout/App/L10n/Unlocalized.swift diff --git a/Passepartout/AppShared/L10n/WireGuard+L10n.swift b/Passepartout/App/L10n/WireGuard+L10n.swift similarity index 100% rename from Passepartout/AppShared/L10n/WireGuard+L10n.swift rename to Passepartout/App/L10n/WireGuard+L10n.swift diff --git a/Passepartout/App/Mac/Models/DefaultLightProfileManager.swift b/Passepartout/App/Mac/Managers/DefaultLightProfileManager.swift similarity index 100% rename from Passepartout/App/Mac/Models/DefaultLightProfileManager.swift rename to Passepartout/App/Mac/Managers/DefaultLightProfileManager.swift diff --git a/Passepartout/App/Mac/Models/DefaultLightProviderManager.swift b/Passepartout/App/Mac/Managers/DefaultLightProviderManager.swift similarity index 100% rename from Passepartout/App/Mac/Models/DefaultLightProviderManager.swift rename to Passepartout/App/Mac/Managers/DefaultLightProviderManager.swift diff --git a/Passepartout/App/Mac/Models/DefaultLightUtils.swift b/Passepartout/App/Mac/Managers/DefaultLightUtils.swift similarity index 100% rename from Passepartout/App/Mac/Models/DefaultLightUtils.swift rename to Passepartout/App/Mac/Managers/DefaultLightUtils.swift diff --git a/Passepartout/App/Mac/Models/DefaultLightVPNManager.swift b/Passepartout/App/Mac/Managers/DefaultLightVPNManager.swift similarity index 100% rename from Passepartout/App/Mac/Models/DefaultLightVPNManager.swift rename to Passepartout/App/Mac/Managers/DefaultLightVPNManager.swift diff --git a/Passepartout/App/Intents/IntentsManager.swift b/Passepartout/App/Managers/IntentsManager.swift similarity index 100% rename from Passepartout/App/Intents/IntentsManager.swift rename to Passepartout/App/Managers/IntentsManager.swift diff --git a/Passepartout/AppShared/Context/PersistenceManager.swift b/Passepartout/App/Managers/PersistenceManager.swift similarity index 100% rename from Passepartout/AppShared/Context/PersistenceManager.swift rename to Passepartout/App/Managers/PersistenceManager.swift diff --git a/Passepartout/App/InApp/ProductManager.swift b/Passepartout/App/Managers/ProductManager.swift similarity index 100% rename from Passepartout/App/InApp/ProductManager.swift rename to Passepartout/App/Managers/ProductManager.swift diff --git a/Passepartout/App/PassepartoutApp.swift b/Passepartout/App/PassepartoutApp.swift index 3d9c882f..d87165d4 100644 --- a/Passepartout/App/PassepartoutApp.swift +++ b/Passepartout/App/PassepartoutApp.swift @@ -47,17 +47,17 @@ struct PassepartoutApp: App { } } -extension View { - fileprivate func onIntentActivity(_ activity: IntentActivity) -> some View { +private extension View { + func onIntentActivity(_ activity: IntentActivity) -> some View { onContinueUserActivity(activity.name) { userActivity in // eligibility: ignore Siri shortcuts if not purchased - guard AppContext.shared.productManager.isEligible(forFeature: .siriShortcuts) else { + guard ProductManager.shared.isEligible(forFeature: .siriShortcuts) else { pp_log.warning("Ignore activity handler, not eligible for Siri shortcuts") return } pp_log.info("Handling activity: \(activity.name)") - activity.handler(userActivity, CoreContext.shared.vpnManager) + activity.handler(userActivity, .shared) } } } diff --git a/Passepartout/AppShared/de.lproj/Localizable.strings b/Passepartout/App/de.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/de.lproj/Localizable.strings rename to Passepartout/App/de.lproj/Localizable.strings diff --git a/Passepartout/AppShared/el.lproj/Localizable.strings b/Passepartout/App/el.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/el.lproj/Localizable.strings rename to Passepartout/App/el.lproj/Localizable.strings diff --git a/Passepartout/AppShared/en.lproj/Localizable.strings b/Passepartout/App/en.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/en.lproj/Localizable.strings rename to Passepartout/App/en.lproj/Localizable.strings diff --git a/Passepartout/AppShared/es.lproj/Localizable.strings b/Passepartout/App/es.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/es.lproj/Localizable.strings rename to Passepartout/App/es.lproj/Localizable.strings diff --git a/Passepartout/AppShared/fr.lproj/Localizable.strings b/Passepartout/App/fr.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/fr.lproj/Localizable.strings rename to Passepartout/App/fr.lproj/Localizable.strings diff --git a/Passepartout/AppShared/it.lproj/Localizable.strings b/Passepartout/App/it.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/it.lproj/Localizable.strings rename to Passepartout/App/it.lproj/Localizable.strings diff --git a/Passepartout/AppShared/nl.lproj/Localizable.strings b/Passepartout/App/nl.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/nl.lproj/Localizable.strings rename to Passepartout/App/nl.lproj/Localizable.strings diff --git a/Passepartout/AppShared/pl.lproj/Localizable.strings b/Passepartout/App/pl.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/pl.lproj/Localizable.strings rename to Passepartout/App/pl.lproj/Localizable.strings diff --git a/Passepartout/AppShared/pt.lproj/Localizable.strings b/Passepartout/App/pt.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/pt.lproj/Localizable.strings rename to Passepartout/App/pt.lproj/Localizable.strings diff --git a/Passepartout/AppShared/ru.lproj/Localizable.strings b/Passepartout/App/ru.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/ru.lproj/Localizable.strings rename to Passepartout/App/ru.lproj/Localizable.strings diff --git a/Passepartout/AppShared/sv.lproj/Localizable.strings b/Passepartout/App/sv.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/sv.lproj/Localizable.strings rename to Passepartout/App/sv.lproj/Localizable.strings diff --git a/Passepartout/AppShared/uk.lproj/Localizable.strings b/Passepartout/App/uk.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/uk.lproj/Localizable.strings rename to Passepartout/App/uk.lproj/Localizable.strings diff --git a/Passepartout/AppShared/zh-Hans.lproj/Localizable.strings b/Passepartout/App/zh-Hans.lproj/Localizable.strings similarity index 100% rename from Passepartout/AppShared/zh-Hans.lproj/Localizable.strings rename to Passepartout/App/zh-Hans.lproj/Localizable.strings diff --git a/Passepartout/AppShared/Constants/SwiftGen+Strings.swift b/Passepartout/AppShared/Constants/SwiftGen+Strings.swift index ea224b66..3fa674b9 100644 --- a/Passepartout/AppShared/Constants/SwiftGen+Strings.swift +++ b/Passepartout/AppShared/Constants/SwiftGen+Strings.swift @@ -258,8 +258,6 @@ internal enum L10n { internal enum Success { /// This means a lot to me and I really hope you keep using and promoting this app. internal static let message = L10n.tr("Localizable", "donate.alerts.purchase.success.message", fallback: "This means a lot to me and I really hope you keep using and promoting this app.") - /// Thank you - internal static let title = L10n.tr("Localizable", "donate.alerts.purchase.success.title", fallback: "Thank you") } } } diff --git a/Passepartout/AppShared/Context/CoreContext+Shared.swift b/Passepartout/AppShared/Context/CoreContext+Shared.swift deleted file mode 100644 index 83d29712..00000000 --- a/Passepartout/AppShared/Context/CoreContext+Shared.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// CoreContext.swift -// Passepartout -// -// Created by Davide De Rosa on 6/15/22. -// 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 . -// - -import Foundation -import PassepartoutLibrary - -extension CoreContext { - static let shared = CoreContext(store: UserDefaultsStore(defaults: .standard, key: \.key)) -} - -extension UpgradeManager { - static let shared = CoreContext.shared.upgradeManager -} - -extension ProfileManager { - static let shared = CoreContext.shared.profileManager -} - -extension ProviderManager { - static let shared = CoreContext.shared.providerManager -} - -extension VPNManager { - static let shared = CoreContext.shared.vpnManager -} - -extension ObservableVPNState { - - @MainActor - static let shared = CoreContext.shared.vpnManager.currentState -} diff --git a/Passepartout/AppShared/Mac/Models/LightProfileManager.swift b/Passepartout/AppShared/Mac/Managers/LightProfileManager.swift similarity index 100% rename from Passepartout/AppShared/Mac/Models/LightProfileManager.swift rename to Passepartout/AppShared/Mac/Managers/LightProfileManager.swift diff --git a/Passepartout/AppShared/Mac/Models/LightProviderManager.swift b/Passepartout/AppShared/Mac/Managers/LightProviderManager.swift similarity index 100% rename from Passepartout/AppShared/Mac/Models/LightProviderManager.swift rename to Passepartout/AppShared/Mac/Managers/LightProviderManager.swift diff --git a/Passepartout/AppShared/Mac/Models/LightUtils.swift b/Passepartout/AppShared/Mac/Managers/LightUtils.swift similarity index 100% rename from Passepartout/AppShared/Mac/Models/LightUtils.swift rename to Passepartout/AppShared/Mac/Managers/LightUtils.swift diff --git a/Passepartout/AppShared/Mac/Models/LightVPNManager.swift b/Passepartout/AppShared/Mac/Managers/LightVPNManager.swift similarity index 100% rename from Passepartout/AppShared/Mac/Models/LightVPNManager.swift rename to Passepartout/AppShared/Mac/Managers/LightVPNManager.swift diff --git a/Passepartout/Mac/Menu/HostProfileItem+ViewModel.swift b/Passepartout/Mac/Views/HostProfileItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/HostProfileItem+ViewModel.swift rename to Passepartout/Mac/Views/HostProfileItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/HostProfileItem.swift b/Passepartout/Mac/Views/HostProfileItem.swift similarity index 100% rename from Passepartout/Mac/Menu/HostProfileItem.swift rename to Passepartout/Mac/Views/HostProfileItem.swift diff --git a/Passepartout/Mac/Menu/LaunchOnLoginItem+ViewModel.swift b/Passepartout/Mac/Views/LaunchOnLoginItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/LaunchOnLoginItem+ViewModel.swift rename to Passepartout/Mac/Views/LaunchOnLoginItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/LaunchOnLoginItem.swift b/Passepartout/Mac/Views/LaunchOnLoginItem.swift similarity index 100% rename from Passepartout/Mac/Menu/LaunchOnLoginItem.swift rename to Passepartout/Mac/Views/LaunchOnLoginItem.swift diff --git a/Passepartout/Mac/Menu/PassepartoutMenu+StatusButton.swift b/Passepartout/Mac/Views/PassepartoutMenu+StatusButton.swift similarity index 100% rename from Passepartout/Mac/Menu/PassepartoutMenu+StatusButton.swift rename to Passepartout/Mac/Views/PassepartoutMenu+StatusButton.swift diff --git a/Passepartout/Mac/Menu/PassepartoutMenu.swift b/Passepartout/Mac/Views/PassepartoutMenu.swift similarity index 100% rename from Passepartout/Mac/Menu/PassepartoutMenu.swift rename to Passepartout/Mac/Views/PassepartoutMenu.swift diff --git a/Passepartout/Mac/Menu/ProfileItemGroup.swift b/Passepartout/Mac/Views/ProfileItemGroup.swift similarity index 100% rename from Passepartout/Mac/Menu/ProfileItemGroup.swift rename to Passepartout/Mac/Views/ProfileItemGroup.swift diff --git a/Passepartout/Mac/Menu/ProviderLocationItem+ViewModel.swift b/Passepartout/Mac/Views/ProviderLocationItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderLocationItem+ViewModel.swift rename to Passepartout/Mac/Views/ProviderLocationItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/ProviderLocationItem.swift b/Passepartout/Mac/Views/ProviderLocationItem.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderLocationItem.swift rename to Passepartout/Mac/Views/ProviderLocationItem.swift diff --git a/Passepartout/Mac/Menu/ProviderProfileItem+ViewModel.swift b/Passepartout/Mac/Views/ProviderProfileItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderProfileItem+ViewModel.swift rename to Passepartout/Mac/Views/ProviderProfileItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/ProviderProfileItem.swift b/Passepartout/Mac/Views/ProviderProfileItem.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderProfileItem.swift rename to Passepartout/Mac/Views/ProviderProfileItem.swift diff --git a/Passepartout/Mac/Menu/ProviderServerItem+ViewModel.swift b/Passepartout/Mac/Views/ProviderServerItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderServerItem+ViewModel.swift rename to Passepartout/Mac/Views/ProviderServerItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/ProviderServerItem.swift b/Passepartout/Mac/Views/ProviderServerItem.swift similarity index 100% rename from Passepartout/Mac/Menu/ProviderServerItem.swift rename to Passepartout/Mac/Views/ProviderServerItem.swift diff --git a/Passepartout/Mac/Menu/VPNItemGroup+ViewModel.swift b/Passepartout/Mac/Views/VPNItemGroup+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/VPNItemGroup+ViewModel.swift rename to Passepartout/Mac/Views/VPNItemGroup+ViewModel.swift diff --git a/Passepartout/Mac/Menu/VPNItemGroup.swift b/Passepartout/Mac/Views/VPNItemGroup.swift similarity index 100% rename from Passepartout/Mac/Menu/VPNItemGroup.swift rename to Passepartout/Mac/Views/VPNItemGroup.swift diff --git a/Passepartout/Mac/Menu/VisibilityItem+ViewModel.swift b/Passepartout/Mac/Views/VisibilityItem+ViewModel.swift similarity index 100% rename from Passepartout/Mac/Menu/VisibilityItem+ViewModel.swift rename to Passepartout/Mac/Views/VisibilityItem+ViewModel.swift diff --git a/Passepartout/Mac/Menu/VisibilityItem.swift b/Passepartout/Mac/Views/VisibilityItem.swift similarity index 100% rename from Passepartout/Mac/Menu/VisibilityItem.swift rename to Passepartout/Mac/Views/VisibilityItem.swift diff --git a/swiftgen.yml b/swiftgen.yml index f678f2c9..377ced23 100644 --- a/swiftgen.yml +++ b/swiftgen.yml @@ -1,6 +1,6 @@ strings: inputs: - - Passepartout/AppShared/en.lproj/Localizable.strings + - Passepartout/App/en.lproj/Localizable.strings outputs: - templateName: structured-swift4 output: Passepartout/AppShared/Constants/SwiftGen+Strings.swift