package com.jdroid.android.google.signin; import android.content.Intent; import android.support.annotation.NonNull; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.OptionalPendingResult; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.fragment.AbstractFragment; import com.jdroid.java.utils.LoggerUtils; import com.jdroid.java.utils.RandomUtils; import org.slf4j.Logger; public class GoogleSignInHelper { private static Logger LOGGER = LoggerUtils.getLogger(GoogleSignInHelper.class); private static final int RC_SIGN_IN = RandomUtils.get16BitsInt(); private GoogleApiClient googleApiClient; private AbstractFragment abstractFragment; private GoogleSignInListener googleSignInListener; public GoogleSignInHelper(AbstractFragment abstractFragment, GoogleSignInListener googleSignInListener) { this.abstractFragment = abstractFragment; this.googleSignInListener = googleSignInListener; googleApiClient = getGoogleApiClientBuilder().build(); } protected GoogleApiClient.Builder getGoogleApiClientBuilder() { GoogleApiClient.Builder builder = new GoogleApiClient.Builder(abstractFragment.getActivity()); builder.enableAutoManage(abstractFragment.getActivity(), googleSignInListener); builder.addApi(Auth.GOOGLE_SIGN_IN_API, getGoogleSignInOptionsBuilder().build()); return builder; } protected GoogleSignInOptions.Builder getGoogleSignInOptionsBuilder() { // Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions.Builder builder = new GoogleSignInOptions.Builder(); builder.requestEmail(); if (isRequestIdTokenEnabled()) { builder.requestIdToken(AbstractApplication.get().getAppContext().getServerClientId()); } if (isServerAuthCodeEnabled()) { builder.requestServerAuthCode(AbstractApplication.get().getAppContext().getServerClientId(), false); } return builder; } protected Boolean isRequestIdTokenEnabled() { return false; } protected Boolean isServerAuthCodeEnabled() { return false; } public void silentSignIn() { OptionalPendingResult<GoogleSignInResult> pendingResult = Auth.GoogleSignInApi.silentSignIn(googleApiClient); if (pendingResult.isDone()) { // If the user's cached credentials are valid, the OptionalPendingResult will be "done" // and the GoogleSignInResult will be available instantly. GoogleSignInResult result = pendingResult.get(); handleSignInResult(result); } else { // If the user has not previously signed in on this device or the sign-in has expired, // this asynchronous branch will attempt to sign in the user silently. Cross-device // single sign-on will occur in this branch. showLoading(); pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() { @Override public void onResult(@NonNull GoogleSignInResult googleSignInResult) { handleSignInResult(googleSignInResult); dismissLoading(); } }); } } protected void showLoading() { abstractFragment.showLoading(); } protected void dismissLoading() { abstractFragment.dismissLoading(); } public void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); abstractFragment.getActivity().startActivityForResult(signInIntent, RC_SIGN_IN); } public void signOut() { Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { LOGGER.debug("signOut: " + status.getStatusMessage()); if (googleSignInListener != null) { googleSignInListener.onGoogleSignOut(); } } }); } public void revokeAccess() { Auth.GoogleSignInApi.revokeAccess(googleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { LOGGER.debug("revokeAccess: " + status.getStatusMessage()); if (googleSignInListener != null) { googleSignInListener.onGoogleAccessRevoked(); } } }); } public void onActivityResult(int requestCode, int resultCode, Intent data) { // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } } private void handleSignInResult(GoogleSignInResult result) { LOGGER.debug("handleSignInResult: " + result.isSuccess()); if (result.isSuccess()) { if (googleSignInListener != null) { googleSignInListener.onGoogleSignIn(result.getSignInAccount()); } } else { if (googleSignInListener != null) { googleSignInListener.onGoogleSignOut(); } } } public void setGoogleSignInListener(GoogleSignInListener googleSignInListener) { this.googleSignInListener = googleSignInListener; } }