diff options
| author | Jon Petersson <jon.petersson@kvadrat.se> | 2023-08-08 10:19:32 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2023-08-16 20:54:07 +0200 |
| commit | a5e41a2763b65fd697a04ecd90277bf51c37f9aa (patch) | |
| tree | b1bd09874fcc69d1aab8ff98e4e4b071a4c91ff8 | |
| parent | 436a87c0f0bd91db940643cf5f72f066243ae49e (diff) | |
| download | mullvadvpn-a5e41a2763b65fd697a04ecd90277bf51c37f9aa.tar.xz mullvadvpn-a5e41a2763b65fd697a04ecd90277bf51c37f9aa.zip | |
Ensure the app fetches account data whenever it enters the new account flow view
5 files changed, 91 insertions, 6 deletions
diff --git a/ios/MullvadVPN/Coordinators/App/WelcomeCoordinator.swift b/ios/MullvadVPN/Coordinators/App/WelcomeCoordinator.swift index dec0fc086b..e458088f0a 100644 --- a/ios/MullvadVPN/Coordinators/App/WelcomeCoordinator.swift +++ b/ios/MullvadVPN/Coordinators/App/WelcomeCoordinator.swift @@ -38,7 +38,8 @@ final class WelcomeCoordinator: Coordinator, Presentable { } let interactor = WelcomeInteractor( deviceData: storedDeviceData, - accountData: storedAccountData + accountData: storedAccountData, + tunnelManager: tunnelManager ) let controller = WelcomeViewController(interactor: interactor) @@ -124,4 +125,10 @@ extension WelcomeCoordinator: WelcomeViewControllerDelegate { coordinator.start() } + + func didUpdateDeviceState(deviceState: DeviceState) { + if deviceState.accountData?.isExpired == false { + didFinishPayment?(self) + } + } } diff --git a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift index ade337f469..0535c84384 100644 --- a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift +++ b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift @@ -7,10 +7,22 @@ // import Foundation +import MullvadLogging + class WelcomeInteractor { + private let logger = Logger(label: "WelcomeInteractor") + + private let accountUpdateTimerInterval: TimeInterval = 60 + private var accountUpdateTimer: DispatchSourceTimer? + private let deviceData: StoredDeviceData private let accountData: StoredAccountData + private let tunnelManager: TunnelManager + private var tunnelObserver: TunnelObserver? + + var didUpdateDeviceState: ((DeviceState) -> Void)? + var viewModel: WelcomeViewModel { WelcomeViewModel( deviceName: deviceData.capitalizedName, @@ -18,8 +30,43 @@ class WelcomeInteractor { ) } - init(deviceData: StoredDeviceData, accountData: StoredAccountData) { + init(deviceData: StoredDeviceData, accountData: StoredAccountData, tunnelManager: TunnelManager) { self.deviceData = deviceData self.accountData = accountData + self.tunnelManager = tunnelManager + + let tunnelObserver = + TunnelBlockObserver(didUpdateDeviceState: { [weak self] tunnelManager, deviceState, previousDeviceState in + self?.didUpdateDeviceState?(deviceState) + }) + + tunnelManager.addObserver(tunnelObserver) + self.tunnelObserver = tunnelObserver + } + + func startAccountUpdateTimer() { + logger.debug( + "Start polling account updates every \(accountUpdateTimerInterval) second(s)." + ) + + let timer = DispatchSource.makeTimerSource(queue: .main) + timer.setEventHandler { [weak self] in + self?.tunnelManager.updateAccountData() + } + + accountUpdateTimer?.cancel() + accountUpdateTimer = timer + + timer.schedule(wallDeadline: .now() + accountUpdateTimerInterval, repeating: accountUpdateTimerInterval) + timer.activate() + } + + func stopAccountUpdateTimer() { + logger.debug( + "Stop polling account updates." + ) + + accountUpdateTimer?.cancel() + accountUpdateTimer = nil } } diff --git a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift index 2acdc9d96e..e5594455f8 100644 --- a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift +++ b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift @@ -11,6 +11,7 @@ protocol WelcomeViewControllerDelegate: AnyObject { func didRequestToPurchaseCredit(controller: WelcomeViewController) func didRequestToRedeemVoucher(controller: WelcomeViewController) func didRequestToShowInfo(controller: WelcomeViewController) + func didUpdateDeviceState(deviceState: DeviceState) } class WelcomeViewController: UIViewController, RootContainment { @@ -55,8 +56,23 @@ class WelcomeViewController: UIViewController, RootContainment { override func viewDidLoad() { super.viewDidLoad() + configureUI() contentView.viewModel = interactor.viewModel + + interactor.didUpdateDeviceState = { [weak self] deviceState in + self?.delegate?.didUpdateDeviceState(deviceState: deviceState) + } + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + interactor.startAccountUpdateTimer() + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + interactor.stopAccountUpdateTimer() } private func configureUI() { diff --git a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeInteractor.swift b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeInteractor.swift index 1b050daa91..5c04436359 100644 --- a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeInteractor.swift +++ b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeInteractor.swift @@ -13,9 +13,6 @@ import MullvadTypes import Operations import StoreKit -/// Interval used for periodic polling account updates. -private let accountUpdateTimerInterval: TimeInterval = 60 - final class OutOfTimeInteractor { private let storePaymentManager: StorePaymentManager private let tunnelManager: TunnelManager @@ -24,6 +21,8 @@ final class OutOfTimeInteractor { private var paymentObserver: StorePaymentObserver? private let logger = Logger(label: "OutOfTimeInteractor") + + private let accountUpdateTimerInterval: TimeInterval = 60 private var accountUpdateTimer: DispatchSourceTimer? var didReceivePaymentEvent: ((StorePaymentEvent) -> Void)? @@ -93,7 +92,6 @@ final class OutOfTimeInteractor { logger.debug( "Start polling account updates every \(accountUpdateTimerInterval) second(s)." ) - let timer = DispatchSource.makeTimerSource(queue: .main) timer.setEventHandler { [weak self] in self?.tunnelManager.updateAccountData() @@ -105,4 +103,13 @@ final class OutOfTimeInteractor { timer.schedule(wallDeadline: .now() + accountUpdateTimerInterval, repeating: accountUpdateTimerInterval) timer.activate() } + + func stopAccountUpdateTimer() { + logger.debug( + "Stop polling account updates." + ) + + accountUpdateTimer?.cancel() + accountUpdateTimer = nil + } } diff --git a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift index 888c8e8a2c..9b37d77138 100644 --- a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift +++ b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift @@ -108,10 +108,18 @@ class OutOfTimeViewController: UIViewController, RootContainment { } else { productState = .cannotMakePurchases } + } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) interactor.startAccountUpdateTimer() } + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + interactor.stopAccountUpdateTimer() + } + // MARK: - Private private func requestStoreProducts() { |
