1

Im using google and facebook firebase Authentication in my app but it's not stable, sometimes it's work but other times it doesn't, i don't know what is wrong with my code to make it not stable.

here is my code:

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.hima.sftani.R;
import com.example.hima.sftani.callback.CarAvailabilityListener;
import com.example.hima.sftani.database.FirebaseHandler;
import com.example.hima.sftani.util.Connection;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
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.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.GoogleAuthProvider;

import butterknife.Bind;
import butterknife.BindDrawable;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {

@Bind(R.id.email_login) EditText email;
@Bind(R.id.password_login) EditText password;
@Bind(R.id.main_activity_progress_bar) ProgressBar progressBar;
@Bind(R.id.link_signup) TextView signupLink;
@BindDrawable(R.drawable.ic_error_24dp) Drawable errorIcon;
@Bind(R.id.googlebtn) SignInButton mGoogleBtn;

private String mEmail,mPassword;
private static final int RC_SIGN_IN = 1;
private GoogleApiClient mGoogleApiClient;
private FirebaseAuth mAuth;
private ProgressDialog mProgressDialog;
private  LoginButton loginButton;

private CallbackManager mCallbackManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(getApplicationContext());
    AppEventsLogger.activateApp(this);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    mProgressDialog = new ProgressDialog(this);
    mAuth = FirebaseAuth.getInstance();
    mProgressDialog.setMessage("Please Wait");
    if (FirebaseAuth.getInstance().getCurrentUser()!=null){
        mProgressDialog.show();
        FirebaseHandler.checkEmailAvailability(FirebaseAuth.getInstance().getCurrentUser().getEmail(),  new CarAvailabilityListener() {
            @Override
            public void onSearchCompleted(boolean isFounded) {
                if(isFounded){
                    startActivity(new Intent(MainActivity.this, NavigationDrawerActivity.class));
                    MainActivity.this.finish();
                    mProgressDialog.dismiss();
                }
                else{
                    startActivity(new Intent(MainActivity.this, CompleteProfile.class));
                    MainActivity.this.finish();
                    mProgressDialog.dismiss();
                }
            }
        });
    }

    errorIcon.setBounds(new Rect(0, 0, errorIcon.getIntrinsicWidth(), errorIcon.getIntrinsicHeight()));
    mCallbackManager = CallbackManager.Factory.create();
    loginButton = (LoginButton) findViewById(R.id.button_facebook_login);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.d("Login", "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());
        }

        @Override
        public void onCancel() {
            Log.d("Login", "facebook:onCancel");
            // ...
        }

        @Override
        public void onError(FacebookException error) {
            Log.d("Login", "facebook:onError", error);
            // ...
        }
    });
    signupLink.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, SignUpActivity.class));
        }
    });

    // ======= GOOGLE SIGN IN ==========
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

                }
            })
            .addApi(Auth.GOOGLE_SIGN_IN_API,gso).build();

    mGoogleBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signIn();
        }
    });
}


private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d("TAG", "firebaseAuthWithGoogle:" + acct.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d("TAG", "signInWithCredential:onComplete:" + task.isSuccessful());
                    String emailNode =task.getResult().getUser().getEmail();
                    Log.v("URI",emailNode);
                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w("TAG", "signInWithCredential", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }
                    FirebaseHandler.checkEmailAvailability(emailNode,  new CarAvailabilityListener() {
                                @Override
                                public void onSearchCompleted(boolean isFounded) {
                                    if(isFounded){
                                        startActivity(new Intent(MainActivity.this, NavigationDrawerActivity.class));
                                        MainActivity.this.finish();
                                        mProgressDialog.dismiss();
                                    }
                                    else{
                                        startActivity(new Intent(MainActivity.this, CompleteProfile.class));
                                        MainActivity.this.finish();
                                        mProgressDialog.dismiss();
                                    }
                                }
                            });

                }
            });
}

private void handleFacebookAccessToken(AccessToken token) {
    Log.d("Login", "handleFacebookAccessToken:" + token);
    mProgressDialog.show();
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d("Login", "signInWithCredential:onComplete:" + task.isSuccessful());
                    String emailNode =task.getResult().getUser().getEmail();
                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w("Login", "signInWithCredential", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        mProgressDialog.dismiss();
                    }
                    FirebaseHandler.checkEmailAvailability(emailNode,  new CarAvailabilityListener() {
                        @Override
                        public void onSearchCompleted(boolean isFounded) {
                            if(isFounded){
                                startActivity(new Intent(MainActivity.this, NavigationDrawerActivity.class));
                                MainActivity.this.finish();
                                mProgressDialog.dismiss();
                            }
                            else{
                                startActivity(new Intent(MainActivity.this, CompleteProfile.class));
                                MainActivity.this.finish();
                                mProgressDialog.dismiss();
                            }
                        }
                    });

                }
            });
}

@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) {

        mProgressDialog.show();
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            // Google Sign In was successful, authenticate with Firebase
            GoogleSignInAccount account = result.getSignInAccount();
            firebaseAuthWithGoogle(account);
        } else {
            // Google Sign In failed, update UI appropriately
            // ...
            mProgressDialog.dismiss();
        }
    }
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
}

public void login(View view) {
    if (!Connection.isNetworkAvailable(this)){
        Toast.makeText(this, "Check your internet connection!", Toast.LENGTH_SHORT).show();
    }

    else if (!isDataValid()){
        Toast.makeText(this, "All Fields required", Toast.LENGTH_SHORT).show();
    }

    else
        login();
}

private void login() {
    progressBar.setVisibility(View.VISIBLE);
    FirebaseAuth.getInstance().signInWithEmailAndPassword(mEmail,mPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()){
                progressBar.setVisibility(View.INVISIBLE);
                startActivity(new Intent(MainActivity.this,NavigationDrawerActivity.class));
                MainActivity.this.finish();
            }
            else {
                Toast.makeText(MainActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                progressBar.setVisibility(View.INVISIBLE);
            }
        }
    });
}

private boolean isDataValid() {
    mEmail = email.getText().toString().trim();
    mPassword =password.getText().toString();

    if(mEmail.equals(""))
        email.setError("Required",errorIcon);
    if(mPassword.equals(""))
        password.setError("Required",errorIcon);

    return !(mEmail.equals("")||mPassword.equals(""));
}



}
  • When GoogleSignIn fails, what are the failure indications? Is `GoogleSignInResult.isSuccess()` false? If so, what is `GoogleSignInResult.getStatus()`? – Bob Snyder Dec 04 '16 at 03:46
  • @qbix sorry for late response, when i put this line`Log.v("REsult",result.getStatus().toString() );` it gave me that log `Status{statusCode=DEVELOPER_ERROR, resolution=null}` – Ibrahim Abousalem Dec 05 '16 at 15:37
  • The description of that status code in the [documentation](https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes) is "The application is misconfigured". When [others see this error](http://stackoverflow.com/q/37421518/4815718), it often means there is something wrong with the SHA1 fingerprint in the `google-services.json` file. That doesn't explain your situation, since you indicate the same version of your app works sometimes but not others. – Bob Snyder Dec 05 '16 at 15:49

0 Answers0