Skip to content

Commit d5de444

Browse files
authored
Merge pull request #238 from samtstern/master
Improving sign out, fix rotation crash, doc update
2 parents 7253b7c + 7a338ef commit d5de444

File tree

5 files changed

+89
-9
lines changed

5 files changed

+89
-9
lines changed

auth/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,27 @@ redefine a string to change it, for example:
285285
<string name="progress_dialog_signing_up">Creating your shiny new account...</string>
286286
</resources>
287287
```
288+
289+
### OAuth Scope Customization
290+
291+
#### Facebook
292+
293+
By default, FirebaseUI requests the `email` and `public_profile` permissions when initiating
294+
Facebook Login. If you would like to override these scopes, add a string array resource
295+
to your application like this:
296+
297+
```
298+
<!--
299+
See:
300+
https://developers.facebook.com/docs/facebook-login/android
301+
https://developers.facebook.com/docs/facebook-login/permissions
302+
-->
303+
<array name="facebook_permissions">
304+
<item>public_profile</item>
305+
<item>email</item>
306+
<!-- ... -->
307+
</array>
308+
```
309+
310+
Note that if you do not include at least the `email` and `public_profile` scopes, FirebaseUI
311+
will not work properly.

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

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,23 @@
2222
import android.support.annotation.Nullable;
2323
import android.support.annotation.StyleRes;
2424

25+
import com.facebook.FacebookSdk;
26+
import com.facebook.login.LoginManager;
2527
import com.firebase.ui.auth.provider.IDPProviderParcel;
26-
import com.firebase.ui.auth.ui.FlowParameters;
2728
import com.firebase.ui.auth.ui.ChooseAccountActivity;
29+
import com.firebase.ui.auth.ui.FlowParameters;
2830
import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity;
2931
import com.firebase.ui.auth.util.CredentialsApiHelper;
32+
import com.firebase.ui.auth.util.GoogleApiClientTaskHelper;
3033
import com.firebase.ui.auth.util.Preconditions;
3134
import com.firebase.ui.auth.util.ProviderHelper;
35+
import com.google.android.gms.auth.api.Auth;
36+
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
37+
import com.google.android.gms.common.api.GoogleApiClient;
3238
import com.google.android.gms.common.api.Status;
3339
import com.google.android.gms.tasks.Continuation;
3440
import com.google.android.gms.tasks.Task;
41+
import com.google.android.gms.tasks.Tasks;
3542
import com.google.firebase.FirebaseApp;
3643
import com.google.firebase.auth.FirebaseAuth;
3744

@@ -257,15 +264,40 @@ private AuthUI(FirebaseApp app) {
257264
* ({@code !result.isSuccess()}).
258265
*/
259266
public Task<Void> signOut(@NonNull Activity activity) {
267+
// Get helper for Google Sign In and Credentials API
268+
GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity);
269+
taskHelper.getBuilder()
270+
.addApi(Auth.CREDENTIALS_API)
271+
.addApi(Auth.GOOGLE_SIGN_IN_API, GoogleSignInOptions.DEFAULT_SIGN_IN);
272+
273+
// Get Credentials Helper
274+
CredentialsApiHelper credentialsHelper = CredentialsApiHelper.getInstance(taskHelper);
275+
276+
// Firebase Sign out
260277
mAuth.signOut();
261-
return CredentialsApiHelper.getInstance(activity)
262-
.disableAutoSignIn()
263-
.continueWith(new Continuation<Status, Void>() {
278+
279+
// Disable credentials auto sign-in
280+
Task<Status> disableCredentialsTask = credentialsHelper.disableAutoSignIn();
281+
282+
// Google sign out
283+
Task<Void> googleSignOutTask = taskHelper.getConnectedGoogleApiClient()
284+
.continueWith(new Continuation<GoogleApiClient, Void>() {
264285
@Override
265-
public Void then(@NonNull Task<Status> task) throws Exception {
286+
public Void then(@NonNull Task<GoogleApiClient> task) throws Exception {
287+
if (task.isSuccessful()) {
288+
Auth.GoogleSignInApi.signOut(task.getResult());
289+
}
266290
return null;
267291
}
268292
});
293+
294+
// Facebook sign out
295+
if (FacebookSdk.isInitialized()) {
296+
LoginManager.getInstance().logOut();
297+
}
298+
299+
// Wait for all tasks to complete
300+
return Tasks.whenAll(disableCredentialsTask, googleSignOutTask);
269301
}
270302

271303
/**

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ protected void onCreate(Bundle savedInstance) {
2727
mActivityHelper.configureTheme();
2828
}
2929

30+
@Override
31+
protected void onDestroy() {
32+
super.onDestroy();
33+
mActivityHelper.dismissDialog();
34+
}
35+
3036
public void finish(int resultCode, Intent intent) {
3137
mActivityHelper.finish(resultCode, intent);
3238
}

auth/src/main/java/com/firebase/ui/auth/util/CredentialsApiHelper.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,16 @@ public void onResult(@NonNull Status status) {
144144
}
145145

146146
public static CredentialsApiHelper getInstance(Activity activity) {
147-
return new CredentialsApiHelper(GoogleApiClientTaskHelper.getInstance(activity));
147+
// Get a task helper with the Credentials Api
148+
GoogleApiClientTaskHelper taskHelper = GoogleApiClientTaskHelper.getInstance(activity);
149+
taskHelper.getBuilder()
150+
.addApi(Auth.CREDENTIALS_API);
151+
152+
return getInstance(taskHelper);
153+
}
154+
155+
public static CredentialsApiHelper getInstance(GoogleApiClientTaskHelper taskHelper) {
156+
return new CredentialsApiHelper(taskHelper);
148157
}
149158

150159
private static abstract class ExceptionForwardingContinuation<InT, OutT>

auth/src/main/java/com/firebase/ui/auth/util/GoogleApiClientTaskHelper.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import android.support.annotation.NonNull;
2020
import android.support.annotation.Nullable;
2121

22-
import com.google.android.gms.auth.api.Auth;
2322
import com.google.android.gms.common.ConnectionResult;
2423
import com.google.android.gms.common.api.GoogleApiClient;
2524
import com.google.android.gms.tasks.Task;
@@ -48,11 +47,17 @@ public class GoogleApiClientTaskHelper {
4847
@NonNull
4948
private final AtomicReference<TaskCompletionSource<GoogleApiClient>> mConnectTaskRef;
5049

50+
@NonNull
51+
private final GoogleApiClient.Builder mBuilder;
52+
5153
private GoogleApiClientTaskHelper(@NonNull Activity activity) {
5254
if (activity == null) {
5355
throw new IllegalArgumentException("activity must not be null");
5456
}
57+
5558
mActivity = activity;
59+
mBuilder = new GoogleApiClient.Builder(mActivity);
60+
5661
mClientRef = new AtomicReference<>();
5762
mConnectTaskRef = new AtomicReference<>();
5863

@@ -68,7 +73,7 @@ public Task<GoogleApiClient> getConnectedGoogleApiClient() {
6873
}
6974

7075
final AtomicReference<GoogleApiClient> gacReference = new AtomicReference<>();
71-
GoogleApiClient client = new GoogleApiClient.Builder(mActivity)
76+
GoogleApiClient client = mBuilder
7277
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
7378
@Override
7479
public void onConnected(@Nullable Bundle bundle) {
@@ -86,7 +91,6 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
8691
+ connectionResult.getErrorMessage()));
8792
}
8893
})
89-
.addApi(Auth.CREDENTIALS_API)
9094
.build();
9195

9296
gacReference.set(client);
@@ -95,6 +99,11 @@ public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
9599
return source.getTask();
96100
}
97101

102+
@NonNull
103+
public GoogleApiClient.Builder getBuilder() {
104+
return mBuilder;
105+
}
106+
98107
/**
99108
* Retrieve the instance for the specified activity, reusing an instance if it exists,
100109
* otherwise creates a new one.

0 commit comments

Comments
 (0)