in aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/AWSCognitoAuthPlugin.java [156:275]
public void configure(
@NonNull JSONObject pluginConfiguration,
@NonNull Context context
) throws AuthException {
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<Exception> asyncException = new AtomicReference<>();
JSONObject mobileClientConfig;
LogFactory.setLevel(LogFactory.Level.OFF);
try {
mobileClientConfig = new JSONObject(pluginConfiguration.toString());
mobileClientConfig.put("UserAgentOverride", UserAgent.string());
} catch (JSONException exception) {
throw new AuthException("Failed to set user agent string",
exception,
AmplifyException.REPORT_BUG_TO_AWS_SUGGESTION);
}
awsMobileClient.initialize(
context,
new AWSConfiguration(mobileClientConfig),
new Callback<UserStateDetails>() {
@Override
public void onResult(UserStateDetails result) {
switch (result.getUserState()) {
case GUEST:
case SIGNED_OUT:
lastEvent = AuthChannelEventName.SIGNED_OUT;
userId = null;
break;
case SIGNED_IN:
lastEvent = AuthChannelEventName.SIGNED_IN;
userId = getUserIdFromToken(result.getDetails().get(MOBILE_CLIENT_TOKEN_KEY));
break;
case SIGNED_OUT_USER_POOLS_TOKENS_INVALID:
case SIGNED_OUT_FEDERATED_TOKENS_INVALID:
lastEvent = AuthChannelEventName.SESSION_EXPIRED;
userId = getUserIdFromToken(result.getDetails().get(MOBILE_CLIENT_TOKEN_KEY));
break;
default:
userId = null;
lastEvent = null;
}
// Set up a listener to asynchronously update the user id if the user state changes in the future
awsMobileClient.addUserStateListener(userStateDetails -> {
switch (userStateDetails.getUserState()) {
case SIGNED_OUT:
case GUEST:
userId = null;
if (lastEvent != AuthChannelEventName.SIGNED_OUT) {
lastEvent = AuthChannelEventName.SIGNED_OUT;
Amplify.Hub.publish(
HubChannel.AUTH,
HubEvent.create(AuthChannelEventName.SIGNED_OUT)
);
}
break;
case SIGNED_IN:
fetchAndSetUserId(() -> {
if (lastEvent != AuthChannelEventName.SIGNED_IN) {
lastEvent = AuthChannelEventName.SIGNED_IN;
Amplify.Hub.publish(
HubChannel.AUTH,
HubEvent.create(AuthChannelEventName.SIGNED_IN)
);
}
});
break;
case SIGNED_OUT_FEDERATED_TOKENS_INVALID:
case SIGNED_OUT_USER_POOLS_TOKENS_INVALID:
fetchAndSetUserId(() -> { /* No response needed */ });
if (lastEvent != AuthChannelEventName.SESSION_EXPIRED) {
lastEvent = AuthChannelEventName.SESSION_EXPIRED;
Amplify.Hub.publish(
HubChannel.AUTH,
HubEvent.create(AuthChannelEventName.SESSION_EXPIRED)
);
}
break;
default:
userId = null;
}
});
latch.countDown();
}
@Override
public void onError(Exception error) {
asyncException.set(error);
latch.countDown();
}
}
);
try {
if (latch.await(SECONDS_BEFORE_TIMEOUT, TimeUnit.SECONDS)) {
if (asyncException.get() != null) {
throw new AuthException(
"Failed to instantiate AWSMobileClient",
asyncException.get(),
"See attached exception for more details"
);
}
return;
} else {
throw new AuthException(
"Failed to instantiate AWSMobileClient within " + SECONDS_BEFORE_TIMEOUT + " seconds",
"Check network connectivity"
);
}
} catch (InterruptedException error) {
throw new AuthException(
"Failed to instantiate AWSMobileClient",
error,
"See attached exception for more details"
);
}
}