Skip to content

Commit 9368dd1

Browse files
author
Aaron Mandle
committed
Refactor to use IdpConfig to configure IDPs, and remove IDPProviderParcel
1 parent 4facac4 commit 9368dd1

23 files changed

+265
-294
lines changed

app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import android.widget.TextView;
3434
import com.firebase.ui.auth.AuthUI;
35+
import com.firebase.ui.auth.AuthUI.IdpConfig;
3536
import com.firebase.ui.auth.ui.ResultCodes;
3637
import com.firebase.uidemo.R;
3738
import com.google.android.gms.common.Scopes;
@@ -184,8 +185,6 @@ public void signIn(View view) {
184185
.setLogo(getSelectedLogo())
185186
.setProviders(getSelectedProviders())
186187
.setTosUrl(getSelectedTosUrl())
187-
.setAdditonalFacebookPermissions(getFacebookPermissions())
188-
.setAdditonalGooglePermissions(getGooglePermissions())
189188
.setIsSmartLockEnabled(mEnableSmartLock.isChecked())
190189
.build(),
191190
RC_SIGN_IN);
@@ -264,26 +263,32 @@ private int getSelectedLogo() {
264263
}
265264

266265
@MainThread
267-
private String[] getSelectedProviders() {
268-
ArrayList<String> selectedProviders = new ArrayList<>();
266+
private List<IdpConfig> getSelectedProviders() {
267+
List<IdpConfig> selectedProviders = new ArrayList<>();
269268

270269
if (mUseEmailProvider.isChecked()) {
271-
selectedProviders.add(AuthUI.EMAIL_PROVIDER);
270+
selectedProviders.add(new IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build());
272271
}
273272

274273
if (mUseFacebookProvider.isChecked()) {
275-
selectedProviders.add(AuthUI.FACEBOOK_PROVIDER);
274+
selectedProviders.add(
275+
new IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER)
276+
.setPermissions(getFacebookPermissions())
277+
.build());
276278
}
277279

278280
if (mUseGoogleProvider.isChecked()) {
279-
selectedProviders.add(AuthUI.GOOGLE_PROVIDER);
281+
selectedProviders.add(
282+
new IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER)
283+
.setPermissions(getGooglePermissions())
284+
.build());
280285
}
281286

282287
if (mUseTwitterProvider.isChecked()) {
283-
selectedProviders.add(AuthUI.TWITTER_PROVIDER);
288+
selectedProviders.add(new IdpConfig.Builder(AuthUI.TWITTER_PROVIDER).build());
284289
}
285290

286-
return selectedProviders.toArray(new String[selectedProviders.size()]);
291+
return selectedProviders;
287292
}
288293

289294
@MainThread

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

Lines changed: 147 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,21 @@
1717
import android.app.Activity;
1818
import android.content.Context;
1919
import android.content.Intent;
20+
import android.os.Parcel;
21+
import android.os.Parcelable;
2022
import android.support.annotation.DrawableRes;
2123
import android.support.annotation.NonNull;
2224
import android.support.annotation.Nullable;
2325
import android.support.annotation.StyleRes;
2426
import android.support.annotation.VisibleForTesting;
25-
2627
import com.facebook.FacebookSdk;
2728
import com.facebook.login.LoginManager;
28-
import com.firebase.ui.auth.provider.IDPProviderParcel;
2929
import com.firebase.ui.auth.ui.ChooseAccountActivity;
3030
import com.firebase.ui.auth.ui.FlowParameters;
3131
import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity;
3232
import com.firebase.ui.auth.util.CredentialsApiHelper;
3333
import com.firebase.ui.auth.util.GoogleApiClientTaskHelper;
3434
import com.firebase.ui.auth.util.Preconditions;
35-
import com.firebase.ui.auth.util.ProviderHelper;
3635
import com.firebase.ui.auth.util.SmartlockUtil;
3736
import com.google.android.gms.auth.api.Auth;
3837
import com.google.android.gms.auth.api.credentials.Credential;
@@ -45,7 +44,6 @@
4544
import com.google.firebase.FirebaseApp;
4645
import com.google.firebase.auth.FirebaseAuth;
4746
import com.google.firebase.auth.FirebaseUser;
48-
4947
import java.util.ArrayList;
5048
import java.util.Arrays;
5149
import java.util.Collections;
@@ -105,7 +103,13 @@
105103
* startActivityForResult(
106104
* AuthUI.getInstance()
107105
* .createSignInIntentBuilder()
108-
* .setProviders(AuthUI.EMAIL_PROVIDER, AuthUI.GOOGLE_PROVIDER, AuthUI.FACEBOOK_PROVIDER)
106+
* .setProviders(
107+
* Arrays.asList(
108+
* new IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
109+
* new IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build(),
110+
* new IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build()
111+
* )
112+
* )
109113
* .build(),
110114
* RC_SIGN_IN);
111115
* }
@@ -403,19 +407,111 @@ public static AuthUI getInstance(FirebaseApp app) {
403407
return R.style.FirebaseUI;
404408
}
405409

