Nithin reddy
Nithin reddy

Reputation: 21

void com.google.firebase.auth.FirebaseAuth$AuthStateListener.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth)' on a null object

Problem This is the code for register activity and i want to make user register and also add user name and user id details in realtimedatabase. But app gets crashed after opening register activity

Error FATAL EXCEPTION: main Process: com.example.movies4u, PID: 27945 java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.firebase.auth.FirebaseAuth$AuthStateListener.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth)' on a null object reference at com.google.firebase.auth.zzl.run(com.google.firebase:firebase-auth@@21.0.3:1) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:224) at android.app.ActivityThread.main(ActivityThread.java:7081) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)

java

package com.example.movies4u;
            import static android.content.ContentValues.TAG;
            import androidx.annotation.NonNull;
            import androidx.appcompat.app.AppCompatActivity;
                
                import android.annotation.SuppressLint;
                import android.content.Intent;
                import android.os.Bundle;
                import android.util.Log;
                import android.view.View;
                import android.view.WindowManager;
                import android.widget.Button;
                import android.widget.EditText;
                import android.widget.ProgressBar;
                import android.widget.TextView;
                import android.widget.Toast;
                
                import com.example.movies4u.Utils.FirebaseMethods;
                import com.google.android.gms.tasks.OnCompleteListener;
                import com.google.android.gms.tasks.OnFailureListener;
                import com.google.android.gms.tasks.Task;
                import com.google.firebase.auth.AuthResult;
                import com.google.firebase.auth.FirebaseAuth;
                import com.google.firebase.auth.FirebaseAuthUserCollisionException;
                import com.google.firebase.auth.FirebaseUser;
                import com.google.firebase.database.DataSnapshot;
                import com.google.firebase.database.DatabaseError;
                import com.google.firebase.database.DatabaseReference;
                import com.google.firebase.database.FirebaseDatabase;
                import com.google.firebase.database.ValueEventListener;
                
                public class activity_register extends AppCompatActivity {
                    TextView HaveAccount;
                    EditText inputUsername,inputEmail,inputPassword,inputConfirmPassword;
                    String username,email,password;
                    Button btnRegister;
                    FirebaseAuth mAuth;
                    ProgressBar pb;
                    private String userID;
                    private FirebaseAuth.AuthStateListener mAuthListener;
                    private FirebaseMethods firebaseMethods;
                    private FirebaseDatabase mFirebaseDatabase;
                    private DatabaseReference myRef;
                
                    private String append;
                
                    @SuppressLint("MissingInflatedId")
                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); //Hide status Bar
                        setContentView(R.layout.activity_register);
                        firebaseMethods =new FirebaseMethods(activity_register.this);
                
                        HaveAccount= (TextView) findViewById(R.id.HaveAccount);
                        pb = findViewById(R.id.progressBar3);
                        inputUsername=findViewById(R.id.inputUsername);
                        inputEmail=findViewById(R.id.inputEmail);
                        inputPassword=findViewById(R.id.inputPassword);
                        inputConfirmPassword=findViewById(R.id.inputConfirmPassword);
                        btnRegister=findViewById(R.id.btnRegister);
                        username=inputUsername.getText().toString();
                        email=inputEmail.getText().toString();
                        password=inputPassword.getText().toString();
                
                        pb.setVisibility(View.GONE);
                        HaveAccount.setOnClickListener(view -> {
                            Intent loginintent=new Intent(activity_register.this,login_activity.class);
                            startActivity(loginintent);
                        });
                
                        mAuth=FirebaseAuth.getInstance();
                        btnRegister.setOnClickListener(view -> ValidateDataandDoRegister());
                    }
                
                    private void ValidateDataandDoRegister() {
                        String username=inputUsername.getText().toString().trim();
                        String email=inputEmail.getText().toString().trim();
                        String password=inputPassword.getText().toString().trim();
                        String confirmPassword=inputConfirmPassword.getText().toString().trim();
                        if(email.isEmpty()){
                            inputEmail.setError("Enter Email Address");
                            inputEmail.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(email.length()<10){
                            inputEmail.setError("Enter valid Email");
                            inputEmail.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(password.isEmpty()){
                            inputPassword.setError("Enter the password");
                            inputPassword.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(password.length()<8){
                            inputPassword.setError("Password should be greater than 8 characters");
                            inputPassword.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(confirmPassword.isEmpty()){
                            inputConfirmPassword.setError("Re-Enter the Password");
                            inputConfirmPassword.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(confirmPassword.length()<8){
                            inputConfirmPassword.setError("Password should be greater than 8 characters");
                            inputConfirmPassword.requestFocus();
                            pb.setVisibility(View.GONE);
                        }
                        else if(!password.equals(confirmPassword)){
                            inputPassword.setError("Password not matched");
                            inputPassword.requestFocus();
                            inputConfirmPassword.setError("Password not matched");
                            inputConfirmPassword.requestFocus();
                            inputPassword.setText("");
                            inputConfirmPassword.setText("");
                            pb.setVisibility(View.GONE);
                        }
                        else{
                            pb.setVisibility(View.VISIBLE);
                            doRegister(username,email,password);
                        }
                    }
                
                    private void doRegister(String username,String email, String password) {
                        pb.setVisibility(View.VISIBLE);
                        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(task -> {
                            if(task.isSuccessful()){
                                userID=mAuth.getCurrentUser().getUid();
                
                //                firebaseMethods.registerNewEmail(username,email,password);
                                setupFirebaseAuth();
                                sendVerificationEmail();
                            }
                
                        }).addOnFailureListener(e -> {
                            if(e instanceof FirebaseAuthUserCollisionException){
                                btnRegister.setEnabled(true);
                                inputEmail.setError("Email Already Registered");
                                pb.setVisibility(View.GONE);
                                inputEmail.requestFocus();
                            }
                            else{
                                btnRegister.setEnabled(true);
                                pb.setVisibility(View.GONE);
                                Toast.makeText(activity_register.this, "Oops! Something Went wrong", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                
                    private void sendVerificationEmail() {
                        mAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(task -> {
                            if(task.isSuccessful()){
                                btnRegister.setEnabled(true);
                                pb.setVisibility(View.GONE);
                                Toast.makeText(activity_register.this, "Email has been sent to your email address", Toast.LENGTH_SHORT).show();
                            }
                            else {
                                btnRegister.setEnabled(true);
                                pb.setVisibility(View.GONE);
                                Toast.makeText(getApplicationContext(), "Oops! failed to send verification email",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                
                
                    /*
                    ------------------------------------ Firebase ---------------------------------------------
                     */
                
                    /**
                     * Setup the firebase auth object
                     */
                    private void setupFirebaseAuth(){
                        Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");
                
                        mAuth = FirebaseAuth.getInstance();
                        mFirebaseDatabase = FirebaseDatabase.getInstance();
                        myRef = mFirebaseDatabase.getReference();
                
                        mAuthListener = new FirebaseAuth.AuthStateListener() {
                            @Override
                            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                                FirebaseUser user = firebaseAuth.getCurrentUser();
                                if (user != null) {
                                    // User is signed in
                                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                
                                    myRef.addListenerForSingleValueEvent(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(DataSnapshot dataSnapshot) {
                                            //1st check: Make sure the username is not already in use
                                            if(firebaseMethods.checkIfUsernameExists(username, dataSnapshot)){
                                                //to randomly generate key to make sure username is unique
                                                append = myRef.push().getKey().substring(3,10);
                                                Log.d(TAG, "onDataChange: username already exists. Appending random string to name: " + append);
                                            }
                                            username = username + append;
                
                                            //add new user to the database
                                            firebaseMethods.addNewUser(email, username);
                                            Toast.makeText(activity_register.this, "SignUp successful", Toast.LENGTH_SHORT).show();
                                        }
                
                                        @Override
                                        public void onCancelled(DatabaseError databaseError) {
                                            Toast.makeText(activity_register.this, "unsuccessful", Toast.LENGTH_SHORT).show();
                                        }
                                    });
                                    finish();
                
                                } else {
                                    // User is signed out
                                    Toast.makeText(activity_register.this, "unsuccessful", Toast.LENGTH_SHORT).show();
                                    Log.d(TAG, "onAuthStateChanged:signed_out");
                                }
                                // ...
                            }
                        };
                    }
                
                    @Override
                    public void onStart() {
                        super.onStart();
                        mAuth.addAuthStateListener(mAuthListener);
                    }
                
                    @Override
                    public void onStop() {
                        super.onStop();
                        if (mAuthListener != null) {
                            mAuth.removeAuthStateListener(mAuthListener);
                        }
                    }
                }

Upvotes: 1

Views: 269

Answers (1)

Vera Iureva
Vera Iureva

Reputation: 413

Not sure, but try to replace this

 if (task.isSuccessful()) {

to that

if(task != null && task.isSuccessful()){ 

(everywhere).

Task is nullable, and can return null (Google doesn't say this in the docs.

Also add the same check for user

 if (mAuth.getCurrentUser() != null)

It could be null if user not signed in, and throw NullPointerEx when you try to call

getUid()

Upvotes: 0

Related Questions