Skip to content

Commit 4c75c23

Browse files
Added setDefaultEmail for EmailBuilder (#1866)
1 parent a72885b commit 4c75c23

File tree

8 files changed

+118
-11
lines changed

8 files changed

+118
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
- Allow most auth flows on devices without Google Play services (#1858)
2+
- Add ability to setDefaultEmail to the EmailBuilder (#1670) (contributed by @laurentiu-git)

auth/src/main/java/com/firebase/ui/auth/AuthUI.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,17 @@ public EmailBuilder setForceSameDevice() {
758758
return this;
759759
}
760760

761+
/**
762+
* Sets a default sign in email, if the given email has been registered before, then
763+
* it will ask the user for password, if the given email it's not registered, then
764+
* it starts signing up the default email.
765+
*/
766+
@NonNull
767+
public EmailBuilder setDefaultEmail(String email) {
768+
getParams().putString(ExtraConstants.DEFAULT_EMAIL, email);
769+
return this;
770+
}
771+
761772
@Override
762773
public IdpConfig build() {
763774
if (super.mProviderId.equals(EMAIL_LINK_PROVIDER)) {

auth/src/main/java/com/firebase/ui/auth/ui/email/EmailActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
9898
responseForLinking, forceSameDevice);
9999
switchFragment(fragment, R.id.fragment_register_email, EmailLinkFragment.TAG);
100100
} else {
101+
AuthUI.IdpConfig emailConfig = ProviderUtils.getConfigFromIdps(
102+
getFlowParams().providers, EmailAuthProvider.PROVIDER_ID);
103+
104+
if (emailConfig != null) {
105+
email = emailConfig.getParams().getString(ExtraConstants.DEFAULT_EMAIL);;
106+
}
101107
// Start with check email
102108
CheckEmailFragment fragment = CheckEmailFragment.newInstance(email);
103109
switchFragment(fragment, R.id.fragment_register_email, CheckEmailFragment.TAG);

auth/src/main/java/com/firebase/ui/auth/util/ExtraConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public final class ExtraConstants {
2727
public static final String CREDENTIAL = "extra_credential";
2828

2929
public static final String EMAIL = "extra_email";
30+
public static final String DEFAULT_EMAIL = "extra_default_email";
3031
public static final String ALLOW_NEW_EMAILS = "extra_allow_new_emails";
3132
public static final String REQUIRE_NAME = "extra_require_name";
3233
public static final String GOOGLE_SIGN_IN_OPTIONS = "extra_google_sign_in_options";

auth/src/test/java/com/firebase/ui/auth/AuthUITest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public void testPhoneBuilder_withValidDefaultNumberCode_expectSuccess() {
203203
}
204204

205205
@Test
206-
public void testPhoneBuilder_withBlacklistedCountryWithSameCountryCode_expectSucess() {
206+
public void testPhoneBuilder_withBlacklistedCountryWithSameCountryCode_expectSuccess() {
207207
new IdpConfig.PhoneBuilder()
208208
.setDefaultNumber("+1123456789")
209209
.setBlacklistedCountries(Arrays.asList("ca"))
@@ -333,6 +333,19 @@ public void testEmailBuilder_withAnonymousUpgradeAndNotForcingSameDevice_expectT
333333
(actionCodeSettings).build();
334334
}
335335

336+
@Test
337+
public void testEmailBuilder_withSetDefaultEmail_expectSuccess() {
338+
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder().setUrl(URL).build();
339+
340+
IdpConfig config = new IdpConfig.EmailBuilder()
341+
.setDefaultEmail(TestConstants.EMAIL)
342+
.setActionCodeSettings(actionCodeSettings)
343+
.build();
344+
345+
assertThat(config.getParams().getString(ExtraConstants.DEFAULT_EMAIL))
346+
.isEqualTo(TestConstants.EMAIL);
347+
}
348+
336349
@Test(expected = IllegalStateException.class)
337350
public void testSignInIntentBuilder_anonymousUpgradeWithEmailLinkCrossDevice_expectThrows() {
338351
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder().setUrl(URL).build();

auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,13 @@ public static FlowParameters getFlowParameters(Collection<String> providerIds) {
126126

127127
public static FlowParameters getFlowParameters(Collection<String> providerIds,
128128
boolean enableAnonymousUpgrade) {
129-
return getFlowParameters(providerIds, enableAnonymousUpgrade, null);
129+
return getFlowParameters(providerIds, enableAnonymousUpgrade, null, false);
130130
}
131131

132132
public static FlowParameters getFlowParameters(Collection<String> providerIds,
133133
boolean enableAnonymousUpgrade,
134-
AuthMethodPickerLayout customLayout) {
134+
AuthMethodPickerLayout customLayout,
135+
boolean hasDefaultEmail) {
135136
List<IdpConfig> idpConfigs = new ArrayList<>();
136137
for (String providerId : providerIds) {
137138
switch (providerId) {
@@ -153,7 +154,13 @@ public static FlowParameters getFlowParameters(Collection<String> providerIds,
153154
.setHandleCodeInApp(true).build()).build());
154155
break;
155156
case EmailAuthProvider.PROVIDER_ID:
156-
idpConfigs.add(new IdpConfig.EmailBuilder().build());
157+
if (hasDefaultEmail) { idpConfigs.add(new IdpConfig.EmailBuilder()
158+
.setDefaultEmail(TestConstants.EMAIL)
159+
.build());
160+
} else
161+
{
162+
idpConfigs.add(new IdpConfig.EmailBuilder().build());
163+
}
157164
break;
158165
case PhoneAuthProvider.PROVIDER_ID:
159166
idpConfigs.add(new IdpConfig.PhoneBuilder().build());

auth/src/test/java/com/firebase/ui/auth/ui/email/EmailActivityTest.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.firebase.ui.auth.testhelpers.TestHelper;
2626
import com.firebase.ui.auth.util.ExtraConstants;
2727
import com.firebase.ui.auth.util.data.EmailLinkPersistenceManager;
28+
import com.google.android.material.textfield.TextInputEditText;
2829
import com.google.android.material.textfield.TextInputLayout;
2930
import com.google.firebase.auth.EmailAuthProvider;
3031
import com.google.firebase.auth.GoogleAuthProvider;
@@ -34,6 +35,8 @@
3435
import org.junit.runner.RunWith;
3536
import org.robolectric.Robolectric;
3637
import org.robolectric.RobolectricTestRunner;
38+
import org.robolectric.Shadows;
39+
import org.robolectric.shadows.ShadowActivity;
3740

3841
import java.util.Collections;
3942

@@ -73,7 +76,7 @@ public void testOnCreate_emailLinkLinkingFlow_expectSendEmailLinkFlowStarted() {
7376
EmailLinkPersistenceManager.getInstance().saveEmail(ApplicationProvider.getApplicationContext(),
7477
EMAIL, TestConstants.SESSION_ID, TestConstants.UID);
7578

76-
EmailActivity emailActivity = createActivity(AuthUI.EMAIL_LINK_PROVIDER, true);
79+
EmailActivity emailActivity = createActivity(AuthUI.EMAIL_LINK_PROVIDER, true, false);
7780

7881
EmailLinkFragment fragment = (EmailLinkFragment) emailActivity
7982
.getSupportFragmentManager().findFragmentByTag(EmailLinkFragment.TAG);
@@ -141,16 +144,59 @@ public void testSignUpButton_validatesFields() {
141144
passwordLayout.getError().toString());
142145
}
143146

147+
@Test
148+
public void testSetDefaultEmail_validField() {
149+
EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true);
150+
151+
CheckEmailFragment fragment = (CheckEmailFragment) emailActivity
152+
.getSupportFragmentManager().findFragmentByTag(CheckEmailFragment.TAG);
153+
assertThat(fragment).isNotNull();
154+
155+
TextInputEditText email = emailActivity.findViewById(R.id.email);
156+
assertEquals(TestConstants.EMAIL, email.getText().toString());
157+
158+
}
159+
160+
@Test
161+
public void testSetDefaultEmail_expectWelcomeBackPasswordPrompt() {
162+
EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true);
163+
164+
emailActivity.onExistingEmailUser(new User.Builder(EmailAuthProvider.PROVIDER_ID, TestConstants.EMAIL).build());
165+
166+
ShadowActivity.IntentForResult nextIntent =
167+
Shadows.shadowOf(emailActivity).getNextStartedActivityForResult();
168+
assertEquals(WelcomeBackPasswordPrompt.class.getName(),
169+
nextIntent.intent.getComponent().getClassName());
170+
171+
}
172+
173+
@Test
174+
public void testSetDefaultEmail_expectRegisterEmailFragment() {
175+
EmailActivity emailActivity = createActivity(EmailAuthProvider.PROVIDER_ID, false, true);
176+
177+
emailActivity.onNewUser(new User.Builder(EmailAuthProvider.PROVIDER_ID, TestConstants.EMAIL).build());
178+
179+
RegisterEmailFragment registerEmailFragment = (RegisterEmailFragment) emailActivity
180+
.getSupportFragmentManager().findFragmentByTag(RegisterEmailFragment.TAG);
181+
assertThat(registerEmailFragment).isNotNull();
182+
}
183+
144184

145185
private EmailActivity createActivity(String providerId) {
146-
return createActivity(providerId, false);
186+
return createActivity(providerId, false, false);
147187
}
148188

149-
private EmailActivity createActivity(String providerId, boolean emailLinkLinkingFlow) {
189+
private EmailActivity createActivity(String providerId, boolean emailLinkLinkingFlow, boolean hasDefaultEmail) {
150190
Intent startIntent = EmailActivity.createIntent(
151191
ApplicationProvider.getApplicationContext(),
152192
TestHelper.getFlowParameters(Collections.singletonList(providerId)));
153193

194+
if (hasDefaultEmail) {
195+
startIntent = EmailActivity.createIntent(
196+
ApplicationProvider.getApplicationContext(),
197+
TestHelper.getFlowParameters(Collections.singletonList(providerId), false, null, true));
198+
}
199+
154200
if (emailLinkLinkingFlow) {
155201
startIntent.putExtra(ExtraConstants.EMAIL, EMAIL);
156202
startIntent.putExtra(ExtraConstants.IDP_RESPONSE, buildGoogleIdpResponse());

auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void testCustomAuthMethodPickerLayout() {
111111
.setEmailButtonId(R.id.email_button)
112112
.build();
113113

114-
AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout);
114+
AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, false);
115115

116116
Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button);
117117
emailButton.performClick();
@@ -133,7 +133,7 @@ public void testCustomAuthMethodPickerLayoutWithEmailLink() {
133133
.setEmailButtonId(R.id.email_button)
134134
.build();
135135

136-
AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout);
136+
AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, false);
137137

138138
Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button);
139139
emailButton.performClick();
@@ -146,11 +146,33 @@ public void testCustomAuthMethodPickerLayoutWithEmailLink() {
146146
nextIntent.intent.getComponent().getClassName());
147147
}
148148

149+
@Test
150+
public void testCustomAuthMethodPickerLayoutWithDefaultEmail() {
151+
List<String> providers = Arrays.asList(EmailAuthProvider.PROVIDER_ID);
152+
153+
AuthMethodPickerLayout customLayout = new AuthMethodPickerLayout
154+
.Builder(R.layout.fui_provider_button_email)
155+
.setEmailButtonId(R.id.email_button)
156+
.build();
157+
158+
AuthMethodPickerActivity authMethodPickerActivity = createActivityWithCustomLayout(providers, customLayout, true);
159+
Button emailButton = authMethodPickerActivity.findViewById(R.id.email_button);
160+
emailButton.performClick();
161+
162+
//Expected result -> Directing users to EmailActivity
163+
ShadowActivity.IntentForResult nextIntent =
164+
Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult();
165+
assertEquals(
166+
EmailActivity.class.getName(),
167+
nextIntent.intent.getComponent().getClassName());
168+
}
169+
149170
private AuthMethodPickerActivity createActivityWithCustomLayout(List<String> providers,
150-
AuthMethodPickerLayout layout) {
171+
AuthMethodPickerLayout layout,
172+
boolean hasDefaultEmail) {
151173
Intent startIntent = AuthMethodPickerActivity.createIntent(
152174
ApplicationProvider.getApplicationContext(),
153-
TestHelper.getFlowParameters(providers, false, layout));
175+
TestHelper.getFlowParameters(providers, false, layout, hasDefaultEmail));
154176

155177
return Robolectric
156178
.buildActivity(AuthMethodPickerActivity.class, startIntent)

0 commit comments

Comments
 (0)