From 2b5c5cad971e72f5760bee11842f86b12bb9f28f Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Fri, 24 Mar 2017 21:53:07 +0800 Subject: [PATCH] Polish the code - Move somethings from view controller to the model "PasswordStore" - Simplify the logic of PasswordsViewController (especially about reloadTableView) - Mark many variables/methods private --- .../Controllers/PasswordsViewController.swift | 133 ++++++++---------- .../SettingsTableViewController.swift | 1 - pass/Models/PasswordStore.swift | 10 +- 3 files changed, 65 insertions(+), 79 deletions(-) diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index 1171224..a930c71 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -25,13 +25,14 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV private var passwordsTableEntries: [PasswordsTableEntry] = [] private var filteredPasswordsTableEntries: [PasswordsTableEntry] = [] private var parentPasswordEntity: PasswordEntity? = nil - let passwordStore = PasswordStore.shared + private let passwordStore = PasswordStore.shared private var tapTabBarTime: TimeInterval = 0 - var sections : [(index: Int, length :Int, title: String)] = Array() - var searchActive : Bool = false - lazy var searchController: UISearchController = { + private var sections : [(index: Int, length :Int, title: String)] = Array() + private var searchActive : Bool = false + + private lazy var searchController: UISearchController = { let uiSearchController = UISearchController(searchResultsController: nil) uiSearchController.searchResultsUpdater = self uiSearchController.dimsBackgroundDuringPresentation = false @@ -40,22 +41,22 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV uiSearchController.searchBar.sizeToFit() return uiSearchController }() - lazy var refreshControl: UIRefreshControl = { - let refreshControl = UIRefreshControl() - refreshControl.addTarget(self, action: #selector(PasswordsViewController.handleRefresh(_:)), for: UIControlEvents.valueChanged) - return refreshControl + private lazy var syncControl: UIRefreshControl = { + let syncControl = UIRefreshControl() + syncControl.addTarget(self, action: #selector(handleRefresh(_:)), for: UIControlEvents.valueChanged) + return syncControl }() - lazy var searchBarView: UIView = { - let uiView = UIView(frame: CGRect(x: 0, y: 64, width: UIScreen.main.bounds.width, height: 44)) + private lazy var searchBarView: UIView = { + let uiView = UIView(frame: CGRect(x: 0, y: 64, width: self.view.bounds.width, height: 44)) uiView.addSubview(self.searchController.searchBar) return uiView }() - lazy var backUIBarButtonItem: UIBarButtonItem = { + private lazy var backUIBarButtonItem: UIBarButtonItem = { let backUIBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(self.backAction(_:))) return backUIBarButtonItem }() - lazy var transitionFromRight: CATransition = { + private lazy var transitionFromRight: CATransition = { let transition = CATransition() transition.type = kCATransitionPush transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) @@ -65,7 +66,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV return transition }() - lazy var transitionFromLeft: CATransition = { + private lazy var transitionFromLeft: CATransition = { let transition = CATransition() transition.type = kCATransitionPush transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) @@ -122,7 +123,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - func syncPasswords() { + private func syncPasswords() { SVProgressHUD.setDefaultMaskType(.black) SVProgressHUD.setDefaultStyle(.light) SVProgressHUD.show(withStatus: "Sync Password Store") @@ -142,11 +143,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV }) } DispatchQueue.main.async { - self.passwordStore.updatePasswordEntityCoreData() - self.initPasswordsTableEntries(parent: nil) - self.reloadTableView(data: self.passwordsTableEntries) - self.passwordStore.setAllSynced() - self.setNavigationItemTitle() + self.reloadTableView(parent: nil) Defaults[.lastUpdatedTime] = Date() Defaults[.gitRepositoryPasswordAttempts] = 0 SVProgressHUD.showSuccess(withStatus: "Done") @@ -160,31 +157,27 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - private func addNotificationObservers() { - // reset the data table if some password (maybe another one) has been updated - NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordStoreUpdatedNotification), name: .passwordStoreUpdated, object: nil) - - // reset the data table if the disaply settings have been changed - NotificationCenter.default.addObserver(self, selector: #selector(actOnPasswordStoreUpdatedNotification), name: .passwordDisplaySettingChanged, object: nil) - - NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnSearchNotification), name: .passwordSearch, object: nil) - } override func viewDidLoad() { super.viewDidLoad() - setNavigationItemTitle() - initPasswordsTableEntries(parent: nil) - addNotificationObservers() - generateSections(item: passwordsTableEntries) + tabBarController!.delegate = self tableView.delegate = self tableView.dataSource = self definesPresentationContext = true view.addSubview(searchBarView) - tableView.insertSubview(refreshControl, at: 0) + tableView.insertSubview(syncControl, at: 0) SVProgressHUD.setDefaultMaskType(.black) - updateRefreshControlTitle() tableView.register(UINib(nibName: "PasswordWithFolderTableViewCell", bundle: nil), forCellReuseIdentifier: "passwordWithFolderTableViewCell") + + // initialize the password table + reloadTableView(parent: nil) + + // reset the data table if some password (maybe another one) has been updated + NotificationCenter.default.addObserver(self, selector: #selector(reloadTableView as (Void) -> Void), name: .passwordStoreUpdated, object: nil) + // reset the data table if the disaply settings have been changed + NotificationCenter.default.addObserver(self, selector: #selector(reloadTableView as (Void) -> Void), name: .passwordDisplaySettingChanged, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(actOnSearchNotification), name: .passwordSearch, object: nil) } override func viewWillAppear(_ animated: Bool) { @@ -268,15 +261,13 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } else { tableView.deselectRow(at: indexPath, animated: true) searchController.isActive = false - initPasswordsTableEntries(parent: entry.passwordEntity) - reloadTableView(data: passwordsTableEntries, anim: transitionFromRight) + reloadTableView(parent: entry.passwordEntity, anim: transitionFromRight) } } func backAction(_ sender: Any?) { guard Defaults[.isShowFolderOn] else { return } - initPasswordsTableEntries(parent: parentPasswordEntity?.parent) - reloadTableView(data: passwordsTableEntries, anim: transitionFromLeft) + reloadTableView(parent: parentPasswordEntity?.parent, anim: transitionFromLeft) } func longPressAction(_ gesture: UILongPressGestureRecognizer) { @@ -304,7 +295,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV copyToPasteboard(from: indexPath) } - func copyToPasteboard(from indexPath: IndexPath) { + private func copyToPasteboard(from indexPath: IndexPath) { guard self.passwordStore.privateKey != nil else { Utils.alert(title: "Cannot Copy Password", message: "PGP Key is not set. Please set your PGP Key first.", controller: self, completion: nil) return @@ -330,7 +321,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } - func decryptThenCopyPassword(passwordEntity: PasswordEntity, passphrase: String) { + private func decryptThenCopyPassword(passwordEntity: PasswordEntity, passphrase: String) { SVProgressHUD.setDefaultMaskType(.black) SVProgressHUD.setDefaultStyle(.dark) SVProgressHUD.show(withStatus: "Decrypting") @@ -352,7 +343,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - func generateSections(item: [PasswordsTableEntry]) { + private func generateSections(item: [PasswordsTableEntry]) { sections.removeAll() guard item.count != 0 else { return @@ -374,27 +365,6 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV sections.append(newSection) } - func actOnPasswordStoreUpdatedNotification() { - initPasswordsTableEntries(parent: nil) - reloadTableView(data: passwordsTableEntries) - setNavigationItemTitle() - } - - private func setNavigationItemTitle() { - var title = "" - if parentPasswordEntity != nil { - title = parentPasswordEntity!.name! - } else { - title = "Password Store" - } - let numberOfLocalCommits = self.passwordStore.numberOfLocalCommits() - if numberOfLocalCommits == 0 { - navigationItem.title = "\(title)" - } else { - navigationItem.title = "\(title) (\(numberOfLocalCommits))" - } - } - func actOnSearchNotification() { searchController.searchBar.becomeFirstResponder() } @@ -435,32 +405,47 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - func updateRefreshControlTitle() { - var atribbutedTitle = "Pull to Sync Password Store" - atribbutedTitle = "Last Synced: \(Utils.getLastUpdatedTimeString())" - refreshControl.attributedTitle = NSAttributedString(string: atribbutedTitle) - } - - func reloadTableView(data: [PasswordsTableEntry], anim: CAAnimation? = nil) { - + private func reloadTableView(data: [PasswordsTableEntry], anim: CAAnimation? = nil) { + // set navigation item + var numberOfLocalCommitsString = "" + let numberOfLocalCommits = self.passwordStore.numberOfLocalCommits() + if numberOfLocalCommits > 0 { + numberOfLocalCommitsString = " (\(numberOfLocalCommits))" + } if parentPasswordEntity != nil { + navigationItem.title = "\(parentPasswordEntity!.name!)\(numberOfLocalCommitsString)" navigationItem.leftBarButtonItem = backUIBarButtonItem } else { + navigationItem.title = "Password Store\(numberOfLocalCommitsString)" navigationItem.leftBarButtonItem = nil } + + // set the password table generateSections(item: data) if anim != nil { self.tableView.layer.add(anim!, forKey: "UITableViewReloadDataAnimationKey") } tableView.reloadData() self.tableView.layer.removeAnimation(forKey: "UITableViewReloadDataAnimationKey") - updateRefreshControlTitle() - setNavigationItemTitle() + + // set the sync control title + let atribbutedTitle = "Last Synced: \(Utils.getLastUpdatedTimeString())" + syncControl.attributedTitle = NSAttributedString(string: atribbutedTitle) } - func handleRefresh(_ refreshControl: UIRefreshControl) { + private func reloadTableView(parent: PasswordEntity?, anim: CAAnimation? = nil) { + initPasswordsTableEntries(parent: parent) + reloadTableView(data: passwordsTableEntries) + } + + func reloadTableView() { + initPasswordsTableEntries(parent: nil) + reloadTableView(data: passwordsTableEntries) + } + + func handleRefresh(_ syncControl: UIRefreshControl) { syncPasswords() - refreshControl.endRefreshing() + syncControl.endRefreshing() } func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { diff --git a/pass/Controllers/SettingsTableViewController.swift b/pass/Controllers/SettingsTableViewController.swift index 2d26a34..0e1c3c3 100644 --- a/pass/Controllers/SettingsTableViewController.swift +++ b/pass/Controllers/SettingsTableViewController.swift @@ -140,7 +140,6 @@ class SettingsTableViewController: UITableViewController { } }) DispatchQueue.main.async { - self.passwordStore.updatePasswordEntityCoreData() Defaults[.lastUpdatedTime] = Date() Defaults[.gitRepositoryURL] = URL(string: gitRepostiroyURL) Defaults[.gitRepositoryUsername] = username diff --git a/pass/Models/PasswordStore.swift b/pass/Models/PasswordStore.swift index 13d184a..186de00 100644 --- a/pass/Models/PasswordStore.swift +++ b/pass/Models/PasswordStore.swift @@ -285,6 +285,8 @@ class PasswordStore { } storeRepository = try GTRepository(url: storeURL) gitCredential = credential + self.updatePasswordEntityCoreData() + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } @@ -298,12 +300,12 @@ class PasswordStore { ] let remote = try GTRemote(name: "origin", in: storeRepository!) try storeRepository?.pull((storeRepository?.currentBranch())!, from: remote, withOptions: options, progress: transferProgressBlock) + self.setAllSynced() + self.updatePasswordEntityCoreData() NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } - - - func updatePasswordEntityCoreData() { + private func updatePasswordEntityCoreData() { deleteCoreData(entityName: "PasswordEntity") let fm = FileManager.default do { @@ -657,10 +659,10 @@ class PasswordStore { throw NSError(domain: "me.mssun.pass.error", code: 1, userInfo: [NSLocalizedDescriptionKey: "Cannot decide how to reset."]) } try self.storeRepository?.reset(to: newHead, resetType: GTRepositoryResetType.hard) + self.setAllSynced() self.updatePasswordEntityCoreData() NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) NotificationCenter.default.post(name: .passwordStoreChangeDiscarded, object: nil) - self.setAllSynced() return localCommits.count } else { return 0 // no new commit