410+
411+
/**
412+
* Configuration for an identity provider.
413+
*
414+
* In the simplest case, you can supply the provider ID and build the config like this:
415+
* {@code new IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build()}
416+
*/
417+
public static class IdpConfig implements Parcelable {
418+
private final String mProviderId;
419+
private final List<String> mScopes;
420+
421+
private IdpConfig(@NonNull String providerId, List<String> scopes) {
422+
mScopes = scopes;
423+
mProviderId = providerId;
424+
}
425+
426+
public String getProviderId() {
427+
return mProviderId;
428+
}
429+
430+
public List<String> getScopes() {
431+
return mScopes;
432+
}
433+
434+
protected IdpConfig(Parcel in) {
435+
mProviderId = in.readString();
436+
mScopes = in.createStringArrayList();
437+
}
438+
439+
public static final Creator<IdpConfig> CREATOR = new Creator<IdpConfig>() {
440+
@Override
441+
public IdpConfig createFromParcel(Parcel in) {
442+
return new IdpConfig(in);
443+
}
444+
445+
@Override
446+
public IdpConfig[] newArray(int size) {
447+
return new IdpConfig[size];
448+
}
449+
};
450+
451+
@Override
452+
public int describeContents() {
453+
return 0;
454+
}
455+
456+
@Override
457+
public void writeToParcel(Parcel parcel, int i) {
458+
parcel.writeString(mProviderId);
459+
parcel.writeStringList(mScopes);
460+
}
461+
462+
public static class Builder {
463+
private String mProviderId;
464+
private List<String> mScopes;
465+
466+
467+
/**
468+
* Builds the configuration parameters for an identity provider.
469+
* @param providerId An ID of one of the supported identity providers. e.g.
470+
* {@link AuthUI#GOOGLE_PROVIDER}. See {@link AuthUI#SUPPORTED_PROVIDERS} for the
471+
* complete list of supported Identity providers
472+
*/
473+
public Builder(@NonNull String providerId) {
474+
if (!SUPPORTED_PROVIDERS.contains(providerId)) {
475+
throw new IllegalArgumentException("Unkown provider: " + providerId);
476+
}
477+
mProviderId = providerId;
478+
}
479+
480+
/**
481+
* Specifies the additional permissions that the application will request for this
482+
* identity provider.
483+
*
484+
* For Facebook permissions see:
485+
* https://developers.facebook.com/docs/facebook-login/android
486+
* https://developers.facebook.com/docs/facebook-login/permissions
487+
*
488+
* For Google permissions see:
489+
* https://developers.google.com/identity/protocols/googlescopes
490+
*/
491+
public Builder setPermissions(List<String> permissions) {
492+
mScopes = permissions;
493+
return this;
494+
}
495+
496+
public IdpConfig build() {
497+
return new IdpConfig(mProviderId, mScopes);
498+
}
499+
}
500+
}
501+
406502
/**
407503
* Builder for the intent to start the user authentication flow.
408504
*/
409505
public final class SignInIntentBuilder {
410506
private int mLogo = NO_LOGO;
411507
private int mTheme = getDefaultTheme();
412-
private List<String> mProviders = Collections.singletonList(EMAIL_PROVIDER);
508+
private List<IdpConfig> mProviders = new ArrayList<>();
413509
private String mTosUrl;
414510
private boolean mIsSmartLockEnabled = true;
415-
private List<String> mAdditonalGooglePermissions;
416-
private List<String> mAdditonalFacebookPermissions;
417511

418-
private SignInIntentBuilder() {}
512+
private SignInIntentBuilder() {
513+
mProviders.add(new IdpConfig.Builder(EMAIL_PROVIDER).build());
514+
}
419515

420516
/**
421517
* Specifies the theme to use for the application flow. If no theme is specified,
@@ -447,10 +543,34 @@ public SignInIntentBuilder setTosUrl(@Nullable String tosUrl) {
447543
return this;
448544
}
449545

546+
/**
547+
* Specified the set of supported authentication providers. At least one provider must
548+
* be specified. There may only be one instance of each provider.
549+
*
550+
* <p>If no providers are explicitly specified by calling this method, then the email
551+
* provider is the default supported provider.
552+
*
553+
* @param idpConfigs a list of {@link IdpConfig}s, where each {@link IdpConfig} contains
554+
* the configuration parameters for the IDP.
555+
*
556+
* @see IdpConfig
557+
*/
558+
public SignInIntentBuilder setProviders(@NonNull List<IdpConfig> idpConfigs) {
559+
Set<String> configuredProviders = new HashSet<>();
560+
for (IdpConfig idpConfig : idpConfigs) {
561+
if (!configuredProviders.add(idpConfig.getProviderId())) {
562+
throw new IllegalArgumentException("Each provider can only be set once. "
563+
+ idpConfig.getProviderId() + " was set twice.");
564+
}
565+
}
566+
mProviders = idpConfigs;
567+
return this;
568+
}
569+
450570
/**
451571
* Specifies the set of supported authentication providers. At least one provider
452572
* must be specified, and the set of providers must be a subset of
453-
* {@link #SUPPORTED_PROVIDERS}.
573+
* {@link #SUPPORTED_PROVIDERS}. There may only be one instance of each provider.
454574
*
455575
* <p>If no providers are explicitly specified by calling this method, then
456576
* {@link #EMAIL_PROVIDER email} is the default supported provider.
@@ -459,12 +579,14 @@ public SignInIntentBuilder setTosUrl(@Nullable String tosUrl) {
459579
* @see #FACEBOOK_PROVIDER
460580
* @see #GOOGLE_PROVIDER
461581
*/
582+
@Deprecated
462583
public SignInIntentBuilder setProviders(@NonNull String... providers) {
463-
mProviders = Arrays.asList(providers);
464-
for (String provider : mProviders) {
465-
if (!SUPPORTED_PROVIDERS.contains(provider)) {
466-
throw new IllegalArgumentException("Unknown provider: " + provider);
584+
mProviders.clear(); // clear the default email provider
585+
for (String provider : providers) {
586+
if (isIdpAlreadyConfigured(provider)) {
587+
throw new IllegalArgumentException("Provider already configured: " + provider);
467588
}
589+
mProviders.add(new IdpConfig.Builder(provider).build());
468590
}
469591
return this;
470592
}
@@ -479,51 +601,31 @@ public SignInIntentBuilder setIsSmartLockEnabled(boolean enabled) {
479601
return this;
480602
}
481603

482-
/**
483-
* Specifies additional Google scopes that this application will request from the user.
484-
* Note that {@link com.google.android.gms.common.Scopes.EMAIL} and
485-
* {@link com.google.android.gms.common.Scopes.PROFILE} are alawys requested.
486-
*
487-
* For a list of all scopes, see:
488-
* https://developers.google.com/identity/protocols/googlescopes
489-
*/
490-
public SignInIntentBuilder setAdditonalGooglePermissions(List<String> permissions) {
491-
mAdditonalGooglePermissions = permissions;
492-
return this;
493-
}
494-
495-
/**
496-
* Specifies the Facebook permissions that this application will request from the user.
497-
*
498-
* See:
499-
* https://developers.facebook.com/docs/facebook-login/android
500-
* https://developers.facebook.com/docs/facebook-login/permissions
501-
*/
502-
public SignInIntentBuilder setAdditonalFacebookPermissions(List<String> permissions) {
503-
mAdditonalFacebookPermissions = permissions;
504-
return this;
505-
}
506-
507604
public Intent build() {
508605
Context context = mApp.getApplicationContext();
509606
return build(context);
510607
}
511608

512609
@VisibleForTesting
513610
public Intent build(Context context) {
514-
List<IDPProviderParcel> providerInfo =
515-
ProviderHelper.getProviderParcels(context, mProviders);
516611
return ChooseAccountActivity.createIntent(
517612
context,
518613
new FlowParameters(
519614
mApp.getName(),
520-
providerInfo,
615+
mProviders,
521616
mTheme,
522617
mLogo,
523618
mTosUrl,
524-
mIsSmartLockEnabled,
525-
mAdditonalFacebookPermissions,
526-
mAdditonalGooglePermissions));
619+
mIsSmartLockEnabled));
620+
}
621+
622+
private boolean isIdpAlreadyConfigured(@NonNull String providerId) {
623+
for (IdpConfig config : mProviders) {
624+
if (config.getProviderId().equals(providerId)) {
625+
return true;
626+
}
627+
}
628+
return false;
527629
}
528630
}
529631
}

