package com.ships.googlesigninplugin;
import org.json.JSONObject;
import org.json.JSONException;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.android.gms.auth.api.signin.*;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.OnCompleteListener;
import com.unity3d.player.UnityPlayer;
public class GoogleSignInPlugin {
private static final String TAG = "GoogleSignInPlugin";
private static final int RC_SIGN_IN = 1002;
private static GoogleSignInClient mGoogleSignInClient;
private static String unityCallbackObject = "_GoogleManagers";
public static void setWebClientId(String clientId) {
Activity activity = UnityPlayer.currentActivity;
Log.d(TAG, "setWebClientID - " + clientId);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestServerAuthCode(clientId)
.build();
mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);
}
public static void signIn() {
Activity activity = UnityPlayer.currentActivity;
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
}
public static void silentSignIn() {
Activity activity = UnityPlayer.currentActivity;
if (mGoogleSignInClient == null) {
sendResult(false, null, null, "GoogleSignInClient not initialized");
return;
}
Task<GoogleSignInAccount> task = mGoogleSignInClient.silentSignIn();
if (task.isSuccessful()) {
handleSignInResult(task);
} else {
task.addOnCompleteListener(activity, new OnCompleteListener<GoogleSignInAccount>() {
@Override
public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
if (task.isSuccessful()) {
handleSignInResult(task);
} else {
// fallback to interactive
signIn();
}
}
});
}
}
public static void handleActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "handleActivityResult");
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
} else {
Log.d(TAG, "requestCode: " + requestCode + "resultCode: " + resultCode);
}
}
public static void signOut() {
if (mGoogleSignInClient != null) {
mGoogleSignInClient.signOut();
}
}
private static void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
String email = account.getEmail();
String idToken = account.getServerAuthCode();
sendResult(true, email, idToken, null);
} catch (ApiException e) {
Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
sendResult(false, null, null, e.getMessage());
}
}
private static void sendResult(boolean success, String email, String idToken, String error) {
try {
JSONObject json = new JSONObject();
json.put("success", success);
json.put("email", email != null ? email : JSONObject.NULL);
json.put("idToken", idToken != null ? idToken : JSONObject.NULL);
Log.d(TAG, json.toString());
UnityPlayer.UnitySendMessage(unityCallbackObject, "GoogleLoginResult", json.toString());
} catch (Exception e) {
Log.d(TAG, "Error sending result to Unity", e);
}
}
private static void handleAccount(GoogleSignInAccount account) throws JSONException {
JSONObject jsonObject = new JSONObject();
if (account != null) {
String email = account.getEmail();
String idToken = account.getIdToken();
String id = account.getId();
jsonObject.put("success", true);
jsonObject.put("email", email);
jsonObject.put("idToken", idToken);
Log.d(TAG, "Result: " + jsonObject.toString());
UnityPlayer.UnitySendMessage(unityCallbackObject, "GoogleLoginResult", jsonObject.toString());
} else {
jsonObject.put("success", false);
jsonObject.put("email", "Account is null");
Log.d(TAG, "Result: " + jsonObject.toString());
UnityPlayer.UnitySendMessage(unityCallbackObject, "GoogleLoginResult", jsonObject.toString());
}
}
}