Android app crashing instead of showing the Toast and throwing IllegalArgumentException

Viewed 116

I made a simple app with a LoginActivity. It is crashing and throwing an IllegalArgumentException if the EditText(s) are empty. I use Firebase Authentication. I tried by using assert but still it did not work.

Dummy credentials to reproduce the issue:

Email: abc@abc.com

Password: 123456

StartActivity.java

import android.app.ProgressDialog;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import android.content.Intent;
import android.app.Activity;
import android.content.SharedPreferences;

import java.util.Objects;

    public class StartActivity extends AppCompatActivity {


    private static final String TAG = "EmailPassword";
    private FirebaseAuth mAuth;

    private LinearLayout linear1;
    private TextInputLayout textinputlayout1;
    private TextInputLayout textinputlayout2;
    private TextInputEditText edittext1;
    private TextInputEditText edittext2;
    private Button button1;
    private TextView textview1;
    private Intent i =new Intent();
    private SharedPreferences user;
    private ProgressDialog prog;
    private OnCompleteListener<AuthResult> _mAuth_sign_in_listener;
    private void reload(){}
    private void updateUI(FirebaseUser user){}


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAuth = FirebaseAuth.getInstance();
        setContentView(R.layout.activity_start);

        LinearLayout _nav_view = (LinearLayout) findViewById(R.id._nav_view);
        TextInputLayout textinputlayout1 = findViewById(R.id.textinputlayout1);
        TextInputLayout textinputlayout2 = findViewById(R.id.textinputlayout2);
        edittext1 = findViewById(R.id.edittext1);
        edittext2 = findViewById(R.id.edittext2);
        Button button1 = findViewById(R.id.button1);
        TextView textview1 = findViewById(R.id.textview1);
        SharedPreferences user = getSharedPreferences("user", Activity.MODE_PRIVATE);
        Intent i= new Intent();
        textview1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                i.setClass(getApplicationContext(), ForgotPassword.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(i);
            }
        });
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signIn();
            }
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser != null) {
            i.setClass(getApplicationContext(), MainActivity.class);
            startActivity(i);
        }
    }

    private void signIn(){

                    Toast.makeText(StartActivity.this,"Button clicked",Toast.LENGTH_SHORT).show();
                    String email=Objects.requireNonNull(edittext1.getText()).toString();
                    String password= Objects.requireNonNull(edittext2.getText()).toString();
                    if(edittext1!=null && edittext2!=null){
                        final ProgressDialog prog= new ProgressDialog(StartActivity.this);prog.setMax(100);prog.setMessage("Logging in...");prog.setIndeterminate(true);prog.setCancelable(true);
                        prog.show();
                        mAuth.signInWithEmailAndPassword(email,password).addOnCompleteListener(StartActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                final boolean success= task.isSuccessful();
                                if(success){
                                    i.setClass(getApplicationContext(),MainActivity.class);
                                    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(i);
                                    prog.cancel();
                                }
                                else{
                                    final String error=task.getException()!=null?task.getException().getMessage():"";
                                    prog.cancel();
                                    Toast.makeText(StartActivity.this,""+error,Toast.LENGTH_LONG).show();
                                }
                            }
                        });
                    }
                    else {
                        prog.cancel();
                        Toast.makeText(getApplicationContext(),"Email/Password cannot be empty!", Toast.LENGTH_SHORT).show();
                    }
                }

    public void onClick(View view) {
    }
}

MainActivity.java

package com.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toolbar;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private Toolbar toolbar1;
    private Button button2;
    private LinearLayout linear2;
    private Intent i=new Intent();
    private FirebaseUser user;
    private TextView textview5;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user= mAuth.getCurrentUser();
        setContentView(R.layout.activity_main);
        Toolbar toolbar1=findViewById(R.id.toolbar1);
        LinearLayout linear2=findViewById(R.id.linear2);
        textview5=findViewById(R.id.textview5);
        Button button2=findViewById(R.id.button2);

        assert user != null;
        textview5.setText(user.getEmail());
         button2.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 FirebaseAuth.getInstance().signOut();
                 i.setClass(getApplicationContext(),StartActivity.class);
                 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                 startActivity(i);
             }
         });
         toolbar1.setNavigationOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 onBackPressed();
             }
         });
    }
}

Screenshot of the crash

enter image description here

1 Answers

You are getting IllegalArgumentException because you let the user sign in with empty credentials. This is happening because you checking against nullity the EditText objects and not the actual values:

if(edittext1!=null && edittext2!=null) { ... }

Which is not correct. You should check if the values that are inserted by the user are different than the empty String. The following if statement should do the trick:

if(!email.isEmpty() && !password.isEmpty()) { ... }

It would be also better if you display a message to the user when the email or the password is empty.

Related