Estou a um tempo tentando desenvolver minha tela de login no padrão MVP pra melhor entender como funciona o padrão, tenho experiencia com JavaWeb e o padrão MVC mas está sendo uma dor de cabeça montar um codigo que funcione direito no padrão MVP.
Codigo da Activity Login
package com.vinitcc.dicarona;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.vinitcc.dicarona.Login.LoginInterface;
import com.vinitcc.dicarona.Login.LoginPresenter;
public class LoginActivity extends AppCompatActivity implements LoginInterface.View {
private Button btn_mostraSenha, btn_login;
private EditText mEmail;
private EditText mSenha;
private LoginInterface.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btn_mostraSenha = findViewById(R.id.btn_mostraSenha);
mSenha = findViewById(R.id.editText_senha);
btn_login = findViewById(R.id.btn_login);
mEmail = findViewById(R.id.editText_Email);
presenter = new LoginPresenter(this);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lidaLogin();
}
});
}
@Override
public void lidaLogin() {
if(!eValidoEmail()){
Toast.makeText(this, "Email Inválido", Toast.LENGTH_SHORT).show();
}else if(!eValidoSenha()){
Toast.makeText(this, "Senha Inválida", Toast.LENGTH_SHORT).show();
}else{
presenter.toLogin(mEmail.getText().toString(),mSenha.getText().toString());
}
}
@Override
public void onLogin() {
Toast.makeText(this, "Logado com sucesso", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(String erro) {
Toast.makeText(this, "Não foi possivel realizar o Login: "+erro, Toast.LENGTH_SHORT).show();
}
@Override
public boolean eValidoEmail() {
return Patterns.EMAIL_ADDRESS.matcher(mEmail.getText().toString()).matches();
}
@Override
public boolean eValidoSenha() {
if(TextUtils.isEmpty(mSenha.getText().toString()) || mSenha.getText().toString().length()<4){
Toast.makeText(this, "Senha Inválida", Toast.LENGTH_SHORT).show();
mSenha.setError("Senha Inválida");
return false;
}else{
return true;
}
}
}
Presenter do Login
package com.vinitcc.dicarona.Login;
import com.vinitcc.dicarona.LoginActivity;
import com.vinitcc.dicarona.Modelo.Cliente;
public class LoginPresenter implements LoginInterface.Presenter, LoginInterface.TaskListener {
private LoginInterface.Model model;
private LoginInterface.View view;
public LoginPresenter(LoginActivity loginActivity) {
this.model = model;
this.view = view;
}
@Override
public void onDestroy() {
view = null;
}
@Override
public void toLogin(String email, String senha) {
model.doLogin(email,senha);
}
@Override
public void onSuccess() {
if(view!=null){
view.onLogin();}
}
@Override
public void onError(String erro) {
if(view!=null){
view.onError(erro);}
}
}
E por ultimo o meu Modelo que cuida da logica
package com.vinitcc.dicarona.Login;
import androidx.annotation.NonNull;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.vinitcc.dicarona.Modelo.Cliente;
public class LoginModel implements LoginInterface.Model {
private LoginInterface.TaskListener listener;
private FirebaseAuth auth;
public LoginModel(LoginInterface.TaskListener listener, FirebaseAuth auth) {
this.listener = listener;
this.auth = auth;
}
@Override
public void doLogin(String email, String senha) {
auth.signInWithEmailAndPassword(email,senha).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
//populaVariavel();
listener.onSuccess();
}else if (task.getException()!=null){
listener.onError(task.getException().getMessage());
}else{
listener.onError("nunsei");
}
}
});
}
@Override
public void populaVariavel() {
}
}
Vim da Java Web e nunca tive contato com o MVP, estou tendo dificuldade em me adaptar.
O codigo resulta nesse crash, que acreido que diz que o metodo está vindo com valores nulos, no caso, a mSenha e o mEmail:
java.lang.NullPointerException: Attempt to invoke interface method 'void com.vinitcc.dicarona.Login.LoginInterface$Model.doLogin(java.lang.String, java.lang.String)' on a null object reference
at com.vinitcc.dicarona.Login.LoginPresenter.toLogin(LoginPresenter.java:22)
at com.vinitcc.dicarona.LoginActivity.lidaLogin(LoginActivity.java:49)
at com.vinitcc.dicarona.LoginActivity$1.onClick(LoginActivity.java:37)
at android.view.View.performClick(View.java:6608)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View.performClickInternal(View.java:6585)
at android.view.View.access$3100(View.java:785)
at android.view.View$PerformClick.run(View.java:25921)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6864)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)