/** * Copyright 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.firebase.quickstart.auth.java; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import androidx.annotation.NonNull; 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.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.android.material.snackbar.Snackbar; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; import com.google.firebase.quickstart.auth.R; import com.google.firebase.quickstart.auth.databinding.ActivityGoogleBinding; /** * Demonstrate Firebase Authentication using a Google ID Token. */ public class GoogleSignInActivity extends BaseActivity implements View.OnClickListener { private static final String TAG = "GoogleActivity"; private static final int RC_SIGN_IN = 9001; // [START declare_auth] private FirebaseAuth mAuth; // [END declare_auth] private GoogleSignInClient mGoogleSignInClient; private ActivityGoogleBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = ActivityGoogleBinding.inflate(getLayoutInflater()); setContentView(mBinding.getRoot()); setProgressBar(mBinding.progressBar); // Button listeners mBinding.signInButton.setOnClickListener(this); mBinding.signOutButton.setOnClickListener(this); mBinding.disconnectButton.setOnClickListener(this); // [START config_signin] // Configure Google Sign In GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); // [END config_signin] mGoogleSignInClient = GoogleSignIn.getClient(this, gso); // [START initialize_auth] // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance(); // [END initialize_auth] } // [START on_start_check_user] @Override public void onStart() { super.onStart(); // Check if user is signed in (non-null) and update UI accordingly. FirebaseUser currentUser = mAuth.getCurrentUser(); updateUI(currentUser); } // [END on_start_check_user] // [START onactivityresult] @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { // Google Sign In was successful, authenticate with Firebase GoogleSignInAccount account = task.getResult(ApiException.class); Log.d(TAG, "firebaseAuthWithGoogle:" + account.getId()); firebaseAuthWithGoogle(account.getIdToken()); } catch (ApiException e) { // Google Sign In failed, update UI appropriately Log.w(TAG, "Google sign in failed", e); // [START_EXCLUDE] updateUI(null); // [END_EXCLUDE] } } } // [END onactivityresult] // [START auth_with_google] private void firebaseAuthWithGoogle(String idToken) { // [START_EXCLUDE silent] showProgressBar(); // [END_EXCLUDE] AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithCredential:success"); FirebaseUser user = mAuth.getCurrentUser(); updateUI(user); } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithCredential:failure", task.getException()); Snackbar.make(mBinding.mainLayout, "Authentication Failed.", Snackbar.LENGTH_SHORT).show(); updateUI(null); } // [START_EXCLUDE] hideProgressBar(); // [END_EXCLUDE] } }); } // [END auth_with_google] // [START signin] private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); } // [END signin] private void signOut() { // Firebase sign out mAuth.signOut(); // Google sign out mGoogleSignInClient.signOut().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { updateUI(null); } }); } private void revokeAccess() { // Firebase sign out mAuth.signOut(); // Google revoke access mGoogleSignInClient.revokeAccess().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { updateUI(null); } }); } private void updateUI(FirebaseUser user) { hideProgressBar(); if (user != null) { mBinding.status.setText(getString(R.string.google_status_fmt, user.getEmail())); mBinding.detail.setText(getString(R.string.firebase_status_fmt, user.getUid())); mBinding.signInButton.setVisibility(View.GONE); mBinding.signOutAndDisconnect.setVisibility(View.VISIBLE); } else { mBinding.status.setText(R.string.signed_out); mBinding.detail.setText(null); mBinding.signInButton.setVisibility(View.VISIBLE); mBinding.signOutAndDisconnect.setVisibility(View.GONE); } } @Override public void onClick(View v) { int i = v.getId(); if (i == R.id.signInButton) { signIn(); } else if (i == R.id.signOutButton) { signOut(); } else if (i == R.id.disconnectButton) { revokeAccess(); } } }