From ff2054de98f3e2eb8fb6c782b7f6241215f432a3 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 31 Aug 2020 12:06:08 +0100 Subject: [PATCH 1/2] Begin development on v6.4.0 --- buildSrc/src/main/kotlin/Config.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index 1ee8d1745..5b9c94faa 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -1,5 +1,5 @@ object Config { - const val version = "6.3.0" + const val version = "6.4.0-SNAPSHOT" val submodules = listOf("auth", "common", "firestore", "database", "storage") private const val kotlinVersion = "1.3.72" From ce750f1b1ac136b85dc48b063587e70f775e8b7e Mon Sep 17 00:00:00 2001 From: ubragg Date: Tue, 1 Sep 2020 18:46:14 -0700 Subject: [PATCH 2/2] add option to specify a default provider to skip the selection screen --- .../java/com/firebase/ui/auth/AuthUI.java | 31 ++++++++++- .../ui/auth/data/model/FlowParameters.java | 14 ++++- .../auth/data/remote/SignInKickstarter.java | 3 +- .../java/com/firebase/ui/auth/AuthUITest.java | 51 +++++++++++++++++++ .../ui/auth/testhelpers/TestHelper.java | 1 + 5 files changed, 96 insertions(+), 4 deletions(-) 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 48b592adc..77ad197f0 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -1201,6 +1201,7 @@ public GenericOAuthProviderBuilder setCustomParameters( @SuppressWarnings(value = "unchecked") private abstract class AuthIntentBuilder { final List mProviders = new ArrayList<>(); + IdpConfig mDefaultProvider = null; int mLogo = NO_LOGO; int mTheme = getDefaultTheme(); String mTosUrl; @@ -1270,7 +1271,7 @@ public T setTosAndPrivacyPolicyUrls(@NonNull String tosUrl, } /** - * Specified the set of supported authentication providers. At least one provider must + * Specifies the set of supported authentication providers. At least one provider must * be specified. There may only be one instance of each provider. Anonymous provider cannot * be the only provider specified. *

@@ -1307,6 +1308,29 @@ public T setAvailableProviders(@NonNull List idpConfigs) { return (T) this; } + /** + * Specifies the default authentication provider, bypassing the provider selection screen. + * The provider here must already be included via {@link #setAvailableProviders(List)}, and + * this method is incompatible with {@link #setAlwaysShowSignInMethodScreen(boolean)}. + * + * @param config the default {@link IdpConfig} to use. + */ + @NonNull + public T setDefaultProvider(@Nullable IdpConfig config) { + if (config != null) { + if (!mProviders.contains(config)) { + throw new IllegalStateException( + "Default provider not in available providers list."); + } + if (mAlwaysShowProviderChoice) { + throw new IllegalStateException( + "Can't set default provider and always show provider choice."); + } + } + mDefaultProvider = config; + return (T) this; + } + /** * Enables or disables the use of Smart Lock for Passwords in the sign in flow. To * (en)disable hint selector and credential selector independently use {@link @@ -1359,6 +1383,10 @@ public T setAuthMethodPickerLayout(@NonNull AuthMethodPickerLayout authMethodPic */ @NonNull public T setAlwaysShowSignInMethodScreen(boolean alwaysShow) { + if (alwaysShow && mDefaultProvider != null) { + throw new IllegalStateException( + "Can't show provider choice with a default provider."); + } mAlwaysShowProviderChoice = alwaysShow; return (T) this; } @@ -1431,6 +1459,7 @@ protected FlowParameters getFlowParams() { return new FlowParameters( mApp.getName(), mProviders, + mDefaultProvider, mTheme, mLogo, mTosUrl, diff --git a/auth/src/main/java/com/firebase/ui/auth/data/model/FlowParameters.java b/auth/src/main/java/com/firebase/ui/auth/data/model/FlowParameters.java index 402a38b12..63e64aa97 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/model/FlowParameters.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/model/FlowParameters.java @@ -44,6 +44,7 @@ public class FlowParameters implements Parcelable { public FlowParameters createFromParcel(Parcel in) { String appName = in.readString(); List providerInfo = in.createTypedArrayList(IdpConfig.CREATOR); + IdpConfig defaultProvider = in.readParcelable(IdpConfig.class.getClassLoader()); int themeId = in.readInt(); int logoId = in.readInt(); String termsOfServiceUrl = in.readString(); @@ -58,6 +59,7 @@ public FlowParameters createFromParcel(Parcel in) { return new FlowParameters( appName, providerInfo, + defaultProvider, themeId, logoId, termsOfServiceUrl, @@ -82,6 +84,9 @@ public FlowParameters[] newArray(int size) { @NonNull public final List providers; + @Nullable + public final IdpConfig defaultProvider; + @StyleRes public final int themeId; @@ -108,6 +113,7 @@ public FlowParameters[] newArray(int size) { public FlowParameters( @NonNull String appName, @NonNull List providers, + @Nullable IdpConfig defaultProvider, @StyleRes int themeId, @DrawableRes int logoId, @Nullable String termsOfServiceUrl, @@ -121,6 +127,7 @@ public FlowParameters( this.appName = Preconditions.checkNotNull(appName, "appName cannot be null"); this.providers = Collections.unmodifiableList( Preconditions.checkNotNull(providers, "providers cannot be null")); + this.defaultProvider = defaultProvider; this.themeId = themeId; this.logoId = logoId; this.termsOfServiceUrl = termsOfServiceUrl; @@ -144,6 +151,7 @@ public static FlowParameters fromIntent(Intent intent) { public void writeToParcel(Parcel dest, int flags) { dest.writeString(appName); dest.writeTypedList(providers); + dest.writeParcelable(defaultProvider, flags); dest.writeInt(themeId); dest.writeInt(logoId); dest.writeString(termsOfServiceUrl); @@ -178,6 +186,10 @@ public boolean isAnonymousUpgradeEnabled() { } public boolean shouldShowProviderChoice() { - return !isSingleProviderFlow() || alwaysShowProviderChoice; + return defaultProvider == null && (!isSingleProviderFlow() || alwaysShowProviderChoice); + } + + public IdpConfig getDefaultOrFirstProvider() { + return defaultProvider != null ? defaultProvider : providers.get(0); } } diff --git a/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java b/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java index acfc3e2dd..3f972b0e6 100644 --- a/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java +++ b/auth/src/main/java/com/firebase/ui/auth/data/remote/SignInKickstarter.java @@ -135,9 +135,8 @@ public void onComplete(@NonNull Task task) { } private void startAuthMethodChoice() { - // If there is only one provider selected, launch the flow directly if (!getArguments().shouldShowProviderChoice()) { - AuthUI.IdpConfig firstIdpConfig = getArguments().providers.get(0); + AuthUI.IdpConfig firstIdpConfig = getArguments().getDefaultOrFirstProvider(); String firstProvider = firstIdpConfig.getProviderId(); switch (firstProvider) { case EMAIL_LINK_PROVIDER: 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 abdafa1e9..47c81b7f5 100644 --- a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java +++ b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java @@ -34,6 +34,8 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) public class AuthUITest { @@ -65,6 +67,35 @@ public void testCreateStartIntent_shouldOnlyAllowOneInstanceOfAnIdp() { new IdpConfig.EmailBuilder().build())); } + @Test(expected = IllegalStateException.class) + public void testCreateStartIntent_defaultProviderMustBeAvailable() { + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); + startIntent.setAvailableProviders(Arrays.asList( + new IdpConfig.EmailBuilder().build(), + new IdpConfig.GoogleBuilder().build())) + .setDefaultProvider(new IdpConfig.FacebookBuilder().build()); + } + + @Test(expected = IllegalStateException.class) + public void testCreateStartIntent_incompatibleOptions() { + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); + startIntent.setAvailableProviders(Arrays.asList( + new IdpConfig.EmailBuilder().build(), + new IdpConfig.GoogleBuilder().build())) + .setDefaultProvider(new IdpConfig.GoogleBuilder().build()) + .setAlwaysShowSignInMethodScreen(true); + } + + @Test(expected = IllegalStateException.class) + public void testCreateStartIntent_incompatibleOptionsReverseOrder() { + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); + startIntent.setAvailableProviders(Arrays.asList( + new IdpConfig.EmailBuilder().build(), + new IdpConfig.GoogleBuilder().build())) + .setAlwaysShowSignInMethodScreen(true) + .setDefaultProvider(new IdpConfig.GoogleBuilder().build()); + } + @Test public void testCreatingStartIntent() { FlowParameters flowParameters = mAuthUi @@ -83,6 +114,26 @@ public void testCreatingStartIntent() { assertEquals(TestConstants.TOS_URL, flowParameters.termsOfServiceUrl); assertEquals(TestConstants.PRIVACY_URL, flowParameters.privacyPolicyUrl); assertEquals(AuthUI.getDefaultTheme(), flowParameters.themeId); + assertTrue(flowParameters.shouldShowProviderChoice()); + assertEquals(new IdpConfig.EmailBuilder().build(), + flowParameters.getDefaultOrFirstProvider()); + } + + @Test + public void testCreatingStartIntentWithDefaultProvider() { + FlowParameters flowParameters = mAuthUi + .createSignInIntentBuilder() + .setAvailableProviders(Arrays.asList( + new IdpConfig.EmailBuilder().build(), + new IdpConfig.GoogleBuilder().build(), + new IdpConfig.FacebookBuilder().build())) + .setDefaultProvider(new IdpConfig.FacebookBuilder().build()) + .build() + .getParcelableExtra(ExtraConstants.FLOW_PARAMS); + assertEquals(new IdpConfig.FacebookBuilder().build(), flowParameters.defaultProvider); + assertFalse(flowParameters.shouldShowProviderChoice()); + assertEquals(new IdpConfig.FacebookBuilder().build(), + flowParameters.getDefaultOrFirstProvider()); } @Test(expected = NullPointerException.class) 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 f118866e7..de44a3e57 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 @@ -157,6 +157,7 @@ public static FlowParameters getFlowParameters(Collection providerIds, return new FlowParameters( DEFAULT_APP_NAME, idpConfigs, + null, AuthUI.getDefaultTheme(), AuthUI.NO_LOGO, null,