From 7a338efd271d8134fcce166b2bf89980da69c495 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 5 Aug 2016 08:28:52 -0700 Subject: [PATCH] Improving sign out, fix rotation crash, doc update --- auth/README.md | 24 +++++++++++ .../java/com/firebase/ui/auth/AuthUI.java | 42 ++++++++++++++++--- .../firebase/ui/auth/ui/AppCompatBase.java | 6 +++ .../ui/auth/util/CredentialsApiHelper.java | 11 ++++- .../auth/util/GoogleApiClientTaskHelper.java | 15 +++++-- 5 files changed, 89 insertions(+), 9 deletions(-) diff --git a/auth/README.md b/auth/README.md index f779ce976..ca663f5d6 100644 --- a/auth/README.md +++ b/auth/README.md @@ -285,3 +285,27 @@ redefine a string to change it, for example: Creating your shiny new account... ``` + +### OAuth Scope Customization + +#### Facebook + +By default, FirebaseUI requests the `email` and `public_profile` permissions when initiating +Facebook Login. If you would like to override these scopes, add a string array resource +to your application like this: + +``` + + + public_profile + email + + +``` + +Note that if you do not include at least the `email` and `public_profile` scopes, FirebaseUI +will not work properly. \ No newline at end of file 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 9f2a10fd1..f2417844b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -22,16 +22,23 @@ import android.support.annotation.Nullable; import android.support.annotation.StyleRes; +import com.facebook.FacebookSdk; +import com.facebook.login.LoginManager; import com.firebase.ui.auth.provider.IDPProviderParcel; -import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.ChooseAccountActivity; +import com.firebase.ui.auth.ui.FlowParameters; import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity; import com.firebase.ui.auth.util.CredentialsApiHelper; +import com.firebase.ui.auth.util.GoogleApiClientTaskHelper; import com.firebase.ui.auth.util.Preconditions; import com.firebase.ui.auth.util.ProviderHelper; +import com.google.android.gms.auth.api.Auth; +import com.google.android.gms.auth.api.signin.GoogleSignInOptions; +import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.Status; import com.google.android.gms.tasks.Continuation; import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; import com.google.firebase.FirebaseApp; import com.google.firebase.auth.FirebaseAuth; @@ -257,15 +264,40 @@ private AuthUI(FirebaseApp app) { * ({@code !result.isSuccess()}). */ public Task signOut(@NonNull Activity activity) { + // Get helper for Google Sign In and Credentials API + GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); + taskHelper.getBuilder() + .addApi(Auth.CREDENTIALS_API) + .addApi(Auth.GOOGLE_SIGN_IN_API, GoogleSignInOptions.DEFAULT_SIGN_IN); + + // Get Credentials Helper + CredentialsApiHelper credentialsHelper = CredentialsApiHelper.getInstance(taskHelper); + + // Firebase Sign out mAuth.signOut(); - return CredentialsApiHelper.getInstance(activity) - .disableAutoSignIn() - .continueWith(new Continuation() { + + // Disable credentials auto sign-in + Task disableCredentialsTask = credentialsHelper.disableAutoSignIn(); + + // Google sign out + Task googleSignOutTask = taskHelper.getConnectedGoogleApiClient() + .continueWith(new Continuation() { @Override - public Void then(@NonNull Task task) throws Exception { + public Void then(@NonNull Task task) throws Exception { + if (task.isSuccessful()) { + Auth.GoogleSignInApi.signOut(task.getResult()); + } return null; } }); + + // Facebook sign out + if (FacebookSdk.isInitialized()) { + LoginManager.getInstance().logOut(); + } + + // Wait for all tasks to complete + return Tasks.whenAll(disableCredentialsTask, googleSignOutTask); } /** diff --git a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java index 6ff31c6a4..7d2c8eeb5 100644 --- a/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java +++ b/auth/src/main/java/com/firebase/ui/auth/ui/AppCompatBase.java @@ -27,6 +27,12 @@ protected void onCreate(Bundle savedInstance) { mActivityHelper.configureTheme(); } + @Override + protected void onDestroy() { + super.onDestroy(); + mActivityHelper.dismissDialog(); + } + public void finish(int resultCode, Intent intent) { mActivityHelper.finish(resultCode, intent); } diff --git a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java index 9fd8893ff..cd9a3e94b 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java @@ -144,7 +144,16 @@ public void onResult(@NonNull Status status) { } public static CredentialsApiHelper getInstance(Activity activity) { - return new CredentialsApiHelper(GoogleApiClientTaskHelper.getInstance(activity)); + // Get a task helper with the Credentials Api + GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity); + taskHelper.getBuilder() + .addApi(Auth.CREDENTIALS_API); + + return getInstance(taskHelper); + } + + public static CredentialsApiHelper getInstance(GoogleApiClientTaskHelper taskHelper) { + return new CredentialsApiHelper(taskHelper); } private static abstract class ExceptionForwardingContinuation diff --git a/auth/src/main/java/com/firebase/ui/auth/util/GoogleApiClientTaskHelper.java b/auth/src/main/java/com/firebase/ui/auth/util/GoogleApiClientTaskHelper.java index c0836eadb..b0e6b3d63 100644 --- a/auth/src/main/java/com/firebase/ui/auth/util/GoogleApiClientTaskHelper.java +++ b/auth/src/main/java/com/firebase/ui/auth/util/GoogleApiClientTaskHelper.java @@ -19,7 +19,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.google.android.gms.auth.api.Auth; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.tasks.Task; @@ -48,11 +47,17 @@ public class GoogleApiClientTaskHelper { @NonNull private final AtomicReference> mConnectTaskRef; + @NonNull + private final GoogleApiClient.Builder mBuilder; + private GoogleApiClientTaskHelper(@NonNull Activity activity) { if (activity == null) { throw new IllegalArgumentException("activity must not be null"); } + mActivity = activity; + mBuilder = new GoogleApiClient.Builder(mActivity); + mClientRef = new AtomicReference<>(); mConnectTaskRef = new AtomicReference<>(); @@ -68,7 +73,7 @@ public Task getConnectedGoogleApiClient() { } final AtomicReference gacReference = new AtomicReference<>(); - GoogleApiClient client = new GoogleApiClient.Builder(mActivity) + GoogleApiClient client = mBuilder .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(@Nullable Bundle bundle) { @@ -86,7 +91,6 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + connectionResult.getErrorMessage())); } }) - .addApi(Auth.CREDENTIALS_API) .build(); gacReference.set(client); @@ -95,6 +99,11 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { return source.getTask(); } + @NonNull + public GoogleApiClient.Builder getBuilder() { + return mBuilder; + } + /** * Retrieve the instance for the specified activity, reusing an instance if it exists, * otherwise creates a new one.