Created
April 14, 2017 23:26
-
-
Save mitchtabian/d54eb3b4190092080304995cbf31e8da to your computer and use it in GitHub Desktop.
Firebase-Google-Sign-In
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:id="@+id/main_layout" | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:background="@color/blue_grey_700" | |
android:orientation="vertical" | |
android:weightSum="4" | |
tools:context=".SignInActivity"> | |
<LinearLayout | |
android:layout_width="match_parent" | |
android:layout_height="0dp" | |
android:layout_weight="3" | |
android:gravity="center_horizontal" | |
android:orientation="vertical"> | |
<ImageView | |
android:id="@+id/google_icon" | |
android:layout_width="48dp" | |
android:layout_height="48dp" | |
android:layout_marginBottom="10dp" | |
android:layout_marginTop="15dp" | |
android:contentDescription="@string/desc_google_icon" | |
android:src="@mipmap/googleg_color" /> | |
<TextView | |
android:id="@+id/title_text" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_marginBottom="10dp" | |
android:text="@string/title_text" | |
android:gravity="center" | |
android:textColor="@android:color/white" | |
android:textSize="36sp" /> | |
<TextView | |
android:id="@+id/status" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:text="@string/signed_out" | |
android:textColor="@android:color/white" | |
android:textSize="14sp" /> | |
<TextView | |
android:id="@+id/detail" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:fadeScrollbars="true" | |
android:gravity="center" | |
android:maxLines="5" | |
android:padding="10dp" | |
android:scrollbars="vertical" | |
android:textColor="@android:color/white" | |
android:textSize="14sp" /> | |
<Button | |
android:id="@+id/button_optional_action" | |
style="@style/Base.Widget.AppCompat.Button.Borderless.Colored" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:visibility="gone" | |
tools:text="Optional Action" | |
tools:visibility="visible" /> | |
</LinearLayout> | |
<RelativeLayout | |
android:layout_width="fill_parent" | |
android:layout_height="0dp" | |
android:layout_weight="1" | |
android:background="@color/blue_grey_900"> | |
<com.google.android.gms.common.SignInButton | |
android:id="@+id/sign_in_button" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_centerInParent="true" | |
android:visibility="visible" | |
tools:visibility="gone" /> | |
<LinearLayout | |
android:id="@+id/sign_out_and_disconnect" | |
android:layout_width="fill_parent" | |
android:layout_height="wrap_content" | |
android:layout_centerInParent="true" | |
android:orientation="horizontal" | |
android:paddingLeft="16dp" | |
android:paddingRight="16dp" | |
android:visibility="gone" | |
tools:visibility="visible"> | |
<Button | |
android:id="@+id/sign_out_button" | |
android:layout_width="0dp" | |
android:layout_height="wrap_content" | |
android:layout_weight="1" | |
android:text="@string/sign_out" | |
android:theme="@style/ThemeOverlay.MyDarkButton" /> | |
<Button | |
android:id="@+id/disconnect_button" | |
android:layout_width="0dp" | |
android:layout_height="wrap_content" | |
android:layout_weight="1" | |
android:text="@string/disconnect" | |
android:theme="@style/ThemeOverlay.MyDarkButton" /> | |
</LinearLayout> | |
</RelativeLayout> | |
</LinearLayout> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.tabian.firebasegooglesignin; | |
import android.app.ProgressDialog; | |
import android.content.Intent; | |
import android.os.Bundle; | |
import android.support.v7.app.AppCompatActivity; | |
import android.util.Log; | |
import android.view.View; | |
import android.widget.TextView; | |
import com.google.android.gms.auth.api.Auth; | |
import com.google.android.gms.auth.api.signin.GoogleSignInAccount; | |
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; | |
import com.google.android.gms.auth.api.signin.GoogleSignInResult; | |
import com.google.android.gms.common.ConnectionResult; | |
import com.google.android.gms.common.SignInButton; | |
import com.google.android.gms.common.api.GoogleApiClient; | |
import com.google.android.gms.common.api.OptionalPendingResult; | |
import com.google.android.gms.common.api.ResultCallback; | |
import com.google.android.gms.common.api.Status; | |
/** | |
* Activity to demonstrate basic retrieval of the Google user's ID, email address, and basic | |
* profile. | |
*/ | |
public class SignInActivity extends AppCompatActivity implements | |
GoogleApiClient.OnConnectionFailedListener, | |
View.OnClickListener { | |
private static final String TAG = "SignInActivity"; | |
private static final int RC_SIGN_IN = 9001; | |
private GoogleApiClient mGoogleApiClient; | |
private TextView mStatusTextView; | |
private ProgressDialog mProgressDialog; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_sign_in); | |
// Views | |
mStatusTextView = (TextView) findViewById(R.id.status); | |
// Button listeners | |
findViewById(R.id.sign_in_button).setOnClickListener(this); | |
findViewById(R.id.sign_out_button).setOnClickListener(this); | |
findViewById(R.id.disconnect_button).setOnClickListener(this); | |
// [START configure_signin] | |
// Configure sign-in to request the user's ID, email address, and basic | |
// profile. ID and basic profile are included in DEFAULT_SIGN_IN. | |
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) | |
.requestEmail() | |
.build(); | |
// [END configure_signin] | |
// [START build_client] | |
// Build a GoogleApiClient with access to the Google Sign-In API and the | |
// options specified by gso. | |
mGoogleApiClient = new GoogleApiClient.Builder(this) | |
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) | |
.addApi(Auth.GOOGLE_SIGN_IN_API, gso) | |
.build(); | |
// [END build_client] | |
// [START customize_button] | |
// Set the dimensions of the sign-in button. | |
SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button); | |
signInButton.setSize(SignInButton.SIZE_STANDARD); | |
// [END customize_button] | |
} | |
@Override | |
public void onStart() { | |
super.onStart(); | |
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); | |
if (opr.isDone()) { | |
// If the user's cached credentials are valid, the OptionalPendingResult will be "done" | |
// and the GoogleSignInResult will be available instantly. | |
Log.d(TAG, "Got cached sign-in"); | |
GoogleSignInResult result = opr.get(); | |
handleSignInResult(result); | |
} else { | |
// If the user has not previously signed in on this device or the sign-in has expired, | |
// this asynchronous branch will attempt to sign in the user silently. Cross-device | |
// single sign-on will occur in this branch. | |
showProgressDialog(); | |
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { | |
@Override | |
public void onResult(GoogleSignInResult googleSignInResult) { | |
hideProgressDialog(); | |
handleSignInResult(googleSignInResult); | |
} | |
}); | |
} | |
} | |
// [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) { | |
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); | |
handleSignInResult(result); | |
} | |
} | |
// [END onActivityResult] | |
// [START handleSignInResult] | |
private void handleSignInResult(GoogleSignInResult result) { | |
Log.d(TAG, "handleSignInResult:" + result.isSuccess()); | |
if (result.isSuccess()) { | |
// Signed in successfully, show authenticated UI. | |
GoogleSignInAccount acct = result.getSignInAccount(); | |
mStatusTextView.setText(getString(R.string.signed_in_fmt, acct.getDisplayName())); | |
updateUI(true); | |
} else { | |
// Signed out, show unauthenticated UI. | |
updateUI(false); | |
} | |
} | |
// [END handleSignInResult] | |
// [START signIn] | |
private void signIn() { | |
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); | |
startActivityForResult(signInIntent, RC_SIGN_IN); | |
} | |
// [END signIn] | |
// [START signOut] | |
private void signOut() { | |
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( | |
new ResultCallback<Status>() { | |
@Override | |
public void onResult(Status status) { | |
// [START_EXCLUDE] | |
updateUI(false); | |
// [END_EXCLUDE] | |
} | |
}); | |
} | |
// [END signOut] | |
// [START revokeAccess] | |
private void revokeAccess() { | |
Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback( | |
new ResultCallback<Status>() { | |
@Override | |
public void onResult(Status status) { | |
// [START_EXCLUDE] | |
updateUI(false); | |
// [END_EXCLUDE] | |
} | |
}); | |
} | |
// [END revokeAccess] | |
@Override | |
public void onConnectionFailed(ConnectionResult connectionResult) { | |
// An unresolvable error has occurred and Google APIs (including Sign-In) will not | |
// be available. | |
Log.d(TAG, "onConnectionFailed:" + connectionResult); | |
} | |
private void showProgressDialog() { | |
if (mProgressDialog == null) { | |
mProgressDialog = new ProgressDialog(this); | |
mProgressDialog.setMessage(getString(R.string.loading)); | |
mProgressDialog.setIndeterminate(true); | |
} | |
mProgressDialog.show(); | |
} | |
private void hideProgressDialog() { | |
if (mProgressDialog != null && mProgressDialog.isShowing()) { | |
mProgressDialog.hide(); | |
} | |
} | |
private void updateUI(boolean signedIn) { | |
if (signedIn) { | |
findViewById(R.id.sign_in_button).setVisibility(View.GONE); | |
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.VISIBLE); | |
} else { | |
mStatusTextView.setText(R.string.signed_out); | |
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); | |
findViewById(R.id.sign_out_and_disconnect).setVisibility(View.GONE); | |
} | |
} | |
@Override | |
public void onClick(View v) { | |
switch (v.getId()) { | |
case R.id.sign_in_button: | |
signIn(); | |
break; | |
case R.id.sign_out_button: | |
signOut(); | |
break; | |
case R.id.disconnect_button: | |
revokeAccess(); | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment