Merge branch 'charlesmchen/screenLock9'

pull/1/head
Matthew Chen 7 years ago
commit 1ae3f77db3

@ -11,6 +11,7 @@ import LocalAuthentication
case success case success
case cancel case cancel
case failure(error:String) case failure(error:String)
case unexpectedFailure(error:String)
} }
@objc public let screenLockTimeoutDefault = 15 * kMinuteInterval @objc public let screenLockTimeoutDefault = 15 * kMinuteInterval
@ -122,6 +123,8 @@ import LocalAuthentication
switch outcome { switch outcome {
case .failure(let error): case .failure(let error):
completion(self.authenticationError(errorDescription: error)) completion(self.authenticationError(errorDescription: error))
case .unexpectedFailure(let error):
completion(self.authenticationError(errorDescription: error))
case .success: case .success:
self.setIsScreenLockEnabled(value: true) self.setIsScreenLockEnabled(value: true)
completion(nil) completion(nil)
@ -144,6 +147,8 @@ import LocalAuthentication
switch outcome { switch outcome {
case .failure(let error): case .failure(let error):
completion(self.authenticationError(errorDescription: error)) completion(self.authenticationError(errorDescription: error))
case .unexpectedFailure(let error):
completion(self.authenticationError(errorDescription: error))
case .success: case .success:
self.setIsScreenLockEnabled(value: false) self.setIsScreenLockEnabled(value: false)
completion(nil) completion(nil)
@ -155,6 +160,7 @@ import LocalAuthentication
@objc public func tryToUnlockScreenLock(success: @escaping (() -> Void), @objc public func tryToUnlockScreenLock(success: @escaping (() -> Void),
failure: @escaping ((Error) -> Void), failure: @escaping ((Error) -> Void),
unexpectedFailure: @escaping ((Error) -> Void),
cancel: @escaping (() -> Void)) { cancel: @escaping (() -> Void)) {
guard !ignoreUnlockUntilActive else { guard !ignoreUnlockUntilActive else {
DispatchQueue.main.async { DispatchQueue.main.async {
@ -171,6 +177,8 @@ import LocalAuthentication
switch outcome { switch outcome {
case .failure(let error): case .failure(let error):
failure(self.authenticationError(errorDescription: error)) failure(self.authenticationError(errorDescription: error))
case .unexpectedFailure(let error):
unexpectedFailure(self.authenticationError(errorDescription: error))
case .success: case .success:
success() success()
case .cancel: case .cancel:
@ -215,7 +223,7 @@ import LocalAuthentication
case .success: case .success:
owsFail("\(self.logTag) local authentication unexpected success") owsFail("\(self.logTag) local authentication unexpected success")
completion(.failure(error:defaultErrorDescription)) completion(.failure(error:defaultErrorDescription))
case .cancel, .failure: case .cancel, .failure, .unexpectedFailure:
completion(outcome) completion(outcome)
} }
return return
@ -235,7 +243,7 @@ import LocalAuthentication
case .success: case .success:
owsFail("\(self.logTag) local authentication unexpected success") owsFail("\(self.logTag) local authentication unexpected success")
completion(.failure(error:defaultErrorDescription)) completion(.failure(error:defaultErrorDescription))
case .cancel, .failure: case .cancel, .failure, .unexpectedFailure:
completion(outcome) completion(outcome)
} }
} }
@ -296,10 +304,10 @@ import LocalAuthentication
comment: "Indicates that Touch ID/Face ID/Phone Passcode is 'locked out' on this device due to authentication failures.")) comment: "Indicates that Touch ID/Face ID/Phone Passcode is 'locked out' on this device due to authentication failures."))
case .invalidContext: case .invalidContext:
owsFail("\(self.logTag) context not valid.") owsFail("\(self.logTag) context not valid.")
return .failure(error:defaultErrorDescription) return .unexpectedFailure(error:defaultErrorDescription)
case .notInteractive: case .notInteractive:
owsFail("\(self.logTag) context not interactive.") owsFail("\(self.logTag) context not interactive.")
return .failure(error:defaultErrorDescription) return .unexpectedFailure(error:defaultErrorDescription)
} }
} }
return .failure(error:defaultErrorDescription) return .failure(error:defaultErrorDescription)

@ -202,6 +202,16 @@ NS_ASSUME_NONNULL_BEGIN
[self showScreenLockFailureAlertWithMessage:error.localizedDescription]; [self showScreenLockFailureAlertWithMessage:error.localizedDescription];
} }
unexpectedFailure:^(NSError *error) {
DDLogInfo(@"%@ unlock screen lock unexpectedly failed.", self.logTag);
// Local Authentication isn't working properly.
// This isn't covered by the docs or the forums but in practice
// it appears to be effective to retry again after waiting a bit.
dispatch_async(dispatch_get_main_queue(), ^{
[self clearAuthUIWhenActive];
});
}
cancel:^{ cancel:^{
DDLogInfo(@"%@ unlock screen lock cancelled.", self.logTag); DDLogInfo(@"%@ unlock screen lock cancelled.", self.logTag);

Loading…
Cancel
Save