public void configure()

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"
            );
        }
    }