Skip to content

AWSMobileClient._showSignIn calls addSignInProvider multiple times for each call to AWSMobileClient.getInstance().showSignIn #766

Closed
@BillBunting

Description

@BillBunting

Describe the bug

Minor bug, if a bug at all.

Make one call to AWSMobileClient.getInstance().initialize then for each call to AWSMobileClient.getInstance().showSignIn, each call to identityManager.addSignInProvider results to adding the sign in provider multiple times. So, when an app calls AWSMobileClient.getInstance().SignOut() then repeats the call to SignIn() the class is added to the list again.

If using awsconfiguration.json, the sign in provider will also already be added so there are two right from the start.

To Reproduce
call AWSMobileClient.getInstance().SignIn(... followed by calls to SignOut then in again or for any reason call SignIn again.

Observe log output of an increasing number of Facebook calls for each iteration of sign out and sign in.

/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook provider sign-in succeeded.
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =
/FacebookSignInProvider: Facebook provider signing out...
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook provider sign-in succeeded.
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode = -
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode = -
/FacebookSignInProvider: Facebook provider signing out...
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook provider sign-in succeeded.
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =
/FacebookSignInProvider: Facebook provider signing out...
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook SDK initialization completed
/FacebookSignInProvider: Facebook provider sign-in succeeded.
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =
/FacebookSignInProvider: Facebook Access Token is OK. Token hashcode =

From AWSMobileClient.java in context.

if (isConfigurationKeyPresent(USER_POOLS)) {
                        authUIConfigBuilder.userPools(true);
                        identityManager.addSignInProvider(CognitoUserPoolsSignInProvider.class); **HERE**
                    }

                    if (isConfigurationKeyPresent(FACEBOOK)) {
                        authUIConfigBuilder.signInButton(FacebookButton.class);
                        identityManager.addSignInProvider(FacebookSignInProvider.class);  **HERE**! 
                    }

                    if (isConfigurationKeyPresent(GOOGLE)) {
                        authUIConfigBuilder.signInButton(GoogleButton.class);
                        identityManager.addSignInProvider(GoogleSignInProvider.class); **HERE** ! 
                    }
private Runnable _showSignIn(final Activity callingActivity,
                                 final SignInUIOptions signInUIOptions,
                                 final Callback<UserStateDetails> callback) {

        return new Runnable() {
            @Override
            public void run() {
                synchronized (showSignInLockObject) {
                    UserState userState = getUserStateDetails(false).getUserState();
                    if (UserState.SIGNED_IN.equals(userState)) {
                        callback.onError(new RuntimeException("Called showSignIn while user is already signed-in"));
                        return;
                    }

                    final AuthUIConfiguration.Builder authUIConfigBuilder = new AuthUIConfiguration.Builder()
                            .canCancel(signInUIOptions.canCancel())
                            .isBackgroundColorFullScreen(false);

                    if (signInUIOptions.getLogo() != null) {
                        authUIConfigBuilder.logoResId(signInUIOptions.getLogo());
                    }
                    if (signInUIOptions.getBackgroundColor() != null) {
                        authUIConfigBuilder.backgroundColor(signInUIOptions.getBackgroundColor());
                    }

                    final IdentityManager identityManager = IdentityManager.getDefaultIdentityManager();

                    if (isConfigurationKeyPresent(USER_POOLS)) {
                        authUIConfigBuilder.userPools(true);
                        identityManager.addSignInProvider(CognitoUserPoolsSignInProvider.class);
                    }

                    if (isConfigurationKeyPresent(FACEBOOK)) {
                        authUIConfigBuilder.signInButton(FacebookButton.class);
                        identityManager.addSignInProvider(FacebookSignInProvider.class);
                    }

                    if (isConfigurationKeyPresent(GOOGLE)) {
                        authUIConfigBuilder.signInButton(GoogleButton.class);
                        identityManager.addSignInProvider(GoogleSignInProvider.class);
                    }

                    Class<? extends Activity> nextActivityClass =
                            signInUIOptions.nextActivity() == null ?
                                callingActivity.getClass() : signInUIOptions.nextActivity();
                    SignInUI signin = (SignInUI) getClient(mContext, SignInUI.class);
                    signin.login(callingActivity, nextActivityClass)
                            .authUIConfiguration(authUIConfigBuilder.build())
                            .enableFederation(false)
                            .execute();

                    showSignInWaitLatch = new CountDownLatch(1);
                    try {
                        showSignInWaitLatch.await();
                        Log.d(TAG, "run: showSignIn completed");
                    } catch (InterruptedException e) {
                        callback.onError(e);
                    }
                }
            }
        };
    }

Which AWS service(s) are affected?
AWSMobileClient

Expected behavior
Clear the list prior to adding them or just only add them the first time.

Screenshots
N/A

Environment Information (please complete the following information):

  • AWS Android SDK Version: Any
  • Device: [e.g. Pixel XL, Simulator] Any
  • Android Version: Any
  • Specific to simulators: No

Metadata

Metadata

Labels

cognitoIssues with the AWS Android SDK for Cognitofeature-requestRequest a new featuremobile clientIssues with AWS Mobile's client-side Cognito wrapperpending-releaseCode has been merged but pending release

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions