package com.firebase.samples.logindemo; import android.app.Activity; import android.content.Intent; import android.content.IntentSender; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import com.google.android.gms.auth.GoogleAuthException; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.auth.UserRecoverableAuthException; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.Scopes; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.plus.Plus; import java.io.IOException; /** * This is a sample GoogleOAuthActivity that has been extracted from {@link com.firebase.samples.logindemo.MainActivity} to * allow for better visibility. */ public class GoogleOAuthActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = GoogleOAuthActivity.class.getSimpleName(); /* Client used to interact with Google APIs. */ private GoogleApiClient mGoogleApiClient; /* A flag indicating that a PendingIntent is in progress and prevents us from starting further intents. */ private boolean mGoogleIntentInProgress; /* Track whether the sign-in button has been clicked so that we know to resolve all issues preventing sign-in * without waiting. */ private boolean mGoogleLoginClicked; /* Store the connection result from onConnectionFailed callbacks so that we can resolve them when the user clicks * sign-in. */ private ConnectionResult mGoogleConnectionResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN) .build(); mGoogleLoginClicked = true; if (!mGoogleApiClient.isConnecting()) { if (mGoogleConnectionResult != null) { resolveSignInError(); } else if (mGoogleApiClient.isConnected()) { getGoogleOAuthTokenAndLogin(); } else { /* connect API now */ Log.d(TAG, "Trying to connect to Google API"); mGoogleApiClient.connect(); } } } /* A helper method to resolve the current ConnectionResult error. */ private void resolveSignInError() { if (mGoogleConnectionResult.hasResolution()) { try { mGoogleIntentInProgress = true; mGoogleConnectionResult.startResolutionForResult(this, MainActivity.RC_GOOGLE_LOGIN); } catch (IntentSender.SendIntentException e) { // The intent was canceled before it was sent. Return to the default // state and attempt to connect to get an updated ConnectionResult. mGoogleIntentInProgress = false; mGoogleApiClient.connect(); } } } private void getGoogleOAuthTokenAndLogin() { /* Get OAuth token in Background */ AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { String errorMessage = null; @Override protected String doInBackground(Void... params) { String token = null; try { String scope = String.format("oauth2:%s", Scopes.PLUS_LOGIN); token = GoogleAuthUtil.getToken(GoogleOAuthActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope); } catch (IOException transientEx) { /* Network or server error */ Log.e(TAG, "Error authenticating with Google: " + transientEx); errorMessage = "Network error: " + transientEx.getMessage(); } catch (UserRecoverableAuthException e) { Log.w(TAG, "Recoverable Google OAuth error: " + e.toString()); /* We probably need to ask for permissions, so start the intent if there is none pending */ if (!mGoogleIntentInProgress) { mGoogleIntentInProgress = true; Intent recover = e.getIntent(); startActivityForResult(recover, MainActivity.RC_GOOGLE_LOGIN); } } catch (GoogleAuthException authEx) { /* The call is not ever expected to succeed assuming you have already verified that * Google Play services is installed. */ Log.e(TAG, "Error authenticating with Google: " + authEx.getMessage(), authEx); errorMessage = "Error authenticating with Google: " + authEx.getMessage(); } return token; } @Override protected void onPostExecute(String token) { mGoogleLoginClicked = false; Intent resultIntent = new Intent(); if (token != null) { resultIntent.putExtra("oauth_token", token); } else if (errorMessage != null) { resultIntent.putExtra("error", errorMessage); } setResult(MainActivity.RC_GOOGLE_LOGIN, resultIntent); finish(); } }; task.execute(); } @Override public void onConnected(final Bundle bundle) { /* Connected with Google API, use this to authenticate with Firebase */ getGoogleOAuthTokenAndLogin(); } @Override public void onConnectionFailed(ConnectionResult result) { if (!mGoogleIntentInProgress) { /* Store the ConnectionResult so that we can use it later when the user clicks on the Google+ login button */ mGoogleConnectionResult = result; if (mGoogleLoginClicked) { /* The user has already clicked login so we attempt to resolve all errors until the user is signed in, * or they cancel. */ resolveSignInError(); } else { Log.e(TAG, result.toString()); } } } @Override public void onConnectionSuspended(int i) { // ignore } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { mGoogleLoginClicked = false; } mGoogleIntentInProgress = false; if (!mGoogleApiClient.isConnecting()) { mGoogleApiClient.connect(); } } }