diff --git a/Signal/src/ViewControllers/AppSettings/Linked Devices/LinkedDevicesView.swift b/Signal/src/ViewControllers/AppSettings/Linked Devices/LinkedDevicesView.swift index be14a8f4f2..0ac1848a04 100644 --- a/Signal/src/ViewControllers/AppSettings/Linked Devices/LinkedDevicesView.swift +++ b/Signal/src/ViewControllers/AppSettings/Linked Devices/LinkedDevicesView.swift @@ -994,6 +994,7 @@ class EditDeviceNameViewController: NameEditorViewController { override class var nameByteLimit: Int { 225 } override class var nameGlyphLimit: Int { 50 } + override var allowEmptyName: Bool { false } override var placeholderText: String? { OWSLocalizedString( "SECONDARY_ONBOARDING_CHOOSE_DEVICE_NAME_PLACEHOLDER", diff --git a/Signal/src/ViewControllers/NameEditorViewController.swift b/Signal/src/ViewControllers/NameEditorViewController.swift index f1f1962a3b..b4cf0615fb 100644 --- a/Signal/src/ViewControllers/NameEditorViewController.swift +++ b/Signal/src/ViewControllers/NameEditorViewController.swift @@ -19,6 +19,7 @@ class NameEditorViewController: OWSTableViewController2 { class var nameByteLimit: Int { owsFail("Must be implemented by subclasses") } class var nameGlyphLimit: Int { owsFail("Must be implemented by subclasses") } + var allowEmptyName: Bool { true } var placeholderText: String? { nil } private lazy var nameField = OWSTextField( @@ -31,7 +32,7 @@ class NameEditorViewController: OWSTableViewController2 { self.updateHasUnsavedChanges() }, returnPressed: { [unowned self] in - if hasUnsavedChanges { self.didTapDone() } + if canSaveChanges { self.didTapDone() } }, ) @@ -63,7 +64,7 @@ class NameEditorViewController: OWSTableViewController2 { if isPresentedInSheet { self.navigationItem.leftBarButtonItem = .cancelButton( dismissingFrom: self, - hasUnsavedChanges: { [unowned self] in self.hasUnsavedChanges }, + hasUnsavedChanges: { [unowned self] in self.canSaveChanges }, ) } self.navigationItem.rightBarButtonItem = .doneButton { [unowned self] in self.didTapDone() } @@ -98,20 +99,23 @@ class NameEditorViewController: OWSTableViewController2 { } override var isModalInPresentation: Bool { - get { hasUnsavedChanges } + get { canSaveChanges } set {} } private func updateHasUnsavedChanges() { - self.hasUnsavedChanges = self.nameField.text != self.oldName + let hasUnsavedChanges = self.nameField.text != self.oldName + let hasUnallowedEmptyName = !self.allowEmptyName && self.nameField.text.isEmptyOrNil + + self.navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges && !hasUnallowedEmptyName } - private var hasUnsavedChanges: Bool = false { + private var canSaveChanges: Bool = false { didSet { - if oldValue == hasUnsavedChanges { + if oldValue == canSaveChanges { return } - self.navigationItem.rightBarButtonItem?.isEnabled = hasUnsavedChanges + self.navigationItem.rightBarButtonItem?.isEnabled = canSaveChanges } } diff --git a/SignalServiceKit/Devices/OWSDeviceNames.swift b/SignalServiceKit/Devices/OWSDeviceNames.swift index 3f3827863b..6e904902a5 100644 --- a/SignalServiceKit/Devices/OWSDeviceNames.swift +++ b/SignalServiceKit/Devices/OWSDeviceNames.swift @@ -10,6 +10,7 @@ public import LibSignalClient public enum OWSDeviceNameError: Error { case assertionFailure case invalidInput + case emptyName case cryptError(_ description: String) } @@ -98,8 +99,7 @@ public enum OWSDeviceNames { throw OWSDeviceNameError.assertionFailure } guard ciphertext.count > 0 else { - owsFailDebug("Invalid cipher text.") - throw OWSDeviceNameError.assertionFailure + throw OWSDeviceNameError.emptyName } // master_secret = ECDH(identity_private, ephemeral_public) diff --git a/SignalServiceKit/Devices/OWSDeviceService.swift b/SignalServiceKit/Devices/OWSDeviceService.swift index b6d6bce194..dbc4b127e7 100644 --- a/SignalServiceKit/Devices/OWSDeviceService.swift +++ b/SignalServiceKit/Devices/OWSDeviceService.swift @@ -154,9 +154,11 @@ struct OWSDeviceServiceImpl: OWSDeviceService { base64String: nameCiphertext, identityKeyPair: identityKeyPair, ) + } catch OWSDeviceNameError.emptyName { + name = nil } catch { owsFailDebug("Failed to decrypt device name! Is this a legacy device name? \(error)") - name = nameCiphertext + name = nil } } else { name = nil