Native Mobile App Development With Java

Android MVP Login Example

15-Sep-2024

How to implement the Model-View-Presenter (MVP) pattern for a login screen in Android Studio using Java


1/  Create A New Project .



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="@color/black">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/emailEditText"
android:layout_width="match_parent"
android:layout_height="60dp"
android:hint="user: user@gmail.com"
android:textColorHint="@color/white"
android:layout_marginTop="45dp"
android:padding="20dp"
android:textColor="@color/white"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:inputType="textEmailAddress" />

<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/passwordEditText"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginTop="25dp"
android:hint="password : 123456"
android:textColorHint="@color/white"
android:padding="20dp"
android:textColor="@color/white"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:inputType="textPassword" />

<androidx.appcompat.widget.AppCompatButton
android:id="@+id/loginButton"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="20dp"
android:padding="18dp"
android:textSize="16sp"
android:textColor="@color/black"
android:layout_marginStart="25dp"
android:layout_marginEnd="25dp"
android:focusable="true"
android:text="Signin" />

</LinearLayout>


</RelativeLayout>


2/  Create interface LoginContract 





package com.example.mvplogintest;

public interface LoginContract {
interface View {
void showInvalidCredentialsError();
void showLoginSuccessMessage();
}

interface PresenterData {
void onLoginButtonClick(String email, String password);
}

interface ModelData{
boolean loginInfo(String userInput, String passInput);

}



}




3/  Create A New Class UserLoginModel



package com.example.mvplogintest;

public class UserLoginModel implements LoginContract.ModelData {

String userName;
String password;

public UserLoginModel(String userName, String password) {
this.userName = userName;
this.password = password;
}

@Override
public boolean loginInfo(String userInput, String passInput) {

if (userName.equals(userInput) && password.equals(passInput)){
return true;
}else {
return false;
}
}



}



4/  Create Class LoginPresenter.class


package com.example.mvplogintest;



public class LoginPresenter implements LoginContract.PresenterData {

private LoginContract.View viewIterface;

private LoginContract.ModelData model;
String user;
String pass;
public LoginPresenter(LoginContract.View view,String user,String pass) {
viewIterface = view;
this.user = user;
this.pass = pass;

model=new UserLoginModel(user,pass);
}

@Override
public void onLoginButtonClick(String userInput, String passInput) {
if (model.loginInfo(userInput,passInput)) {
viewIterface.showLoginSuccessMessage();
} else {
viewIterface.showInvalidCredentialsError();
}
}
}






5/  Then in MainActivity.






package com.example.mvplogintest;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity implements LoginContract.View{


private EditText etEmail;
private EditText etPassword;
private Button btnSigin;
private LoginPresenter loginPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);

etEmail = findViewById(R.id.emailEditText);
etPassword = findViewById(R.id.passwordEditText);
btnSigin = findViewById(R.id.loginButton);
loginPresenter = new LoginPresenter(this,"user@gmail.com","123456");

btnSigin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = etEmail.getText().toString().trim();
String password = etPassword.getText().toString().trim();

loginPresenter.onLoginButtonClick(email, password);
}
});


}

@Override
public void showInvalidCredentialsError() {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
}

@Override
public void showLoginSuccessMessage() {
Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
}
}


Run code then see output.

Comments