Add Google Auth example + auto Sign In · binary2015nov/AndroidJavaChat@4fdac94 · GitHub
Skip to content

Commit 4fdac94

Browse files
committed
Add Google Auth example + auto Sign In
1 parent 23117ec commit 4fdac94

5 files changed

Lines changed: 114 additions & 5 deletions

File tree

src/androidchat/app/build.gradle

Lines changed: 5 additions & 2 deletions

src/androidchat/app/src/main/java/servicestack/net/androidchat/App.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ public dtos.Authenticate getSavedAccessToken(){
6363
.setRememberMe(true);
6464
}
6565

66+
String googleAccessToken = prefs.getString("google.AccessToken", null);
67+
if (googleAccessToken != null){
68+
return new dtos.Authenticate()
69+
.setProvider("GoogleOAuth")
70+
.setAccessToken(googleAccessToken)
71+
.setRememberMe(true);
72+
}
73+
6674
String twitterAccessToken = prefs.getString("twitter.AccessToken", null);
6775
String twitterAccessSecret = prefs.getString("twitter.AccessTokenSecret", null);
6876

@@ -83,12 +91,19 @@ public void saveTwitterAccessToken(TwitterAuthToken authToken){
8391
editor.apply();
8492
}
8593

94+
public void saveGoogleAccessToken(String accessToken){
95+
SharedPreferences.Editor editor = prefs.edit();
96+
editor.putString("google.AccessToken", accessToken);
97+
editor.apply();
98+
}
99+
86100
public void logout(){
87101
App.get().getServiceClient().clearCookies(); //Logout server
88102

89103
LoginManager.getInstance().logOut(); //Logout facebook
90104

91-
SharedPreferences.Editor editor = prefs.edit(); //Logout twitter
105+
SharedPreferences.Editor editor = prefs.edit(); //Logout google + twitter
106+
editor.remove("google.AccessToken");
92107
editor.remove("twitter.AccessToken");
93108
editor.remove("twitter.AccessTokenSecret");
94109
editor.apply();

src/androidchat/app/src/main/java/servicestack/net/androidchat/LoginButtonsActivity.java

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,18 @@
1313
import android.widget.ProgressBar;
1414
import android.widget.TextView;
1515

16-
import com.facebook.AccessToken;
1716
import com.facebook.CallbackManager;
1817
import com.facebook.FacebookCallback;
1918
import com.facebook.FacebookException;
2019
import com.facebook.login.LoginResult;
2120
import com.facebook.login.widget.LoginButton;
21+
import com.google.android.gms.auth.api.Auth;
22+
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
23+
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
24+
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
25+
import com.google.android.gms.common.SignInButton;
26+
import com.google.android.gms.common.api.GoogleApiClient;
27+
import com.google.gson.JsonObject;
2228
import com.twitter.sdk.android.Twitter;
2329
import com.twitter.sdk.android.core.Callback;
2430
import com.twitter.sdk.android.core.Result;
@@ -27,10 +33,18 @@
2733
import com.twitter.sdk.android.core.TwitterSession;
2834
import com.twitter.sdk.android.core.identity.TwitterLoginButton;
2935

30-
import net.servicestack.android.AndroidServiceClient;
36+
import net.servicestack.client.JsonUtils;
3137
import net.servicestack.client.Log;
3238

39+
import java.io.IOException;
40+
3341
import io.fabric.sdk.android.Fabric;
42+
import okhttp3.Call;
43+
import okhttp3.FormBody;
44+
import okhttp3.OkHttpClient;
45+
import okhttp3.Request;
46+
import okhttp3.RequestBody;
47+
import okhttp3.Response;
3448

3549
/**
3650
* This Login Page signs in using Facebook and Twitter's SDK Buttons
@@ -45,6 +59,8 @@ public class LoginButtonsActivity extends AppCompatActivity {
4559
private LoginButton btnFacebookLogin;
4660
private CallbackManager facebookCallback;
4761
private Button btnGuestLogin;
62+
GoogleApiClient googleApiClient;
63+
private static final int RC_SIGN_IN = 9001;
4864

4965
@Override
5066
protected void onCreate(Bundle savedInstanceState) {
@@ -142,6 +158,20 @@ public void onError(FacebookException exception) {
142158
}
143159
});
144160

161+
SignInButton btnGoogleSignIn = (SignInButton) findViewById(R.id.sign_in_button);
162+
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
163+
.requestEmail()
164+
.requestServerAuthCode(getResources().getString(R.string.google_key))
165+
.build();
166+
googleApiClient = new GoogleApiClient.Builder(this)
167+
.enableAutoManage(this, r -> { /* Handle On Connection Failed...*/ })
168+
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
169+
.build();
170+
btnGoogleSignIn.setOnClickListener(v -> {
171+
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
172+
startActivityForResult(signInIntent, RC_SIGN_IN);
173+
});
174+
145175
Button btnGuestLogin = (Button)findViewById(R.id.btnGuestLogin);
146176
btnGuestLogin.setOnClickListener(view -> {
147177
UiHelpers.setStatus(txtStatus, "Opening chat as guest...");
@@ -171,6 +201,59 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
171201
super.onActivityResult(requestCode, resultCode, data);
172202
btnTwitterLogin.onActivityResult(requestCode, resultCode, data);
173203
facebookCallback.onActivityResult(requestCode, resultCode, data);
204+
if (requestCode == RC_SIGN_IN) {
205+
handleGoogleSignInResult(Auth.GoogleSignInApi.getSignInResultFromIntent(data));
206+
}
207+
}
208+
209+
private void handleGoogleSignInResult(GoogleSignInResult result) {
210+
if (result.isSuccess()) {
211+
GoogleSignInAccount acct = result.getSignInAccount();
212+
UiHelpers.setStatus(txtStatus, "Local google sign-in successful, signing into server...");
213+
214+
Activity activity = this;
215+
OkHttpClient client = new OkHttpClient();
216+
RequestBody requestBody = new FormBody.Builder()
217+
.add("grant_type", "authorization_code")
218+
.add("client_id", getResources().getString(R.string.google_key))
219+
.add("client_secret", getResources().getString(R.string.google_secret))
220+
.add("redirect_uri","")
221+
.add("code", acct.getServerAuthCode())
222+
.build();
223+
Request request = new Request.Builder()
224+
.url("https://www.googleapis.com/oauth2/v4/token")
225+
.post(requestBody)
226+
.build();
227+
client.newCall(request).enqueue(new okhttp3.Callback() {
228+
@Override
229+
public void onFailure(Call call, IOException e) {
230+
UiHelpers.setStatus(txtStatus, "Failed to retrieve AccessToken from Google");
231+
}
232+
233+
@Override
234+
public void onResponse(Call call, Response response) throws IOException {
235+
String json = response.body().string();
236+
JsonObject obj = JsonUtils.toJsonObject(json);
237+
String accessToken = obj.get("access_token").getAsString();
238+
App.get().saveGoogleAccessToken(accessToken);
239+
240+
App.get().getServiceClient().postAsync(new dtos.Authenticate()
241+
.setProvider("GoogleOAuth")
242+
.setAccessToken(accessToken)
243+
.setRememberMe(true),
244+
r -> {
245+
UiHelpers.setStatus(txtStatus, "Server google sign-in successful, opening chat...");
246+
Intent intent = new Intent(activity, MainActivity.class);
247+
stopProgressBar();
248+
startActivity(intent);
249+
},
250+
error -> {
251+
UiHelpers.setStatusError(txtStatus, "Server google sign-in failed", error);
252+
stopProgressBar();
253+
});
254+
}
255+
});
256+
}
174257
}
175258

176259
private void startProgressBar(){

src/androidchat/app/src/main/res/layout/login_buttons.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
android:layout_marginTop="30dp"
3535
android:layout_marginBottom="30dp" />
3636

37+
<com.google.android.gms.common.SignInButton
38+
android:id="@+id/sign_in_button"
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content" />
41+
3742
<Button
3843
android:text="Guest Login"
3944
android:layout_width="wrap_content"

src/androidchat/app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions

0 commit comments

Comments
 (0)