-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSignWithGoogle.java
More file actions
120 lines (99 loc) · 3.76 KB
/
SignWithGoogle.java
File metadata and controls
120 lines (99 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// package [your own package];
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.tasks.Task;
import static android.app.Activity.RESULT_OK;
public class SignWithGoogle {
public final String ERROR_TAG="GOOGLE_SIGN_IN_DEBUG";
private int REQUEST_CODE;
public final int DEFAULT_REQUEST_CODE=77;
private GoogleSignInClient client;
private SignIn signInCallback;
private Context context;
public interface SignOut{
void before(@Nullable GoogleSignInAccount account);
void after(@NonNull Status status, @NonNull Task<Void> task);
}
public interface SignIn{
void doSignIn(@NonNull Intent SignInIntent, final int REQUEST_CODE);
void after(@NonNull Status status,@Nullable GoogleSignInAccount account);
}
public SignWithGoogle(@NonNull Context context)
{
super();
this.context=context;
this.REQUEST_CODE=DEFAULT_REQUEST_CODE;
}
public SignWithGoogle(@NonNull Context context, int REQUEST_CODE)
{
super();
this.context=context;
this.REQUEST_CODE=REQUEST_CODE;
}
public SignWithGoogle build(){
GoogleSignInOptions options=new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestProfile()
.build();
buildWithOptions(options);
return this;
}
public void buildWithOptions(@NonNull GoogleSignInOptions options)
{
client= GoogleSignIn.getClient(context
,options);
}
public void signIn(@NonNull SignIn callback){
setSignInCallback(callback);
if(getSignedAccount()!=null) {
signInCallback.after(new Status(CommonStatusCodes.SUCCESS),getSignedAccount());
}
else {
Intent signInIntent=client.getSignInIntent();
signInCallback.doSignIn(signInIntent,REQUEST_CODE);
}
}
private void setSignInCallback(@NonNull SignIn callback)
{
signInCallback=callback;
}
public GoogleSignInAccount getSignedAccount() {
return GoogleSignIn.getLastSignedInAccount(context);
}
public void signOut(@NonNull final SignOut callback) {
GoogleSignInAccount account=GoogleSignIn.getLastSignedInAccount(context);
callback.before(account);
if(client!=null){
Task<Void> task=client.signOut();
callback.after(new Status(CommonStatusCodes.SUCCESS),task);
}
}
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(resultCode==RESULT_OK)
{
if(requestCode==REQUEST_CODE)
{
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
}
private void handleSignInResult(Task<GoogleSignInAccount> task) {
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
if(signInCallback!=null)signInCallback.after(new Status(CommonStatusCodes.SUCCESS),account);
} catch (ApiException e) {
Log.e(ERROR_TAG, "signInResult:failed code=" + e.getStatusCode());
}
}
}