From 71f3a02355a5c23f096e9ef0a5dc1300cbcaf55b Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Mon, 12 Apr 2021 17:10:18 +0300 Subject: [PATCH 01/17] Added: hardcoded localizedFallbackTitle --- packages/local_auth/CHANGELOG.md | 4 ++++ packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m | 11 +++++++++-- packages/local_auth/lib/auth_strings.dart | 7 +++++-- packages/local_auth/lib/local_auth.dart | 2 +- packages/local_auth/pubspec.yaml | 2 +- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index f6c38489d8bb..81a0b2fa5130 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.5 + +* Add support `localizedFallbackTitle` in authenticateWithBiometrics on iOS. + ## 1.1.4 * Add debug assertion that `localizedReason` in `LocalAuthentication.authenticateWithBiometrics` must not be empty. diff --git a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m index a00c7eed2703..3dc5765855e1 100644 --- a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m +++ b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m @@ -122,7 +122,10 @@ - (void)authenticateWithBiometrics:(NSDictionary *)arguments NSError *authError = nil; self.lastCallArgs = nil; self.lastResult = nil; - context.localizedFallbackTitle = @""; + context.localizedFallbackTitle = nil; + if (arguments[@"localizedFallbackTitle"] != (NSString *)[NSNull null]) { + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; + } if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { @@ -146,7 +149,10 @@ - (void)authenticate:(NSDictionary *)arguments withFlutterResult:(FlutterResult) NSError *authError = nil; _lastCallArgs = nil; _lastResult = nil; - context.localizedFallbackTitle = @""; + context.localizedFallbackTitle = nil; + if (arguments[@"localizedFallbackTitle"] != (NSString *)[NSNull null]) { + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; + } if (@available(iOS 9.0, *)) { if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&authError]) { @@ -180,6 +186,7 @@ - (void)handleAuthReplyWithSuccess:(BOOL)success case LAErrorPasscodeNotSet: case LAErrorTouchIDNotAvailable: case LAErrorTouchIDNotEnrolled: + case LAErrorUserFallback: case LAErrorTouchIDLockout: [self handleErrors:error flutterArguments:arguments withFlutterResult:result]; return; diff --git a/packages/local_auth/lib/auth_strings.dart b/packages/local_auth/lib/auth_strings.dart index 537340b79d4e..b2ce25c3e864 100644 --- a/packages/local_auth/lib/auth_strings.dart +++ b/packages/local_auth/lib/auth_strings.dart @@ -68,20 +68,23 @@ class IOSAuthMessages { this.goToSettingsButton, this.goToSettingsDescription, this.cancelButton, + this.localizedFallbackTitle, }); final String? lockOut; final String? goToSettingsButton; final String? goToSettingsDescription; final String? cancelButton; + final String? localizedFallbackTitle; - Map get args { - return { + Map get args { + return { 'lockOut': lockOut ?? iOSLockOut, 'goToSetting': goToSettingsButton ?? goToSettings, 'goToSettingDescriptionIOS': goToSettingsDescription ?? iOSGoToSettingsDescription, 'okButton': cancelButton ?? iOSOkButton, + 'localizedFallbackTitle': localizedFallbackTitle, }; } } diff --git a/packages/local_auth/lib/local_auth.dart b/packages/local_auth/lib/local_auth.dart index 0b75a83d4029..987ecb22bb0b 100644 --- a/packages/local_auth/lib/local_auth.dart +++ b/packages/local_auth/lib/local_auth.dart @@ -102,7 +102,7 @@ class LocalAuthentication { }) async { assert(localizedReason.isNotEmpty); - final Map args = { + final Map args = { 'localizedReason': localizedReason, 'useErrorDialogs': useErrorDialogs, 'stickyAuth': stickyAuth, diff --git a/packages/local_auth/pubspec.yaml b/packages/local_auth/pubspec.yaml index eccc2f812a89..3b59bab9c541 100644 --- a/packages/local_auth/pubspec.yaml +++ b/packages/local_auth/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth description: Flutter plugin for Android and iOS devices to allow local authentication via fingerprint, touch ID, face ID, passcode, pin, or pattern. homepage: https://github.com/flutter/plugins/tree/master/packages/local_auth -version: 1.1.4 +version: 1.1.5 flutter: plugin: From ad80f96560e8650b392d512641d252741dabff3b Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sat, 18 Sep 2021 16:03:05 +0300 Subject: [PATCH 02/17] localizedFallbackTitle as non nullable param --- packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m | 5 +---- packages/local_auth/lib/auth_strings.dart | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m index 360b9f044d75..b31e1684a7af 100644 --- a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m +++ b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m @@ -122,10 +122,7 @@ - (void)authenticateWithBiometrics:(NSDictionary *)arguments NSError *authError = nil; self.lastCallArgs = nil; self.lastResult = nil; - context.localizedFallbackTitle = nil; - if (arguments[@"localizedFallbackTitle"] != (NSString *)[NSNull null]) { - context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; - } + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { diff --git a/packages/local_auth/lib/auth_strings.dart b/packages/local_auth/lib/auth_strings.dart index b2ce25c3e864..6edc9191bd95 100644 --- a/packages/local_auth/lib/auth_strings.dart +++ b/packages/local_auth/lib/auth_strings.dart @@ -77,14 +77,14 @@ class IOSAuthMessages { final String? cancelButton; final String? localizedFallbackTitle; - Map get args { - return { + Map get args { + return { 'lockOut': lockOut ?? iOSLockOut, 'goToSetting': goToSettingsButton ?? goToSettings, 'goToSettingDescriptionIOS': goToSettingsDescription ?? iOSGoToSettingsDescription, 'okButton': cancelButton ?? iOSOkButton, - 'localizedFallbackTitle': localizedFallbackTitle, + 'localizedFallbackTitle': localizedFallbackTitle ?? '', }; } } From 2e52b894db12a12abf4e65a2dfcfca860ddf048f Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sun, 19 Sep 2021 11:40:17 +0300 Subject: [PATCH 03/17] added: localizedFallbackTitle test --- .../ios/RunnerTests/FLTLocalAuthPluginTests.m | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index 97e78e2f624b..4866931967e4 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -56,6 +56,7 @@ - (void)testSuccessfullAuthWithBiometrics { arguments:@{ @"biometricOnly" : @(YES), @"localizedReason" : reason, + @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -63,6 +64,7 @@ - (void)testSuccessfullAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -95,6 +97,7 @@ - (void)testSuccessfullAuthWithoutBiometrics { arguments:@{ @"biometricOnly" : @(NO), @"localizedReason" : reason, + @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -102,6 +105,7 @@ - (void)testSuccessfullAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -134,6 +138,7 @@ - (void)testFailedAuthWithBiometrics { arguments:@{ @"biometricOnly" : @(YES), @"localizedReason" : reason, + @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -141,6 +146,7 @@ - (void)testFailedAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; @@ -173,6 +179,7 @@ - (void)testFailedAuthWithoutBiometrics { arguments:@{ @"biometricOnly" : @(NO), @"localizedReason" : reason, + @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -180,6 +187,50 @@ - (void)testFailedAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); + XCTAssertFalse([result boolValue]); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kTimeout handler:nil]; +} + + +- (void)testLocalizedFallbackTitle { + FLTLocalAuthPlugin* plugin = [[FLTLocalAuthPlugin alloc] init]; + id mockAuthContext = OCMClassMock([LAContext class]); + plugin.authContextOverrides = @[ mockAuthContext ]; + + const LAPolicy policy = LAPolicyDeviceOwnerAuthentication; + NSString* reason = @"a reason"; + NSString* localizedFallbackTitle = @"a title"; + OCMStub([mockAuthContext canEvaluatePolicy:policy error:[OCMArg setTo:nil]]).andReturn(YES); + + // evaluatePolicy:localizedReason:reply: calls back on an internal queue, which is not + // guaranteed to be on the main thread. Ensure that's handled correctly by calling back on + // a background thread. + void (^backgroundThreadReplyCaller)(NSInvocation*) = ^(NSInvocation* invocation) { + void (^reply)(BOOL, NSError*); + [invocation getArgument:&reply atIndex:4]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ + reply(NO, [NSError errorWithDomain:@"error" code:99 userInfo:nil]); + }); + }; + OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) + .andDo(backgroundThreadReplyCaller); + + FlutterMethodCall* call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" + arguments:@{ + @"biometricOnly" : @(NO), + @"localizedReason" : reason, + @"localizedFallbackTitle" : localizedFallbackTitle, + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; + [plugin handleMethodCall:call + result:^(id _Nullable result) { + XCTAssertTrue([NSThread isMainThread]); + XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle: localizedFallbackTitle]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; From 1b6c9bb1488bd66d4de8474d1129a91a19ba52f2 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Mon, 20 Sep 2021 11:50:08 +0300 Subject: [PATCH 04/17] test formatting fix --- .../ios/RunnerTests/FLTLocalAuthPluginTests.m | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index 4866931967e4..eb1c3b7866eb 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -64,7 +64,7 @@ - (void)testSuccessfullAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -105,7 +105,7 @@ - (void)testSuccessfullAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -146,7 +146,7 @@ - (void)testFailedAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; @@ -187,7 +187,7 @@ - (void)testFailedAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle: @""]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; @@ -218,19 +218,20 @@ - (void)testLocalizedFallbackTitle { OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) .andDo(backgroundThreadReplyCaller); - FlutterMethodCall* call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" - arguments:@{ - @"biometricOnly" : @(NO), - @"localizedReason" : reason, - @"localizedFallbackTitle" : localizedFallbackTitle, - }]; + FlutterMethodCall* call = + [FlutterMethodCall methodCallWithMethodName:@"authenticate" + arguments:@{ + @"biometricOnly" : @(NO), + @"localizedReason" : reason, + @"localizedFallbackTitle" : localizedFallbackTitle, + }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; [plugin handleMethodCall:call result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle: localizedFallbackTitle]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:localizedFallbackTitle]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; From 399f7870d60fd3a20b99bff1c97f3f5c79e34aa5 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Mon, 20 Sep 2021 12:10:02 +0300 Subject: [PATCH 05/17] test formatting fix --- .../local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index eb1c3b7866eb..97082ac7c4c1 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -194,7 +194,6 @@ - (void)testFailedAuthWithoutBiometrics { [self waitForExpectationsWithTimeout:kTimeout handler:nil]; } - - (void)testLocalizedFallbackTitle { FLTLocalAuthPlugin* plugin = [[FLTLocalAuthPlugin alloc] init]; id mockAuthContext = OCMClassMock([LAContext class]); From a0114210c670d08b345811ad7acc36a3cadff4af Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Tue, 12 Oct 2021 18:48:49 +0300 Subject: [PATCH 06/17] fixed: localizedFallbackTitle will not sent if it is null --- packages/local_auth/lib/auth_strings.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/local_auth/lib/auth_strings.dart b/packages/local_auth/lib/auth_strings.dart index 6edc9191bd95..c65147514f3a 100644 --- a/packages/local_auth/lib/auth_strings.dart +++ b/packages/local_auth/lib/auth_strings.dart @@ -78,14 +78,19 @@ class IOSAuthMessages { final String? localizedFallbackTitle; Map get args { - return { + final args = { 'lockOut': lockOut ?? iOSLockOut, 'goToSetting': goToSettingsButton ?? goToSettings, 'goToSettingDescriptionIOS': goToSettingsDescription ?? iOSGoToSettingsDescription, 'okButton': cancelButton ?? iOSOkButton, - 'localizedFallbackTitle': localizedFallbackTitle ?? '', }; + + if (localizedFallbackTitle != null) { + args['localizedFallbackTitle'] = localizedFallbackTitle!; + } + + return args; } } From dcc6e914a6960a999a1840a84ed01d4e56a93dc8 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Fri, 15 Oct 2021 11:19:59 +0300 Subject: [PATCH 07/17] fixed: localizedFallbackTitle [NSNull null] check, refactored IOSAuthMessages args with collection-if --- .../local_auth/ios/Classes/FLTLocalAuthPlugin.m | 13 ++++++++++--- packages/local_auth/lib/auth_strings.dart | 11 ++++------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m index b31e1684a7af..5d20c35db62f 100644 --- a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m +++ b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m @@ -122,7 +122,12 @@ - (void)authenticateWithBiometrics:(NSDictionary *)arguments NSError *authError = nil; self.lastCallArgs = nil; self.lastResult = nil; - context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; + + if (arguments[@"localizedFallbackTitle"] == [NSNull null]) { + context.localizedFallbackTitle = nil; + } else { + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; + } if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { @@ -146,8 +151,10 @@ - (void)authenticate:(NSDictionary *)arguments withFlutterResult:(FlutterResult) NSError *authError = nil; _lastCallArgs = nil; _lastResult = nil; - context.localizedFallbackTitle = nil; - if (arguments[@"localizedFallbackTitle"] != (NSString *)[NSNull null]) { + + if (arguments[@"localizedFallbackTitle"] == [NSNull null]) { + context.localizedFallbackTitle = nil; + } else { context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; } diff --git a/packages/local_auth/lib/auth_strings.dart b/packages/local_auth/lib/auth_strings.dart index c65147514f3a..6bcc8b7a1b8e 100644 --- a/packages/local_auth/lib/auth_strings.dart +++ b/packages/local_auth/lib/auth_strings.dart @@ -78,19 +78,16 @@ class IOSAuthMessages { final String? localizedFallbackTitle; Map get args { - final args = { + return { 'lockOut': lockOut ?? iOSLockOut, 'goToSetting': goToSettingsButton ?? goToSettings, 'goToSettingDescriptionIOS': goToSettingsDescription ?? iOSGoToSettingsDescription, 'okButton': cancelButton ?? iOSOkButton, + if (localizedFallbackTitle != null) ...{ + localizedFallbackTitle!: localizedFallbackTitle!, + } }; - - if (localizedFallbackTitle != null) { - args['localizedFallbackTitle'] = localizedFallbackTitle!; - } - - return args; } } From a55fa1dcf45644abec61677b00531b729b62d9e6 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Fri, 15 Oct 2021 11:39:40 +0300 Subject: [PATCH 08/17] reverted LocalAuthentication authenticate arguments to non-nullable --- packages/local_auth/lib/local_auth.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/local_auth/lib/local_auth.dart b/packages/local_auth/lib/local_auth.dart index 987ecb22bb0b..0b75a83d4029 100644 --- a/packages/local_auth/lib/local_auth.dart +++ b/packages/local_auth/lib/local_auth.dart @@ -102,7 +102,7 @@ class LocalAuthentication { }) async { assert(localizedReason.isNotEmpty); - final Map args = { + final Map args = { 'localizedReason': localizedReason, 'useErrorDialogs': useErrorDialogs, 'stickyAuth': stickyAuth, From dc4bee30c8d37e35df0fb96f5ea7ae0d55dfd45c Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Mon, 25 Oct 2021 21:45:21 +0300 Subject: [PATCH 09/17] fixed: localizedFallbackTitle key, added: dart tests --- .../ios/Classes/FLTLocalAuthPlugin.m | 18 +++---- packages/local_auth/lib/auth_strings.dart | 5 +- packages/local_auth/test/local_auth_test.dart | 47 +++++++++++++++++++ 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m index 5d20c35db62f..fc325e94df91 100644 --- a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m +++ b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m @@ -122,12 +122,9 @@ - (void)authenticateWithBiometrics:(NSDictionary *)arguments NSError *authError = nil; self.lastCallArgs = nil; self.lastResult = nil; - - if (arguments[@"localizedFallbackTitle"] == [NSNull null]) { - context.localizedFallbackTitle = nil; - } else { - context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; - } + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"] == [NSNull null] + ? nil + : arguments[@"localizedFallbackTitle"]; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { @@ -151,12 +148,9 @@ - (void)authenticate:(NSDictionary *)arguments withFlutterResult:(FlutterResult) NSError *authError = nil; _lastCallArgs = nil; _lastResult = nil; - - if (arguments[@"localizedFallbackTitle"] == [NSNull null]) { - context.localizedFallbackTitle = nil; - } else { - context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"]; - } + context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"] == [NSNull null] + ? nil + : arguments[@"localizedFallbackTitle"]; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&authError]) { [context evaluatePolicy:kLAPolicyDeviceOwnerAuthentication diff --git a/packages/local_auth/lib/auth_strings.dart b/packages/local_auth/lib/auth_strings.dart index 6bcc8b7a1b8e..3e34659b8dad 100644 --- a/packages/local_auth/lib/auth_strings.dart +++ b/packages/local_auth/lib/auth_strings.dart @@ -84,9 +84,8 @@ class IOSAuthMessages { 'goToSettingDescriptionIOS': goToSettingsDescription ?? iOSGoToSettingsDescription, 'okButton': cancelButton ?? iOSOkButton, - if (localizedFallbackTitle != null) ...{ - localizedFallbackTitle!: localizedFallbackTitle!, - } + if (localizedFallbackTitle != null) + 'localizedFallbackTitle': localizedFallbackTitle!, }; } } diff --git a/packages/local_auth/test/local_auth_test.dart b/packages/local_auth/test/local_auth_test.dart index b24de8bd3c11..bc500ee573e7 100644 --- a/packages/local_auth/test/local_auth_test.dart +++ b/packages/local_auth/test/local_auth_test.dart @@ -73,6 +73,30 @@ void main() { ); }); + test('authenticate with `localizedFallbackTitle` on iOS.', () async { + final iosAuthMessages = + IOSAuthMessages(localizedFallbackTitle: 'Enter PIN'); + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + await localAuthentication.authenticate( + localizedReason: 'Needs secure', + biometricOnly: true, + iOSAuthStrings: iosAuthMessages, + ); + expect( + log, + [ + isMethodCall('authenticate', + arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': true, + }..addAll(iosAuthMessages.args)), + ], + ); + }); + test('authenticate with no localizedReason on iOS.', () async { setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); await expectLater( @@ -149,6 +173,29 @@ void main() { ); }); + test('authenticate with `localizedFallbackTitle` on iOS', () async { + final iosAuthMessages = + IOSAuthMessages(localizedFallbackTitle: 'Enter PIN'); + setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); + await localAuthentication.authenticate( + localizedReason: 'Needs secure', + iOSAuthStrings: iosAuthMessages, + ); + expect( + log, + [ + isMethodCall('authenticate', + arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': false, + }..addAll(iosAuthMessages.args)), + ], + ); + }); + test('authenticate with no sensitive transaction.', () async { setMockPathProviderPlatform(FakePlatform(operatingSystem: 'android')); await localAuthentication.authenticate( From 50310fd75c013d21210fb5e216d7ced44fb7702f Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Mon, 25 Oct 2021 21:52:47 +0300 Subject: [PATCH 10/17] formatting --- packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m index fc325e94df91..70113efa00a0 100644 --- a/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m +++ b/packages/local_auth/ios/Classes/FLTLocalAuthPlugin.m @@ -123,8 +123,8 @@ - (void)authenticateWithBiometrics:(NSDictionary *)arguments self.lastCallArgs = nil; self.lastResult = nil; context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"] == [NSNull null] - ? nil - : arguments[@"localizedFallbackTitle"]; + ? nil + : arguments[@"localizedFallbackTitle"]; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) { @@ -149,8 +149,8 @@ - (void)authenticate:(NSDictionary *)arguments withFlutterResult:(FlutterResult) _lastCallArgs = nil; _lastResult = nil; context.localizedFallbackTitle = arguments[@"localizedFallbackTitle"] == [NSNull null] - ? nil - : arguments[@"localizedFallbackTitle"]; + ? nil + : arguments[@"localizedFallbackTitle"]; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&authError]) { [context evaluatePolicy:kLAPolicyDeviceOwnerAuthentication From fd4356d4622cd8c1b010256f44b21324a844e771 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sat, 30 Oct 2021 20:20:26 +0300 Subject: [PATCH 11/17] updated: local_auth_test.dart --- packages/local_auth/test/local_auth_test.dart | 192 +++++++++++------- 1 file changed, 113 insertions(+), 79 deletions(-) diff --git a/packages/local_auth/test/local_auth_test.dart b/packages/local_auth/test/local_auth_test.dart index bc500ee573e7..9524e079d8cf 100644 --- a/packages/local_auth/test/local_auth_test.dart +++ b/packages/local_auth/test/local_auth_test.dart @@ -40,14 +40,28 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': true, - }..addAll(const AndroidAuthMessages().args)), + isMethodCall( + 'authenticate', + arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': true, + 'biometricHint': androidBiometricHint, + 'biometricNotRecognized': androidBiometricNotRecognized, + 'biometricSuccess': androidBiometricSuccess, + 'biometricRequired': androidBiometricRequiredTitle, + 'cancelButton': androidCancelButton, + 'deviceCredentialsRequired': + androidDeviceCredentialsRequiredTitle, + 'deviceCredentialsSetupDescription': + androidDeviceCredentialsSetupDescription, + 'goToSetting': goToSettings, + 'goToSettingDescription': androidGoToSettingsDescription, + 'signInTitle': androidSignInTitle, + }, + ), ], ); }); @@ -61,14 +75,17 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': true, - }..addAll(const IOSAuthMessages().args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': true, + 'lockOut': iOSLockOut, + 'goToSetting': goToSettings, + 'goToSettingDescriptionIOS': iOSGoToSettingsDescription, + 'okButton': iOSOkButton, + }), ], ); }); @@ -85,14 +102,18 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': true, - }..addAll(iosAuthMessages.args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': true, + 'lockOut': iOSLockOut, + 'goToSetting': goToSettings, + 'goToSettingDescriptionIOS': iOSGoToSettingsDescription, + 'okButton': iOSOkButton, + 'localizedFallbackTitle': 'Enter PIN', + }), ], ); }); @@ -119,14 +140,25 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Insecure', - 'useErrorDialogs': false, - 'stickyAuth': false, - 'sensitiveTransaction': false, - 'biometricOnly': true, - }..addAll(const AndroidAuthMessages().args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Insecure', + 'useErrorDialogs': false, + 'stickyAuth': false, + 'sensitiveTransaction': false, + 'biometricOnly': true, + 'biometricHint': androidBiometricHint, + 'biometricNotRecognized': androidBiometricNotRecognized, + 'biometricSuccess': androidBiometricSuccess, + 'biometricRequired': androidBiometricRequiredTitle, + 'cancelButton': androidCancelButton, + 'deviceCredentialsRequired': + androidDeviceCredentialsRequiredTitle, + 'deviceCredentialsSetupDescription': + androidDeviceCredentialsSetupDescription, + 'goToSetting': goToSettings, + 'goToSettingDescription': androidGoToSettingsDescription, + 'signInTitle': androidSignInTitle, + }), ], ); }); @@ -141,14 +173,25 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': false, - }..addAll(const AndroidAuthMessages().args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': false, + 'biometricHint': androidBiometricHint, + 'biometricNotRecognized': androidBiometricNotRecognized, + 'biometricSuccess': androidBiometricSuccess, + 'biometricRequired': androidBiometricRequiredTitle, + 'cancelButton': androidCancelButton, + 'deviceCredentialsRequired': + androidDeviceCredentialsRequiredTitle, + 'deviceCredentialsSetupDescription': + androidDeviceCredentialsSetupDescription, + 'goToSetting': goToSettings, + 'goToSettingDescription': androidGoToSettingsDescription, + 'signInTitle': androidSignInTitle, + }), ], ); }); @@ -161,37 +204,17 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': false, - }..addAll(const IOSAuthMessages().args)), - ], - ); - }); - - test('authenticate with `localizedFallbackTitle` on iOS', () async { - final iosAuthMessages = - IOSAuthMessages(localizedFallbackTitle: 'Enter PIN'); - setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); - await localAuthentication.authenticate( - localizedReason: 'Needs secure', - iOSAuthStrings: iosAuthMessages, - ); - expect( - log, - [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Needs secure', - 'useErrorDialogs': true, - 'stickyAuth': false, - 'sensitiveTransaction': true, - 'biometricOnly': false, - }..addAll(iosAuthMessages.args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Needs secure', + 'useErrorDialogs': true, + 'stickyAuth': false, + 'sensitiveTransaction': true, + 'biometricOnly': false, + 'lockOut': iOSLockOut, + 'goToSetting': goToSettings, + 'goToSettingDescriptionIOS': iOSGoToSettingsDescription, + 'okButton': iOSOkButton, + }), ], ); }); @@ -206,14 +229,25 @@ void main() { expect( log, [ - isMethodCall('authenticate', - arguments: { - 'localizedReason': 'Insecure', - 'useErrorDialogs': false, - 'stickyAuth': false, - 'sensitiveTransaction': false, - 'biometricOnly': false, - }..addAll(const AndroidAuthMessages().args)), + isMethodCall('authenticate', arguments: { + 'localizedReason': 'Insecure', + 'useErrorDialogs': false, + 'stickyAuth': false, + 'sensitiveTransaction': false, + 'biometricOnly': false, + 'biometricHint': androidBiometricHint, + 'biometricNotRecognized': androidBiometricNotRecognized, + 'biometricSuccess': androidBiometricSuccess, + 'biometricRequired': androidBiometricRequiredTitle, + 'cancelButton': androidCancelButton, + 'deviceCredentialsRequired': + androidDeviceCredentialsRequiredTitle, + 'deviceCredentialsSetupDescription': + androidDeviceCredentialsSetupDescription, + 'goToSetting': goToSettings, + 'goToSettingDescription': androidGoToSettingsDescription, + 'signInTitle': androidSignInTitle, + }), ], ); }); From 63fd16bf61ba4993506bdbf662cb244520804359 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sun, 16 Jan 2022 13:27:05 +0200 Subject: [PATCH 12/17] fixed: tests --- .../example/ios/RunnerTests/FLTLocalAuthPluginTests.m | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index 97082ac7c4c1..4b916ff9100a 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -56,7 +56,6 @@ - (void)testSuccessfullAuthWithBiometrics { arguments:@{ @"biometricOnly" : @(YES), @"localizedReason" : reason, - @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -64,7 +63,6 @@ - (void)testSuccessfullAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -97,7 +95,6 @@ - (void)testSuccessfullAuthWithoutBiometrics { arguments:@{ @"biometricOnly" : @(NO), @"localizedReason" : reason, - @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -105,7 +102,6 @@ - (void)testSuccessfullAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertTrue([result boolValue]); [expectation fulfill]; }]; @@ -138,7 +134,6 @@ - (void)testFailedAuthWithBiometrics { arguments:@{ @"biometricOnly" : @(YES), @"localizedReason" : reason, - @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -146,7 +141,6 @@ - (void)testFailedAuthWithBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; @@ -179,7 +173,6 @@ - (void)testFailedAuthWithoutBiometrics { arguments:@{ @"biometricOnly" : @(NO), @"localizedReason" : reason, - @"localizedFallbackTitle" : @"", }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; @@ -187,7 +180,6 @@ - (void)testFailedAuthWithoutBiometrics { result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); XCTAssertTrue([result isKindOfClass:[NSNumber class]]); - OCMVerify([mockAuthContext setLocalizedFallbackTitle:@""]); XCTAssertFalse([result boolValue]); [expectation fulfill]; }]; From 0b408fd9eff901b7e8f88683418f60791c4630ba Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sun, 16 Jan 2022 13:53:43 +0200 Subject: [PATCH 13/17] fixed: tests (lintering) --- packages/local_auth/test/local_auth_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/local_auth/test/local_auth_test.dart b/packages/local_auth/test/local_auth_test.dart index 853d54febbb2..3de9758f9d0c 100644 --- a/packages/local_auth/test/local_auth_test.dart +++ b/packages/local_auth/test/local_auth_test.dart @@ -91,7 +91,7 @@ void main() { }); test('authenticate with `localizedFallbackTitle` on iOS.', () async { - final iosAuthMessages = + const IOSAuthMessages iosAuthMessages = IOSAuthMessages(localizedFallbackTitle: 'Enter PIN'); setMockPathProviderPlatform(FakePlatform(operatingSystem: 'ios')); await localAuthentication.authenticate( From 0cf0a8c94f9c24e94ee76d3ee08d9ef7efe74a16 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sun, 16 Jan 2022 21:13:17 +0200 Subject: [PATCH 14/17] fixed: added setLocalizedFallbackTitle test --- .../ios/RunnerTests/FLTLocalAuthPluginTests.m | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index 4b916ff9100a..ac85e3dcf4d8 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -229,4 +229,45 @@ - (void)testLocalizedFallbackTitle { [self waitForExpectationsWithTimeout:kTimeout handler:nil]; } +- (void)testSkippedLocalizedFallbackTitle { + FLTLocalAuthPlugin* plugin = [[FLTLocalAuthPlugin alloc] init]; + id mockAuthContext = OCMClassMock([LAContext class]); + plugin.authContextOverrides = @[ mockAuthContext ]; + + const LAPolicy policy = LAPolicyDeviceOwnerAuthentication; + NSString* reason = @"a reason"; + OCMStub([mockAuthContext canEvaluatePolicy:policy error:[OCMArg setTo:nil]]).andReturn(YES); + + // evaluatePolicy:localizedReason:reply: calls back on an internal queue, which is not + // guaranteed to be on the main thread. Ensure that's handled correctly by calling back on + // a background thread. + void (^backgroundThreadReplyCaller)(NSInvocation*) = ^(NSInvocation* invocation) { + void (^reply)(BOOL, NSError*); + [invocation getArgument:&reply atIndex:4]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ + reply(NO, [NSError errorWithDomain:@"error" code:99 userInfo:nil]); + }); + }; + OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) + .andDo(backgroundThreadReplyCaller); + + FlutterMethodCall* call = + [FlutterMethodCall methodCallWithMethodName:@"authenticate" + arguments:@{ + @"biometricOnly" : @(NO), + @"localizedReason" : reason, + }]; + + XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; + [plugin handleMethodCall:call + result:^(id _Nullable result) { + XCTAssertTrue([NSThread isMainThread]); + XCTAssertTrue([result isKindOfClass:[NSNumber class]]); + OCMVerify([mockAuthContext setLocalizedFallbackTitle:nil]); + XCTAssertFalse([result boolValue]); + [expectation fulfill]; + }]; + [self waitForExpectationsWithTimeout:kTimeout handler:nil]; +} + @end From efec6b520644be571c4a4c7bba00cba90df564a8 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Sun, 16 Jan 2022 21:50:58 +0200 Subject: [PATCH 15/17] fixed: formatting --- .../example/ios/RunnerTests/FLTLocalAuthPluginTests.m | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index ac85e3dcf4d8..55cafda4dbdc 100644 --- a/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -251,12 +251,11 @@ - (void)testSkippedLocalizedFallbackTitle { OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) .andDo(backgroundThreadReplyCaller); - FlutterMethodCall* call = - [FlutterMethodCall methodCallWithMethodName:@"authenticate" - arguments:@{ - @"biometricOnly" : @(NO), - @"localizedReason" : reason, - }]; + FlutterMethodCall* call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" + arguments:@{ + @"biometricOnly" : @(NO), + @"localizedReason" : reason, + }]; XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; [plugin handleMethodCall:call From cd7e0662953e177579f21c312b1a3252427c31fa Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Tue, 18 Jan 2022 18:01:45 +0200 Subject: [PATCH 16/17] fixed: changelog comment style --- packages/local_auth/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/local_auth/CHANGELOG.md b/packages/local_auth/CHANGELOG.md index ea28ada715e5..9387540d6795 100644 --- a/packages/local_auth/CHANGELOG.md +++ b/packages/local_auth/CHANGELOG.md @@ -1,6 +1,6 @@ ## 1.1.11 -* Add support `localizedFallbackTitle` in authenticateWithBiometrics on iOS. +* Adds support `localizedFallbackTitle` in authenticateWithBiometrics on iOS. ## 1.1.10 From 2ca4cbadb54b55b063ccef33612c2f6668b57767 Mon Sep 17 00:00:00 2001 From: Alex Furaiev Date: Tue, 15 Feb 2022 20:35:15 +0200 Subject: [PATCH 17/17] ObjC formatted --- .../ios/RunnerTests/FLTLocalAuthPluginTests.m | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/local_auth/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m b/packages/local_auth/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m index f049b16f4cff..3572524d8991 100644 --- a/packages/local_auth/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m +++ b/packages/local_auth/local_auth/example/ios/RunnerTests/FLTLocalAuthPluginTests.m @@ -187,20 +187,20 @@ - (void)testFailedAuthWithoutBiometrics { } - (void)testLocalizedFallbackTitle { - FLTLocalAuthPlugin* plugin = [[FLTLocalAuthPlugin alloc] init]; + FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc] init]; id mockAuthContext = OCMClassMock([LAContext class]); plugin.authContextOverrides = @[ mockAuthContext ]; const LAPolicy policy = LAPolicyDeviceOwnerAuthentication; - NSString* reason = @"a reason"; - NSString* localizedFallbackTitle = @"a title"; + NSString *reason = @"a reason"; + NSString *localizedFallbackTitle = @"a title"; OCMStub([mockAuthContext canEvaluatePolicy:policy error:[OCMArg setTo:nil]]).andReturn(YES); // evaluatePolicy:localizedReason:reply: calls back on an internal queue, which is not // guaranteed to be on the main thread. Ensure that's handled correctly by calling back on // a background thread. - void (^backgroundThreadReplyCaller)(NSInvocation*) = ^(NSInvocation* invocation) { - void (^reply)(BOOL, NSError*); + void (^backgroundThreadReplyCaller)(NSInvocation *) = ^(NSInvocation *invocation) { + void (^reply)(BOOL, NSError *); [invocation getArgument:&reply atIndex:4]; dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ reply(NO, [NSError errorWithDomain:@"error" code:99 userInfo:nil]); @@ -209,7 +209,7 @@ - (void)testLocalizedFallbackTitle { OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) .andDo(backgroundThreadReplyCaller); - FlutterMethodCall* call = + FlutterMethodCall *call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" arguments:@{ @"biometricOnly" : @(NO), @@ -217,7 +217,7 @@ - (void)testLocalizedFallbackTitle { @"localizedFallbackTitle" : localizedFallbackTitle, }]; - XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; + XCTestExpectation *expectation = [self expectationWithDescription:@"Result is called"]; [plugin handleMethodCall:call result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]); @@ -230,19 +230,19 @@ - (void)testLocalizedFallbackTitle { } - (void)testSkippedLocalizedFallbackTitle { - FLTLocalAuthPlugin* plugin = [[FLTLocalAuthPlugin alloc] init]; + FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc] init]; id mockAuthContext = OCMClassMock([LAContext class]); plugin.authContextOverrides = @[ mockAuthContext ]; const LAPolicy policy = LAPolicyDeviceOwnerAuthentication; - NSString* reason = @"a reason"; + NSString *reason = @"a reason"; OCMStub([mockAuthContext canEvaluatePolicy:policy error:[OCMArg setTo:nil]]).andReturn(YES); // evaluatePolicy:localizedReason:reply: calls back on an internal queue, which is not // guaranteed to be on the main thread. Ensure that's handled correctly by calling back on // a background thread. - void (^backgroundThreadReplyCaller)(NSInvocation*) = ^(NSInvocation* invocation) { - void (^reply)(BOOL, NSError*); + void (^backgroundThreadReplyCaller)(NSInvocation *) = ^(NSInvocation *invocation) { + void (^reply)(BOOL, NSError *); [invocation getArgument:&reply atIndex:4]; dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ reply(NO, [NSError errorWithDomain:@"error" code:99 userInfo:nil]); @@ -251,13 +251,13 @@ - (void)testSkippedLocalizedFallbackTitle { OCMStub([mockAuthContext evaluatePolicy:policy localizedReason:reason reply:[OCMArg any]]) .andDo(backgroundThreadReplyCaller); - FlutterMethodCall* call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" + FlutterMethodCall *call = [FlutterMethodCall methodCallWithMethodName:@"authenticate" arguments:@{ @"biometricOnly" : @(NO), @"localizedReason" : reason, }]; - XCTestExpectation* expectation = [self expectationWithDescription:@"Result is called"]; + XCTestExpectation *expectation = [self expectationWithDescription:@"Result is called"]; [plugin handleMethodCall:call result:^(id _Nullable result) { XCTAssertTrue([NSThread isMainThread]);