1313import android .widget .ProgressBar ;
1414import android .widget .TextView ;
1515
16- import com .facebook .AccessToken ;
1716import com .facebook .CallbackManager ;
1817import com .facebook .FacebookCallback ;
1918import com .facebook .FacebookException ;
2019import com .facebook .login .LoginResult ;
2120import 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 ;
2228import com .twitter .sdk .android .Twitter ;
2329import com .twitter .sdk .android .core .Callback ;
2430import com .twitter .sdk .android .core .Result ;
2733import com .twitter .sdk .android .core .TwitterSession ;
2834import com .twitter .sdk .android .core .identity .TwitterLoginButton ;
2935
30- import net .servicestack .android . AndroidServiceClient ;
36+ import net .servicestack .client . JsonUtils ;
3137import net .servicestack .client .Log ;
3238
39+ import java .io .IOException ;
40+
3341import 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 (){
0 commit comments