Skip to content

Instantly share code, notes, and snippets.

@amoozeshbebin
Created December 2, 2023 16:48
Show Gist options
  • Save amoozeshbebin/25f5ec0c49271c877509635ae604c16d to your computer and use it in GitHub Desktop.
Save amoozeshbebin/25f5ec0c49271c877509635ae604c16d to your computer and use it in GitHub Desktop.
MVP
MainActivity:
package com.iliyadev.mvp.main
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import com.iliyadev.mvp.R
import com.iliyadev.mvp.login.LoginActivity
class MainActivity : AppCompatActivity(),MainContract.MainView {
private lateinit var presenter: MainContract.MainPresenter
private lateinit var btn_login:Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
bindViews()
presenter = MainPresenterImpl(this)
btn_login.setOnClickListener {
presenter.handleLoginButton()
}
}
private fun bindViews(){
btn_login = findViewById(R.id.btn_login)
}
override fun showLoginView() {
startActivity(Intent(this, LoginActivity::class.java))
}
}
MainContract interface:
package com.iliyadev.mvp.main
interface MainContract {
interface MainView {
fun showLoginView()
}
interface MainPresenter {
fun handleLoginButton()
}
}
MainPresenterImpl:
package com.iliyadev.mvp.main
class MainPresenterImpl(private var view:MainContract.MainView) : MainContract.MainPresenter {
override fun handleLoginButton() {
view.showLoginView()
}
}
LoginPresenterImpl:
package com.iliyadev.mvp.login
import com.iliyadev.mvp.login.data.LoginInteractor
import com.iliyadev.mvp.login.data.UserCrenedtial
import com.iliyadev.mvp.main.MainContract
class LoginPresenterImpl(
private val view:LoginContract.LoginView,
) : LoginContract.LoginPresenter {
private val interactor = LoginInteractor(this)
override fun doLogin(userCrenedtial: UserCrenedtial) {
view.showLoading()
interactor.login(userCrenedtial)
}
override fun onError(message: String) {
view.hideLoading()
view.onError(message)
}
override fun onSuccess() {
view.hideLoading()
view.onSuccess()
}
}
LoginContract Interface:
package com.iliyadev.mvp.login
import com.iliyadev.mvp.login.data.UserCrenedtial
interface LoginContract {
interface LoginView {
fun onError(message: String)
fun onSuccess()
fun showLoading()
fun hideLoading()
}
interface LoginPresenter {
fun doLogin(userCrenedtial: UserCrenedtial)
fun onError(message: String)
fun onSuccess()
}
}
LoginActivity:
package com.iliyadev.mvp.login
import android.app.ProgressDialog
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.Toast
import com.google.android.material.button.MaterialButton
import com.iliyadev.mvp.R
import com.iliyadev.mvp.login.data.UserCrenedtial
class LoginActivity : AppCompatActivity(), LoginContract.LoginView {
private lateinit var txtusername: EditText
private lateinit var txtpaswword: EditText
private lateinit var btnSignin: MaterialButton
private lateinit var progressBar: ProgressBar
private lateinit var presenter: LoginContract.LoginPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
init()
}
private fun init() {
bindView()
presenter = LoginPresenterImpl(this)
// Initially hide the ProgressBar
progressBar.visibility = View.GONE
btnSignin.setOnClickListener {
// Show the ProgressBar when the login button is clicked
showLoading()
val username = txtusername.text.toString()
val password = txtpaswword.text.toString()
val userCredential = UserCrenedtial(username, password)
presenter.doLogin(userCredential)
}
}
private fun bindView() {
txtusername = findViewById(R.id.txtUsername)
txtpaswword = findViewById(R.id.txtPassword)
btnSignin = findViewById(R.id.logBTN)
progressBar = findViewById(R.id.progressBar)
}
override fun onError(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
hideLoading()
}
override fun onSuccess() {
Toast.makeText(this, "Login Successfully!", Toast.LENGTH_LONG).show()
hideLoading()
}
override fun showLoading() {
progressBar.visibility = View.VISIBLE
btnSignin.visibility = View.GONE
}
override fun hideLoading() {
progressBar.visibility = View.GONE
btnSignin.visibility = View.VISIBLE
}
}
UserCredential:
package com.iliyadev.mvp.login.data
class UserCrenedtial(val username:String,var password:String) {
}
LoginInteractor:
package com.iliyadev.mvp.login.data
import android.os.Handler
import android.os.Looper
import com.iliyadev.mvp.login.LoginContract
class LoginInteractor(private val presenter: LoginContract.LoginPresenter) {
fun login(userCrenedtial: UserCrenedtial) {
if (hasError(userCrenedtial)) {
return
}
// Simulate an asynchronous operation (e.g., API call)
Handler(Looper.getMainLooper()).postDelayed({
// Check credentials against a server or perform any other operation
if (userCrenedtial.username == "admin" && userCrenedtial.password == "123") {
presenter.onSuccess()
} else {
presenter.onError("Incorrect username or password")
}
}, 2000) // Simulating a delay of 2 seconds, adjust as needed
}
private fun hasError(userCrenedtial: UserCrenedtial): Boolean {
if (userCrenedtial.username.isEmpty() || userCrenedtial.password.isEmpty()) {
presenter.onError("Please enter a username and password")
return true
}
return false
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment