An advanced Ethereum/EVM mobile wallet
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
alpha-wallet-ios/Trust/AppCoordinator.swift

152 lines
4.7 KiB

// Copyright SIX DAY LLC. All rights reserved.
7 years ago
import Foundation
import TrustKeystore
7 years ago
import UIKit
class AppCoordinator: NSObject, Coordinator {
let navigationController: UINavigationController
7 years ago
lazy var welcomeViewController: WelcomeViewController = {
let controller = WelcomeViewController()
controller.delegate = self
return controller
7 years ago
}()
lazy var splashCoordinator: SplashCoordinator = {
return SplashCoordinator(navigationController: navigationController)
}()
lazy var touchRegistrar: TouchRegistrar = {
return TouchRegistrar(keystore: self.keystore)
}()
let pushNotificationRegistrar = PushNotificationsRegistrar()
private var keystore: Keystore
private var appTracker = AppTracker()
var coordinators: [Coordinator] = []
init(
window: UIWindow,
keystore: Keystore,
navigationController: UINavigationController = NavigationController()
) {
self.navigationController = navigationController
self.keystore = keystore
super.init()
window.rootViewController = navigationController
window.makeKeyAndVisible()
7 years ago
}
7 years ago
func start() {
inializers()
appTracker.start()
handleNotifications()
applyStyle()
resetToWelcomeScreen()
if keystore.hasWallets {
showTransactions(for: keystore.recentlyUsedWallet ?? keystore.wallets.first!)
} else {
resetToWelcomeScreen()
}
pushNotificationRegistrar.reRegister()
7 years ago
}
func showTransactions(for wallet: Wallet) {
let coordinator = InCoordinator(
navigationController: navigationController,
wallet: wallet,
keystore: keystore,
appTracker: appTracker
)
coordinator.delegate = self
coordinator.start()
addCoordinator(coordinator)
}
func inializers() {
let initializers: [Initializer] = [
7 years ago
CrashReportInitializer(),
LokaliseInitializer(),
SkipBackupFilesInitializer(),
]
initializers.forEach { $0.perform() }
touchRegistrar.register()
}
func handleNotifications() {
UIApplication.shared.applicationIconBadgeNumber = 0
}
func resetToWelcomeScreen() {
navigationController.setNavigationBarHidden(true, animated: false)
navigationController.viewControllers = [welcomeViewController]
7 years ago
}
7 years ago
@objc func reset() {
touchRegistrar.unregister()
pushNotificationRegistrar.unregister()
coordinators.removeAll()
navigationController.dismiss(animated: true, completion: nil)
resetToWelcomeScreen()
7 years ago
}
func didRegisterForRemoteNotificationsWithDeviceToken(deviceToken: Data) {
pushNotificationRegistrar.didRegister(
with: deviceToken,
addresses: keystore.wallets.map { $0.address }
)
}
func showInitialWalletCoordinator(entryPoint: WalletEntryPoint) {
let coordinator = InitialWalletCreationCoordinator(
navigationController: navigationController,
keystore: keystore,
entryPoint: entryPoint
)
coordinator.delegate = self
coordinator.start()
addCoordinator(coordinator)
}
func applicationWillResignActive() {
//Show splash screen to protect sensetive information.
splashCoordinator.start()
}
func applicationDidBecomeActive() {
//Hide splash screen.
splashCoordinator.dismiss()
}
7 years ago
}
extension AppCoordinator: WelcomeViewControllerDelegate {
func didPressCreateWallet(in viewController: WelcomeViewController) {
showInitialWalletCoordinator(entryPoint: .createInstantWallet)
}
func didPressImportWallet(in viewController: WelcomeViewController) {
showInitialWalletCoordinator(entryPoint: .importWallet)
7 years ago
}
}
extension AppCoordinator: InitialWalletCreationCoordinatorDelegate {
func didCancel(in coordinator: InitialWalletCreationCoordinator) {
coordinator.navigationController.dismiss(animated: true, completion: nil)
removeCoordinator(coordinator)
7 years ago
}
func didAddAccount(_ account: Wallet, in coordinator: InitialWalletCreationCoordinator) {
coordinator.navigationController.dismiss(animated: true, completion: nil)
removeCoordinator(coordinator)
showTransactions(for: account)
7 years ago
}
}
extension AppCoordinator: InCoordinatorDelegate {
func didCancel(in coordinator: InCoordinator) {
removeCoordinator(coordinator)
pushNotificationRegistrar.reRegister()
reset()
}
func didUpdateAccounts(in coordinator: InCoordinator) {
pushNotificationRegistrar.reRegister()
}
}