diff --git a/auth/src/main/AndroidManifest.xml b/auth/src/main/AndroidManifest.xml index ff27ea34f..64ed09baf 100644 --- a/auth/src/main/AndroidManifest.xml +++ b/auth/src/main/AndroidManifest.xml @@ -34,10 +34,6 @@ android:name="com.firebase.ui.auth.ui.email.SignInActivity" android:label="@string/title_sign_in_activity" android:theme="@style/FirebaseUI" /> - delete(@NonNull Activity activity) { CredentialsApiHelper credentialHelper = CredentialsApiHelper.getInstance(gacHelper); // Get all SmartLock credentials associated with the user - List credentials = SmartlockUtil.credentialsFromFirebaseUser(firebaseUser); + List credentials = SmartLockUtil.credentialsFromFirebaseUser(firebaseUser); // For each Credential in the list, create a task to delete it. List> credentialTasks = new ArrayList<>(); diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java index 7d2c8eeb5..4fb0ba640 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java @@ -16,8 +16,9 @@ import android.content.Intent; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; -public class AppCompatBase extends android.support.v7.app.AppCompatActivity { +public class AppCompatBase extends AppCompatActivity { protected ActivityHelper mActivityHelper; @Override @@ -36,5 +37,4 @@ protected void onDestroy() { public void finish(int resultCode, Intent intent) { mActivityHelper.finish(resultCode, intent); } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java index 54cbad225..98d46f8a3 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/ChooseAccountActivity.java @@ -141,7 +141,6 @@ private boolean hasNetworkConnection() { public void onCredentialsApiConnected( CredentialsAPI credentialsApi, ActivityHelper activityHelper) { - String email = credentialsApi.getEmailFromCredential(); String password = credentialsApi.getPasswordFromCredential(); String accountType = credentialsApi.getAccountTypeFromCredential(); @@ -249,7 +248,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { finish(resultCode, new Intent()); } break; - } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java index 3d07f231a..b3179d066 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/account_link/WelcomeBackPasswordPrompt.java @@ -38,7 +38,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.PasswordToggler; import com.firebase.ui.auth.ui.email.RecoverPasswordActivity; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthCredential; @@ -50,8 +50,6 @@ * the password before initiating a link. */ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnClickListener { - - private static final int RC_CREDENTIAL_SAVE = 3; private static final String TAG = "WelcomeBackPassword"; private static final StyleSpan BOLD = new StyleSpan(Typeface.BOLD); @@ -107,14 +105,6 @@ public void onClick(View view) { } } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_CREDENTIAL_SAVE) { - finish(RESULT_OK, new Intent()); - } - } - private void next(String email, final String password) { final FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth(); @@ -148,14 +138,15 @@ public void onSuccess(AuthResult authResult) { new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - mActivityHelper.dismissDialog(); - SmartlockUtil.saveCredentialOrFinish( - WelcomeBackPasswordPrompt.this, - RC_CREDENTIAL_SAVE, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */); + SmartLock + .getInstance(WelcomeBackPasswordPrompt.this, + TAG) + .saveCredentialsOrFinish( + WelcomeBackPasswordPrompt.this, + mActivityHelper, + authResult.getUser(), + password, + null /* provider */); } }); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java index 40041a2a6..0974c1c91 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/RegisterEmailActivity.java @@ -39,7 +39,7 @@ import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.PasswordFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -56,8 +56,6 @@ * Activity displaying a form to create a new email/password account. */ public class RegisterEmailActivity extends AppCompatBase implements View.OnClickListener { - - private static final int RC_SAVE_CREDENTIAL = 3; private static final String TAG = "RegisterEmailActivity"; private EditText mEmailEditText; @@ -97,10 +95,8 @@ protected void onCreate(Bundle savedInstanceState) { mPasswordFieldValidator = new PasswordFieldValidator((TextInputLayout) findViewById(R.id.password_layout), getResources().getInteger(R.integer.min_password_length)); - mNameValidator = new RequiredFieldValidator((TextInputLayout) - findViewById(R.id.name_layout)); - mEmailFieldValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id - .email_layout)); + mNameValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id.name_layout)); + mEmailFieldValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id.email_layout)); if (email != null) { mEmailEditText.setText(email); @@ -155,18 +151,15 @@ public void onSuccess(AuthResult authResult) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - mActivityHelper.dismissDialog(); - // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - SmartlockUtil.saveCredentialOrFinish( - RegisterEmailActivity.this, - RC_SAVE_CREDENTIAL, - mActivityHelper.getFlowParams(), - firebaseUser, - password, - null /* provider */); + SmartLock.getInstance(RegisterEmailActivity.this, TAG) + .saveCredentialsOrFinish(RegisterEmailActivity.this, + mActivityHelper, + firebaseUser, + password, + null /* provider */); } }); } @@ -199,14 +192,6 @@ public void onFailure(@NonNull Exception e) { }); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_SAVE_CREDENTIAL) { - finish(RESULT_OK, new Intent()); - } - } - @Override public void onClick(View view) { if (view.getId() == R.id.button_create) { diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java index 9663c1ea4..7d091eac7 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/SignInActivity.java @@ -34,7 +34,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.field_validators.EmailFieldValidator; import com.firebase.ui.auth.ui.email.field_validators.RequiredFieldValidator; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.AuthResult; @@ -44,7 +44,6 @@ */ public class SignInActivity extends AppCompatBase implements View.OnClickListener { private static final String TAG = "SignInActivity"; - private static final int RC_CREDENTIAL_SAVE = 101; private EditText mEmailEditText; private EditText mPasswordEditText; @@ -67,7 +66,8 @@ protected void onCreate(Bundle savedInstanceState) { getResources().getValue(R.dimen.slightly_visible_icon, slightlyVisibleIcon, true); mPasswordEditText = (EditText) findViewById(R.id.password); - ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled(false); + ((TextInputLayout) findViewById(R.id.password_layout)).setPasswordVisibilityToggleEnabled( + false); ImageView togglePasswordImage = (ImageView) findViewById(R.id.toggle_visibility); mPasswordEditText.setOnFocusChangeListener(new ImageFocusTransparencyChanger( @@ -77,24 +77,16 @@ protected void onCreate(Bundle savedInstanceState) { togglePasswordImage.setOnClickListener(new PasswordToggler(mPasswordEditText)); - mEmailValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id - .email_layout)); - mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id - .password_layout)); + mEmailValidator = new EmailFieldValidator((TextInputLayout) findViewById(R.id.email_layout)); + mPasswordValidator = new RequiredFieldValidator((TextInputLayout) findViewById(R.id.password_layout)); Button signInButton = (Button) findViewById(R.id.button_done); - TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); + TextView recoveryButton = (TextView) findViewById(R.id.trouble_signing_in); if (email != null) { mEmailEditText.setText(email); } signInButton.setOnClickListener(this); recoveryButton.setOnClickListener(this); - - } - - @Override - public void onBackPressed () { - super.onBackPressed(); } private void signIn(String email, final String password) { @@ -105,16 +97,13 @@ private void signIn(String email, final String password) { .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - mActivityHelper.dismissDialog(); - // Save credential in SmartLock (if enabled) - SmartlockUtil.saveCredentialOrFinish( - SignInActivity.this, - RC_CREDENTIAL_SAVE, - mActivityHelper.getFlowParams(), - authResult.getUser(), - password, - null /* provider */); + SmartLock.getInstance(SignInActivity.this, TAG) + .saveCredentialsOrFinish(SignInActivity.this, + mActivityHelper, + authResult.getUser(), + password, + null /* provider */); } }) .addOnFailureListener(new OnFailureListener() { @@ -131,32 +120,20 @@ public void onFailure(@NonNull Exception e) { }); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == RC_CREDENTIAL_SAVE) { - finish(RESULT_OK, new Intent()); - } - } - @Override public void onClick(View view) { if (view.getId() == R.id.button_done) { boolean emailValid = mEmailValidator.validate(mEmailEditText.getText()); boolean passwordValid = mPasswordValidator.validate(mPasswordEditText.getText()); - if (!emailValid || !passwordValid) { - return; - } else { + if (emailValid && passwordValid) { mActivityHelper.showLoadingDialog(R.string.progress_dialog_signing_in); signIn(mEmailEditText.getText().toString(), mPasswordEditText.getText().toString()); - return; } } else if (view.getId() == R.id.trouble_signing_in) { startActivity(RecoverPasswordActivity.createIntent( this, mActivityHelper.getFlowParams(), mEmailEditText.getText().toString())); - return; } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java index d53a69c66..ca746e5e5 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivity.java @@ -37,6 +37,7 @@ import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.EmailFlowUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.FacebookAuthProvider; import com.google.firebase.auth.FirebaseAuth; @@ -56,14 +57,11 @@ * Authentication picker activity rendered with all authentication options and default settings */ -public class AuthMethodPickerActivity - extends IDPBaseActivity +public class AuthMethodPickerActivity extends IDPBaseActivity implements IdpCallback, View.OnClickListener { - + private static final String TAG = "AuthMethodPicker"; private static final int RC_EMAIL_FLOW = 2; private static final int RC_ACCOUNT_LINK = 3; - private static final int RC_SAVE_CREDENTIAL = 4; - private static final String TAG = "AuthMethodPicker"; private ArrayList mIdpProviders; @Override @@ -88,7 +86,7 @@ private void populateIdpList(List providers) { mIdpProviders = new ArrayList<>(); for (IdpConfig idpConfig : providers) { switch (idpConfig.getProviderId()) { - case AuthUI.FACEBOOK_PROVIDER : + case AuthUI.FACEBOOK_PROVIDER: mIdpProviders.add(new FacebookProvider(this, idpConfig)); break; case AuthUI.GOOGLE_PROVIDER: @@ -109,7 +107,7 @@ private void populateIdpList(List providers) { } LinearLayout btnHolder = (LinearLayout) findViewById(R.id.btn_holder); - for (final IdpProvider provider: mIdpProviders) { + for (final IdpProvider provider : mIdpProviders) { View loginButton = null; switch (provider.getProviderId()) { case GoogleAuthProvider.PROVIDER_ID: @@ -148,8 +146,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { finish(RESULT_OK, data); } - } else if (requestCode == RC_SAVE_CREDENTIAL) { - finish(RESULT_OK, data); } else if (requestCode == RC_ACCOUNT_LINK) { finish(resultCode, data); } else { @@ -171,8 +167,8 @@ public void onSuccess(final IdpResponse response) { .addOnCompleteListener(new CredentialSignInHandler( AuthMethodPickerActivity.this, mActivityHelper, + SmartLock.getInstance(AuthMethodPickerActivity.this, TAG), RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIAL, response)); } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java index 3de29302a..e5a8da173 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandler.java @@ -14,16 +14,16 @@ package com.firebase.ui.auth.ui.idp; -import android.app.Activity; import android.support.annotation.NonNull; import android.util.Log; import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; import com.firebase.ui.auth.ui.TaskFailureLogger; import com.firebase.ui.auth.ui.account_link.WelcomeBackIdpPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; -import com.firebase.ui.auth.util.SmartlockUtil; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -37,28 +37,36 @@ public class CredentialSignInHandler implements OnCompleteListener { private final static String TAG = "CredentialSignInHandler"; - private int mAccountLinkResultCode; - private int mSaveCredentialsResultCode; - private Activity mActivity; + + private AppCompatBase mActivity; private ActivityHelper mActivityHelper; + private SmartLock mSmartLock; private IdpResponse mResponse; + private int mAccountLinkResultCode; public CredentialSignInHandler( - Activity activity, + AppCompatBase activity, ActivityHelper activityHelper, + SmartLock smartLock, int accountLinkResultCode, - int saveCredentialsResultCode, IdpResponse response) { mActivity = activity; - mAccountLinkResultCode = accountLinkResultCode; - mSaveCredentialsResultCode = saveCredentialsResultCode; mActivityHelper = activityHelper; + mSmartLock = smartLock; mResponse = response; + mAccountLinkResultCode = accountLinkResultCode; } @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + FirebaseUser firebaseUser = task.getResult().getUser(); + mSmartLock.saveCredentialsOrFinish(mActivity, + mActivityHelper, + firebaseUser, + null /* password */, + mResponse.getProviderType()); + } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); FirebaseAuth firebaseAuth = mActivityHelper.getFirebaseAuth(); @@ -77,15 +85,8 @@ public void onFailure(@NonNull Exception e) { } else { mActivityHelper.dismissDialog(); Log.e(TAG, "Unexpected exception when signing in with credential", - task.getException()); + task.getException()); } - } else { - mActivityHelper.dismissDialog(); - - FirebaseUser firebaseUser = task.getResult().getUser(); - SmartlockUtil.saveCredentialOrFinish(mActivity, mSaveCredentialsResultCode, - mActivityHelper.getFlowParams(), firebaseUser, - null /* password */, mResponse); } } @@ -109,7 +110,6 @@ public void onSuccess(@NonNull ProviderQueryResult result) { mActivityHelper.getFlowParams(), mResponse ), mAccountLinkResultCode); - } else { // Start IDP welcome back flow mActivity.startActivityForResult( @@ -123,5 +123,4 @@ public void onSuccess(@NonNull ProviderQueryResult result) { } } } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java index dcfc87ae1..fee155e1d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IDPBaseActivity.java @@ -38,5 +38,4 @@ protected AuthCredential createCredential(IdpResponse idpSignInResponse) { } return null; } - } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IdpSignInContainerActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IdpSignInContainerActivity.java index 32225191c..a6c5bffa6 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/idp/IdpSignInContainerActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/idp/IdpSignInContainerActivity.java @@ -28,6 +28,7 @@ import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.TaskFailureLogger; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; @@ -39,14 +40,15 @@ public class IdpSignInContainerActivity extends IDPBaseActivity implements IdpCallback { private static final String TAG = "IDPSignInContainer"; private static final int RC_WELCOME_BACK_IDP = 4; - private static final int RC_SAVE_CREDENTIALS = 5; - private IdpProvider mIDPProvider; + + private IdpProvider mIdpProvider; private String mProvider; private String mEmail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mProvider = getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER); mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); IdpConfig providerConfig = null; @@ -62,14 +64,14 @@ protected void onCreate(Bundle savedInstanceState) { return; } if (mProvider.equalsIgnoreCase(FacebookAuthProvider.PROVIDER_ID)) { - mIDPProvider = new FacebookProvider(this, providerConfig); + mIdpProvider = new FacebookProvider(this, providerConfig); } else if (mProvider.equalsIgnoreCase(GoogleAuthProvider.PROVIDER_ID)) { - mIDPProvider = new GoogleProvider(this, providerConfig, mEmail); + mIdpProvider = new GoogleProvider(this, providerConfig, mEmail); } else if (mProvider.equalsIgnoreCase(TwitterAuthProvider.PROVIDER_ID)) { - mIDPProvider = new TwitterProvider(this); + mIdpProvider = new TwitterProvider(this); } - mIDPProvider.setAuthenticationCallback(this); - mIDPProvider.startLogin(this); + mIdpProvider.setAuthenticationCallback(this); + mIdpProvider.startLogin(this); } @Override @@ -85,8 +87,8 @@ public void onSuccess(final IdpResponse response) { .addOnCompleteListener(new CredentialSignInHandler( IdpSignInContainerActivity.this, mActivityHelper, + SmartLock.getInstance(IdpSignInContainerActivity.this, TAG), RC_WELCOME_BACK_IDP, - RC_SAVE_CREDENTIALS, response)); } @@ -100,10 +102,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_WELCOME_BACK_IDP) { finish(resultCode, data); - } else if (requestCode == RC_SAVE_CREDENTIALS) { - finish(RESULT_OK, data); } else { - mIDPProvider.onActivityResult(requestCode, resultCode, data); + mIdpProvider.onActivityResult(requestCode, resultCode, data); } } diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java similarity index 50% rename from auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java rename to auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 01c8f9e7b..864e2928f 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/account_link/SaveCredentialsActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -12,26 +12,23 @@ * limitations under the License. */ -package com.firebase.ui.auth.ui.account_link; +package com.firebase.ui.auth.util; import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.util.Log; import com.firebase.ui.auth.BuildConfig; -import com.firebase.ui.auth.R; -import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.util.FirebaseAuthWrapperFactory; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.IdentityProviders; @@ -45,84 +42,70 @@ import com.google.firebase.auth.GoogleAuthProvider; import com.google.firebase.auth.TwitterAuthProvider; -public class SaveCredentialsActivity extends AppCompatBase - implements GoogleApiClient.ConnectionCallbacks, ResultCallback, - GoogleApiClient.OnConnectionFailedListener { +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_FIRST_USER; +import static android.app.Activity.RESULT_OK; + +public class SmartLock extends Fragment + implements GoogleApiClient.ConnectionCallbacks, + GoogleApiClient.OnConnectionFailedListener, + ResultCallback { private static final String TAG = "CredentialsSaveBase"; private static final int RC_SAVE = 100; private static final int RC_UPDATE_SERVICE = 28; + private AppCompatBase mActivity; + private ActivityHelper mActivityHelper; private String mName; private String mEmail; private String mPassword; - private IdpResponse mIdpResponse; + private String mProvider; private String mProfilePictureUri; private GoogleApiClient mCredentialsApiClient; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.save_credentials_layout); - - if (!FirebaseAuthWrapperFactory.getFirebaseAuthWrapper(mActivityHelper.getAppName()) - .isPlayServicesAvailable(this)) { - finish(RESULT_FIRST_USER, getIntent()); - return; - } - - mName = getIntent().getStringExtra(ExtraConstants.EXTRA_NAME); - mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); - mPassword = getIntent().getStringExtra(ExtraConstants.EXTRA_PASSWORD); - mIdpResponse = getIntent().getParcelableExtra(ExtraConstants.EXTRA_IDP_RESPONSE); - mProfilePictureUri = getIntent() - .getStringExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI); - - mCredentialsApiClient = new GoogleApiClient.Builder(this) - .addConnectionCallbacks(this) - .addOnConnectionFailedListener(this) - .addApi(Auth.CREDENTIALS_API) - .enableAutoManage(this, this) - .build(); - } - @Override public void onConnected(@Nullable Bundle bundle) { if (mEmail == null) { Log.e(TAG, "Unable to save null credential!"); - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_CANCELED); return; } + Credential.Builder builder = new Credential.Builder(mEmail); builder.setPassword(mPassword); if (mPassword == null) { // only password OR provider can be set, not both - String provider = mIdpResponse.getProviderType(); - if (provider != null) { + if (mProvider != null) { String translatedProvider = null; // translate the google.com/facebook.com provider strings into full URIs - if (provider.equals(GoogleAuthProvider.PROVIDER_ID)) { - translatedProvider = IdentityProviders.GOOGLE; - } else if (provider.equals(FacebookAuthProvider.PROVIDER_ID)) { - translatedProvider = IdentityProviders.FACEBOOK; - } else if (provider.equals(TwitterAuthProvider.PROVIDER_ID)) { - translatedProvider = IdentityProviders.TWITTER; + switch (mProvider) { + case GoogleAuthProvider.PROVIDER_ID: + translatedProvider = IdentityProviders.GOOGLE; + break; + case FacebookAuthProvider.PROVIDER_ID: + translatedProvider = IdentityProviders.FACEBOOK; + break; + case TwitterAuthProvider.PROVIDER_ID: + translatedProvider = IdentityProviders.TWITTER; + break; + default: + Log.e(TAG, "Unable to save null credential!"); + finish(RESULT_CANCELED); + return; } - if (translatedProvider != null) { - builder.setAccountType(translatedProvider); - } else { - Log.e(TAG, "Unable to save null credential!"); - finish(RESULT_FIRST_USER, getIntent()); - return; - } + builder.setAccountType(translatedProvider); } } + if (mName != null) { builder.setName(mName); } + if (mProfilePictureUri != null) { builder.setProfilePictureUri(Uri.parse(mProfilePictureUri)); } + mActivityHelper.getCredentialsApi() .save(mCredentialsApiClient, builder.build()) .setResultCallback(this); @@ -135,7 +118,6 @@ public void onConnectionSuspended(int i) { } } - @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { if (BuildConfig.DEBUG) { @@ -143,13 +125,22 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + " and code: " + connectionResult.getErrorCode()); } PendingIntent resolution = - GoogleApiAvailability.getInstance().getErrorResolutionPendingIntent(this, - connectionResult.getErrorCode(), RC_UPDATE_SERVICE); + GoogleApiAvailability + .getInstance() + .getErrorResolutionPendingIntent(mActivity, + connectionResult.getErrorCode(), + RC_UPDATE_SERVICE); try { - startIntentSenderForResult(resolution.getIntentSender(), RC_UPDATE_SERVICE, null, 0, 0, 0); + startIntentSenderForResult(resolution.getIntentSender(), + RC_UPDATE_SERVICE, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_CANCELED); } } @@ -157,20 +148,26 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { @Override public void onResult(@NonNull Status status) { if (status.isSuccess()) { - finish(RESULT_OK, getIntent()); + finish(RESULT_OK); } else { if (status.hasResolution()) { // Try to resolve the save request. This will prompt the user if // the credential is new. try { - status.startResolutionForResult(this, RC_SAVE); + startIntentSenderForResult(status.getResolution().getIntentSender(), + RC_SAVE, + null, + 0, + 0, + 0, + null); } catch (IntentSender.SendIntentException e) { // Could not resolve the request Log.e(TAG, "STATUS: Failed to send resolution.", e); - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_CANCELED); } } else { - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_CANCELED); } } } @@ -178,42 +175,99 @@ public void onResult(@NonNull Status status) { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + if (requestCode == RC_SAVE) { if (resultCode == RESULT_OK) { if (BuildConfig.DEBUG) { Log.d(TAG, "SAVE: OK"); } - finish(RESULT_OK, getIntent()); + finish(RESULT_OK); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_FIRST_USER); } } else if (requestCode == RC_UPDATE_SERVICE) { if (resultCode == RESULT_OK) { - Credential credential = new Credential.Builder(mEmail).setPassword(mPassword).build(); + Credential credential = new Credential.Builder(mEmail).setPassword(mPassword) + .build(); mActivityHelper.getCredentialsApi() .save(mCredentialsApiClient, credential) .setResultCallback(this); } else { Log.e(TAG, "SAVE: Canceled by user"); - finish(RESULT_FIRST_USER, getIntent()); + finish(RESULT_FIRST_USER); } } } - public static Intent createIntent( - Context context, - FlowParameters flowParams, - FirebaseUser user, - @Nullable String password, - @Nullable IdpResponse idpResponse) { - - String photoUrl = user.getPhotoUrl() != null ? user.getPhotoUrl().toString() : null; - return ActivityHelper.createBaseIntent(context, SaveCredentialsActivity.class, flowParams) - .putExtra(ExtraConstants.EXTRA_NAME, user.getDisplayName()) - .putExtra(ExtraConstants.EXTRA_EMAIL, user.getEmail()) - .putExtra(ExtraConstants.EXTRA_PASSWORD, password) - .putExtra(ExtraConstants.EXTRA_IDP_RESPONSE, idpResponse) - .putExtra(ExtraConstants.EXTRA_PROFILE_PICTURE_URI, photoUrl); + private void finish(int resultCode) { + mActivity.finish(RESULT_OK, mActivity.getIntent()); + } + + /** + * If SmartLock is enabled and Google Play Services is available, save the credentials. + * Otherwise, finish the calling Activity with RESULT_OK. + * + * @param activity the calling Activity. + * @param firebaseUser Firebase user to save in Credential. + * @param password (optional) password for email credential. + * @param provider (optional) provider string for provider credential. + */ + public void saveCredentialsOrFinish(AppCompatBase activity, + ActivityHelper helper, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable String provider) { + mActivity = activity; + mActivityHelper = helper; + mName = firebaseUser.getDisplayName(); + mEmail = firebaseUser.getEmail(); + mPassword = password; + mProvider = provider; + mProfilePictureUri = firebaseUser.getPhotoUrl() != null ? firebaseUser.getPhotoUrl() + .toString() : null; + + // If SmartLock is disabled, finish the Activity + if (!helper.getFlowParams().smartLockEnabled) { + finish(RESULT_CANCELED); + return; + } + + // If Play Services is not available, finish the Activity + if (!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { + finish(RESULT_CANCELED); + return; + } + + if (!FirebaseAuthWrapperFactory + .getFirebaseAuthWrapper(helper.getFlowParams().appName) + .isPlayServicesAvailable(activity)) { + finish(RESULT_CANCELED); + return; + } + + mCredentialsApiClient = new GoogleApiClient.Builder(activity) + .addConnectionCallbacks(this) + .addOnConnectionFailedListener(this) + .addApi(Auth.CREDENTIALS_API) + .enableAutoManage(activity, this) + .build(); + } + + public static SmartLock getInstance(AppCompatBase activity, String tag) { + SmartLock result; + + FragmentManager fm = activity.getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + + Fragment fragment = fm.findFragmentByTag(tag); + if (fragment == null || !(fragment instanceof SmartLock)) { + result = new SmartLock(); + ft.add(result, tag).disallowAddToBackStack().commit(); + } else { + result = (SmartLock) fragment; + } + + return result; } } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLockUtil.java similarity index 55% rename from auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java rename to auth/src/main/java/com/firebase/ui/auth/util/SmartLockUtil.java index 78eb55677..4fd61de00 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartlockUtil.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLockUtil.java @@ -1,16 +1,9 @@ package com.firebase.ui.auth.util; -import android.app.Activity; -import android.content.Intent; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.text.TextUtils; import android.util.Log; -import com.firebase.ui.auth.IdpResponse; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; import com.google.android.gms.auth.api.credentials.Credential; import com.google.android.gms.auth.api.credentials.IdentityProviders; import com.google.firebase.auth.EmailAuthProvider; @@ -27,45 +20,9 @@ /** * Helper class to deal with Smartlock Flows. */ -public class SmartlockUtil { - +public class SmartLockUtil { private static final String TAG = "SmartLockUtil"; - /** - * If SmartLock is enabled and Google Play Services is available, start the save credential - * Activity. Otherwise, finish the calling Activity with RESULT_OK. - * @param activity the calling Activity. - * @param requestCode request code to use when starting the save operation. - * @param parameters calling Activity flow parameters. - * @param firebaseUser Firebase user to save in Credential. - * @param password (optional) password for email credential. - * @param idpResponse (optional) response from signing in with a credential. - */ - public static void saveCredentialOrFinish(Activity activity, - int requestCode, - FlowParameters parameters, - FirebaseUser firebaseUser, - @Nullable String password, - @Nullable IdpResponse idpResponse) { - - // If SmartLock is disabled, finish the Activity - if (!parameters.smartLockEnabled) { - finishActivity(activity, idpResponse); - return; - } - - // If Play Services is not available, finish the Activity - if(!PlayServicesHelper.getInstance(activity).isPlayServicesAvailable()) { - finishActivity(activity, idpResponse); - return; - } - - // Launch save activity - Intent saveCredentialIntent = SaveCredentialsActivity.createIntent(activity, parameters, - firebaseUser, password, idpResponse); - activity.startActivityForResult(saveCredentialIntent, requestCode); - } - /** * Translate a Firebase Auth provider ID (such as {@link GoogleAuthProvider#PROVIDER_ID}) to * a Credentials API account type (such as {@link IdentityProviders#GOOGLE}). @@ -119,12 +76,4 @@ public static List credentialsFromFirebaseUser(@NonNull FirebaseUser return credentials; } - - private static void finishActivity(Activity activity, IdpResponse idpResponse) { - activity.setResult( - Activity.RESULT_OK, - new Intent().putExtra(ExtraConstants.EXTRA_IDP_RESPONSE, idpResponse)); - activity.finish(); - } - } diff --git a/auth/src/main/res/values/styles.xml b/auth/src/main/res/values/styles.xml index f46b9d0e4..4f0a8e8cd 100644 --- a/auth/src/main/res/values/styles.xml +++ b/auth/src/main/res/values/styles.xml @@ -251,12 +251,4 @@ @drawable/idp_button_background_twitter @color/tw__solid_white - - diff --git a/auth/src/test/java/com/firebase/ui/auth/test_helpers/SmartLockResult.java b/auth/src/test/java/com/firebase/ui/auth/test_helpers/SmartLockResult.java new file mode 100644 index 000000000..23474721f --- /dev/null +++ b/auth/src/test/java/com/firebase/ui/auth/test_helpers/SmartLockResult.java @@ -0,0 +1,56 @@ +package com.firebase.ui.auth.test_helpers; + +import android.support.annotation.Nullable; +import android.support.v4.app.FragmentActivity; + +import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; +import com.firebase.ui.auth.util.SmartLock; +import com.google.firebase.auth.FirebaseUser; + +import java.util.concurrent.CountDownLatch; + +import static org.junit.Assert.assertEquals; + +public class SmartLockResult extends SmartLock { + private CountDownLatch mCountDownLatch; + private String mPassword; + private String mProvider; + + public void await() throws InterruptedException { + mCountDownLatch.await(); + } + + @Override + public void saveCredentialsOrFinish(AppCompatBase activity, + ActivityHelper helper, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable String provider) { + assertEquals(firebaseUser.getEmail(), TestConstants.EMAIL); + assertEquals(firebaseUser.getDisplayName(), TestConstants.NAME); + assertEquals(firebaseUser.getPhotoUrl() != null + ? firebaseUser.getPhotoUrl().toString() : null, TestConstants.PHOTO_URL); + assertEquals(password, mPassword); + assertEquals(provider, mProvider); + mCountDownLatch.countDown(); + } + + public static SmartLockResult newInstance(FragmentActivity activity, + String tag, + String password, + String provider) { + SmartLockResult result = new SmartLockResult(); + + result.mCountDownLatch = new CountDownLatch(1); + result.mPassword = password; + result.mProvider = provider; + + activity.getSupportFragmentManager() + .beginTransaction() + .add(result, tag) + .commit(); + + return result; + } +} diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java index a5a622400..ba066e7b5 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java @@ -27,10 +27,9 @@ import com.firebase.ui.auth.test_helpers.CustomRobolectricGradleTestRunner; import com.firebase.ui.auth.test_helpers.FakeAuthResult; import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; +import com.firebase.ui.auth.test_helpers.SmartLockResult; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseUser; @@ -42,14 +41,12 @@ import org.mockito.Mockito; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowActivity; import java.util.Arrays; +import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.when; @@ -110,40 +107,30 @@ public void testSignUpButton_successfulRegistrationShouldContinueToSaveCredentia FirebaseUser mockFirebaseUser = Mockito.mock(FirebaseUser.class); when(mockFirebaseUser.getEmail()).thenReturn(TestConstants.EMAIL); when(mockFirebaseUser.getDisplayName()).thenReturn(TestConstants.NAME); - when(mockFirebaseUser.updateProfile((UserProfileChangeRequest) Mockito.anyObject())) + when(mockFirebaseUser.getPhotoUrl()).thenReturn(TestConstants.PHOTO_URI); + when(mockFirebaseUser.updateProfile((UserProfileChangeRequest) Mockito.any())) .thenReturn(new AutoCompleteTask(null, true, null)); when(ActivityHelperShadow.firebaseAuth - .createUserWithEmailAndPassword( - TestConstants.EMAIL, - TestConstants.PASSWORD)) - .thenReturn( - new AutoCompleteTask( - new FakeAuthResult(mockFirebaseUser), - true, - null)); - + .createUserWithEmailAndPassword( + TestConstants.EMAIL, + TestConstants.PASSWORD)) + .thenReturn(new AutoCompleteTask(new FakeAuthResult(mockFirebaseUser), + true, + null)); + + SmartLockResult result = SmartLockResult.newInstance(registerEmailActivity, + "RegisterEmailActivity", + TestConstants.PASSWORD, + null); Button button = (Button) registerEmailActivity.findViewById(R.id.button_create); button.performClick(); - ShadowActivity shadowActivity = Shadows.shadowOf(registerEmailActivity); - - ShadowActivity.IntentForResult nextIntent = - shadowActivity.getNextStartedActivityForResult(); - - assertNotNull(nextIntent); - assertEquals( - SaveCredentialsActivity.class.getName(), - nextIntent.intent.getComponent().getClassName()); - assertEquals( - TestConstants.EMAIL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); - assertEquals( - TestConstants.PASSWORD, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); - assertEquals( - TestConstants.NAME, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME)); + try { + result.await(); + } catch (InterruptedException e) { + assertTrue("Interrupted waiting for result", false); + } } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java index bd3802cd4..dc547aae5 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/SignInActivityTest.java @@ -26,10 +26,9 @@ import com.firebase.ui.auth.test_helpers.CustomRobolectricGradleTestRunner; import com.firebase.ui.auth.test_helpers.FakeAuthResult; import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; +import com.firebase.ui.auth.test_helpers.SmartLockResult; import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseUser; @@ -45,6 +44,7 @@ import java.util.Collections; +import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; @@ -54,7 +54,6 @@ @RunWith(CustomRobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 23) public class SignInActivityTest { - @Before public void setUp() { TestHelper.initializeApp(RuntimeEnvironment.application); @@ -67,9 +66,12 @@ private SignInActivity createActivity() { TestHelper.getFlowParameters( Collections.emptyList()), null); - return Robolectric.buildActivity(SignInActivity.class).withIntent(startIntent) - .create().visible().get(); - + return Robolectric + .buildActivity(SignInActivity.class) + .withIntent(startIntent) + .create() + .visible() + .get(); } @Test @@ -112,6 +114,12 @@ public void testSignInButton_signsInAndSavesCredentials() { new AutoCompleteTask(new FakeAuthResult(mockFirebaseUser), true, null)); when(mockFirebaseUser.getDisplayName()).thenReturn(TestConstants.NAME); when(mockFirebaseUser.getEmail()).thenReturn(TestConstants.EMAIL); + when(mockFirebaseUser.getPhotoUrl()).thenReturn(TestConstants.PHOTO_URI); + + SmartLockResult result = SmartLockResult.newInstance(signInActivity, + "SignInActivity", + TestConstants.PASSWORD, + null); Button signIn = (Button) signInActivity.findViewById(R.id.button_done); signIn.performClick(); @@ -120,23 +128,10 @@ public void testSignInButton_signsInAndSavesCredentials() { TestConstants.EMAIL, TestConstants.PASSWORD); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(signInActivity).getNextStartedActivityForResult(); - assertEquals( - SaveCredentialsActivity.class.getName(), - nextIntent.intent.getComponent().getClassName() - ); - assertEquals( - TestConstants.EMAIL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL) - ); - assertEquals( - TestConstants.PASSWORD, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD) - ); - assertEquals( - TestConstants.NAME, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME) - ); + try { + result.await(); + } catch (InterruptedException e) { + assertTrue("Interrupted waiting for result", false); + } } } diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java index 185e67106..21b6ba8c1 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java @@ -21,7 +21,6 @@ import com.firebase.ui.auth.AuthUI; import com.firebase.ui.auth.BuildConfig; -import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.R; import com.firebase.ui.auth.test_helpers.ActivityHelperShadow; import com.firebase.ui.auth.test_helpers.AutoCompleteTask; @@ -31,10 +30,8 @@ import com.firebase.ui.auth.test_helpers.FirebaseAuthWrapperImplShadow; import com.firebase.ui.auth.test_helpers.GoogleProviderShadow; import com.firebase.ui.auth.test_helpers.LoginManagerShadow; -import com.firebase.ui.auth.test_helpers.TestConstants; +import com.firebase.ui.auth.test_helpers.SmartLockResult; import com.firebase.ui.auth.test_helpers.TestHelper; -import com.firebase.ui.auth.ui.ExtraConstants; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; import com.google.firebase.auth.AuthCredential; @@ -47,6 +44,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; @@ -59,7 +57,6 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; -import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.when; @RunWith(CustomRobolectricGradleTestRunner.class) @@ -140,18 +137,26 @@ public void testFacebookLoginFlow() { FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(FacebookAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) anyObject())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) .thenReturn(new AutoCompleteTask( new FakeAuthResult(mockFirebaseUser), true, null)); + + SmartLockResult result = SmartLockResult.newInstance(authMethodPickerActivity, + "AuthMethodPicker", + null, + FacebookAuthProvider.PROVIDER_ID); + Button facebookButton = (Button) authMethodPickerActivity.findViewById(R.id.facebook_button); assertNotNull(facebookButton); facebookButton.performClick(); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); - verifySaveCredentialIntent(nextIntent, FacebookAuthProvider.PROVIDER_ID); + try { + result.await(); + } catch (InterruptedException e) { + assertTrue("Interrupted waiting for result", false); + } } @Test @@ -166,18 +171,26 @@ public void testGoogleLoginFlow() { when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(GoogleAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) anyObject())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) .thenReturn(new AutoCompleteTask( new FakeAuthResult(mockFirebaseUser), true, null)); + + SmartLockResult result = SmartLockResult.newInstance(authMethodPickerActivity, + "AuthMethodPicker", + null, + GoogleAuthProvider.PROVIDER_ID); + Button googleButton = (Button) authMethodPickerActivity.findViewById(R.id.google_button); assertNotNull(googleButton); googleButton.performClick(); - ShadowActivity.IntentForResult nextIntent = - Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); - verifySaveCredentialIntent(nextIntent, GoogleAuthProvider.PROVIDER_ID); + try { + result.await(); + } catch (InterruptedException e) { + assertTrue("Interrupted waiting for result", false); + } } @Test @@ -192,7 +205,7 @@ public void testTwitterLoginFlowStarts() { when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(TwitterAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) anyObject())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) .thenReturn(new AutoCompleteTask( new FakeAuthResult(mockFirebaseUser), true, null)); Button twitterButton = @@ -206,33 +219,6 @@ public void testTwitterLoginFlowStarts() { assertTrue(nextIntent.intent.getComponent().getClassName().contains("com.twitter.sdk")); } - - private static void verifySaveCredentialIntent( - ShadowActivity.IntentForResult nextIntent, - String provider) { - assertEquals( - SaveCredentialsActivity.class.getName(), - nextIntent.intent.getComponent().getClassName()); - assertEquals( - TestConstants.EMAIL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); - assertEquals( - TestConstants.NAME, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_NAME)); - assertEquals( - TestConstants.PHOTO_URL, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI)); - assertEquals( - provider, - ((IdpResponse) nextIntent - .intent - .getExtras() - .getParcelable(ExtraConstants.EXTRA_IDP_RESPONSE)).getProviderType()); - assertEquals( - null, - nextIntent.intent.getExtras().getString(ExtraConstants.EXTRA_PASSWORD)); - } - private AuthMethodPickerActivity createActivity(List providers) { Intent startIntent = AuthMethodPickerActivity.createIntent( RuntimeEnvironment.application, diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java index 6e90ae9e9..caa60d443 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java @@ -14,7 +14,6 @@ package com.firebase.ui.auth.ui.idp; -import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -29,13 +28,14 @@ import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; import com.firebase.ui.auth.ui.ExtraConstants; import com.firebase.ui.auth.ui.FlowParameters; -import com.firebase.ui.auth.ui.account_link.SaveCredentialsActivity; import com.firebase.ui.auth.ui.account_link.WelcomeBackIdpPrompt; import com.firebase.ui.auth.ui.account_link.WelcomeBackPasswordPrompt; import com.firebase.ui.auth.util.CredentialsAPI; import com.firebase.ui.auth.util.PlayServicesHelper; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.tasks.Task; import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; @@ -63,16 +63,15 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; - @RunWith(CustomRobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 23, shadows = {ActivityHelperShadow.class}) public class CredentialSignInHandlerTest { private static final int RC_ACCOUNT_LINK = 3; - private static final int RC_SAVE_CREDENTIALS = 4; private static final String LINKING_ERROR = "ERROR_TEST_LINKING"; private static final String LINKING_EXPLANATION = "Test explanation"; - @Mock private CredentialsAPI mCredentialsAPI; + @Mock + private CredentialsAPI mCredentialsAPI; private FirebaseApp mFirebaseApp; @Before @@ -88,23 +87,25 @@ public void setUp() { @Test public void testSignInSucceeded() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); IdpResponse idpResponse = new IdpResponse( GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL); + SmartLock smartLock = mock(SmartLock.class); CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + smartLock, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); // Build basic flow parameters FlowParameters flowParams = AuthUI.getInstance(mFirebaseApp) - .createSignInIntentBuilder().build() + .createSignInIntentBuilder() + .build() .getParcelableExtra(ExtraConstants.EXTRA_FLOW_PARAMS); Task signInTask = Tasks.forResult(new FakeAuthResult(mockFirebaseUser)); @@ -112,29 +113,16 @@ public void testSignInSucceeded() { when(mockActivityHelper.getFlowParams()).thenReturn(flowParams); credentialSignInHandler.onComplete(signInTask); - ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - ArgumentCaptor intCaptor = ArgumentCaptor.forClass(Integer.class); - verify(mockActivity).startActivityForResult(intentCaptor.capture(), intCaptor.capture()); - - Intent capturedIntent = intentCaptor.getValue(); - assertEquals(RC_SAVE_CREDENTIALS, (int) intCaptor.getValue()); - assertEquals( - SaveCredentialsActivity.class.getName(), - capturedIntent.getComponent().getClassName()); - assertEquals( - TestConstants.EMAIL, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_EMAIL)); - assertEquals( - TestConstants.NAME, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_NAME)); - assertEquals( - TestConstants.PHOTO_URL, - capturedIntent.getExtras().getString(ExtraConstants.EXTRA_PROFILE_PICTURE_URI)); + verify(smartLock).saveCredentialsOrFinish(mockActivity, + mockActivityHelper, + mockFirebaseUser, + null, + GoogleAuthProvider.PROVIDER_ID); } @Test public void testSignInFailed_withFacebookAlreadyLinked() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class); IdpResponse idpResponse = new IdpResponse( @@ -143,8 +131,8 @@ public void testSignInFailed_withFacebookAlreadyLinked() { CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + null, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); @@ -180,10 +168,9 @@ public void testSignInFailed_withFacebookAlreadyLinked() { } - @Test public void testSignInFailed_withPasswordAccountAlreadyLinked() { - Activity mockActivity = mock(Activity.class); + AppCompatBase mockActivity = mock(AppCompatBase.class); ActivityHelper mockActivityHelper = mock(ActivityHelper.class); FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class); IdpResponse idpResponse = new IdpResponse( @@ -192,8 +179,8 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler( mockActivity, mockActivityHelper, + null, RC_ACCOUNT_LINK, - RC_SAVE_CREDENTIALS, idpResponse); Context mockContext = mock(Context.class); @@ -225,7 +212,9 @@ public void testSignInFailed_withPasswordAccountAlreadyLinked() { capturedIntent.getComponent().getClassName()); assertEquals( TestConstants.EMAIL, - ((IdpResponse) capturedIntent.getExtras().getParcelable(ExtraConstants - .EXTRA_IDP_RESPONSE)).getEmail()); + ((IdpResponse) capturedIntent + .getExtras() + .getParcelable(ExtraConstants.EXTRA_IDP_RESPONSE)) + .getEmail()); } }