Skip to content

Commit

Permalink
refactor openMF#2415: login,registration,update viewmodel to stateflow
Browse files Browse the repository at this point in the history
  • Loading branch information
PratyushSingh07 committed Oct 21, 2023
1 parent 94822f5 commit 2deca6f
Show file tree
Hide file tree
Showing 18 changed files with 191 additions and 139 deletions.
16 changes: 10 additions & 6 deletions app/src/main/java/org/mifos/mobile/api/DataManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import kotlinx.coroutines.flow.Flow
import okhttp3.ResponseBody
import org.mifos.mobile.api.local.DatabaseHelper
import org.mifos.mobile.api.local.PreferencesHelper
import org.mifos.mobile.models.*
import org.mifos.mobile.models.Charge
import org.mifos.mobile.models.Page
import org.mifos.mobile.models.Transaction
import org.mifos.mobile.models.UpdatePasswordPayload
import org.mifos.mobile.models.User
import org.mifos.mobile.models.accounts.loan.LoanAccount
import org.mifos.mobile.models.accounts.loan.LoanWithAssociations
import org.mifos.mobile.models.accounts.loan.LoanWithdraw
Expand Down Expand Up @@ -48,11 +52,11 @@ class DataManager @Inject constructor(
private val databaseHelper: DatabaseHelper,
) {
var clientId: Long? = preferencesHelper.clientId
suspend fun login(loginPayload: LoginPayload?): Response<User?>? {
suspend fun login(loginPayload: LoginPayload?): User {
return baseApiManager.authenticationApi.authenticate(loginPayload)
}

suspend fun clients(): Response<Page<Client?>?>? = baseApiManager.clientsApi.clients()
suspend fun clients(): Page<Client> = baseApiManager.clientsApi.clients()

suspend fun currentClient(): Client {
return baseApiManager.clientsApi.getClientForId(clientId)
Expand Down Expand Up @@ -194,11 +198,11 @@ class DataManager @Inject constructor(
return baseApiManager.thirdPartyTransferApi.makeTransfer(transferPayload)
}

suspend fun registerUser(registerPayload: RegisterPayload?): Response<ResponseBody?>? {
suspend fun registerUser(registerPayload: RegisterPayload?): ResponseBody {
return baseApiManager.registrationApi.registerUser(registerPayload)
}

suspend fun verifyUser(userVerify: UserVerify?): Response<ResponseBody?>? {
suspend fun verifyUser(userVerify: UserVerify?): ResponseBody {
return baseApiManager.registrationApi.verifyUser(userVerify)
}

Expand All @@ -225,7 +229,7 @@ class DataManager @Inject constructor(
return baseApiManager.notificationApi.getUserNotificationId(id)
}

suspend fun updateAccountPassword(payload: UpdatePasswordPayload?): Response<ResponseBody?>? {
suspend fun updateAccountPassword(payload: UpdatePasswordPayload?): ResponseBody {
return baseApiManager.userDetailsApi.updateAccountPassword(payload)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package org.mifos.mobile.api.services

import io.reactivex.Observable
import org.mifos.mobile.api.ApiEndPoints
import org.mifos.mobile.models.User
import org.mifos.mobile.models.payload.LoginPayload
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST

Expand All @@ -16,5 +14,5 @@ import retrofit2.http.POST
interface AuthenticationService {

@POST(ApiEndPoints.AUTHENTICATION)
suspend fun authenticate(@Body loginPayload: LoginPayload?): Response<User?>?
suspend fun authenticate(@Body loginPayload: LoginPayload?): User
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import retrofit2.http.Query
interface ClientService {
// This is a default call and Loads client from 0 to 200
@GET(ApiEndPoints.CLIENTS)
suspend fun clients(): Response<Page<Client?>?>?
suspend fun clients(): Page<Client>

@GET(ApiEndPoints.CLIENTS + "/{clientId}")
suspend fun getClientForId(@Path(CLIENT_ID) clientId: Long?): Client
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import retrofit2.http.POST
*/
interface RegistrationService {
@POST(ApiEndPoints.REGISTRATION)
suspend fun registerUser(@Body registerPayload: RegisterPayload?): Response<ResponseBody?>?
suspend fun registerUser(@Body registerPayload: RegisterPayload?): ResponseBody

@POST(ApiEndPoints.REGISTRATION + "/user")
suspend fun verifyUser(@Body userVerify: UserVerify?): Response<ResponseBody?>?
suspend fun verifyUser(@Body userVerify: UserVerify?): ResponseBody
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ package org.mifos.mobile.api.services
import okhttp3.ResponseBody
import org.mifos.mobile.api.ApiEndPoints
import org.mifos.mobile.models.UpdatePasswordPayload
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.PUT

/*
* Created by saksham on 13/July/2018
*/ interface UserDetailsService {
@PUT(ApiEndPoints.USER)
suspend fun updateAccountPassword(@Body payload: UpdatePasswordPayload?): Response<ResponseBody?>?
suspend fun updateAccountPassword(@Body payload: UpdatePasswordPayload?): ResponseBody
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import org.mifos.mobile.models.Page
import org.mifos.mobile.models.User
import org.mifos.mobile.models.client.Client
import retrofit2.Response

interface ClientRepository {

suspend fun loadClient(): Response<Page<Client?>?>?
suspend fun loadClient(): Flow<Page<Client>>

fun saveAuthenticationTokenForSession(user: User)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.Credentials
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.api.SelfServiceOkHttpClient
Expand All @@ -8,7 +10,6 @@ import org.mifos.mobile.models.Page
import org.mifos.mobile.models.User
import org.mifos.mobile.models.client.Client
import org.mifos.mobile.utils.Constants
import retrofit2.Response
import retrofit2.Retrofit
import javax.inject.Inject

Expand All @@ -19,8 +20,10 @@ class ClientRepositoryImp @Inject constructor(
) : ClientRepository {


override suspend fun loadClient(): Response<Page<Client?>?>? {
return dataManager.clients()
override suspend fun loadClient(): Flow<Page<Client>> {
return flow {
emit(dataManager.clients())
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import okhttp3.ResponseBody
import org.mifos.mobile.models.User
import retrofit2.Response

interface UserAuthRepository {

Expand All @@ -15,14 +15,14 @@ interface UserAuthRepository {
mobileNumber: String?,
password: String?,
username: String?
): Response<ResponseBody?>?
): Flow<ResponseBody>

suspend fun login(username: String, password: String): Response<User?>?
suspend fun login(username: String, password: String): Flow<User>

suspend fun verifyUser(authenticationToken: String?, requestId: String?): Response<ResponseBody?>?
suspend fun verifyUser(authenticationToken: String?, requestId: String?): Flow<ResponseBody>

suspend fun updateAccountPassword(
newPassword: String, confirmPassword: String
): Response<ResponseBody?>?
): Flow<ResponseBody>

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package org.mifos.mobile.repositories

import io.reactivex.Observable
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.ResponseBody
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.models.UpdatePasswordPayload
import org.mifos.mobile.models.User
import org.mifos.mobile.models.payload.LoginPayload
import org.mifos.mobile.models.register.RegisterPayload
import org.mifos.mobile.models.register.UserVerify
import retrofit2.Response
import javax.inject.Inject

class UserAuthRepositoryImp @Inject constructor(private val dataManager: DataManager) : UserAuthRepository {
class UserAuthRepositoryImp @Inject constructor(private val dataManager: DataManager) :
UserAuthRepository {

override suspend fun registerUser(
accountNumber: String?,
Expand All @@ -22,7 +23,7 @@ class UserAuthRepositoryImp @Inject constructor(private val dataManager: DataMan
mobileNumber: String?,
password: String?,
username: String?
): Response<ResponseBody?>? {
): Flow<ResponseBody> {
val registerPayload = RegisterPayload().apply {
this.accountNumber = accountNumber
this.authenticationMode = authenticationMode
Expand All @@ -33,35 +34,46 @@ class UserAuthRepositoryImp @Inject constructor(private val dataManager: DataMan
this.password = password
this.username = username
}
return dataManager.registerUser(registerPayload)
return flow {
emit(dataManager.registerUser(registerPayload))
}
}

override suspend fun login(username: String, password: String): Response<User?>? {
override suspend fun login(username: String, password: String): Flow<User> {
val loginPayload = LoginPayload().apply {
this.username = username
this.password = password
}
return dataManager.login(loginPayload)
return flow {
emit(dataManager.login(loginPayload))
}
}


override suspend fun verifyUser(authenticationToken: String?, requestId: String?): Response<ResponseBody?>? {
override suspend fun verifyUser(
authenticationToken: String?,
requestId: String?
): Flow<ResponseBody> {
val userVerify = UserVerify().apply {
this.authenticationToken = authenticationToken
this.requestId = requestId
}
return dataManager.verifyUser(userVerify)
return flow {
emit(dataManager.verifyUser(userVerify))
}
}

override suspend fun updateAccountPassword(
newPassword: String, confirmPassword: String
): Response<ResponseBody?>? {
): Flow<ResponseBody> {
val payload = UpdatePasswordPayload().apply {
this.password = newPassword
this.repeatPassword = confirmPassword
}

return dataManager.updateAccountPassword(payload)
return flow {
emit(dataManager.updateAccountPassword(payload))
}
}

}
41 changes: 25 additions & 16 deletions app/src/main/java/org/mifos/mobile/ui/activities/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@ import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import androidx.activity.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.mifos.mobile.MifosSelfServiceApp.Companion.context
import org.mifos.mobile.R
import org.mifos.mobile.databinding.ActivityLoginBinding
Expand All @@ -26,13 +30,12 @@ import org.mifos.mobile.viewModels.LoginViewModel
class LoginActivity : BaseActivity() {

private lateinit var binding: ActivityLoginBinding
private lateinit var viewModel: LoginViewModel
private val viewModel: LoginViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
viewModel = ViewModelProvider(this)[LoginViewModel::class.java]
dismissSoftKeyboardOnBkgTap(binding.nsvBackground)
binding.btnLogin.setOnClickListener {
onLoginClicked()
Expand All @@ -48,22 +51,28 @@ class LoginActivity : BaseActivity() {
onTouch(view)
}

viewModel.loginUiState.observe(this) { state ->
when (state) {
LoginUiState.Loading -> showProgress()
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.loginUiState.collect { state ->
when (state) {
LoginUiState.Loading -> showProgress()

LoginUiState.Error -> {
hideProgress()
showMessage(context?.getString(R.string.login_failed))
}
LoginUiState.Error -> {
hideProgress()
showMessage(context?.getString(R.string.login_failed))
}

LoginUiState.LoginSuccess -> {
onLoginSuccess()
}
LoginUiState.LoginSuccess -> {
onLoginSuccess()
}

is LoginUiState.LoadClientSuccess -> {
hideProgress()
showPassCodeActivity(state.clientName)
}

is LoginUiState.LoadClientSuccess -> {
hideProgress()
showPassCodeActivity(state.clientName)
LoginUiState.Initial -> {}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,17 @@ import android.view.View
import android.view.ViewGroup
import android.widget.RadioButton
import android.widget.TextView
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.hbb20.CountryCodePicker
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.mifos.mobile.R
import org.mifos.mobile.databinding.FragmentRegistrationBinding
import org.mifos.mobile.ui.activities.base.BaseActivity
import org.mifos.mobile.ui.fragments.base.BaseFragment
import org.mifos.mobile.utils.MFErrorParser
import org.mifos.mobile.utils.Network
import org.mifos.mobile.utils.PasswordStrength
import org.mifos.mobile.utils.RegistrationUiState
Expand Down Expand Up @@ -89,18 +92,24 @@ class RegistrationFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel.registrationUiState.observe(viewLifecycleOwner) { state ->
when (state) {
RegistrationUiState.Loading -> showProgress()
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.registrationUiState.collect { state ->
when (state) {
RegistrationUiState.Loading -> showProgress()

RegistrationUiState.Success -> {
hideProgress()
showRegisteredSuccessfully()
}
RegistrationUiState.Success -> {
hideProgress()
showRegisteredSuccessfully()
}

is RegistrationUiState.Error -> {
hideProgress()
showError(getString(state.exception))
}

is RegistrationUiState.Error -> {
hideProgress()
showError(getString(state.exception))
RegistrationUiState.Initial -> {}
}
}
}
}
Expand Down
Loading

0 comments on commit 2deca6f

Please sign in to comment.