Skip to content

Commit f1876ed

Browse files
SUPERCILEXsamtstern
authored andcommitted
Redirect user to add account if user removed Google account (#565)
1 parent d517973 commit f1876ed

File tree

1 file changed

+40
-29
lines changed

1 file changed

+40
-29
lines changed

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

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import android.support.v4.app.FragmentActivity;
2424
import android.text.TextUtils;
2525
import android.util.Log;
26-
import android.view.View;
27-
import android.view.View.OnClickListener;
2826

2927
import com.firebase.ui.auth.AuthUI.IdpConfig;
3028
import com.firebase.ui.auth.IdpResponse;
@@ -35,58 +33,66 @@
3533
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
3634
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
3735
import com.google.android.gms.common.ConnectionResult;
36+
import com.google.android.gms.common.api.CommonStatusCodes;
3837
import com.google.android.gms.common.api.GoogleApiClient;
3938
import com.google.android.gms.common.api.Scope;
39+
import com.google.android.gms.common.api.Status;
4040
import com.google.firebase.auth.AuthCredential;
4141
import com.google.firebase.auth.GoogleAuthProvider;
4242

43-
public class GoogleProvider implements
44-
IdpProvider, OnClickListener, GoogleApiClient.OnConnectionFailedListener {
43+
public class GoogleProvider implements IdpProvider, GoogleApiClient.OnConnectionFailedListener {
4544
private static final String TAG = "GoogleProvider";
4645
private static final int RC_SIGN_IN = 20;
4746
private static final String ERROR_KEY = "error";
4847

4948
private GoogleApiClient mGoogleApiClient;
50-
private Activity mActivity;
51-
private IdpCallback mIDPCallback;
49+
private FragmentActivity mActivity;
50+
private IdpConfig mIdpConfig;
51+
private IdpCallback mIdpCallback;
5252

5353
public GoogleProvider(FragmentActivity activity, IdpConfig idpConfig) {
5454
this(activity, idpConfig, null);
5555
}
5656

5757
public GoogleProvider(FragmentActivity activity, IdpConfig idpConfig, @Nullable String email) {
5858
mActivity = activity;
59-
String clientId = activity.getString(R.string.default_web_client_id);
59+
mIdpConfig = idpConfig;
60+
61+
mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
62+
.enableAutoManage(mActivity, GoogleApiHelper.getSafeAutoManageId(), this)
63+
.addApi(Auth.GOOGLE_SIGN_IN_API, getSignInOptions(email))
64+
.build();
65+
}
66+
67+
public static AuthCredential createAuthCredential(IdpResponse response) {
68+
return GoogleAuthProvider.getCredential(response.getIdpToken(), null);
69+
}
70+
71+
private GoogleSignInOptions getSignInOptions(@Nullable String email) {
72+
String clientId = mActivity.getString(R.string.default_web_client_id);
6073

6174
GoogleSignInOptions.Builder builder =
6275
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
6376
.requestEmail()
6477
.requestIdToken(clientId);
6578

66-
if (activity.getResources().getIdentifier(
67-
"google_permissions", "array", activity.getPackageName()) != 0) {
79+
if (mActivity.getResources().getIdentifier(
80+
"google_permissions", "array", mActivity.getPackageName()) != 0) {
6881
Log.w(TAG, "DEVELOPER WARNING: You have defined R.array.google_permissions but that is"
6982
+ " no longer respected as of FirebaseUI 1.0.0. Please see README for IDP scope"
7083
+ " configuration instructions.");
7184
}
7285

7386
// Add additional scopes
74-
for (String scopeString : idpConfig.getScopes()) {
87+
for (String scopeString : mIdpConfig.getScopes()) {
7588
builder.requestScopes(new Scope(scopeString));
7689
}
7790

7891
if (!TextUtils.isEmpty(email)) {
7992
builder.setAccountName(email);
8093
}
8194

82-
mGoogleApiClient = new GoogleApiClient.Builder(activity)
83-
.enableAutoManage(activity, GoogleApiHelper.getSafeAutoManageId(), this)
84-
.addApi(Auth.GOOGLE_SIGN_IN_API, builder.build())
85-
.build();
86-
}
87-
88-
public static AuthCredential createAuthCredential(IdpResponse response) {
89-
return GoogleAuthProvider.getCredential(response.getIdpToken(), null);
95+
return builder.build();
9096
}
9197

9298
public String getName(Context context) {
@@ -100,7 +106,7 @@ public String getProviderId() {
100106

101107
@Override
102108
public void setAuthenticationCallback(IdpCallback callback) {
103-
mIDPCallback = callback;
109+
mIdpCallback = callback;
104110
}
105111

106112
public void disconnect() {
@@ -121,7 +127,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
121127
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
122128
if (result != null) {
123129
if (result.isSuccess()) {
124-
mIDPCallback.onSuccess(createIdpResponse(result.getSignInAccount()));
130+
mIdpCallback.onSuccess(createIdpResponse(result.getSignInAccount()));
125131
} else {
126132
onError(result);
127133
}
@@ -138,21 +144,26 @@ public void startLogin(Activity activity) {
138144
}
139145

140146
private void onError(GoogleSignInResult result) {
141-
String errorMessage = result.getStatus().getStatusMessage();
142-
onError(result.getStatus().getStatusCode() + " " + errorMessage);
147+
Status status = result.getStatus();
148+
149+
if (status.getStatusCode() == CommonStatusCodes.INVALID_ACCOUNT) {
150+
mGoogleApiClient.stopAutoManage(mActivity);
151+
mGoogleApiClient.disconnect();
152+
mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
153+
.enableAutoManage(mActivity, GoogleApiHelper.getSafeAutoManageId(), this)
154+
.addApi(Auth.GOOGLE_SIGN_IN_API, getSignInOptions(null))
155+
.build();
156+
startLogin(mActivity);
157+
} else {
158+
onError(status.getStatusCode() + " " + status.getStatusMessage());
159+
}
143160
}
144161

145162
private void onError(String errorMessage) {
146163
Log.e(TAG, "Error logging in with Google. " + errorMessage);
147164
Bundle extra = new Bundle();
148165
extra.putString(ERROR_KEY, errorMessage);
149-
mIDPCallback.onFailure(extra);
150-
}
151-
152-
@Override
153-
public void onClick(View view) {
154-
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
155-
startLogin(mActivity);
166+
mIdpCallback.onFailure(extra);
156167
}
157168

158169
@Override

0 commit comments

Comments
 (0)