Skip to content

Commit 8d3fc0c

Browse files
authored
add option to specify a default provider to skip the selection screen (#1829)
1 parent ff2054d commit 8d3fc0c

File tree

5 files changed

+96
-4
lines changed

5 files changed

+96
-4
lines changed

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

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,7 @@ public GenericOAuthProviderBuilder setCustomParameters(
12011201
@SuppressWarnings(value = "unchecked")
12021202
private abstract class AuthIntentBuilder<T extends AuthIntentBuilder> {
12031203
final List<IdpConfig> mProviders = new ArrayList<>();
1204+
IdpConfig mDefaultProvider = null;
12041205
int mLogo = NO_LOGO;
12051206
int mTheme = getDefaultTheme();
12061207
String mTosUrl;
@@ -1270,7 +1271,7 @@ public T setTosAndPrivacyPolicyUrls(@NonNull String tosUrl,
12701271
}
12711272

12721273
/**
1273-
* Specified the set of supported authentication providers. At least one provider must
1274+
* Specifies the set of supported authentication providers. At least one provider must
12741275
* be specified. There may only be one instance of each provider. Anonymous provider cannot
12751276
* be the only provider specified.
12761277
* <p>
@@ -1307,6 +1308,29 @@ public T setAvailableProviders(@NonNull List<IdpConfig> idpConfigs) {
13071308
return (T) this;
13081309
}
13091310

1311+
/**
1312+
* Specifies the default authentication provider, bypassing the provider selection screen.
1313+
* The provider here must already be included via {@link #setAvailableProviders(List)}, and
1314+
* this method is incompatible with {@link #setAlwaysShowSignInMethodScreen(boolean)}.
1315+
*
1316+
* @param config the default {@link IdpConfig} to use.
1317+
*/
1318+
@NonNull
1319+
public T setDefaultProvider(@Nullable IdpConfig config) {
1320+
if (config != null) {
1321+
if (!mProviders.contains(config)) {
1322+
throw new IllegalStateException(
1323+
"Default provider not in available providers list.");
1324+
}
1325+
if (mAlwaysShowProviderChoice) {
1326+
throw new IllegalStateException(
1327+
"Can't set default provider and always show provider choice.");
1328+
}
1329+
}
1330+
mDefaultProvider = config;
1331+
return (T) this;
1332+
}
1333+
13101334
/**
13111335
* Enables or disables the use of Smart Lock for Passwords in the sign in flow. To
13121336
* (en)disable hint selector and credential selector independently use {@link
@@ -1359,6 +1383,10 @@ public T setAuthMethodPickerLayout(@NonNull AuthMethodPickerLayout authMethodPic
13591383
*/
13601384
@NonNull
13611385
public T setAlwaysShowSignInMethodScreen(boolean alwaysShow) {
1386+
if (alwaysShow && mDefaultProvider != null) {
1387+
throw new IllegalStateException(
1388+
"Can't show provider choice with a default provider.");
1389+
}
13621390
mAlwaysShowProviderChoice = alwaysShow;
13631391
return (T) this;
13641392
}
@@ -1431,6 +1459,7 @@ protected FlowParameters getFlowParams() {
14311459
return new FlowParameters(
14321460
mApp.getName(),
14331461
mProviders,
1462+
mDefaultProvider,
14341463
mTheme,
14351464
mLogo,
14361465
mTosUrl,

auth/src/main/java/com/firebase/ui/auth/data/model/FlowParameters.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class FlowParameters implements Parcelable {
4444
public FlowParameters createFromParcel(Parcel in) {
4545
String appName = in.readString();
4646
List<IdpConfig> providerInfo = in.createTypedArrayList(IdpConfig.CREATOR);
47+
IdpConfig defaultProvider = in.readParcelable(IdpConfig.class.getClassLoader());
4748
int themeId = in.readInt();
4849
int logoId = in.readInt();
4950
String termsOfServiceUrl = in.readString();
@@ -58,6 +59,7 @@ public FlowParameters createFromParcel(Parcel in) {
5859
return new FlowParameters(
5960
appName,
6061
providerInfo,
62+
defaultProvider,
6163
themeId,
6264
logoId,
6365
termsOfServiceUrl,
@@ -82,6 +84,9 @@ public FlowParameters[] newArray(int size) {
8284
@NonNull
8385
public final List<IdpConfig> providers;
8486

87+
@Nullable
88+
public final IdpConfig defaultProvider;
89+
8590
@StyleRes
8691
public final int themeId;
8792

@@ -108,6 +113,7 @@ public FlowParameters[] newArray(int size) {
108113
public FlowParameters(
109114
@NonNull String appName,
110115
@NonNull List<IdpConfig> providers,
116+
@Nullable IdpConfig defaultProvider,
111117
@StyleRes int themeId,
112118
@DrawableRes int logoId,
113119
@Nullable String termsOfServiceUrl,
@@ -121,6 +127,7 @@ public FlowParameters(
121127
this.appName = Preconditions.checkNotNull(appName, "appName cannot be null");
122128
this.providers = Collections.unmodifiableList(
123129
Preconditions.checkNotNull(providers, "providers cannot be null"));
130+
this.defaultProvider = defaultProvider;
124131
this.themeId = themeId;
125132
this.logoId = logoId;
126133
this.termsOfServiceUrl = termsOfServiceUrl;
@@ -144,6 +151,7 @@ public static FlowParameters fromIntent(Intent intent) {
144151
public void writeToParcel(Parcel dest, int flags) {
145152
dest.writeString(appName);
146153
dest.writeTypedList(providers);
154+
dest.writeParcelable(defaultProvider, flags);
147155
dest.writeInt(themeId);
148156
dest.writeInt(logoId);
149157
dest.writeString(termsOfServiceUrl);
@@ -178,6 +186,10 @@ public boolean isAnonymousUpgradeEnabled() {
178186
}
179187

180188
public boolean shouldShowProviderChoice() {
181-
return !isSingleProviderFlow() || alwaysShowProviderChoice;
189+
return defaultProvider == null && (!isSingleProviderFlow() || alwaysShowProviderChoice);
190+
}
191+
192+
public IdpConfig getDefaultOrFirstProvider() {
193+
return defaultProvider != null ? defaultProvider : providers.get(0);
182194
}
183195
}

auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,8 @@ public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
135135
}
136136

137137
private void startAuthMethodChoice() {
138-
// If there is only one provider selected, launch the flow directly
139138
if (!getArguments().shouldShowProviderChoice()) {
140-
AuthUI.IdpConfig firstIdpConfig = getArguments().providers.get(0);
139+
AuthUI.IdpConfig firstIdpConfig = getArguments().getDefaultOrFirstProvider();
141140
String firstProvider = firstIdpConfig.getProviderId();
142141
switch (firstProvider) {
143142
case EMAIL_LINK_PROVIDER:

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
import static com.google.common.truth.Truth.assertThat;
3636
import static junit.framework.Assert.assertEquals;
37+
import static junit.framework.Assert.assertFalse;
38+
import static junit.framework.Assert.assertTrue;
3739

3840
@RunWith(RobolectricTestRunner.class)
3941
public class AuthUITest {
@@ -65,6 +67,35 @@ public void testCreateStartIntent_shouldOnlyAllowOneInstanceOfAnIdp() {
6567
new IdpConfig.EmailBuilder().build()));
6668
}
6769

70+
@Test(expected = IllegalStateException.class)
71+
public void testCreateStartIntent_defaultProviderMustBeAvailable() {
72+
SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder();
73+
startIntent.setAvailableProviders(Arrays.asList(
74+
new IdpConfig.EmailBuilder().build(),
75+
new IdpConfig.GoogleBuilder().build()))
76+
.setDefaultProvider(new IdpConfig.FacebookBuilder().build());
77+
}
78+
79+
@Test(expected = IllegalStateException.class)
80+
public void testCreateStartIntent_incompatibleOptions() {
81+
SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder();
82+
startIntent.setAvailableProviders(Arrays.asList(
83+
new IdpConfig.EmailBuilder().build(),
84+
new IdpConfig.GoogleBuilder().build()))
85+
.setDefaultProvider(new IdpConfig.GoogleBuilder().build())
86+
.setAlwaysShowSignInMethodScreen(true);
87+
}
88+
89+
@Test(expected = IllegalStateException.class)
90+
public void testCreateStartIntent_incompatibleOptionsReverseOrder() {
91+
SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder();
92+
startIntent.setAvailableProviders(Arrays.asList(
93+
new IdpConfig.EmailBuilder().build(),
94+
new IdpConfig.GoogleBuilder().build()))
95+
.setAlwaysShowSignInMethodScreen(true)
96+
.setDefaultProvider(new IdpConfig.GoogleBuilder().build());
97+
}
98+
6899
@Test
69100
public void testCreatingStartIntent() {
70101
FlowParameters flowParameters = mAuthUi
@@ -83,6 +114,26 @@ public void testCreatingStartIntent() {
83114
assertEquals(TestConstants.TOS_URL, flowParameters.termsOfServiceUrl);
84115
assertEquals(TestConstants.PRIVACY_URL, flowParameters.privacyPolicyUrl);
85116
assertEquals(AuthUI.getDefaultTheme(), flowParameters.themeId);
117+
assertTrue(flowParameters.shouldShowProviderChoice());
118+
assertEquals(new IdpConfig.EmailBuilder().build(),
119+
flowParameters.getDefaultOrFirstProvider());
120+
}
121+
122+
@Test
123+
public void testCreatingStartIntentWithDefaultProvider() {
124+
FlowParameters flowParameters = mAuthUi
125+
.createSignInIntentBuilder()
126+
.setAvailableProviders(Arrays.asList(
127+
new IdpConfig.EmailBuilder().build(),
128+
new IdpConfig.GoogleBuilder().build(),
129+
new IdpConfig.FacebookBuilder().build()))
130+
.setDefaultProvider(new IdpConfig.FacebookBuilder().build())
131+
.build()
132+
.getParcelableExtra(ExtraConstants.FLOW_PARAMS);
133+
assertEquals(new IdpConfig.FacebookBuilder().build(), flowParameters.defaultProvider);
134+
assertFalse(flowParameters.shouldShowProviderChoice());
135+
assertEquals(new IdpConfig.FacebookBuilder().build(),
136+
flowParameters.getDefaultOrFirstProvider());
86137
}
87138

88139
@Test(expected = NullPointerException.class)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public static FlowParameters getFlowParameters(Collection<String> providerIds,
157157
return new FlowParameters(
158158
DEFAULT_APP_NAME,
159159
idpConfigs,
160+
null,
160161
AuthUI.getDefaultTheme(),
161162
AuthUI.NO_LOGO,
162163
null,

0 commit comments

Comments
 (0)