diff --git a/Apps/Locations/Libraries/Sources/Core/Protocols/Application.swift b/Apps/Locations/Libraries/Sources/Core/Protocols/Application.swift new file mode 100644 index 0000000..6f60af7 --- /dev/null +++ b/Apps/Locations/Libraries/Sources/Core/Protocols/Application.swift @@ -0,0 +1,23 @@ +// +// Application.swift +// Core +// +// Created by Javier Cicchelli on 13/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Foundation +import UIKit + +public protocol Application { + + // MARK: Functions + + func canOpenURL(_ url: URL) -> Bool + func open( + _ url: URL, + options: [UIApplication.OpenExternalURLOptionsKey : Any], + completionHandler completion: ((Bool) -> Void)? + ) + +} diff --git a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift index 05d5ff5..11db617 100644 --- a/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift +++ b/Apps/Locations/Sources/Coordinators/LocationsListCoordinator.swift @@ -7,10 +7,15 @@ // import Core +import Dependency import UIKit class LocationsListCoordinator: Coordinator { + // MARK: Dependencies + + @Dependency(\.app) private var app + // MARK: Properties var children: [Coordinator] = [] @@ -62,11 +67,11 @@ extension LocationsListCoordinator: LocationsListCoordination { } func openWikipediaApp(with url: URL) { - guard UIApplication.shared.canOpenURL(url) else { + guard app.canOpenURL(url) else { return } - UIApplication.shared.open(url) + app.open(url, options: [:], completionHandler: nil) } } diff --git a/Apps/Locations/Sources/Extensions/DependencyService+Keys.swift b/Apps/Locations/Sources/Extensions/DependencyService+Keys.swift index 1826369..0f4a532 100644 --- a/Apps/Locations/Sources/Extensions/DependencyService+Keys.swift +++ b/Apps/Locations/Sources/Extensions/DependencyService+Keys.swift @@ -6,13 +6,20 @@ // Copyright © 2023 Röck+Cöde. All rights reserved. // +import Core import Dependency import Persistence import Remote +import UIKit // MARK: - DependencyService+Keys extension DependencyService { + var app: Core.Application { + get { Self[ApplicationKey.self] } + set { Self[ApplicationKey.self] = newValue } + } + var persistence: Persistence.Service { get { Self[PersistenceKey.self] } set { Self[PersistenceKey.self] = newValue } @@ -26,6 +33,10 @@ extension DependencyService { // MARK: - Dependency keys +struct ApplicationKey: DependencyKey { + static var currentValue: Core.Application = UIApplication.shared +} + struct PersistenceKey: DependencyKey { static var currentValue: Persistence.Service = PersistenceService.shared } diff --git a/Apps/Locations/Sources/Extensions/UIApplication+Conformances.swift b/Apps/Locations/Sources/Extensions/UIApplication+Conformances.swift new file mode 100644 index 0000000..598333d --- /dev/null +++ b/Apps/Locations/Sources/Extensions/UIApplication+Conformances.swift @@ -0,0 +1,12 @@ +// +// UIApplication+Conformances.swift +// Locations +// +// Created by Javier Cicchelli on 13/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Core +import UIKit + +extension UIApplication: Application {} diff --git a/DeepLinking.xcodeproj/project.pbxproj b/DeepLinking.xcodeproj/project.pbxproj index c66b4b3..e66e389 100644 --- a/DeepLinking.xcodeproj/project.pbxproj +++ b/DeepLinking.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */; }; 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */; }; 46C3B7DE29E5ED2E00F8F57C /* LocationsAddCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */; }; + 46DF736D29E82A1500AA6D21 /* UIApplication+Conformances.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46DF736C29E82A1500AA6D21 /* UIApplication+Conformances.swift */; }; 46EB331B29E1CE04001D5EAF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */; }; 46EB331F29E1CE04001D5EAF /* LocationsListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EB331E29E1CE04001D5EAF /* LocationsListViewController.swift */; }; 46EB332729E1CE05001D5EAF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 46EB332629E1CE05001D5EAF /* Assets.xcassets */; }; @@ -143,6 +144,7 @@ 46C3B7D729E5E55000F8F57C /* LocationsListCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsListCoordination.swift; sourceTree = ""; }; 46C3B7DB29E5ED2300F8F57C /* LocationsAddCoordination.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordination.swift; sourceTree = ""; }; 46C3B7DD29E5ED2E00F8F57C /* LocationsAddCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationsAddCoordinator.swift; sourceTree = ""; }; + 46DF736C29E82A1500AA6D21 /* UIApplication+Conformances.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Conformances.swift"; sourceTree = ""; }; 46EB325829E1BD5C001D5EAF /* Wikipedia.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Wikipedia.xcodeproj; path = Wikipedia/Wikipedia.xcodeproj; sourceTree = ""; }; 46EB331829E1CE04001D5EAF /* Locations.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Locations.app; sourceTree = BUILT_PRODUCTS_DIR; }; 46EB331A29E1CE04001D5EAF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -180,6 +182,7 @@ children = ( 02031EC829E60B29003C108C /* DependencyService+Keys.swift */, 02031F0929E7645F003C108C /* Location+URLs.swift */, + 46DF736C29E82A1500AA6D21 /* UIApplication+Conformances.swift */, ); path = Extensions; sourceTree = ""; @@ -550,6 +553,7 @@ 02031EEA29E6B495003C108C /* ErrorMessageView.swift in Sources */, 46C3B7DC29E5ED2300F8F57C /* LocationsAddCoordination.swift in Sources */, 46C3B7D829E5E55000F8F57C /* LocationsListCoordination.swift in Sources */, + 46DF736D29E82A1500AA6D21 /* UIApplication+Conformances.swift in Sources */, 46C3B7D629E5E50500F8F57C /* LocationsListViewModeling.swift in Sources */, 4656CBC229E6D33C00600EE6 /* LoadRemoteLocationsUseCase.swift in Sources */, 46C3B7CF29E5D00E00F8F57C /* LocationsAddViewModel.swift in Sources */,