Skip to content

Commit

Permalink
Merge pull request #323 from cryptomator/feature/dependency_injection…
Browse files Browse the repository at this point in the history
…-fullversionchecker

Inject FullVersionChecker with new DI framework
  • Loading branch information
tobihagemann authored Oct 16, 2023
2 parents 264515a + 5ab938a commit 447831a
Show file tree
Hide file tree
Showing 20 changed files with 101 additions and 61 deletions.
4 changes: 3 additions & 1 deletion Cryptomator/AddVault/AddVaultCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
//

import CryptomatorCommonCore
import Dependencies
import Foundation
import UIKit

class AddVaultCoordinator: Coordinator {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
@Dependency(\.fullVersionChecker) private var fullVersionChecker
weak var parentCoordinator: MainCoordinator?

init(navigationController: UINavigationController) {
Expand Down Expand Up @@ -76,7 +78,7 @@ class AddVaultCoordinator: Coordinator {
}

private func isAllowedToCreateNewVault() -> Bool {
return GlobalFullVersionChecker.default.isFullVersion
fullVersionChecker.isFullVersion
}
}

Expand Down
17 changes: 15 additions & 2 deletions Cryptomator/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import CryptomatorCloudAccess
import CryptomatorCloudAccessCore
import CryptomatorCommon
import CryptomatorCommonCore
import Dependencies
import MSAL
import ObjectiveDropboxOfficial
import StoreKit
Expand Down Expand Up @@ -130,11 +131,23 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private func setupIAP() {
#if ALWAYS_PREMIUM
DDLogDebug("Always activated premium")
GlobalFullVersionChecker.default = AlwaysActivatedPremium.default
CryptomatorUserDefaults.shared.fullVersionUnlocked = true
#else
DDLogDebug("Freemium version")
GlobalFullVersionChecker.default = UserDefaultsFullVersionChecker.default
#endif
}
}

/**
Define the liveValue in the main target since compilation flags do not work on Swift Package Manager level.
Be aware that it is needed to set the default value once per app launch (+ also when launching the FileProviderExtension).
*/
extension FullVersionCheckerKey: DependencyKey {
public static var liveValue: FullVersionChecker {
#if ALWAYS_PREMIUM
return AlwaysActivatedPremium.default
#else
return UserDefaultsFullVersionChecker.default
#endif
}
}
4 changes: 3 additions & 1 deletion Cryptomator/Onboarding/OnboardingCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
//

import CryptomatorCommonCore
import Dependencies
import Foundation
import UIKit

