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.