summaryrefslogtreecommitdiffhomepage
path: root/ios
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@kvadrat.se>2023-08-08 10:19:32 +0200
committerAndrej Mihajlov <and@mullvad.net>2023-08-16 20:54:07 +0200
commita5e41a2763b65fd697a04ecd90277bf51c37f9aa (patch)
treeb1bd09874fcc69d1aab8ff98e4e4b071a4c91ff8 /ios
parent436a87c0f0bd91db940643cf5f72f066243ae49e (diff)
downloadmullvadvpn-a5e41a2763b65fd697a04ecd90277bf51c37f9aa.tar.xz
mullvadvpn-a5e41a2763b65fd697a04ecd90277bf51c37f9aa.zip
Ensure the app fetches account data whenever it enters the new account flow view
Diffstat (limited to 'ios')
-rw-r--r--ios/MullvadVPN/Coordinators/App/WelcomeCoordinator.swift9
-rw-r--r--ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift49
-rw-r--r--ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift16
-rw-r--r--ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeInteractor.swift15
-rw-r--r--ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift8
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() {