From c7d3cd73c12380285a0fd84237fd3055dded5d5b Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 20 Jul 2023 18:37:27 +0530 Subject: [PATCH] DetailsMoreFragment: Drop dependency upon kovenant Signed-off-by: Aayush Gupta --- .../view/ui/details/DetailsMoreFragment.kt | 75 +++++++++---------- .../viewmodel/details/DetailsMoreViewModel.kt | 35 +++++++++ 2 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt diff --git a/app/src/main/java/com/aurora/store/view/ui/details/DetailsMoreFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/DetailsMoreFragment.kt index f19378e7c..6d2767062 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/DetailsMoreFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/DetailsMoreFragment.kt @@ -22,6 +22,8 @@ package com.aurora.store.view.ui.details import android.os.Bundle import android.view.View import androidx.core.text.HtmlCompat +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.aurora.gplayapi.data.models.App @@ -37,9 +39,10 @@ import com.aurora.store.view.epoxy.views.details.FileViewModel_ import com.aurora.store.view.epoxy.views.details.InfoViewModel_ import com.aurora.store.view.epoxy.views.details.MoreBadgeViewModel_ import com.aurora.store.view.ui.commons.BaseFragment -import nl.komponents.kovenant.task -import nl.komponents.kovenant.ui.failUi -import nl.komponents.kovenant.ui.successUi +import com.aurora.store.viewmodel.details.DetailsMoreViewModel +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.drop +import kotlinx.coroutines.launch class DetailsMoreFragment : BaseFragment(R.layout.fragment_details_more) { @@ -47,6 +50,8 @@ class DetailsMoreFragment : BaseFragment(R.layout.fragment_details_more) { private val binding: FragmentDetailsMoreBinding get() = _binding!! + private val viewModel: DetailsMoreViewModel by viewModels() + private val args: DetailsMoreFragmentArgs by navArgs() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -60,7 +65,32 @@ class DetailsMoreFragment : BaseFragment(R.layout.fragment_details_more) { inflateDescription(args.app) inflateFiles(args.app) - fetchDependentApps(args.app) + viewModel.fetchDependentApps(view.context, args.app) + + viewLifecycleOwner.lifecycleScope.launch { + viewModel.dependentApps.collect { list -> + if (list.isNotEmpty()) { + binding.recyclerDependency.withModels { + list.filter { it.displayName.isNotEmpty() }.forEach { + add( + AppDependentViewModel_() + .id(it.id) + .app(it) + .click { _ -> openDetailsFragment(it) } + ) + } + } + } else { + binding.recyclerDependency.withModels { + add( + NoAppAltViewModel_() + .id("no_app") + .message(getString(R.string.details_no_dependencies)) + ) + } + } + } + } } override fun onDestroyView() { @@ -140,41 +170,4 @@ class DetailsMoreFragment : BaseFragment(R.layout.fragment_details_more) { } } } - - private fun fetchDependentApps(app: App) { - val authData: AuthData = AuthProvider - .with(requireContext()) - .getAuthData() - task { - AppDetailsHelper(authData) - .getAppByPackageName(app.dependencies.dependentPackages) - } successUi { - binding.recyclerDependency.withModels { - if (it.isNotEmpty()) { - it.filter { it.displayName.isNotEmpty() }.forEach { - add( - AppDependentViewModel_() - .id(it.id) - .app(it) - .click { _ -> openDetailsFragment(it) } - ) - } - } else { - add( - NoAppAltViewModel_() - .id("no_app") - .message(getString(R.string.details_no_dependencies)) - ) - } - } - } failUi { - binding.recyclerDependency.withModels { - add( - NoAppAltViewModel_() - .id("no_app") - .message(getString(R.string.details_no_dependencies)) - ) - } - } - } } diff --git a/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt new file mode 100644 index 000000000..46ccbdea8 --- /dev/null +++ b/app/src/main/java/com/aurora/store/viewmodel/details/DetailsMoreViewModel.kt @@ -0,0 +1,35 @@ +package com.aurora.store.viewmodel.details + +import android.content.Context +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.aurora.gplayapi.data.models.App +import com.aurora.gplayapi.data.models.AuthData +import com.aurora.gplayapi.helpers.AppDetailsHelper +import com.aurora.store.data.providers.AuthProvider +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch + +class DetailsMoreViewModel : ViewModel() { + + private val TAG = DetailsMoreViewModel::class.java.simpleName + + private val _dependentApps = MutableSharedFlow>() + val dependentApps = _dependentApps.asSharedFlow() + + fun fetchDependentApps(context: Context, app: App) { + viewModelScope.launch(Dispatchers.IO) { + try { + val authData: AuthData = AuthProvider.with(context).getAuthData() + _dependentApps.emit(AppDetailsHelper(authData) + .getAppByPackageName(app.dependencies.dependentPackages)) + } catch (exception: Exception) { + Log.e(TAG, "Failed to fetch dependencies", exception) + _dependentApps.emit(emptyList()) + } + } + } +}