From 1a7451a3263dea8e45f777508963203688554e6f Mon Sep 17 00:00:00 2001 From: Bob Sun Date: Sat, 11 Feb 2017 19:48:47 +0800 Subject: [PATCH] add progress callback to "add password" --- .../Controllers/PasswordsViewController.swift | 21 +++++++++++++++---- pass/Models/PasswordStore.swift | 15 ++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/pass/Controllers/PasswordsViewController.swift b/pass/Controllers/PasswordsViewController.swift index f4aec58..6111a25 100644 --- a/pass/Controllers/PasswordsViewController.swift +++ b/pass/Controllers/PasswordsViewController.swift @@ -32,8 +32,21 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } @IBAction func saveAddPassword(segue: UIStoryboardSegue) { if let controller = segue.source as? AddPasswordTableViewController { - PasswordStore.shared.add(password: controller.password!) - NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) + SVProgressHUD.setDefaultMaskType(.black) + SVProgressHUD.setDefaultStyle(.light) + SVProgressHUD.show(withStatus: "Saving") + DispatchQueue.global(qos: .userInitiated).async { + PasswordStore.shared.add(password: controller.password!, progressBlock: { progress in + DispatchQueue.main.async { + SVProgressHUD.showProgress(progress, status: "Encrypting") + } + }) + DispatchQueue.main.async { + SVProgressHUD.showSuccess(withStatus: "Done") + SVProgressHUD.dismiss(withDelay: 1) + NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated"))) + } + } } } func syncPasswords() { @@ -47,9 +60,9 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV SVProgressHUD.showProgress(Float(git_transfer_progress.pointee.received_objects)/Float(git_transfer_progress.pointee.total_objects), status: "Pull Remote Repository") } }) - try PasswordStore.shared.pushRepository(transferProgressBlock: {(git_transfer_progress, stop) in + try PasswordStore.shared.pushRepository(transferProgressBlock: {(current, total, bytes, stop) in DispatchQueue.main.async { - SVProgressHUD.showProgress(Float(git_transfer_progress.pointee.received_objects)/Float(git_transfer_progress.pointee.total_objects), status: "Push Remote Repository") + SVProgressHUD.showProgress(Float(current)/Float(total), status: "Push Remote Repository") } }) DispatchQueue.main.async { diff --git a/pass/Models/PasswordStore.swift b/pass/Models/PasswordStore.swift index a6f98c1..93e3eac 100644 --- a/pass/Models/PasswordStore.swift +++ b/pass/Models/PasswordStore.swift @@ -181,7 +181,7 @@ class PasswordStore { func updateRemoteRepo() { } - func createCommitInRepository(message: String, fileData: Data, filename: String) -> GTCommit? { + func createCommitInRepository(message: String, fileData: Data, filename: String, progressBlock: (_ progress: Float) -> Void) -> GTCommit? { do { let head = try storeRepository!.headReference() let branch = GTBranch(reference: head, repository: storeRepository!) @@ -195,7 +195,9 @@ class PasswordStore { let commitEnum = try GTEnumerator(repository: storeRepository!) try commitEnum.pushSHA(headReference.targetOID.sha) let parent = commitEnum.nextObject() as! GTCommit + progressBlock(0.5) let commit = try storeRepository!.createCommit(with: newTree, message: message, parents: [parent], updatingReferenceNamed: headReference.name) + progressBlock(0.7) return commit } catch { print(error) @@ -214,26 +216,29 @@ class PasswordStore { return nil } - func pushRepository(transferProgressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void) throws { + func pushRepository(transferProgressBlock: @escaping (UInt32, UInt32, Int, UnsafeMutablePointer) -> Void) throws { let credentialProvider = try gitCredential!.credentialProvider() let options: [String: Any] = [ GTRepositoryRemoteOptionsCredentialProvider: credentialProvider, ] let masterBranch = getLocalBranch(withName: "master")! let remote = try GTRemote(name: "origin", in: storeRepository!) - try storeRepository?.push(masterBranch, to: remote, withOptions: options, progress: nil) + try storeRepository?.push(masterBranch, to: remote, withOptions: options, progress: transferProgressBlock) } - func add(password: Password) { + func add(password: Password, progressBlock: (_ progress: Float) -> Void) { + progressBlock(0.0) let passwordEntity = NSEntityDescription.insertNewObject(forEntityName: "PasswordEntity", into: context) as! PasswordEntity do { let encryptedData = try passwordEntity.encrypt(password: password) + progressBlock(0.3) let saveURL = storeURL.appendingPathComponent("\(password.name).gpg") try encryptedData.write(to: saveURL) passwordEntity.rawPath = "\(password.name).gpg" try context.save() print(saveURL.path) - let _ = createCommitInRepository(message: "Add new password by pass for iOS", fileData: encryptedData, filename: saveURL.lastPathComponent) + let _ = createCommitInRepository(message: "Add new password by pass for iOS", fileData: encryptedData, filename: saveURL.lastPathComponent, progressBlock: progressBlock) + progressBlock(1.0) } catch { print(error) }