diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/ActivityHelper.java b/auth/src/main/java/com/firebase/ui/auth/ui/ActivityHelper.java index 667c16613..f5f5a47af 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/ActivityHelper.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/ActivityHelper.java @@ -19,14 +19,18 @@ import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import com.firebase.ui.auth.IdpResponse; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.CredentialsApi; import com.google.firebase.FirebaseApp; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; +import static android.app.Activity.RESULT_OK; import static com.firebase.ui.auth.util.Preconditions.checkNotNull; public class ActivityHelper { @@ -106,4 +110,42 @@ public static Intent createBaseIntent( .putExtra(ExtraConstants.EXTRA_FLOW_PARAMS, checkNotNull(flowParams, "flowParams cannot be null")); } + + public SmartLock getSmartLockInstance(AppCompatBase activity, String tag) { + return SmartLock.getInstance(activity, tag); + } + + public void saveCredentialsOrFinish( + @Nullable SmartLock smartLock, + AppCompatBase activity, + FirebaseUser firebaseUser, + @NonNull IdpResponse response) { + saveCredentialsOrFinish(smartLock, activity, firebaseUser, null, response); + } + + public void saveCredentialsOrFinish( + @Nullable SmartLock smartLock, + AppCompatBase activity, + FirebaseUser firebaseUser, + @NonNull String password) { + saveCredentialsOrFinish(smartLock, activity, firebaseUser, password, null); + } + + private void saveCredentialsOrFinish( + @Nullable SmartLock smartLock, + AppCompatBase activity, + FirebaseUser firebaseUser, + @Nullable String password, + @Nullable IdpResponse response) { + if (smartLock == null) { + activity.finish(RESULT_OK, new Intent()); + } else { + smartLock.saveCredentialsOrFinish( + activity, + this, + firebaseUser, + password, + response); + } + } } 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 9eb7457eb..4142c8720 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 @@ -19,6 +19,7 @@ import android.graphics.Typeface; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.text.Spannable; import android.text.SpannableStringBuilder; @@ -28,7 +29,6 @@ import android.widget.EditText; import android.widget.TextView; -import com.firebase.ui.auth.AuthUI; import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.R; import com.firebase.ui.auth.ui.ActivityHelper; @@ -58,12 +58,14 @@ public class WelcomeBackPasswordPrompt extends AppCompatBase implements View.OnC private TextInputLayout mPasswordLayout; private EditText mPasswordField; private IdpResponse mIdpResponse; + @Nullable + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.welcome_back_password_prompt_layout); - + mSmartLock = SmartLock.getInstance(WelcomeBackPasswordPrompt.this, TAG); mPasswordLayout = (TextInputLayout) findViewById(R.id.password_layout); mPasswordField = (EditText) findViewById(R.id.password); @@ -139,15 +141,11 @@ public void onSuccess(AuthResult authResult) { new OnSuccessListener() { @Override public void onSuccess(AuthResult authResult) { - SmartLock - .getInstance(WelcomeBackPasswordPrompt.this, - TAG) - .saveCredentialsOrFinish( - WelcomeBackPasswordPrompt.this, - mActivityHelper, - authResult.getUser(), - password, - null); + mActivityHelper.saveCredentialsOrFinish( + mSmartLock, + WelcomeBackPasswordPrompt.this, + authResult.getUser(), + password); } }); } 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 a0b72af65..c56af9174 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 @@ -19,6 +19,7 @@ import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.support.v4.content.ContextCompat; import android.text.SpannableStringBuilder; @@ -30,8 +31,6 @@ import android.widget.ImageView; import android.widget.TextView; -import com.firebase.ui.auth.AuthUI; -import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.R; import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; @@ -66,12 +65,16 @@ public class RegisterEmailActivity extends AppCompatBase implements View.OnClick private EmailFieldValidator mEmailFieldValidator; private PasswordFieldValidator mPasswordFieldValidator; private RequiredFieldValidator mNameValidator; + @Nullable + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.register_email_layout); + mSmartLock = mActivityHelper.getSmartLockInstance(this, TAG); + String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); mEmailEditText = (EditText) findViewById(R.id.email); @@ -156,13 +159,11 @@ public void onComplete(@NonNull Task task) { // This executes even if the name change fails, since // the account creation succeeded and we want to save // the credential to SmartLock (if enabled). - SmartLock.getInstance(RegisterEmailActivity.this, TAG) - .saveCredentialsOrFinish( - RegisterEmailActivity.this, - mActivityHelper, - firebaseUser, - password, - null); + mActivityHelper.saveCredentialsOrFinish( + mSmartLock, + RegisterEmailActivity.this, + firebaseUser, + password); } }); } 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 fb7c1ad80..78b4e0640 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 @@ -18,6 +18,7 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.util.TypedValue; import android.view.View; @@ -26,8 +27,6 @@ import android.widget.ImageView; import android.widget.TextView; -import com.firebase.ui.auth.AuthUI; -import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.R; import com.firebase.ui.auth.ui.ActivityHelper; import com.firebase.ui.auth.ui.AppCompatBase; @@ -51,12 +50,16 @@ public class SignInActivity extends AppCompatBase implements View.OnClickListene private EditText mPasswordEditText; private EmailFieldValidator mEmailValidator; private RequiredFieldValidator mPasswordValidator; + @Nullable + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sign_in_layout); + mSmartLock = mActivityHelper.getSmartLockInstance(this, TAG); + String email = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); mEmailEditText = (EditText) findViewById(R.id.email); @@ -100,12 +103,11 @@ private void signIn(final String email, final String password) { @Override public void onSuccess(AuthResult authResult) { // Save credential in SmartLock (if enabled) - SmartLock.getInstance(SignInActivity.this, TAG) - .saveCredentialsOrFinish(SignInActivity.this, - mActivityHelper, - authResult.getUser(), - password, - null); + mActivityHelper.saveCredentialsOrFinish( + mSmartLock, + SignInActivity.this, + authResult.getUser(), + password); } }) .addOnFailureListener(new OnFailureListener() { 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 ca746e5e5..3d6d31b56 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 @@ -17,6 +17,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import android.widget.ImageView; @@ -63,12 +64,14 @@ public class AuthMethodPickerActivity extends IDPBaseActivity private static final int RC_EMAIL_FLOW = 2; private static final int RC_ACCOUNT_LINK = 3; private ArrayList mIdpProviders; + @Nullable + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.auth_method_picker_layout); - + mSmartLock = mActivityHelper.getSmartLockInstance(this, TAG); findViewById(R.id.email_provider).setOnClickListener(this); populateIdpList(mActivityHelper.getFlowParams().providerInfo); @@ -167,7 +170,7 @@ public void onSuccess(final IdpResponse response) { .addOnCompleteListener(new CredentialSignInHandler( AuthMethodPickerActivity.this, mActivityHelper, - SmartLock.getInstance(AuthMethodPickerActivity.this, TAG), + mSmartLock, RC_ACCOUNT_LINK, 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 0d6ca0e8b..bedd21c53 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 @@ -15,6 +15,7 @@ package com.firebase.ui.auth.ui.idp; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.Log; import com.firebase.ui.auth.IdpResponse; @@ -40,14 +41,14 @@ public class CredentialSignInHandler implements OnCompleteListener { private AppCompatBase mActivity; private ActivityHelper mActivityHelper; - private SmartLock mSmartLock; + @Nullable private SmartLock mSmartLock; private IdpResponse mResponse; private int mAccountLinkResultCode; public CredentialSignInHandler( AppCompatBase activity, ActivityHelper activityHelper, - SmartLock smartLock, + @Nullable SmartLock smartLock, int accountLinkResultCode, IdpResponse response) { mActivity = activity; @@ -61,11 +62,11 @@ public CredentialSignInHandler( public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { FirebaseUser firebaseUser = task.getResult().getUser(); - mSmartLock.saveCredentialsOrFinish(mActivity, - mActivityHelper, - firebaseUser, - null /* password */, - mResponse); + mActivityHelper.saveCredentialsOrFinish( + mSmartLock, + mActivity, + firebaseUser, + mResponse); } else { if (task.getException() instanceof FirebaseAuthUserCollisionException) { final String email = mResponse.getEmail(); 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 a6c5bffa6..5c3027eb0 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 @@ -17,6 +17,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.Nullable; import com.firebase.ui.auth.AuthUI.IdpConfig; import com.firebase.ui.auth.IdpResponse; import com.firebase.ui.auth.provider.FacebookProvider; @@ -44,11 +45,13 @@ public class IdpSignInContainerActivity extends IDPBaseActivity implements IdpCa private IdpProvider mIdpProvider; private String mProvider; private String mEmail; + @Nullable + private SmartLock mSmartLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + mSmartLock = mActivityHelper.getSmartLockInstance(this, TAG); mProvider = getIntent().getStringExtra(ExtraConstants.EXTRA_PROVIDER); mEmail = getIntent().getStringExtra(ExtraConstants.EXTRA_EMAIL); IdpConfig providerConfig = null; @@ -87,7 +90,7 @@ public void onSuccess(final IdpResponse response) { .addOnCompleteListener(new CredentialSignInHandler( IdpSignInContainerActivity.this, mActivityHelper, - SmartLock.getInstance(IdpSignInContainerActivity.this, TAG), + mSmartLock, RC_WELCOME_BACK_IDP, response)); } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java index 91d8e85b4..e2f695d0a 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/SmartLock.java @@ -24,11 +24,11 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.firebase.ui.auth.BuildConfig; 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.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.credentials.Credential; @@ -36,6 +36,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.GoogleApiClient.Builder; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.firebase.auth.FacebookAuthProvider; @@ -49,11 +50,11 @@ public class SmartLock extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, ResultCallback { - private static final String TAG = "CredentialsSaveBase"; + private static final String TAG = "SmartLockFragment"; private static final int RC_SAVE = 100; private static final int RC_UPDATE_SERVICE = 28; - private AppCompatBase mActivity; + private AppCompatActivity mActivity; private ActivityHelper mActivityHelper; private String mName; private String mEmail; @@ -202,7 +203,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { private void finish() { Intent resultIntent = new Intent().putExtra(ExtraConstants.EXTRA_IDP_RESPONSE, mResponse); - mActivity.finish(RESULT_OK, resultIntent); + mActivity.setResult(RESULT_OK, resultIntent); + mActivity.finish(); } /** @@ -212,9 +214,9 @@ private void finish() { * @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. + * @param response (optional) an {@link IdpResponse} representing the result of signing in. */ - public void saveCredentialsOrFinish(AppCompatBase activity, + public void saveCredentialsOrFinish(AppCompatActivity activity, ActivityHelper helper, FirebaseUser firebaseUser, @Nullable String password, @@ -252,15 +254,22 @@ public void saveCredentialsOrFinish(AppCompatBase activity, return; } - mCredentialsApiClient = new GoogleApiClient.Builder(activity) + if (mActivity.isFinishing()) { + finish(); + return; + } + + mCredentialsApiClient = new Builder(activity) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Auth.CREDENTIALS_API) .enableAutoManage(activity, this) .build(); + mCredentialsApiClient.connect(); } - public static SmartLock getInstance(AppCompatBase activity, String tag) { + @Nullable + public static SmartLock getInstance(AppCompatActivity activity, String tag) { SmartLock result; FragmentManager fm = activity.getSupportFragmentManager(); @@ -269,7 +278,12 @@ public static SmartLock getInstance(AppCompatBase activity, String tag) { Fragment fragment = fm.findFragmentByTag(tag); if (fragment == null || !(fragment instanceof SmartLock)) { result = new SmartLock(); - ft.add(result, tag).disallowAddToBackStack().commit(); + try { + ft.add(result, tag).disallowAddToBackStack().commit(); + } catch (IllegalStateException e) { + Log.e(TAG, "Can not add fragment", e); + return null; + } } else { result = (SmartLock) fragment; } diff --git a/auth/src/test/java/com/firebase/ui/auth/test_helpers/ActivityHelperShadow.java b/auth/src/test/java/com/firebase/ui/auth/test_helpers/ActivityHelperShadow.java index 7241c6648..05fbebf74 100644 --- a/auth/src/test/java/com/firebase/ui/auth/test_helpers/ActivityHelperShadow.java +++ b/auth/src/test/java/com/firebase/ui/auth/test_helpers/ActivityHelperShadow.java @@ -15,6 +15,8 @@ package com.firebase.ui.auth.test_helpers; import com.firebase.ui.auth.ui.ActivityHelper; +import com.firebase.ui.auth.ui.AppCompatBase; +import com.firebase.ui.auth.util.SmartLock; import com.google.android.gms.auth.api.credentials.CredentialsApi; import com.google.firebase.auth.FirebaseAuth; @@ -26,6 +28,7 @@ public class ActivityHelperShadow { public static FirebaseAuth firebaseAuth; public static CredentialsApi credentialsApi; + public static SmartLock smartLock; public ActivityHelperShadow() { if (firebaseAuth == null) { @@ -34,6 +37,9 @@ public ActivityHelperShadow() { if (credentialsApi == null) { credentialsApi = Mockito.mock(CredentialsApi.class); } + if (smartLock == null) { + smartLock = Mockito.mock(SmartLock.class); + } } @Implementation @@ -45,4 +51,9 @@ public FirebaseAuth getFirebaseAuth() { public CredentialsApi getCredentialsApi() { return credentialsApi; } + + @Implementation + public SmartLock getSmartLockInstance(AppCompatBase activity, String tag) { + return smartLock; + } } 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 deleted file mode 100644 index 936c03222..000000000 --- a/auth/src/test/java/com/firebase/ui/auth/test_helpers/SmartLockResult.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.firebase.ui.auth.test_helpers; - -import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; - -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.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 IdpResponse idpResponse) { - assertEquals(TestConstants.EMAIL, firebaseUser.getEmail()); - assertEquals(TestConstants.NAME, firebaseUser.getDisplayName()); - assertEquals(TestConstants.PHOTO_URL, firebaseUser.getPhotoUrl() != null - ? firebaseUser.getPhotoUrl().toString() : null); - assertEquals(mPassword, password); - String provider = null; - if (idpResponse != null) { - provider = idpResponse.getProviderType(); - } - assertEquals(mProvider, provider); - 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/test_helpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/test_helpers/TestHelper.java index 666cc6f0f..7055a2743 100644 --- a/auth/src/test/java/com/firebase/ui/auth/test_helpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/test_helpers/TestHelper.java @@ -18,6 +18,9 @@ import com.firebase.ui.auth.AuthUI; import com.firebase.ui.auth.AuthUI.IdpConfig; +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.FlowParameters; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; @@ -27,9 +30,13 @@ import java.util.ArrayList; import java.util.List; +import org.mockito.ArgumentCaptor; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class TestHelper { @@ -80,4 +87,24 @@ public static GoogleApiAvailability makeMockGoogleApiAvailability() { return availability; } + + public static void verifySmartLockSave(String providerId, String email, String password) { + ArgumentCaptor userArgumentCaptor = + ArgumentCaptor.forClass(FirebaseUser.class); + ArgumentCaptor idpResponseArgumentCaptor = + ArgumentCaptor.forClass(IdpResponse.class); + ArgumentCaptor passwordArgumentCaptor = ArgumentCaptor.forClass(String.class); + verify(ActivityHelperShadow.smartLock).saveCredentialsOrFinish( + any(AppCompatBase.class), any(ActivityHelper.class), userArgumentCaptor.capture(), + passwordArgumentCaptor.capture(), idpResponseArgumentCaptor.capture()); + assertEquals(email, userArgumentCaptor.getValue().getEmail()); + assertEquals(password, passwordArgumentCaptor.getValue()); + if (providerId == null) { + assertNull(idpResponseArgumentCaptor.getValue()); + } else { + assertEquals( + providerId, + idpResponseArgumentCaptor.getValue().getProviderType()); + } + } } 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 ba066e7b5..a7bb117e3 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,7 +27,6 @@ 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.util.PlayServicesHelper; @@ -45,8 +44,8 @@ import java.util.Arrays; -import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.when; @@ -96,6 +95,10 @@ public void testSignUpButton_validatesFields() { @Test @Config(shadows = {ActivityHelperShadow.class, FirebaseAuthWrapperImplShadow.class}) public void testSignUpButton_successfulRegistrationShouldContinueToSaveCredentials() { + // init mocks + new ActivityHelperShadow(); + reset(ActivityHelperShadow.smartLock); + TestHelper.initializeApp(RuntimeEnvironment.application); RegisterEmailActivity registerEmailActivity = createActivity(TestConstants.EMAIL); @@ -115,22 +118,14 @@ public void testSignUpButton_successfulRegistrationShouldContinueToSaveCredentia .createUserWithEmailAndPassword( TestConstants.EMAIL, TestConstants.PASSWORD)) - .thenReturn(new AutoCompleteTask(new FakeAuthResult(mockFirebaseUser), - true, - null)); - - SmartLockResult result = SmartLockResult.newInstance(registerEmailActivity, - "RegisterEmailActivity", - TestConstants.PASSWORD, - null); + .thenReturn(new AutoCompleteTask( + new FakeAuthResult(mockFirebaseUser), + true, + null)); Button button = (Button) registerEmailActivity.findViewById(R.id.button_create); button.performClick(); - try { - result.await(); - } catch (InterruptedException e) { - assertTrue("Interrupted waiting for result", false); - } + TestHelper.verifySmartLockSave(null, TestConstants.EMAIL, TestConstants.PASSWORD); } } 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 dc547aae5..29902569d 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 @@ -14,11 +14,18 @@ package com.firebase.ui.auth.ui.email; +import static com.firebase.ui.auth.test_helpers.TestHelper.verifySmartLockSave; +import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.content.Intent; import android.support.design.widget.TextInputLayout; import android.widget.Button; import android.widget.EditText; - import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.R; import com.firebase.ui.auth.test_helpers.ActivityHelperShadow; @@ -26,13 +33,12 @@ 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.util.PlayServicesHelper; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseUser; - +import java.util.Collections; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -42,15 +48,6 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; -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; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - @RunWith(CustomRobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 23) public class SignInActivityTest { @@ -100,6 +97,10 @@ public void testSignInButton_validatesFields() { @Test @Config(shadows = {ActivityHelperShadow.class, FirebaseAuthWrapperImplShadow.class}) public void testSignInButton_signsInAndSavesCredentials() { + // initialize mocks + new ActivityHelperShadow(); + reset(ActivityHelperShadow.smartLock); + SignInActivity signInActivity = createActivity(); EditText emailField = (EditText) signInActivity.findViewById(R.id.email); EditText passwordField = (EditText) signInActivity.findViewById(R.id.password); @@ -116,11 +117,6 @@ public void testSignInButton_signsInAndSavesCredentials() { 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(); @@ -128,10 +124,6 @@ public void testSignInButton_signsInAndSavesCredentials() { TestConstants.EMAIL, TestConstants.PASSWORD); - try { - result.await(); - } catch (InterruptedException e) { - assertTrue("Interrupted waiting for result", false); - } + verifySmartLockSave(null, TestConstants.EMAIL, TestConstants.PASSWORD); } } 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 23645c9ba..f84d36257 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 @@ -14,11 +14,18 @@ package com.firebase.ui.auth.ui.idp; +import static com.firebase.ui.auth.test_helpers.TestHelper.verifySmartLockSave; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.when; + import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; - import com.firebase.ui.auth.AuthUI; import com.firebase.ui.auth.BuildConfig; import com.firebase.ui.auth.R; @@ -30,7 +37,7 @@ 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.SmartLockResult; +import com.firebase.ui.auth.test_helpers.TestConstants; import com.firebase.ui.auth.test_helpers.TestHelper; import com.firebase.ui.auth.ui.email.EmailHintContainerActivity; import com.firebase.ui.auth.util.PlayServicesHelper; @@ -40,25 +47,17 @@ import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; import com.google.firebase.auth.TwitterAuthProvider; - +import java.util.Arrays; +import java.util.List; 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; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; -import java.util.Arrays; -import java.util.List; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; -import static org.mockito.Mockito.when; - @RunWith(CustomRobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, shadows = { @@ -130,39 +129,36 @@ public void testEmailLoginFlow() { @Test @Config(shadows = {ActivityHelperShadow.class}) public void testFacebookLoginFlow() { - List providers = Arrays.asList(AuthUI.FACEBOOK_PROVIDER); - - AuthMethodPickerActivity authMethodPickerActivity = - createActivity(providers); + // initialize mocks + new ActivityHelperShadow(); + reset(ActivityHelperShadow.smartLock); FirebaseUser mockFirebaseUser = TestHelper.makeMockFirebaseUser(); when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(FacebookAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) any())) .thenReturn(new AutoCompleteTask( new FakeAuthResult(mockFirebaseUser), true, null)); + List providers = Arrays.asList(AuthUI.FACEBOOK_PROVIDER); - SmartLockResult result = SmartLockResult.newInstance(authMethodPickerActivity, - "AuthMethodPicker", - null, - FacebookAuthProvider.PROVIDER_ID); + AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers); Button facebookButton = (Button) authMethodPickerActivity.findViewById(R.id.facebook_button); assertNotNull(facebookButton); facebookButton.performClick(); - try { - result.await(); - } catch (InterruptedException e) { - assertTrue("Interrupted waiting for result", false); - } + verifySmartLockSave(AuthUI.FACEBOOK_PROVIDER, TestConstants.EMAIL, null); } @Test @Config(shadows = {GoogleProviderShadow.class, ActivityHelperShadow.class}) public void testGoogleLoginFlow() { + // initialize mocks + new ActivityHelperShadow(); + reset(ActivityHelperShadow.smartLock); + List providers = Arrays.asList(AuthUI.GOOGLE_PROVIDER); AuthMethodPickerActivity authMethodPickerActivity = @@ -172,28 +168,21 @@ public void testGoogleLoginFlow() { when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(GoogleAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) 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(); - try { - result.await(); - } catch (InterruptedException e) { - assertTrue("Interrupted waiting for result", false); - } + verifySmartLockSave(AuthUI.GOOGLE_PROVIDER, TestConstants.EMAIL, null); } + + @Test @Config(shadows = {ActivityHelperShadow.class}) public void testTwitterLoginFlowStarts() { @@ -206,7 +195,7 @@ public void testTwitterLoginFlowStarts() { when(mockFirebaseUser.getProviders()) .thenReturn(Arrays.asList(TwitterAuthProvider.PROVIDER_ID)); - when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) Mockito.any())) + when(ActivityHelperShadow.firebaseAuth.signInWithCredential((AuthCredential) any())) .thenReturn(new AutoCompleteTask( new FakeAuthResult(mockFirebaseUser), true, null)); Button twitterButton = 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 725e6b245..819409133 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 @@ -113,11 +113,11 @@ public void testSignInSucceeded() { when(mockActivityHelper.getFlowParams()).thenReturn(flowParams); credentialSignInHandler.onComplete(signInTask); - verify(smartLock).saveCredentialsOrFinish(mockActivity, - mockActivityHelper, - mockFirebaseUser, - null, - idpResponse); + verify(mockActivityHelper).saveCredentialsOrFinish( + smartLock, + mockActivity, + mockFirebaseUser, + idpResponse); } @Test