Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,7 +25,10 @@ class Cognito(val context: Context) {
val awsClient = AWSMobileClient.getInstance()!!

fun initialize(call: MethodCall, result: Result) {
awsClient.initialize(context, object : Callback<UserStateDetails> {
val configuration = call.argument<String>("configuration")
val awsConfig = AWSConfiguration(context)
if (configuration != null) awsConfig.configuration = configuration
awsClient.initialize(context, awsConfig, object : Callback<UserStateDetails> {
override fun onResult(u: UserStateDetails) {
trySend(result) { dumpUserState(u) }
}
Expand Down
133 changes: 122 additions & 11 deletions ios/Classes/Cognito.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ import plugin_scaffold
typealias CompletionCallback<T> = (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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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

Expand All @@ -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
Expand All @@ -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]

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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(
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion ios/Classes/SwiftFlutterCognitoPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
Expand Down
4 changes: 2 additions & 2 deletions lib/flutter_cognito_plugin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,10 @@ class Cognito {
/// ```
///
/// Returns the value of [Cognito.getCurrentUserState()].
static Future<UserState> initialize() async {
static Future<UserState> 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();

Expand Down