diff --git a/android/src/main/kotlin/com/pycampers/flutter_cognito_plugin/Cognito.kt b/android/src/main/kotlin/com/pycampers/flutter_cognito_plugin/Cognito.kt index 53b572c..91ef502 100644 --- a/android/src/main/kotlin/com/pycampers/flutter_cognito_plugin/Cognito.kt +++ b/android/src/main/kotlin/com/pycampers/flutter_cognito_plugin/Cognito.kt @@ -14,6 +14,7 @@ import com.amazonaws.mobile.client.results.SignInResult import com.amazonaws.mobile.client.results.SignUpResult import com.amazonaws.mobile.client.results.Tokens import com.amazonaws.mobile.client.results.UserCodeDeliveryDetails +import com.amazonaws.mobile.config.AWSConfiguration import com.pycampers.plugin_scaffold.sendThrowable import com.pycampers.plugin_scaffold.trySend import io.flutter.plugin.common.MethodCall @@ -24,7 +25,10 @@ class Cognito(val context: Context) { val awsClient = AWSMobileClient.getInstance()!! fun initialize(call: MethodCall, result: Result) { - awsClient.initialize(context, object : Callback { + val configuration = call.argument("configuration") + val awsConfig = AWSConfiguration(context) + if (configuration != null) awsConfig.configuration = configuration + awsClient.initialize(context, awsConfig, object : Callback { override fun onResult(u: UserStateDetails) { trySend(result) { dumpUserState(u) } } diff --git a/ios/Classes/Cognito.swift b/ios/Classes/Cognito.swift index 5ef53ff..35e72f5 100644 --- a/ios/Classes/Cognito.swift +++ b/ios/Classes/Cognito.swift @@ -5,7 +5,13 @@ import plugin_scaffold typealias CompletionCallback = (T?, Error?) -> Void class Cognito { - let awsClient = AWSMobileClient.default() + var awsClient: AWSMobileClient? + var userStateCallback: UserStateChangeCallback? + private lazy var notInitializedError = FlutterError( + code: "NotInitialized", + message: "Call the initialize method first.", + details: nil + ) func createErrorCallback(_ result: @escaping FlutterResult) -> (Error?) -> Void { return { error in @@ -31,10 +37,39 @@ class Cognito { } func initialize(call: FlutterMethodCall, result: @escaping FlutterResult) { - self.awsClient.initialize(self.createCallback(result, dumpUserState)) + let args = call.arguments as! [String: Any?] + if let configuration = args["configuration"] as? String, + let url = Bundle.main.url(forResource: "awsconfiguration", withExtension: "json"), + let data = try? Data(contentsOf: url), + let obj = try? JSONSerialization.jsonObject(with: data) as? [String:Any] { + var config:[String: Any] = [:] + obj.forEach { (key, value) in + if var value = value as? [String:Any], + let newval = value[configuration] { + value["Default"] = newval + value[configuration] = nil + config[key] = value + } else { + config[key] = value + } + } + self.awsClient = AWSMobileClient(configuration: config) + } else { + self.awsClient = AWSMobileClient.default() + } + if let callback = userStateCallback { + let obj = "test" as NSString + self.awsClient?.removeUserStateListener(obj) + self.awsClient?.addUserStateListener(obj, callback) + } + self.awsClient?.initialize(self.createCallback(result, dumpUserState)) } func signUp(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String let password = args["password"] as! String @@ -50,6 +85,10 @@ class Cognito { } func confirmSignUp(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String let confirmationCode = args["confirmationCode"] as! String @@ -62,6 +101,10 @@ class Cognito { } func resendSignUp(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String @@ -72,6 +115,10 @@ class Cognito { } func signIn(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String let password = args["password"] as! String @@ -85,6 +132,10 @@ class Cognito { } func confirmSignIn(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let confirmationCode = args["confirmationCode"] as! String @@ -95,6 +146,10 @@ class Cognito { } func changePassword(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let oldPassword = args["oldPassword"] as! String let newPassword = args["newPassword"] as! String @@ -107,6 +162,10 @@ class Cognito { } func forgotPassword(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String @@ -117,6 +176,10 @@ class Cognito { } func confirmForgotPassword(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let username = args["username"] as! String let newPassword = args["newPassword"] as! String @@ -131,6 +194,10 @@ class Cognito { } func updateUserAttributes(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let userAttributes = args["userAttributes"] as! [String: String] @@ -143,10 +210,18 @@ class Cognito { } func getUserAttributes(call: FlutterMethodCall, result: @escaping FlutterResult) { - self.awsClient.getUserAttributes(completionHandler: self.createCallback(result)) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + awsClient.getUserAttributes(completionHandler: self.createCallback(result)) } func confirmUpdateUserAttribute(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let attributeName = args["attributeName"] as! String let confirmationCode = args["confirmationCode"] as! String @@ -158,35 +233,67 @@ class Cognito { } func signOut(call: FlutterMethodCall, result: @escaping FlutterResult) { - self.awsClient.signOut() + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + awsClient.signOut() result(nil) } func getUsername(call: FlutterMethodCall, result: @escaping FlutterResult) { - result(self.awsClient.username) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + result(awsClient.username) } func isSignedIn(call: FlutterMethodCall, result: @escaping FlutterResult) { - result(self.awsClient.isSignedIn) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + result(awsClient.isSignedIn) } func getIdentityId(call: FlutterMethodCall, result: @escaping FlutterResult) { - result(self.awsClient.identityId) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + result(awsClient.identityId) } func currentUserState(call: FlutterMethodCall, result: @escaping FlutterResult) { - result(dumpUserState(self.awsClient.currentUserState)) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + result(dumpUserState(awsClient.currentUserState)) } func getTokens(call: FlutterMethodCall, result: @escaping FlutterResult) { - self.awsClient.getTokens(self.createCallback(result, dumpTokens)) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + awsClient.getTokens(self.createCallback(result, dumpTokens)) } func getCredentials(call: FlutterMethodCall, result: @escaping FlutterResult) { - self.awsClient.getAWSCredentials(self.createCallback(result, dumpCredentials)) + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } + awsClient.getAWSCredentials(self.createCallback(result, dumpCredentials)) } func federatedSignIn(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let args = call.arguments as! [String: Any?] let providerName = args["providerName"] as! String let token = args["token"] as! String @@ -199,6 +306,10 @@ class Cognito { } func showSignIn(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let awsClient = self.awsClient else { + result(notInitializedError) + return + } let navigationController = CognitoPluginAppDelegate.navigationController if navigationController == nil { let error = FlutterError( @@ -217,7 +328,7 @@ class Cognito { let hostedUIOptions = HostedUIOptions(scopes: scopes, identityProvider: identityProvider) // Present the Hosted UI sign in. - self.awsClient.showSignIn( + awsClient.showSignIn( navigationController: navigationController!, hostedUIOptions: hostedUIOptions, createCallback(result, dumpUserState) diff --git a/ios/Classes/SwiftFlutterCognitoPlugin.swift b/ios/Classes/SwiftFlutterCognitoPlugin.swift index 6bc4ef1..845b87e 100644 --- a/ios/Classes/SwiftFlutterCognitoPlugin.swift +++ b/ios/Classes/SwiftFlutterCognitoPlugin.swift @@ -58,7 +58,7 @@ public class SwiftFlutterCognitoPlugin: NSObject, FlutterPlugin { "showSignIn": plugin.showSignIn, ] ) - plugin.awsClient.addUserStateListener("test" as NSString) { userState, _ in + plugin.userStateCallback = { userState, _ in channel.invokeMethod("userStateCallback", arguments: dumpUserState(userState)) } } diff --git a/lib/flutter_cognito_plugin.dart b/lib/flutter_cognito_plugin.dart index 9fa44f7..5f866ea 100644 --- a/lib/flutter_cognito_plugin.dart +++ b/lib/flutter_cognito_plugin.dart @@ -102,10 +102,10 @@ class Cognito { /// ``` /// /// Returns the value of [Cognito.getCurrentUserState()]. - static Future initialize() async { + static Future initialize({String configuration}) async { // don't trust the UserState returned by this // https://github.com/aws-amplify/aws-sdk-android/issues/873 - await invokeMethod("initialize"); + await invokeMethod("initialize", {"configuration": configuration}); var userState = await Cognito.getCurrentUserState();