Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement login activity architecture using android architecture components?

I understand how to use ViewModel, Repositories and Room for transfer data from database to screen. But how implement login activity with POST method. Do I need create LiveData isAuthorized from ViewModel or AuthorizationRepository? Can anyone show example about using command methods with android architecture components?

like image 601
Алексей Мальченко Avatar asked Nov 08 '22 10:11

Алексей Мальченко


1 Answers

This can be your login class, maybe extending ViewModel, so it keeps alive on configuration changes:

 class LoginClass
    {
        var loginEvent = SingleLiveEvent<LoginEvent>()
        fun startLogin(user: String, password: String)
        {
            loginEvent.value= LoginEvent(LoginStatus.LoginStart,null,null)
            launch(UI) { 
                try{
                    bg{
                        //do login process
                    }.await()
                    loginEvent.value= LoginEvent(LoginStatus.LoginOk,null,null)
                }
                catch (error: Exception){
                    loginEvent.value= LoginEvent(LoginStatus.LoginFailed,error.message,null)
                }
            }
        }
        data class LoginEvent(var loginStatus: LoginStatus, var errorMessage: String?, var loginExtraData: Any?) 
        enum class LoginStatus
        {
            LoginStart,
            LoginOk,
            LoginFailed
        }
    }

You can observe the login status to react and change your UI accordingly:

val myLoginClass = LoginClass()
myLoginClass.loginEvent.observe(this@LifecycleOwner, Observer {
    if(it==null)
        return@Observer
    when(it.loginStatus)
    {

        LoginClass.LoginStatus.LoginStart -> {
            //show indeterinate progress bar, disable inputs, etc
        }
        LoginClass.LoginStatus.LoginOk -> {
            //go to logged in activity
        }

        LoginClass.LoginStatus.LoginFailed -> {
            //show login failed toast, hide progress bar, enable input, etc
        }
    }
})

To start login simply call the login method of your class:

loginButton.onClick {
    myLoginClass.startLogin("user", "password")
}

Logically, you will need more than this, but you can use it as a skeleton.

SingleLiveEvent can be found here: https://github.com/googlesamples/android-architecture/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java

like image 151
Raymond Arteaga Avatar answered Dec 14 '22 00:12

Raymond Arteaga