auth/src/main/java/com/firebase/ui/auth/provider/FacebookProvider.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ public class FacebookProvider implements IDPProvider, FacebookCallback<LoginResu
4646
protected static final String ERROR_MSG = "err_msg";
4747

4848
private static final String TAG = "FacebookProvider";
49-
private static final String APPLICATION_ID = "application_id";
5049
private static final String EMAIL = "email";
5150
private static final String PUBLIC_PROFILE = "public_profile";
5251

@@ -56,21 +55,18 @@ public class FacebookProvider implements IDPProvider, FacebookCallback<LoginResu
5655

5756
public FacebookProvider (
5857
Context appContext,
59-
IDPProviderParcel facebookParcel,
6058
List<String> scopes) {
6159
mCallbackManager = CallbackManager.Factory.create();
62-
String applicationId = facebookParcel.getProviderExtra().getString(APPLICATION_ID);
63-
mScopes = scopes;
60+
if (scopes == null) {
61+
mScopes = new ArrayList<>();
62+
} else {
63+
mScopes = scopes;
64+
}
65+
String applicationId = appContext.getString(R.string.facebook_application_id);
6466
FacebookSdk.sdkInitialize(appContext);
6567
FacebookSdk.setApplicationId(applicationId);
6668
}
6769

68-
public static IDPProviderParcel createFacebookParcel(String applicationId) {
69-
Bundle extra = new Bundle();
70-
extra.putString(APPLICATION_ID, applicationId);
71-
return new IDPProviderParcel(FacebookAuthProvider.PROVIDER_ID, extra);
72-
}
73-
7470
@Override
7571
public String getName(Context context) {
7672
return context.getResources().getString(R.string.idp_name_facebook);

0 commit comments

Comments
 (0)