From 8b46dc18d919b7bc770ea38aeb1c9c8b2f889fc2 Mon Sep 17 00:00:00 2001 From: Aditya-gupta99 Date: Fri, 12 Jul 2024 00:55:56 +0530 Subject: [PATCH] refactor: refactor Group list fragment to compose --- .../java/com/mifos/core/data/di/DataModule.kt | 7 +- .../data/repository}/GroupListRepository.kt | 2 +- .../repository_imp}/GroupListRepositoryImp.kt | 3 +- .../use_cases/GetGroupsByCenterUseCase.kt | 41 ++++ .../core/domain/use_cases/GetGroupsUseCase.kt | 40 ++++ .../center_group_list/GroupListScreen.kt | 218 ++++++++++++++++++ .../center_group_list/GroupListUiState.kt | 15 ++ .../center_group_list/GroupListViewModel.kt | 58 +++++ .../center/src/main/res/values/strings.xml | 6 + .../injection/module/RepositoryModule.kt | 7 - .../online/grouplist/GroupListFragment.kt | 107 ++------- .../online/grouplist/GroupListUiState.kt | 20 -- .../online/grouplist/GroupListViewModel.kt | 67 ------ 13 files changed, 410 insertions(+), 181 deletions(-) rename {mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist => core/data/src/main/java/com/mifos/core/data/repository}/GroupListRepository.kt (88%) rename {mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist => core/data/src/main/java/com/mifos/core/data/repository_imp}/GroupListRepositoryImp.kt (86%) create mode 100644 core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsByCenterUseCase.kt create mode 100644 core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsUseCase.kt create mode 100644 feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListScreen.kt create mode 100644 feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListUiState.kt create mode 100644 feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListViewModel.kt delete mode 100644 mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListUiState.kt delete mode 100644 mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListViewModel.kt diff --git a/core/data/src/main/java/com/mifos/core/data/di/DataModule.kt b/core/data/src/main/java/com/mifos/core/data/di/DataModule.kt index 81e3b4444f5..6f40eab51f8 100644 --- a/core/data/src/main/java/com/mifos/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/mifos/core/data/di/DataModule.kt @@ -10,6 +10,7 @@ import com.mifos.core.data.repository.ClientIdentifiersRepository import com.mifos.core.data.repository.CreateNewCenterRepository import com.mifos.core.data.repository.DocumentListRepository import com.mifos.core.data.repository.GroupDetailsRepository +import com.mifos.core.data.repository.GroupListRepository import com.mifos.core.data.repository.GroupsListRepository import com.mifos.core.data.repository.LoanAccountRepository import com.mifos.core.data.repository.NewIndividualCollectionSheetRepository @@ -25,6 +26,7 @@ import com.mifos.core.data.repository_imp.ClientIdentifiersRepositoryImp import com.mifos.core.data.repository_imp.CreateNewCenterRepositoryImp import com.mifos.core.data.repository_imp.DocumentListRepositoryImp import com.mifos.core.data.repository_imp.GroupDetailsRepositoryImp +import com.mifos.core.data.repository_imp.GroupListRepositoryImp import com.mifos.core.data.repository_imp.GroupsListRepositoryImpl import com.mifos.core.data.repository_imp.LoanAccountRepositoryImp import com.mifos.core.data.repository_imp.NewIndividualCollectionSheetRepositoryImp @@ -80,10 +82,13 @@ abstract class DataModule { @Binds internal abstract fun bindReportDetailRepository(impl: ReportDetailRepositoryImp): ReportDetailRepository - + @Binds internal abstract fun bindLoanAccountRepository(impl: LoanAccountRepositoryImp): LoanAccountRepository @Binds internal abstract fun bindDocumentListRepository(impl: DocumentListRepositoryImp): DocumentListRepository + + @Binds + internal abstract fun bindGroupListRepository(impl: GroupListRepositoryImp): GroupListRepository } \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepository.kt b/core/data/src/main/java/com/mifos/core/data/repository/GroupListRepository.kt similarity index 88% rename from mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepository.kt rename to core/data/src/main/java/com/mifos/core/data/repository/GroupListRepository.kt index d0fb243ddce..83290394012 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepository.kt +++ b/core/data/src/main/java/com/mifos/core/data/repository/GroupListRepository.kt @@ -1,4 +1,4 @@ -package com.mifos.mifosxdroid.online.grouplist +package com.mifos.core.data.repository import com.mifos.core.objects.group.CenterWithAssociations import com.mifos.core.objects.group.GroupWithAssociations diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepositoryImp.kt b/core/data/src/main/java/com/mifos/core/data/repository_imp/GroupListRepositoryImp.kt similarity index 86% rename from mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepositoryImp.kt rename to core/data/src/main/java/com/mifos/core/data/repository_imp/GroupListRepositoryImp.kt index c76c28f28f7..4886df554a6 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListRepositoryImp.kt +++ b/core/data/src/main/java/com/mifos/core/data/repository_imp/GroupListRepositoryImp.kt @@ -1,5 +1,6 @@ -package com.mifos.mifosxdroid.online.grouplist +package com.mifos.core.data.repository_imp +import com.mifos.core.data.repository.GroupListRepository import com.mifos.core.network.DataManager import com.mifos.core.objects.group.CenterWithAssociations import com.mifos.core.objects.group.GroupWithAssociations diff --git a/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsByCenterUseCase.kt b/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsByCenterUseCase.kt new file mode 100644 index 00000000000..18d95fbb19e --- /dev/null +++ b/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsByCenterUseCase.kt @@ -0,0 +1,41 @@ +package com.mifos.core.domain.use_cases + +import com.mifos.core.common.utils.Resource +import com.mifos.core.data.repository.GroupListRepository +import com.mifos.core.objects.group.CenterWithAssociations +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers +import javax.inject.Inject + +class GetGroupsByCenterUseCase @Inject constructor(private val repository: GroupListRepository) { + + suspend operator fun invoke(id: Int): Flow> = callbackFlow { + try { + trySend(Resource.Loading()) + repository.getGroupsByCenter(id) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() { + } + + override fun onError(e: Throwable) { + trySend(Resource.Error(e.message.toString())) + } + + override fun onNext(centerWithAssociations: CenterWithAssociations) { + trySend(Resource.Success(centerWithAssociations)) + } + }) + + awaitClose { channel.close() } + } catch (exception: Exception) { + send(Resource.Error(exception.message.toString())) + } + } + +} \ No newline at end of file diff --git a/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsUseCase.kt b/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsUseCase.kt new file mode 100644 index 00000000000..da85cb8c478 --- /dev/null +++ b/core/domain/src/main/java/com/mifos/core/domain/use_cases/GetGroupsUseCase.kt @@ -0,0 +1,40 @@ +package com.mifos.core.domain.use_cases + +import com.mifos.core.common.utils.Resource +import com.mifos.core.data.repository.GroupListRepository +import com.mifos.core.objects.group.GroupWithAssociations +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import rx.Subscriber +import rx.android.schedulers.AndroidSchedulers +import rx.schedulers.Schedulers +import javax.inject.Inject + +class GetGroupsUseCase @Inject constructor(private val repository: GroupListRepository) { + + suspend operator fun invoke(groupId: Int): Flow> = + callbackFlow { + try { + trySend(Resource.Loading()) + repository.getGroups(groupId) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(object : Subscriber() { + override fun onCompleted() {} + + override fun onError(exception: Throwable) { + trySend(Resource.Error(exception.message.toString())) + } + + override fun onNext(groupWithAssociations: GroupWithAssociations) { + trySend(Resource.Success(groupWithAssociations)) + } + }) + + awaitClose { channel.close() } + } catch (exception: Exception) { + trySend(Resource.Error(exception.message.toString())) + } + } +} \ No newline at end of file diff --git a/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListScreen.kt b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListScreen.kt new file mode 100644 index 00000000000..fd10e2189b2 --- /dev/null +++ b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListScreen.kt @@ -0,0 +1,218 @@ +package com.mifos.feature.center.center_group_list + +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.mifos.core.designsystem.component.MifosCircularProgress +import com.mifos.core.designsystem.component.MifosScaffold +import com.mifos.core.designsystem.component.MifosSweetError +import com.mifos.core.designsystem.icon.MifosIcons +import com.mifos.core.objects.client.Client +import com.mifos.core.objects.client.Status +import com.mifos.core.objects.group.CenterWithAssociations +import com.mifos.core.objects.group.Group +import com.mifos.core.ui.components.MifosEmptyUi +import com.mifos.feature.center.R + +@Composable +fun GroupListScreen( + centerId: Int, + onBackPressed: () -> Unit, + loadClientsOfGroup: (List) -> Unit +) { + + val viewModel: GroupListViewModel = hiltViewModel() + val state by viewModel.groupListUiState.collectAsStateWithLifecycle() + val groupAssociationState by viewModel.groupAssociationState.collectAsStateWithLifecycle() + var groupClicked by remember { mutableStateOf(false) } + + LaunchedEffect(key1 = groupAssociationState) { + groupAssociationState?.let { + if (groupClicked) { + loadClientsOfGroup(it.clientMembers) + } + } + } + + LaunchedEffect(key1 = Unit) { + viewModel.loadGroupByCenter(centerId) + } + + GroupListScreen( + state = state, + onBackPressed = onBackPressed, + onGroupClick = { + groupClicked = true + viewModel.loadGroups(it) + }, + onRetry = { + viewModel.loadGroupByCenter(centerId) + } + ) +} + +@Composable +fun GroupListScreen( + state: GroupListUiState, + onBackPressed: () -> Unit, + onRetry: () -> Unit, + onGroupClick: (Int) -> Unit +) { + val snackbarHostState = remember { SnackbarHostState() } + + MifosScaffold( + icon = MifosIcons.arrowBack, + title = stringResource(id = R.string.feature_center_groups), + onBackPressed = onBackPressed, + snackbarHostState = snackbarHostState + ) { paddingValues -> + Column(modifier = Modifier.padding(paddingValues)) { + when (state) { + is GroupListUiState.Error -> MifosSweetError(message = stringResource(id = state.message)) { + onRetry() + } + + is GroupListUiState.Loading -> MifosCircularProgress() + + is GroupListUiState.GroupList -> { + if (state.centerWithAssociations.groupMembers.isEmpty()) { + MifosEmptyUi( + text = stringResource(id = R.string.feature_center_no_group_list_to_show), + icon = MifosIcons.fileTask + ) + } else { + GroupListContent( + centerWithAssociations = state.centerWithAssociations, + onGroupClick = onGroupClick + ) + } + } + } + } + } +} + + +@Composable +fun GroupListContent( + centerWithAssociations: CenterWithAssociations, + onGroupClick: (Int) -> Unit +) { + LazyColumn { + items(centerWithAssociations.groupMembers) { group -> + GroupItem(group = group, onGroupClick = onGroupClick) + } + } +} + + +@Composable +fun GroupItem( + group: Group, + onGroupClick: (Int) -> Unit +) { + Card( + modifier = Modifier + .fillMaxWidth(), + shape = RoundedCornerShape(0.dp), + elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), + colors = CardDefaults.cardColors( + containerColor = Color.White + ), + onClick = { group.id?.let { onGroupClick(it) } } + ) { + Column(modifier = Modifier.padding(8.dp)) { + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + modifier = Modifier + .padding(8.dp), + text = group.name.toString(), + style = MaterialTheme.typography.bodyMedium + ) + Text( + modifier = Modifier.padding(8.dp), + text = group.officeName.toString(), + style = MaterialTheme.typography.bodyMedium, + ) + } + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + modifier = Modifier.padding(8.dp), + style = MaterialTheme.typography.bodySmall, + text = if (group.status?.value?.let { Status.isActive(it) } == true) { + stringResource(id = R.string.feature_center_active) + } else { + stringResource(id = R.string.feature_center_inactive) + } + ) + Canvas(modifier = Modifier.size(16.dp)) { + if (group.status?.value?.let { Status.isActive(it) } == true) { + drawRect(Color.Green) + } else { + drawRect(Color.Red) + } + } + } + } + } + HorizontalDivider() +} + +class GroupListUiStateProvider : PreviewParameterProvider { + + override val values: Sequence + get() = sequenceOf( + GroupListUiState.Loading, + GroupListUiState.Error(R.string.feature_center_failed_to_load_group_list), + GroupListUiState.GroupList(sampleCenterWithAssociations) + ) +} + +@Preview(showBackground = true) +@Composable +private fun GroupListScreenPreview( + @PreviewParameter(GroupListUiStateProvider::class) state: GroupListUiState +) { + GroupListScreen( + state = state, + onBackPressed = {}, + onGroupClick = {}, + onRetry = {} + ) +} + +val sampleCenterWithAssociations = CenterWithAssociations() \ No newline at end of file diff --git a/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListUiState.kt b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListUiState.kt new file mode 100644 index 00000000000..a6c11bd23fc --- /dev/null +++ b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListUiState.kt @@ -0,0 +1,15 @@ +package com.mifos.feature.center.center_group_list + +import com.mifos.core.objects.group.CenterWithAssociations + +/** + * Created by Aditya Gupta on 06/08/23. + */ +sealed class GroupListUiState { + + data object Loading : GroupListUiState() + + data class Error(val message: Int) : GroupListUiState() + + data class GroupList(val centerWithAssociations: CenterWithAssociations) : GroupListUiState() +} \ No newline at end of file diff --git a/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListViewModel.kt b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListViewModel.kt new file mode 100644 index 00000000000..9a587d6ee4a --- /dev/null +++ b/feature/center/src/main/java/com/mifos/feature/center/center_group_list/GroupListViewModel.kt @@ -0,0 +1,58 @@ +package com.mifos.feature.center.center_group_list + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.mifos.core.common.utils.Resource +import com.mifos.core.domain.use_cases.GetGroupsByCenterUseCase +import com.mifos.core.domain.use_cases.GetGroupsUseCase +import com.mifos.core.objects.group.CenterWithAssociations +import com.mifos.core.objects.group.GroupWithAssociations +import com.mifos.feature.center.R +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class GroupListViewModel @Inject constructor( + private val getGroupsUseCase: GetGroupsUseCase, + private val getGroupsByCenterUseCase: GetGroupsByCenterUseCase +) : ViewModel() { + + private val _groupListUiState = MutableStateFlow(GroupListUiState.Loading) + val groupListUiState = _groupListUiState.asStateFlow() + + private val _groupAssociationState = MutableStateFlow(null) + val groupAssociationState = _groupAssociationState.asStateFlow() + + + fun loadGroupByCenter(id: Int) = viewModelScope.launch(Dispatchers.IO) { + getGroupsByCenterUseCase(id).collect { result -> + when (result) { + is Resource.Error -> _groupListUiState.value = + GroupListUiState.Error(R.string.feature_center_failed_to_load_group_list) + + is Resource.Loading -> _groupListUiState.value = GroupListUiState.Loading + + is Resource.Success -> _groupListUiState.value = + GroupListUiState.GroupList(result.data ?: CenterWithAssociations()) + } + + } + } + + fun loadGroups(groupId: Int) = viewModelScope.launch(Dispatchers.IO) { + getGroupsUseCase(groupId).collect { result -> + when (result) { + is Resource.Error -> _groupListUiState.value = + GroupListUiState.Error(R.string.feature_center_failed_to_load_group_list) + + is Resource.Loading -> _groupListUiState.value = GroupListUiState.Loading + + is Resource.Success -> _groupAssociationState.value = result.data + } + } + } +} \ No newline at end of file diff --git a/feature/center/src/main/res/values/strings.xml b/feature/center/src/main/res/values/strings.xml index 4d2d7c081e6..a0db4c1e969 100644 --- a/feature/center/src/main/res/values/strings.xml +++ b/feature/center/src/main/res/values/strings.xml @@ -42,4 +42,10 @@ Select Office Activate Center Created Successfully + + Failed to load Group List + Active + InActive + Groups + No Group List to Show \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt index 4c5937e2260..79fc0813c81 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/injection/module/RepositoryModule.kt @@ -80,8 +80,6 @@ import com.mifos.mifosxdroid.online.generatecollectionsheet.GenerateCollectionSh import com.mifos.mifosxdroid.online.generatecollectionsheet.GenerateCollectionSheetRepositoryImp import com.mifos.mifosxdroid.online.groupdetails.GroupDetailsRepository import com.mifos.mifosxdroid.online.groupdetails.GroupDetailsRepositoryImp -import com.mifos.mifosxdroid.online.grouplist.GroupListRepository -import com.mifos.mifosxdroid.online.grouplist.GroupListRepositoryImp import com.mifos.mifosxdroid.online.grouploanaccount.GroupLoanAccountRepository import com.mifos.mifosxdroid.online.grouploanaccount.GroupLoanAccountRepositoryImp import com.mifos.mifosxdroid.online.groupslist.GroupsListRepository @@ -146,11 +144,6 @@ class RepositoryModule { return CenterListRepositoryImp(dataManagerCenter) } - @Provides - fun providesGroupListRepository(dataManager: DataManager): GroupListRepository { - return GroupListRepositoryImp(dataManager) - } - @Provides fun providesClientDetailsRepository(dataManagerClient: DataManagerClient): ClientDetailsRepository { return ClientDetailsRepositoryImp(dataManagerClient) diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListFragment.kt index aa569fb87ce..5710809fdb0 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListFragment.kt @@ -8,40 +8,22 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.AdapterView -import android.widget.Toast -import androidx.lifecycle.ViewModelProvider +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.mifos.core.objects.client.Client -import com.mifos.core.objects.group.CenterWithAssociations -import com.mifos.core.objects.group.GroupWithAssociations import com.mifos.core.objects.navigation.ClientListArgs -import com.mifos.mifosxdroid.R -import com.mifos.mifosxdroid.adapters.GroupListAdapter -import com.mifos.mifosxdroid.core.ProgressableFragment -import com.mifos.mifosxdroid.databinding.FragmentGroupListBinding +import com.mifos.feature.center.center_group_list.GroupListScreen import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class GroupListFragment : ProgressableFragment(), - AdapterView.OnItemClickListener { +class GroupListFragment : Fragment() { - private lateinit var binding: FragmentGroupListBinding private val arg: GroupListFragmentArgs by navArgs() - - private lateinit var viewModel: GroupListViewModel - - private var mGroupListAdapter: GroupListAdapter? = null - private var mCenterWithAssociations: CenterWithAssociations? = null private var centerId = 0 - override fun onItemClick(parent: AdapterView<*>?, view: View, position: Int, id: Long) { - mCenterWithAssociations!!.groupMembers[position].id?.let { - viewModel.loadGroups( - it - ) - } - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -53,73 +35,30 @@ class GroupListFragment : ProgressableFragment(), container: ViewGroup?, savedInstanceState: Bundle? ): View { - binding = FragmentGroupListBinding.inflate(inflater, container, false) - viewModel = ViewModelProvider(this)[GroupListViewModel::class.java] - setToolbarTitle(resources.getString(R.string.title_center_list)) - binding.lvGroupList.onItemClickListener = this - inflateGroupList() - - viewModel.groupListUiState.observe(viewLifecycleOwner) { - when (it) { - is GroupListUiState.ShowFetchingError -> { - showProgressbar(false) - showFetchingError(it.message) - } - - is GroupListUiState.ShowGroups -> { - showProgressbar(false) - showGroups(it.groupWithAssociations) - } - - is GroupListUiState.ShowProgress -> showProgressbar(it.state) - is GroupListUiState.ShowGroupList -> { - showProgressbar(false) - showGroupList(it.centerWithAssociations) - } - } - } - - return binding.root - } - - private fun inflateGroupList() { - viewModel.loadGroupByCenter(centerId) - } - - private fun showGroupList(centerWithAssociations: CenterWithAssociations?) { - if (centerWithAssociations != null) { - if (centerWithAssociations.groupMembers.isEmpty()) { - showEmptyGroups(R.string.empty_groups) - } else { - mCenterWithAssociations = centerWithAssociations - mGroupListAdapter = GroupListAdapter( - requireActivity(), - centerWithAssociations.groupMembers + return ComposeView(requireContext()).apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + GroupListScreen( + centerId = centerId, + onBackPressed = { + findNavController().popBackStack() + }, + loadClientsOfGroup = { + loadClientsOfGroup(it) + } ) - binding.lvGroupList.adapter = mGroupListAdapter } } } - private fun showGroups(groupWithAssociations: GroupWithAssociations?) { - if (groupWithAssociations != null) loadClientsOfGroup( - groupWithAssociations - .clientMembers - ) - } - - private fun showFetchingError(s: String?) { - Toast.makeText(activity, s, Toast.LENGTH_SHORT).show() - } - - private fun showEmptyGroups(message: Int) { - binding.viewFlipper.visibility = View.GONE - binding.llError.visibility = View.VISIBLE - binding.noGroupsText.text = getStringMessage(message) + override fun onResume() { + super.onResume() + (requireActivity() as AppCompatActivity).supportActionBar?.hide() } - private fun showProgressbar(b: Boolean) { - showProgress(b) + override fun onStop() { + super.onStop() + (requireActivity() as AppCompatActivity).supportActionBar?.show() } private fun loadClientsOfGroup(clientList: List) { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListUiState.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListUiState.kt deleted file mode 100644 index 3d2b5745b4f..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListUiState.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.mifos.mifosxdroid.online.grouplist - -import com.mifos.core.objects.group.CenterWithAssociations -import com.mifos.core.objects.group.GroupWithAssociations - -/** - * Created by Aditya Gupta on 06/08/23. - */ -sealed class GroupListUiState { - - data class ShowProgress(val state: Boolean) : GroupListUiState() - - data class ShowFetchingError(val message: String) : GroupListUiState() - - data class ShowGroups(val groupWithAssociations: GroupWithAssociations?) : GroupListUiState() - - data class ShowGroupList(val centerWithAssociations: CenterWithAssociations?) : - GroupListUiState() - -} \ No newline at end of file diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListViewModel.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListViewModel.kt deleted file mode 100644 index 0165e0dcae3..00000000000 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/grouplist/GroupListViewModel.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.mifos.mifosxdroid.online.grouplist - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import com.mifos.core.objects.group.CenterWithAssociations -import com.mifos.core.objects.group.GroupWithAssociations -import dagger.hilt.android.lifecycle.HiltViewModel -import rx.Subscriber -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers -import javax.inject.Inject - -/** - * Created by Aditya Gupta on 06/08/23. - */ -@HiltViewModel -class GroupListViewModel @Inject constructor(private val repository: GroupListRepository) : - ViewModel() { - - private val _groupListUiState = MutableLiveData() - - val groupListUiState: LiveData - get() = _groupListUiState - - - fun loadGroups(groupId: Int) { - _groupListUiState.value = GroupListUiState.ShowProgress(true) - repository.getGroups(groupId) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() { - } - - override fun onError(e: Throwable) { - _groupListUiState.value = - GroupListUiState.ShowFetchingError("Failed to load Groups") - } - - override fun onNext(groupWithAssociations: GroupWithAssociations?) { - _groupListUiState.value = GroupListUiState.ShowGroups(groupWithAssociations) - } - }) - } - - fun loadGroupByCenter(id: Int) { - _groupListUiState.value = GroupListUiState.ShowProgress(true) - repository.getGroupsByCenter(id) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(object : Subscriber() { - override fun onCompleted() { - } - - override fun onError(e: Throwable) { - _groupListUiState.value = - GroupListUiState.ShowFetchingError("Failed to load GroupList") - } - - override fun onNext(centerWithAssociations: CenterWithAssociations?) { - _groupListUiState.value = GroupListUiState.ShowGroupList(centerWithAssociations) - } - }) - } - -} \ No newline at end of file