class OnboardingCoordinator: Coordinator {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
@Dependency(\.fullVersionChecker) private var fullVersionChecker

init(navigationController: UINavigationController) {
self.navigationController = navigationController
Expand All @@ -25,7 +27,7 @@ class OnboardingCoordinator: Coordinator {
}

func showIAP() {
guard !GlobalFullVersionChecker.default.isFullVersion else {
guard !fullVersionChecker.isFullVersion else {
navigationController.dismiss(animated: true)
return
}
Expand Down
4 changes: 3 additions & 1 deletion Cryptomator/VaultList/VaultListViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import CocoaLumberjackSwift
import Combine
import CryptomatorCommonCore
import Dependencies
import Foundation
import UIKit

Expand All @@ -17,6 +18,7 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {

private let viewModel: VaultListViewModelProtocol
private var observer: NSObjectProtocol?
@Dependency(\.fullVersionChecker) private var fullVersionChecker

init(with viewModel: VaultListViewModelProtocol) {
self.viewModel = viewModel
Expand Down Expand Up @@ -60,7 +62,7 @@ class VaultListViewController: ListViewController<VaultCellViewModel> {
super.viewDidAppear(animated)
if CryptomatorUserDefaults.shared.showOnboardingAtStartup {
coordinator?.showOnboarding()
} else if GlobalFullVersionChecker.default.hasExpiredTrial, !CryptomatorUserDefaults.shared.showedTrialExpiredAtStartup {
} else if fullVersionChecker.hasExpiredTrial, !CryptomatorUserDefaults.shared.showedTrialExpiredAtStartup {
coordinator?.showTrialExpired()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//

import CocoaLumberjackSwift
import Dependencies
import Foundation

public protocol CryptomatorSettings {
Expand All @@ -16,6 +17,20 @@ public protocol CryptomatorSettings {
var hasRunningSubscription: Bool { get set }
}

private enum CryptomatorSettingsKey: DependencyKey {
#if DEBUG
static let testValue: CryptomatorSettings = CryptomatorSettingsMock()
#endif
static let liveValue: CryptomatorSettings = CryptomatorUserDefaults.shared
}

public extension DependencyValues {
var cryptomatorSettings: CryptomatorSettings {
get { self[CryptomatorSettingsKey.self] }
set { self[CryptomatorSettingsKey.self] = newValue }
}
}

public class CryptomatorUserDefaults {
public static let shared = CryptomatorUserDefaults()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,31 @@
// Copyright © 2021 Skymatic GmbH. All rights reserved.
//

import Dependencies
import Foundation

public protocol FullVersionChecker {
var isFullVersion: Bool { get }
var hasExpiredTrial: Bool { get }
}

/**
Use a singleton to inject the full version checker conveniently at several initializers since compilation flags do not work on Swift Package Manager level.
Be aware that it is needed to set the default value once per app launch (+ also when launching the FileProviderExtension).
*/
public enum GlobalFullVersionChecker {
public static var `default`: FullVersionChecker!
public enum FullVersionCheckerKey {}

extension FullVersionCheckerKey: TestDependencyKey {
public static let testValue: FullVersionChecker = FullVersionCheckerMock()
}

public extension DependencyValues {
var fullVersionChecker: FullVersionChecker {
get { self[FullVersionCheckerKey.self] }
set { self[FullVersionCheckerKey.self] = newValue }
}
}

public class UserDefaultsFullVersionChecker: FullVersionChecker {
public static let `default` = UserDefaultsFullVersionChecker(cryptomatorSettings: CryptomatorUserDefaults.shared)
private let cryptomatorSettings: CryptomatorSettings
@Dependency(\.cryptomatorSettings) private var cryptomatorSettings

init(cryptomatorSettings: CryptomatorSettings) {
self.cryptomatorSettings = cryptomatorSettings
}
public static let `default` = UserDefaultsFullVersionChecker()

public var isFullVersion: Bool {
if cryptomatorSettings.fullVersionUnlocked {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@
// Copyright © 2021 Skymatic GmbH. All rights reserved.
//

#if DEBUG
import Foundation

final class FullVersionCheckerMock: FullVersionChecker {
var isFullVersion: Bool = false
var hasExpiredTrial: Bool = false
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,19 @@

import XCTest
@testable import CryptomatorCommonCore
@testable import Dependencies

class FullVersionCheckerTests: XCTestCase {
var settingsMock: CryptomatorSettingsMock!
var fullVersionChecker: FullVersionChecker!

override func setUpWithError() throws {
settingsMock = CryptomatorSettingsMock()
DependencyValues.mockDependency(\.cryptomatorSettings, with: settingsMock)
settingsMock.fullVersionUnlocked = false
settingsMock.hasRunningSubscription = false
settingsMock.trialExpirationDate = nil
fullVersionChecker = UserDefaultsFullVersionChecker(cryptomatorSettings: settingsMock)
fullVersionChecker = UserDefaultsFullVersionChecker()
}

// MARK: Is Full Version
Expand Down
5 changes: 2 additions & 3 deletions CryptomatorFileProvider/FileProviderAdapter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import CocoaLumberjackSwift
import CryptomatorCloudAccessCore
import CryptomatorCommonCore
import Dependencies
import FileProvider
import Foundation
import Promises
Expand Down Expand Up @@ -68,7 +69,7 @@ public class FileProviderAdapter: FileProviderAdapterType {
private let provider: CloudProvider
private let localURLProvider: LocalURLProviderType
private let notificator: FileProviderItemUpdateDelegate?
private let fullVersionChecker: FullVersionChecker
@Dependency(\.fullVersionChecker) private var fullVersionChecker
private let workflowFactory: WorkflowFactoryLocking
private let domainIdentifier: NSFileProviderDomainIdentifier
private let fileCoordinator: NSFileCoordinator
Expand All @@ -87,7 +88,6 @@ public class FileProviderAdapter: FileProviderAdapterType {
coordinator: NSFileCoordinator,
notificator: FileProviderItemUpdateDelegate? = nil,
localURLProvider: LocalURLProviderType,
fullVersionChecker: FullVersionChecker = GlobalFullVersionChecker.default,
taskRegistrator: SessionTaskRegistrator) {
self.lastUnlockedDate = Date()
self.domainIdentifier = domainIdentifier
Expand All @@ -112,7 +112,6 @@ public class FileProviderAdapter: FileProviderAdapterType {
self.provider = provider
self.notificator = notificator
self.localURLProvider = localURLProvider
self.fullVersionChecker = fullVersionChecker
self.fileCoordinator = coordinator
self.taskRegistrator = taskRegistrator
}
Expand Down
6 changes: 3 additions & 3 deletions CryptomatorFileProvider/FileProviderItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import CryptomatorCloudAccessCore
import CryptomatorCommonCore
import Dependencies
import FileProvider
import Foundation
import MobileCoreServices
Expand All @@ -22,15 +23,14 @@ public class FileProviderItem: NSObject, NSFileProviderItem {
let newestVersionLocallyCached: Bool
let localURL: URL?
let domainIdentifier: NSFileProviderDomainIdentifier
private let fullVersionChecker: FullVersionChecker
@Dependency(\.fullVersionChecker) private var fullVersionChecker

init(metadata: ItemMetadata, domainIdentifier: NSFileProviderDomainIdentifier, newestVersionLocallyCached: Bool = false, localURL: URL? = nil, error: Error? = nil, fullVersionChecker: FullVersionChecker = GlobalFullVersionChecker.default) {
init(metadata: ItemMetadata, domainIdentifier: NSFileProviderDomainIdentifier, newestVersionLocallyCached: Bool = false, localURL: URL? = nil, error: Error? = nil) {
self.metadata = metadata
self.domainIdentifier = domainIdentifier
self.error = error
self.newestVersionLocallyCached = newestVersionLocallyCached
self.localURL = localURL
self.fullVersionChecker = fullVersionChecker
}

public var itemIdentifier: NSFileProviderItemIdentifier {
Expand Down
10 changes: 2 additions & 8 deletions CryptomatorFileProvider/RootFileProviderItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//

import CryptomatorCommonCore
import Dependencies
import FileProvider
import Foundation
import MobileCoreServices
Expand All @@ -25,12 +26,5 @@ public class RootFileProviderItem: NSObject, NSFileProviderItem {
}
}

private let fullVersionChecker: FullVersionChecker
override public convenience init() {
self.init(fullVersionChecker: GlobalFullVersionChecker.default)
}

init(fullVersionChecker: FullVersionChecker) {
self.fullVersionChecker = fullVersionChecker
}
@Dependency(\.fullVersionChecker) private var fullVersionChecker
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import CryptomatorCloudAccessCore
import CryptomatorCommonCore
import Dependencies
import FileProvider
import Foundation

Expand All @@ -17,7 +18,7 @@ public class FileImportingServiceSource: ServiceSource, FileImporting {
private let dbPath: URL
private let localURLProvider: LocalURLProviderType
private let adapterManager: FileProviderAdapterProviding
private let fullVersionChecker: FullVersionChecker
@Dependency(\.fullVersionChecker) private var fullVersionChecker
private let taskRegistrator: SessionTaskRegistrator

public convenience init(domain: NSFileProviderDomain, notificator: FileProviderNotificatorType, dbPath: URL, delegate: LocalURLProviderType, taskRegistrator: SessionTaskRegistrator) {
Expand All @@ -26,17 +27,15 @@ public class FileImportingServiceSource: ServiceSource, FileImporting {
dbPath: dbPath,
delegate: delegate,
adapterManager: FileProviderAdapterManager.shared,
fullVersionChecker: GlobalFullVersionChecker.default,
taskRegistrator: taskRegistrator)
}

init(domain: NSFileProviderDomain, notificator: FileProviderNotificatorType, dbPath: URL, delegate: LocalURLProviderType, adapterManager: FileProviderAdapterProviding, fullVersionChecker: FullVersionChecker, taskRegistrator: SessionTaskRegistrator) {
init(domain: NSFileProviderDomain, notificator: FileProviderNotificatorType, dbPath: URL, delegate: LocalURLProviderType, adapterManager: FileProviderAdapterProviding, taskRegistrator: SessionTaskRegistrator) {
self.domain = domain
self.notificator = notificator
self.dbPath = dbPath
self.localURLProvider = delegate
self.adapterManager = adapterManager
self.fullVersionChecker = fullVersionChecker
self.taskRegistrator = taskRegistrator
super.init(serviceName: .fileImporting, exportedInterface: NSXPCInterface(with: FileImporting.self))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import CryptomatorCloudAccessCore
import XCTest
@testable import CryptomatorCommonCore
@testable import CryptomatorFileProvider
@testable import Dependencies
@testable import Promises

class FileImportingServiceSourceTests: XCTestCase {
Expand All @@ -21,21 +22,21 @@ class FileImportingServiceSourceTests: XCTestCase {
var taskRegistratorMock: SessionTaskRegistratorMock!
let dbPath = FileManager.default.temporaryDirectory
let domain = NSFileProviderDomain(identifier: .test, displayName: "Foo", pathRelativeToDocumentStorage: "/")
let itemStub = FileProviderItem(metadata: .init(name: "Foo", type: .file, size: nil, parentID: NSFileProviderItemIdentifier.rootContainerDatabaseValue, lastModifiedDate: nil, statusCode: .isUploading, cloudPath: CloudPath("/foo"), isPlaceholderItem: false), domainIdentifier: .test, fullVersionChecker: FullVersionCheckerMock())
let itemStub = FileProviderItem(metadata: .init(name: "Foo", type: .file, size: nil, parentID: NSFileProviderItemIdentifier.rootContainerDatabaseValue, lastModifiedDate: nil, statusCode: .isUploading, cloudPath: CloudPath("/foo"), isPlaceholderItem: false), domainIdentifier: .test)

override func setUpWithError() throws {
notificatorMock = FileProviderNotificatorTypeMock()
urlProviderMock = LocalURLProviderMock()
adapterProvidingMock = FileProviderAdapterProvidingMock()
fullVersionCheckerMock = FullVersionCheckerMock()
fullVersionCheckerMock.isFullVersion = true
DependencyValues.mockDependency(\.fullVersionChecker, with: fullVersionCheckerMock)
taskRegistratorMock = SessionTaskRegistratorMock()
serviceSource = FileImportingServiceSource(domain: domain,
notificator: notificatorMock,
dbPath: dbPath,
delegate: urlProviderMock,
adapterManager: adapterProvidingMock,
fullVersionChecker: fullVersionCheckerMock,
taskRegistrator: taskRegistratorMock)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Promises
import XCTest
@testable import CryptomatorCommonCore
@testable import CryptomatorFileProvider
@testable import Dependencies

class FileProviderAdapterTestCase: CloudTaskExecutorTestCase {
let fileCoordinator = NSFileCoordinator()
Expand All @@ -27,6 +28,7 @@ class FileProviderAdapterTestCase: CloudTaskExecutorTestCase {
fileProviderItemUpdateDelegateMock = FileProviderItemUpdateDelegateMock()
fullVersionCheckerMock = FullVersionCheckerMock()
fullVersionCheckerMock.isFullVersion = true
DependencyValues.mockDependency(\.fullVersionChecker, with: fullVersionCheckerMock)
taskRegistratorMock = SessionTaskRegistratorMock()
adapter = FileProviderAdapter(domainIdentifier: .test,
uploadTaskManager: uploadTaskManagerMock,
Expand All @@ -41,7 +43,6 @@ class FileProviderAdapterTestCase: CloudTaskExecutorTestCase {
coordinator: fileCoordinator,
notificator: fileProviderItemUpdateDelegateMock,
localURLProvider: localURLProviderMock,
fullVersionChecker: fullVersionCheckerMock,
taskRegistrator: taskRegistratorMock)
uploadTaskManagerMock.createNewTaskRecordForClosure = {
return UploadTaskRecord(correspondingItem: $0.id!, lastFailedUploadDate: nil, uploadErrorCode: nil, uploadErrorDomain: nil)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@ class FileProviderAdapterManagerTests: XCTestCase {
case test
}

override class func setUp() {
GlobalFullVersionChecker.default = FullVersionCheckerMock()
}

#warning("TODO: Replace unlockMonitor with mock")
override func setUpWithError() throws {
masterkeyCacheManagerMock = MasterkeyCacheManagerMock()
Expand Down
Loading

0 comments on commit 447831a

Please sign in to comment.