Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save CMingTseng/7454db2af26d25797c12cc79a6671ef4 to your computer and use it in GitHub Desktop.
Save CMingTseng/7454db2af26d25797c12cc79a6671ef4 to your computer and use it in GitHub Desktop.
This is an example of Android development with MVP + Interactor in Kotlin
interface LoginContracts {
interface View {
fun presentHomeScreen(user: User)
fun showError(message: String)
}
interface Presenter {
fun onDestroy()
fun onLoginButtonPressed(username: String, password: String)
}
interface Interactor {
fun unregister()
fun login(username: String, password: String)
}
interface InteractorOutput {
fun onLoginSuccess(user: User)
fun onLoginError(message: String)
}
}
class LoginActivity: BaseActivity, LoginContracts.View {
var presenter: LoginContracts.Presenter? = null
//other fields
override fun onCreate() {
//...
presenter = LoginPresenter(this)
loginButton.setOnClickListener { onLoginButtonClicked() }
//...
}
override fun onDestroy() {
presenter?.onDestroy()
presenter = null
super.onDestroy()
}
private fun onLoginButtonClicked() {
presenter?.onLoginButtonClicked(usernameEditText.text, passwordEditText.text)
}
fun presentHomeScreen(user: User) {
val intent = Intent(view, HomeActivity::class.java)
intent.putExtra(Constants.IntentExtras.USER, user)
startActivity(intent)
}
fun showError(message: String) {
//shows the error on a dialog
}
}
class LoginPresenter(var view: LoginContract.View?): LoginContract.Presenter, LoginContract.InteractorOutput {
var interactor: LoginContract.Interactor? = LoginInteractor(this)
fun onDestroy() {
view = null
interactor?.unregister()
interactor = null
}
fun onLoginButtonPressed(username: String, password: String) {
interactor?.login(username, password)
}
fun onLoginSuccess(user: User) {
view?.presentNextScreen(user)
}
fun onLoginError(message: String) {
view?.showError(message)
}
}
class LoginInteractor(var output: LoginContract.InteractorOutput?): LoginContract.Interactor {
fun unregister() {
output = null
}
fun login(username: String, password: String) {
LoginApiManager.login(username, password)
?.subscribeOn(Schedulers.newThread())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe({ user ->
//does something with the user, like saving it or the token
output?.onLoginSuccess(user)
},
{ throwable -> output?.onLoginError(throwable.message ?: "Error!") })
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment