Skip to content

Commit

Permalink
refactor openMF#2415: notification to stateflow
Browse files Browse the repository at this point in the history
  • Loading branch information
PratyushSingh07 committed Oct 23, 2023
1 parent 0afe159 commit b64b371
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 35 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/org/mifos/mobile/api/DataManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ class DataManager @Inject constructor(

suspend fun clientLocalCharges(): Response<Page<Charge?>?> = databaseHelper.clientCharges()

fun notifications(): Flow<List<MifosNotification?>?> = databaseHelper.notifications()
fun notifications(): List<MifosNotification> = databaseHelper.notifications()

fun unreadNotificationsCount(): Int {
return databaseHelper.unreadNotificationsCount()
Expand Down
20 changes: 8 additions & 12 deletions app/src/main/java/org/mifos/mobile/api/local/DatabaseHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@ package org.mifos.mobile.api.local

import com.raizlabs.android.dbflow.sql.language.SQLite
import io.reactivex.Observable
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import org.mifos.mobile.models.Charge
import org.mifos.mobile.models.Page
import org.mifos.mobile.models.notification.MifosNotification
import org.mifos.mobile.models.notification.MifosNotification_Table
import org.mifos.mobile.utils.NotificationComparator
import retrofit2.Response
import java.util.*
import java.util.Collections
import javax.inject.Inject
import javax.inject.Singleton

Expand All @@ -36,15 +34,13 @@ class DatabaseHelper @Inject constructor() {
return Response.success(chargePage)
}

fun notifications(): Flow<List<MifosNotification?>?> {
return flow {
deleteOldNotifications()
val notifications = SQLite.select()
.from(MifosNotification::class.java)
.queryList()
Collections.sort(notifications, NotificationComparator())
emit(notifications)
}
fun notifications(): List<MifosNotification> {
deleteOldNotifications()
val notifications = SQLite.select()
.from(MifosNotification::class.java)
.queryList()
Collections.sort(notifications, NotificationComparator())
return notifications
}

fun unreadNotificationsCount(): Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ import org.mifos.mobile.models.notification.MifosNotification

interface NotificationRepository {

suspend fun loadNotifications(): Flow<List<MifosNotification?>?>
suspend fun loadNotifications(): Flow<List<MifosNotification>>

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

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.models.notification.MifosNotification
import javax.inject.Inject

class NotificationRepositoryImp @Inject constructor(private val dataManager: DataManager) :
NotificationRepository {

override suspend fun loadNotifications(): Flow<List<MifosNotification?>?> {
return dataManager.notifications()
override suspend fun loadNotifications(): Flow<List<MifosNotification>> {
return flow {
emit(dataManager.notifications())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,24 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.mifos.mobile.BuildConfig
import org.mifos.mobile.utils.NotificationUiState
import org.mifos.mobile.R
import org.mifos.mobile.databinding.FragmentNotificationBinding
import org.mifos.mobile.models.notification.MifosNotification
import org.mifos.mobile.ui.adapters.NotificationAdapter
import org.mifos.mobile.ui.fragments.base.BaseFragment
import org.mifos.mobile.utils.DividerItemDecoration
import org.mifos.mobile.utils.Network
import org.mifos.mobile.utils.NotificationUiState
import org.mifos.mobile.viewModels.NotificationViewModel
import javax.inject.Inject

Expand All @@ -29,7 +33,8 @@ import javax.inject.Inject
class NotificationFragment : BaseFragment(), OnRefreshListener {
private var _binding: FragmentNotificationBinding? = null
private val binding get() = _binding!!
private lateinit var viewModel : NotificationViewModel

private val viewModel: NotificationViewModel by viewModels()

@JvmField
@Inject
Expand All @@ -47,7 +52,6 @@ class NotificationFragment : BaseFragment(), OnRefreshListener {
): View {
_binding = FragmentNotificationBinding.inflate(inflater, container, false)
val rootView = binding.root
viewModel = ViewModelProvider(this)[NotificationViewModel::class.java]
sweetUIErrorHandler = SweetUIErrorHandler(activity, rootView)
val layoutManager = LinearLayoutManager(activity)
layoutManager.orientation = LinearLayoutManager.VERTICAL
Expand Down Expand Up @@ -105,16 +109,24 @@ class NotificationFragment : BaseFragment(), OnRefreshListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel.notificationUiState.observe(viewLifecycleOwner) { state ->
when(state) {
NotificationUiState.Loading -> showProgress()
NotificationUiState.Error -> {
hideProgress()
showError(context?.getString(R.string.notification))
}
is NotificationUiState.LoadNotificationsSuccessful -> {
hideProgress()
showNotifications(state.notifications)
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.notificationUiState.collect { state ->
when (state) {
NotificationUiState.Loading -> showProgress()

NotificationUiState.Error -> {
hideProgress()
showError(context?.getString(R.string.notification))
}

is NotificationUiState.LoadNotificationsSuccessful -> {
hideProgress()
showNotifications(state.notifications)
}

NotificationUiState.Initial -> {}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.mifos.mobile.utils
import org.mifos.mobile.models.notification.MifosNotification

sealed class NotificationUiState {
object Initial : NotificationUiState()
object Loading : NotificationUiState()
data class LoadNotificationsSuccessful(val notifications : List<MifosNotification?>) : NotificationUiState()
object Error : NotificationUiState()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.mifos.mobile.viewModels

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.launch
import org.mifos.mobile.repositories.NotificationRepository
Expand All @@ -15,8 +15,9 @@ import javax.inject.Inject
class NotificationViewModel @Inject constructor(private val notificationRepositoryImp: NotificationRepository) :
ViewModel() {

private val _notificationUiState = MutableLiveData<NotificationUiState>()
val notificationUiState: LiveData<NotificationUiState> get() = _notificationUiState
private val _notificationUiState =
MutableStateFlow<NotificationUiState>(NotificationUiState.Initial)
val notificationUiState: StateFlow<NotificationUiState> get() = _notificationUiState

fun loadNotifications() {
_notificationUiState.value = NotificationUiState.Loading
Expand All @@ -25,7 +26,7 @@ class NotificationViewModel @Inject constructor(private val notificationReposito
_notificationUiState.value = NotificationUiState.Error
}.collect { list ->
_notificationUiState.value =
list?.let { NotificationUiState.LoadNotificationsSuccessful(it) }
list.let { NotificationUiState.LoadNotificationsSuccessful(it) }
}
}
}
Expand Down

0 comments on commit b64b371

Please sign in to comment.