From b2f3fe8df5fb64fde83a8afde7fada5f5e019267 Mon Sep 17 00:00:00 2001 From: laurentiu-git Date: Tue, 17 Nov 2020 12:58:01 +0200 Subject: [PATCH 1/3] Added setDefaultEmail for EmailBuilder --- auth/src/main/java/com/firebase/ui/auth/AuthUI.java | 11 +++++++++++ .../com/firebase/ui/auth/ui/email/EmailActivity.java | 6 ++++++ .../com/firebase/ui/auth/util/ExtraConstants.java | 1 + 3 files changed, 18 insertions(+) diff --git a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java index 1c39c6d16..3086fad04 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -732,6 +732,17 @@ public EmailBuilder setForceSameDevice() { return this; } + /** + * Sets a default sign in email, if the given email has been registered before, then + * it will ask the user for password, if the given email it's not registered, then + * it starts signing up the default email. + */ + @NonNull + public EmailBuilder setDefaultEmail(String email) { + getParams().putString(ExtraConstants.DEFAULT_EMAIL, email); + return this; + } + @Override public IdpConfig build() { if (super.mProviderId.equals(EMAIL_LINK_PROVIDER)) { diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailActivity.java b/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailActivity.java index d9ac5f7b1..feabf506d 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailActivity.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/email/EmailActivity.java @@ -98,6 +98,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { responseForLinking, forceSameDevice); switchFragment(fragment, R.id.fragment_register_email, EmailLinkFragment.TAG); } else { + AuthUI.IdpConfig emailConfig = ProviderUtils.getConfigFromIdps( + getFlowParams().providers, EmailAuthProvider.PROVIDER_ID); + + if (emailConfig != null) { + email = emailConfig.getParams().getString(ExtraConstants.DEFAULT_EMAIL);; + } // Start with check email CheckEmailFragment fragment = CheckEmailFragment.newInstance(email); switchFragment(fragment, R.id.fragment_register_email, CheckEmailFragment.TAG); diff --git a/auth/src/main/java/com/firebase/ui/auth/util/ExtraConstants.java b/auth/src/main/java/com/firebase/ui/auth/util/ExtraConstants.java index 843deb6f5..2d2a27317 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/ExtraConstants.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/ExtraConstants.java @@ -27,6 +27,7 @@ public final class ExtraConstants { public static final String CREDENTIAL = "extra_credential"; public static final String EMAIL = "extra_email"; + public static final String DEFAULT_EMAIL = "extra_default_email"; public static final String ALLOW_NEW_EMAILS = "extra_allow_new_emails"; public static final String REQUIRE_NAME = "extra_require_name"; public static final String GOOGLE_SIGN_IN_OPTIONS = "extra_google_sign_in_options"; From 4c86edcae889182c89613e74354257f9f91f54b8 Mon Sep 17 00:00:00 2001 From: laurentiu-git Date: Wed, 18 Nov 2020 12:57:51 +0200 Subject: [PATCH 2/3] Added tests for setDefaultEmail --- .../java/com/firebase/ui/auth/AuthUITest.java | 15 +++++- .../ui/auth/testhelpers/TestHelper.java | 13 +++-- .../ui/auth/ui/email/EmailActivityTest.java | 52 +++++++++++++++++-- .../ui/idp/AuthMethodPickerActivityTest.java | 30 +++++++++-- 4 files changed, 99 insertions(+), 11 deletions(-) diff --git a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java index 47c81b7f5..70c766e95 100644 --- a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java +++ b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java @@ -203,7 +203,7 @@ public void testPhoneBuilder_withValidDefaultNumberCode_expectSuccess() { } @Test - public void testPhoneBuilder_withBlacklistedCountryWithSameCountryCode_expectSucess() { + public void testPhoneBuilder_withBlacklistedCountryWithSameCountryCode_expectSuccess() { new IdpConfig.PhoneBuilder() .setDefaultNumber("+1123456789") .setBlacklistedCountries(Arrays.asList("ca")) @@ -333,6 +333,19 @@ public void testEmailBuilder_withAnonymousUpgradeAndNotForcingSameDevice_expectT (actionCodeSettings).build(); } + @Test + public void testEmailBuilder_withSetDefaultEmail_expectSuccess() { + ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder().setUrl(URL).build(); + + IdpConfig config = new IdpConfig.EmailBuilder() + .setDefaultEmail(TestConstants.EMAIL) + .setActionCodeSettings(actionCodeSettings) + .build(); + + assertThat(config.getParams().getString(ExtraConstants.DEFAULT_EMAIL)) + .isEqualTo(TestConstants.EMAIL); + } + @Test(expected = IllegalStateException.class) public void testSignInIntentBuilder_anonymousUpgradeWithEmailLinkCrossDevice_expectThrows() { ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder().setUrl(URL).build(); diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java index c2ed71f74..2fab50343 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java @@ -126,12 +126,13 @@ public static FlowParameters getFlowParameters(Collection providerIds) { public static FlowParameters getFlowParameters(Collection providerIds, boolean enableAnonymousUpgrade) { - return getFlowParameters(providerIds, enableAnonymousUpgrade, null); + return getFlowParameters(providerIds, enableAnonymousUpgrade, null, false); } public static FlowParameters getFlowParameters(Collection providerIds, boolean enableAnonymousUpgrade, - AuthMethodPickerLayout customLayout) { + AuthMethodPickerLayout customLayout, + boolean hasDefaultEmail) { List idpConfigs = new ArrayList<>(); for (String providerId : providerIds) { switch (providerId) { @@ -153,7 +154,13 @@ public static FlowParameters getFlowParameters(Collection providerIds, .setHandleCodeInApp(true).build()).build()); break; case EmailAuthProvider.PROVIDER_ID: - idpConfigs.add(new IdpConfig.EmailBuilder().build()); + if (hasDefaultEmail) { idpConfigs.add(new IdpConfig.EmailBuilder() + .setDefaultEmail(TestConstants.EMAIL) + .build()); + } else + { + idpConfigs.add(new IdpConfig.EmailBuilder().build()); + } break; case PhoneAuthProvider.PROVIDER_ID: idpConfigs.add(new IdpConfig.PhoneBuilder().build()); diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/EmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/EmailActivityTest.java index a4873f4fc..9208cbfe3 100644 --- a/auth/src/test/java/com/firebase/ui/auth/ui/email/EmailActivityTest.java +++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/EmailActivityTest.java @@ -25,6 +25,7 @@ import com.firebase.ui.auth.testhelpers.TestHelper; import com.firebase.ui.auth.util.ExtraConstants; import com.firebase.ui.auth.util.data.EmailLinkPersistenceManager; +import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.GoogleAuthProvider; @@ -34,6 +35,8 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowActivity; import java.util.Collections; @@ -73,7 +76,7 @@ public void testOnCreate_emailLinkLinkingFlow_expectSendEmailLinkFlowStarted() { EmailLinkPersistenceManager.getInstance().saveEmail(ApplicationProvider.getApplicationContext(), EMAIL, TestConstants.SESSION_ID, TestConstants.UID); - EmailActivity emailActivity = createActivity(AuthUI.EMAIL_LINK_PROVIDER, true); + EmailActivity emailActivity = createActivity(AuthUI.EMAIL_LINK_PROVIDER, true, false); EmailLinkFragment fragment = (EmailLinkFragment) emailActivity .getSupportFragmentManager().findFragmentByTag(EmailLinkFragment.TAG); @@ -141,16 +144,59 @@ public void testSignUpButton_validatesFields() { passwordLayout.getError().toString()); } + @Test + public void testSetDefaultEmail_validField() { + EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true); + + CheckEmailFragment fragment = (CheckEmailFragment) emailActivity + .getSupportFragmentManager().findFragmentByTag(CheckEmailFragment.TAG); + assertThat(fragment).isNotNull(); + + TextInputEditText email = emailActivity.findViewById(R.id.email); + assertEquals(TestConstants.EMAIL, email.getText().toString()); + + } + + @Test + public void testSetDefaultEmail_expectWelcomeBackPasswordPrompt() { + EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true); + + emailActivity.onExistingEmailUser(new User.Builder(EmailAuthProvider.PROVIDER_ID, TestConstants.EMAIL).build()); + + ShadowActivity.IntentForResult nextIntent = + Shadows.shadowOf(emailActivity).getNextStartedActivityForResult(); + assertEquals(WelcomeBackPasswordPrompt.class.getName(), + nextIntent.intent.getComponent().getClassName()); + + } + + @Test + public void testSetDefaultEmail_expectRegisterEmailFragment() { + EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true); + + emailActivity.onNewUser(new User.Builder(EmailAuthProvider.PROVIDER_ID, TestConstants.EMAIL).build()); + + RegisterEmailFragment registerEmailFragment = (RegisterEmailFragment) emailActivity + .getSupportFragmentManager().findFragmentByTag(RegisterEmailFragment.TAG); + assertThat(registerEmailFragment).isNotNull(); + } + private EmailActivity createActivity(String providerId) { - return createActivity(providerId, false); + return createActivity(providerId, false, false); } - private EmailActivity createActivity(String providerId, boolean emailLinkLinkingFlow) { + private EmailActivity createActivity(String providerId, boolean emailLinkLinkingFlow, boolean hasDefaultEmail) { Intent startIntent = EmailActivity.createIntent( ApplicationProvider.getApplicationContext(), TestHelper.getFlowParameters(Collections.singletonList(providerId))); + if (hasDefaultEmail) { + startIntent = EmailActivity.createIntent( + ApplicationProvider.getApplicationContext(), + TestHelper.getFlowParameters(Collections.singletonList(providerId), false, null, true)); + } + if (emailLinkLinkingFlow) { startIntent.putExtra(ExtraConstants.EMAIL, EMAIL); startIntent.putExtra(ExtraConstants.IDP_RESPONSE, buildGoogleIdpResponse()); 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 3cef98399..11eb1cf44 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 @@ -111,7 +111,7 @@ public void testCustomAuthMethodPickerLayout() { .setEmailButtonId(R.id.email_button) .build(); - AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout); + AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, false); Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button); emailButton.performClick(); @@ -133,7 +133,7 @@ public void testCustomAuthMethodPickerLayoutWithEmailLink() { .setEmailButtonId(R.id.email_button) .build(); - AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout); + AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, false); Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button); emailButton.performClick(); @@ -146,11 +146,33 @@ public void testCustomAuthMethodPickerLayoutWithEmailLink() { nextIntent.intent.getComponent().getClassName()); } + @Test + public void testCustomAuthMethodPickerLayoutWithDefaultEmail() { + List providers = Arrays.asList(EmailAuthProvider.PROVIDER_ID); + + AuthMethodPickerLayout customLayout = new AuthMethodPickerLayout + .Builder(R.layout.fui_provider_button_email) + .setEmailButtonId(R.id.email_button) + .build(); + + AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, true); + Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button); + emailButton.performClick(); + + //Expected result -> Directing users to EmailActivity + ShadowActivity.IntentForResult nextIntent = + Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult(); + assertEquals( + EmailActivity.class.getName(), + nextIntent.intent.getComponent().getClassName()); + } + private AuthMethodPickerActivity createActivityWithCustomLayout(List providers, - AuthMethodPickerLayout layout) { + AuthMethodPickerLayout layout, + boolean hasDefaultEmail) { Intent startIntent = AuthMethodPickerActivity.createIntent( ApplicationProvider.getApplicationContext(), - TestHelper.getFlowParameters(providers, false, layout)); + TestHelper.getFlowParameters(providers, false, layout, hasDefaultEmail)); return Robolectric .buildActivity(AuthMethodPickerActivity.class, startIntent) From 6c4a7e3bc394458fa629b500cd3f84c1dc143dab Mon Sep 17 00:00:00 2001 From: laurentiu-git Date: Wed, 18 Nov 2020 13:21:33 +0200 Subject: [PATCH 3/3] Added CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e69de29bb..ee3353b09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -0,0 +1 @@ +Add ability to setDefaultEmail to the EmailBuilder (#1670) (contributed by @laurentiu-git) \ No newline at end of file