From 1f829fffccabbd5ceae695b0937f112366867c0d Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Sat, 18 Mar 2017 00:18:55 +0800 Subject: [PATCH] Polish notification - define notification names - move "post notification" to PasswordStore (todo: move "search" and the one for "show folder switch") - "erase" and "reset" also post the "passwordStoreUpdated" notification --- pass.xcodeproj/project.pbxproj | 4 ++++ pass/AppDelegate.swift | 2 +- .../AboutRepositoryTableViewController.swift | 9 +++------ .../AdvancedSettingsTableViewController.swift | 4 ---- .../GeneralSettingsTableViewController.swift | 2 +- .../PasswordDetailTableViewController.swift | 3 +-- pass/Controllers/PasswordsViewController.swift | 14 +++----------- .../SettingsTableViewController.swift | 3 +-- pass/Helpers/NotificationNames.swift | 16 ++++++++++++++++ pass/Models/PasswordStore.swift | 12 +++++++++++- pass/Views/LabelTableViewCell.swift | 1 - 11 files changed, 41 insertions(+), 29 deletions(-) create mode 100644 pass/Helpers/NotificationNames.swift diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 52dbf4a..80aac60 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 94BA784B85E071D25EE89B59 /* libPods-pass.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADCE7A5C3CCC67D7D21BB3C4 /* libPods-pass.a */; }; A262A58D1E68749C006B0890 /* Base32.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A262A58C1E68749C006B0890 /* Base32.framework */; }; + A27424D91E7C35960093F436 /* NotificationNames.swift in Sources */ = {isa = PBXBuildFile; fileRef = A27424D81E7C35960093F436 /* NotificationNames.swift */; }; A2802BF91E70813A00879216 /* SliderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2802BF71E70813A00879216 /* SliderTableViewCell.swift */; }; A2802BFA1E70813A00879216 /* SliderTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A2802BF81E70813A00879216 /* SliderTableViewCell.xib */; }; DC037CA61E4B883900609409 /* OpenSourceComponentsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC037CA51E4B883900609409 /* OpenSourceComponentsTableViewController.swift */; }; @@ -69,6 +70,7 @@ /* Begin PBXFileReference section */ 274CCFCF32444A2FF46BE7F4 /* Pods-pass.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pass.debug.xcconfig"; path = "Pods/Target Support Files/Pods-pass/Pods-pass.debug.xcconfig"; sourceTree = ""; }; A262A58C1E68749C006B0890 /* Base32.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Base32.framework; path = Carthage/Build/iOS/Base32.framework; sourceTree = ""; }; + A27424D81E7C35960093F436 /* NotificationNames.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationNames.swift; sourceTree = ""; }; A2802BF71E70813A00879216 /* SliderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SliderTableViewCell.swift; sourceTree = ""; }; A2802BF81E70813A00879216 /* SliderTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SliderTableViewCell.xib; sourceTree = ""; }; ADCE7A5C3CCC67D7D21BB3C4 /* libPods-pass.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-pass.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -204,6 +206,7 @@ DC4A746D1E30FBDE00E8EB18 /* Objective-CBridgingHeader.h */, DCA049971E33586A00522E8F /* DefaultsKeys.swift */, DC19400A1E4B36B60077E0A3 /* Utils.swift */, + A27424D81E7C35960093F436 /* NotificationNames.swift */, ); path = Helpers; sourceTree = ""; @@ -447,6 +450,7 @@ DC7E6EEA1E432E48006C2443 /* Password.swift in Sources */, DC4914961E434301007FF592 /* LabelTableViewCell.swift in Sources */, DC5F385B1E56AADB00C69ACA /* PGPKeyArmorSettingTableViewController.swift in Sources */, + A27424D91E7C35960093F436 /* NotificationNames.swift in Sources */, DCAAF7451E2FA66800AB94BC /* SettingsTableViewController.swift in Sources */, DCE6C2671E71261C003038C6 /* PasswordWithFolderTableViewCell.swift in Sources */, DCFB77A71E502DF9008DE471 /* EditPasswordTableViewController.swift in Sources */, diff --git a/pass/AppDelegate.swift b/pass/AppDelegate.swift index 9b635e7..66ee47f 100644 --- a/pass/AppDelegate.swift +++ b/pass/AppDelegate.swift @@ -38,7 +38,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } func postSearchNotification() { - NotificationCenter.default.post(Notification(name: Notification.Name("search"))) + NotificationCenter.default.post(name: .passwordSearch, object: nil) } func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) { diff --git a/pass/Controllers/AboutRepositoryTableViewController.swift b/pass/Controllers/AboutRepositoryTableViewController.swift index 2e76612..f6e7178 100644 --- a/pass/Controllers/AboutRepositoryTableViewController.swift +++ b/pass/Controllers/AboutRepositoryTableViewController.swift @@ -32,7 +32,9 @@ class AboutRepositoryTableViewController: BasicStaticTableViewController { tableView.addSubview(indicatorLabel) setTableData() - addNotificationObservers() + + // all password store updates (including erase, discard) will trigger the refresh + NotificationCenter.default.addObserver(self, selector: #selector(setNeedRefresh), name: .passwordStoreUpdated, object: nil) } override func viewWillAppear(_ animated: Bool) { @@ -92,11 +94,6 @@ class AboutRepositoryTableViewController: BasicStaticTableViewController { } } } - - private func addNotificationObservers() { - NotificationCenter.default.addObserver(self, selector: #selector(setNeedRefresh), name: NSNotification.Name(rawValue: "passwordUpdated"), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(setNeedRefresh), name: NSNotification.Name(rawValue: "passwordStoreErased"), object: nil) - } func setNeedRefresh() { needRefresh = true diff --git a/pass/Controllers/AdvancedSettingsTableViewController.swift b/pass/Controllers/AdvancedSettingsTableViewController.swift index e805b88..7b22c93 100644 --- a/pass/Controllers/AdvancedSettingsTableViewController.swift +++ b/pass/Controllers/AdvancedSettingsTableViewController.swift @@ -26,7 +26,6 @@ class AdvancedSettingsTableViewController: UITableViewController { alert.addAction(UIAlertAction(title: "Erase Password Data", style: UIAlertActionStyle.destructive, handler: {[unowned self] (action) -> Void in SVProgressHUD.show(withStatus: "Erasing ...") self.passwordStore.erase() - NotificationCenter.default.post(Notification(name: Notification.Name("passwordStoreErased"))) self.navigationController!.popViewController(animated: true) SVProgressHUD.showSuccess(withStatus: "Done") SVProgressHUD.dismiss(withDelay: 1) @@ -42,9 +41,6 @@ class AdvancedSettingsTableViewController: UITableViewController { DispatchQueue.main.async { do { let numberDiscarded = try self.passwordStore.reset() - if numberDiscarded > 0 { - NotificationCenter.default.post(Notification(name: Notification.Name("passwordStoreChangeDiscarded"))) - } self.navigationController!.popViewController(animated: true) switch numberDiscarded { case 0: diff --git a/pass/Controllers/GeneralSettingsTableViewController.swift b/pass/Controllers/GeneralSettingsTableViewController.swift index c0bd539..9d83de8 100644 --- a/pass/Controllers/GeneralSettingsTableViewController.swift +++ b/pass/Controllers/GeneralSettingsTableViewController.swift @@ -184,7 +184,7 @@ class GeneralSettingsTableViewController: BasicStaticTableViewController { func showFolderSwitchAction(_ sender: Any?) { Defaults[.isShowFolderOn] = showFolderSwitch.isOn - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } } diff --git a/pass/Controllers/PasswordDetailTableViewController.swift b/pass/Controllers/PasswordDetailTableViewController.swift index 2dff655..0ba0770 100644 --- a/pass/Controllers/PasswordDetailTableViewController.swift +++ b/pass/Controllers/PasswordDetailTableViewController.swift @@ -197,7 +197,6 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni DispatchQueue.main.async { self.passwordEntity!.synced = false self.passwordStore.saveUpdated(passwordEntity: self.passwordEntity!) - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) self.setTableData() self.tableView.reloadData() SVProgressHUD.showSuccess(withStatus: "Success") @@ -397,7 +396,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni } private func addNotificationObservers() { - NotificationCenter.default.addObserver(self, selector: #selector(setShouldPopCurrentView), name: NSNotification.Name(rawValue: "passwordStoreChangeDiscarded"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(setShouldPopCurrentView), name: .passwordStoreChangeDiscarded, object: nil) } func setShouldPopCurrentView() { diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index 65a7939..035f889 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -92,7 +92,6 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV DispatchQueue.main.async { SVProgressHUD.showSuccess(withStatus: "Done") SVProgressHUD.dismiss(withDelay: 1) - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) } } catch { DispatchQueue.main.async { @@ -142,9 +141,8 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } private func addNotificationObservers() { - NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordUpdatedNotification), name: NSNotification.Name(rawValue: "passwordUpdated"), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordStoreErasedNotification), name: NSNotification.Name(rawValue: "passwordStoreErased"), object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnSearchNotification), name: NSNotification.Name(rawValue: "search"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnPasswordStoreUpdatedNotification), name: .passwordStoreUpdated, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(PasswordsViewController.actOnSearchNotification), name: .passwordSearch, object: nil) } override func viewDidLoad() { @@ -351,7 +349,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV sections.append(newSection) } - func actOnPasswordUpdatedNotification() { + func actOnPasswordStoreUpdatedNotification() { initPasswordsTableEntries(parent: nil) reloadTableView(data: passwordsTableEntries) setNavigationItemTitle() @@ -372,12 +370,6 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - func actOnPasswordStoreErasedNotification() { - initPasswordsTableEntries(parent: nil) - reloadTableView(data: passwordsTableEntries) - setNavigationItemTitle() - } - func actOnSearchNotification() { searchController.searchBar.becomeFirstResponder() } diff --git a/pass/Controllers/SettingsTableViewController.swift b/pass/Controllers/SettingsTableViewController.swift index 754b404..2d26a34 100644 --- a/pass/Controllers/SettingsTableViewController.swift +++ b/pass/Controllers/SettingsTableViewController.swift @@ -142,7 +142,6 @@ class SettingsTableViewController: UITableViewController { DispatchQueue.main.async { self.passwordStore.updatePasswordEntityCoreData() Defaults[.lastUpdatedTime] = Date() - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) Defaults[.gitRepositoryURL] = URL(string: gitRepostiroyURL) Defaults[.gitRepositoryUsername] = username Defaults[.gitRepositoryAuthenticationMethod] = auth @@ -164,7 +163,7 @@ class SettingsTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - NotificationCenter.default.addObserver(self, selector: #selector(SettingsTableViewController.actOnPasswordStoreErasedNotification), name: NSNotification.Name(rawValue: "passwordStoreErased"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(SettingsTableViewController.actOnPasswordStoreErasedNotification), name: .passwordStoreErased, object: nil) self.passwordRepositoryTableViewCell.detailTextLabel?.text = Defaults[.gitRepositoryURL]?.host touchIDTableViewCell.accessoryView = touchIDSwitch setPGPKeyTableViewCellDetailText() diff --git a/pass/Helpers/NotificationNames.swift b/pass/Helpers/NotificationNames.swift new file mode 100644 index 0000000..e4bf3d8 --- /dev/null +++ b/pass/Helpers/NotificationNames.swift @@ -0,0 +1,16 @@ +// +// NotificationNames.swift +// pass +// +// Created by Yishi Lin on 17/3/17. +// Copyright © 2017 Yishi Lin, Bob Sun. All rights reserved. +// + +import Foundation + +extension Notification.Name { + static let passwordStoreUpdated = Notification.Name("passwordStoreUpdated") + static let passwordStoreErased = Notification.Name("passwordStoreErased") + static let passwordStoreChangeDiscarded = Notification.Name("passwordStoreChangeDiscarded") + static let passwordSearch = Notification.Name("passwordSearch") +} diff --git a/pass/Models/PasswordStore.swift b/pass/Models/PasswordStore.swift index 1d6bb0b..be28d0f 100644 --- a/pass/Models/PasswordStore.swift +++ b/pass/Models/PasswordStore.swift @@ -285,6 +285,7 @@ class PasswordStore { } storeRepository = try GTRepository(url: storeURL) gitCredential = credential + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } func pullRepository(transferProgressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void) throws { @@ -297,6 +298,7 @@ class PasswordStore { ] let remote = try GTRemote(name: "origin", in: storeRepository!) try storeRepository?.pull((storeRepository?.currentBranch())!, from: remote, withOptions: options, progress: transferProgressBlock) + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } @@ -542,18 +544,22 @@ class PasswordStore { print(saveURL.path) let _ = createAddCommitInRepository(message: "Add password for \(passwordEntity.nameWithCategory) to store using Pass for iOS.", fileData: encryptedData, filename: saveURL.lastPathComponent, progressBlock: progressBlock) progressBlock(1.0) + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } catch { print(error) } } func update(passwordEntity: PasswordEntity, password: Password, progressBlock: (_ progress: Float) -> Void) { + progressBlock(0.0) do { let encryptedData = try passwordEntity.encrypt(password: password) let saveURL = storeURL.appendingPathComponent(passwordEntity.path!) try encryptedData.write(to: saveURL) progressBlock(0.3) let _ = createAddCommitInRepository(message: "Edit password for \(passwordEntity.nameWithCategory) using Pass for iOS.", fileData: encryptedData, filename: saveURL.lastPathComponent, progressBlock: progressBlock) + progressBlock(1.0) + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) } catch { print(error) } @@ -621,6 +627,9 @@ class PasswordStore { Defaults.removeAll() storeRepository = nil + + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) + NotificationCenter.default.post(name: .passwordStoreErased, object: nil) } // return the number of discarded commits @@ -645,7 +654,8 @@ class PasswordStore { } try self.storeRepository?.reset(to: newHead, resetType: GTRepositoryResetType.hard) self.updatePasswordEntityCoreData() - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) + NotificationCenter.default.post(name: .passwordStoreUpdated, object: nil) + NotificationCenter.default.post(name: .passwordStoreChangeDiscarded, object: nil) self.setAllSynced() return localCommits.count } else { diff --git a/pass/Views/LabelTableViewCell.swift b/pass/Views/LabelTableViewCell.swift index 088d892..242ca3b 100644 --- a/pass/Views/LabelTableViewCell.swift +++ b/pass/Views/LabelTableViewCell.swift @@ -131,7 +131,6 @@ class LabelTableViewCell: UITableViewCell { DispatchQueue.main.async { passwordEntity.synced = false self.passwordStore.saveUpdated(passwordEntity: passwordEntity) - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) // reload so that the "unsynced" symbol could be added self.passwordTableView?.tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic) SVProgressHUD.showSuccess(withStatus: "Password Copied\nCounter Updated")