diff --git a/Signal/src/ViewControllers/Registration/OnboardingAccountDetailsViewController.swift b/Signal/src/ViewControllers/Registration/OnboardingAccountDetailsViewController.swift index 6d67e58a3..0039e4257 100644 --- a/Signal/src/ViewControllers/Registration/OnboardingAccountDetailsViewController.swift +++ b/Signal/src/ViewControllers/Registration/OnboardingAccountDetailsViewController.swift @@ -1,13 +1,13 @@ final class OnboardingAccountDetailsViewController : OnboardingBaseViewController { - private lazy var displayNameTextField: UITextField = { + private lazy var userNameTextField: UITextField = { let result = UITextField() result.textColor = Theme.primaryColor result.font = UIFont.ows_dynamicTypeBodyClamped result.textAlignment = .center result.placeholder = NSLocalizedString("Display Name (Optional)", comment: "") - result.accessibilityIdentifier = "onboarding.accountDetailsStep.displayNameTextField" + result.accessibilityIdentifier = "onboarding.accountDetailsStep.userNameTextField" return result }() @@ -22,8 +22,8 @@ final class OnboardingAccountDetailsViewController : OnboardingBaseViewControlle return result }() - private var normalizedName: String? { - let result = displayNameTextField.text!.ows_stripped() + private var normalizedUserName: String? { + let result = userNameTextField.text!.ows_stripped() return !result.isEmpty ? result : nil } @@ -46,7 +46,7 @@ final class OnboardingAccountDetailsViewController : OnboardingBaseViewControlle topSpacer, displayNameLabel, UIView.spacer(withHeight: 8), - displayNameTextField, + userNameTextField, UIView.spacer(withHeight: 16), passwordLabel, UIView.spacer(withHeight: 8), @@ -67,15 +67,15 @@ final class OnboardingAccountDetailsViewController : OnboardingBaseViewControlle public override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - displayNameTextField.becomeFirstResponder() + userNameTextField.becomeFirstResponder() } @objc private func handleNextButtonPressed() { - if let normalizedName = normalizedName { + if let normalizedName = normalizedUserName { guard !OWSProfileManager.shared().isProfileNameTooLong(normalizedName) else { return OWSAlerts.showErrorAlert(message: NSLocalizedString("PROFILE_VIEW_ERROR_PROFILE_NAME_TOO_LONG", comment: "Error message shown when user tries to update profile with a profile name that is too long")) } } - onboardingController.pushKeyPairViewController(from: self, userName: normalizedName) + onboardingController.pushKeyPairViewController(from: self, userName: normalizedUserName) } } diff --git a/Signal/src/ViewControllers/Registration/OnboardingKeyPairViewController.swift b/Signal/src/ViewControllers/Registration/OnboardingKeyPairViewController.swift index 11f06259b..c4c6b4b0f 100644 --- a/Signal/src/ViewControllers/Registration/OnboardingKeyPairViewController.swift +++ b/Signal/src/ViewControllers/Registration/OnboardingKeyPairViewController.swift @@ -42,12 +42,22 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController { }() private lazy var restoreStackView: UIStackView = { - let result = UIStackView(arrangedSubviews: [ mnemonicTextField, UIView.spacer(withHeight: 24), registerButton ]) + let result = UIStackView(arrangedSubviews: [ errorLabel, UIView.spacer(withHeight: 32), mnemonicTextField, UIView.spacer(withHeight: 24), registerButton ]) result.accessibilityIdentifier = "onboarding.keyPairStep.restoreStackView" result.axis = .vertical return result }() + private lazy var errorLabel: UILabel = { + let result = createExplanationLabel(text: "") + result.accessibilityIdentifier = "onboarding.keyPairStep.errorLabel" + result.textColor = UIColor.red + var fontTraits = result.font.fontDescriptor.symbolicTraits + fontTraits.insert(.traitBold) + result.font = UIFont(descriptor: result.font.fontDescriptor.withSymbolicTraits(fontTraits)!, size: result.font.pointSize) + return result + }() + private lazy var mnemonicTextField: UITextField = { let result = UITextField(frame: CGRect.zero) result.accessibilityIdentifier = "onboarding.keyPairStep.mnemonicTextField" @@ -129,16 +139,16 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController { // MARK: Updating private func handleModeChanged() { + UIView.animate(withDuration: 0.25) { + self.registerStackView.alpha = (self.mode == .register ? 1 : 0) + self.restoreStackView.alpha = (self.mode == .restore ? 1 : 0) + } let registerOrRestoreButtonTitle: String = { switch mode { case .register: return NSLocalizedString("Register", comment: "") case .restore: return NSLocalizedString("Restore", comment: "") } }() - UIView.animate(withDuration: 0.25) { - self.registerStackView.alpha = (self.mode == .register ? 1 : 0) - self.restoreStackView.alpha = (self.mode == .restore ? 1 : 0) - } self.registerOrRestoreButton.setTitle(registerOrRestoreButtonTitle) } @@ -180,10 +190,14 @@ final class OnboardingKeyPairViewController : OnboardingBaseViewController { do { let hexEncodedPrivateKey = try Mnemonic.decode(mnemonic: mnemonic) let keyPair = ECKeyPair.generate(withHexEncodedPrivateKey: hexEncodedPrivateKey) - // TODO: Store key pair + let databaseConnection = OWSIdentityManager.shared().value(forKey: "dbConnection") as! YapDatabaseConnection + databaseConnection.setObject(keyPair, forKey: "TSStorageManagerIdentityKeyStoreIdentityKey", inCollection: OWSPrimaryStorageIdentityKeyStoreCollection) hexEncodedPublicKey = keyPair.hexEncodedPublicKey } catch let error { - fatalError(error.localizedDescription) // TODO: Handle + let error = error as? Mnemonic.DecodingError ?? Mnemonic.DecodingError.generic + errorLabel.text = error.description + errorLabel.isHidden = false + return } } let accountManager = TSAccountManager.sharedInstance() diff --git a/Signal/src/util/Mnemonic.swift b/Signal/src/util/Mnemonic.swift index 0ef519d7d..e636f7395 100644 --- a/Signal/src/util/Mnemonic.swift +++ b/Signal/src/util/Mnemonic.swift @@ -45,6 +45,16 @@ enum Mnemonic { enum DecodingError : Error { case generic, inputTooShort, missingLastWord, invalidWord, verificationFailed + + var description: String { + switch self { + case .generic: return NSLocalizedString("Something went wrong. Please check your mnemonic and try again.", comment: "") + case .inputTooShort: return NSLocalizedString("Looks like you didn't enter enough words. Please check your mnemonic and try again.", comment: "") + case .missingLastWord: return NSLocalizedString("You seem to be missing the last word of your mnemonic. Please check what you entered and try again.", comment: "") + case .invalidWord: return NSLocalizedString("There appears to be an invalid word in your mnemonic. Please check what you entered and try again.", comment: "") + case .verificationFailed: return NSLocalizedString("Your mnemonic couldn't be verified. Please check what you entered and try again.", comment: "") + } + } } static func encode(hexEncodedString string: String, language: Language = .english) -> String {