From 08a4eefd1659b28ce420503dacf85ee685d1edd6 Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Fri, 7 Feb 2025 15:48:08 +0100 Subject: [PATCH] Cancel loading of ratings when view is recycled So that we prevent ugly timeouts --- .../e/apps/ui/PrivacyInfoViewModel.kt | 16 ++++++++++--- .../ApplicationListRVAdapter.kt | 23 ++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt b/app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt index c01da14f4..e43c10858 100644 --- a/app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt @@ -3,7 +3,6 @@ package foundation.e.apps.ui import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.Result @@ -12,8 +11,10 @@ import foundation.e.apps.data.exodus.repositories.IAppPrivacyInfoRepository import foundation.e.apps.data.exodus.repositories.PrivacyScoreRepository import foundation.e.apps.data.application.data.Application import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject @HiltViewModel @@ -25,10 +26,19 @@ class PrivacyInfoViewModel @Inject constructor( private val singularAppPrivacyInfoLiveData: MutableLiveData> = MutableLiveData() + private val loadPrivacyInfoJobs = ConcurrentHashMap() + fun getAppPrivacyInfoLiveData(application: Application): LiveData> { - return liveData { - emit(fetchEmitAppPrivacyInfo(application)) + val privacyInfo = MutableLiveData>() + loadPrivacyInfoJobs[application.package_name] = viewModelScope.launch { + privacyInfo.value = fetchEmitAppPrivacyInfo(application) } + + return privacyInfo + } + + fun cancelAppPrivacyInfoFetch(application: Application) { + loadPrivacyInfoJobs[application.package_name]?.cancel() } fun getSingularAppPrivacyInfoLiveData(application: Application?): LiveData> { diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt index 83ab2b0b6..7ffbeecdf 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt @@ -81,9 +81,11 @@ class ApplicationListRVAdapter( var onPlaceHolderShow: (() -> Unit)? = null - inner class ViewHolder(val binding: ApplicationListItemBinding) : - RecyclerView.ViewHolder(binding.root) { + inner class ViewHolder( + val binding: ApplicationListItemBinding + ) : RecyclerView.ViewHolder(binding.root) { var isPurchasedLiveData: LiveData = MutableLiveData() + lateinit var app: Application } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -99,6 +101,7 @@ class ApplicationListRVAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val view = holder.itemView val searchApp = getItem(position) + holder.app = searchApp val shimmerDrawable = ShimmerDrawable().apply { setShimmer(shimmer) } /* @@ -151,7 +154,7 @@ class ApplicationListRVAdapter( } } - showCalculatedPrivacyScoreData(searchApp, view) + showPrivacyScoreAfterFetching(searchApp, view) } } @@ -368,7 +371,7 @@ class ApplicationListRVAdapter( } } - private fun MaterialButton.getInstallationIssueText( + private fun getInstallationIssueText( faultyAppResult: Pair, view: View ) = @@ -395,13 +398,6 @@ class ApplicationListRVAdapter( progressBarInstall.visibility = View.GONE } - private fun ApplicationListItemBinding.showCalculatedPrivacyScoreData( - searchApp: Application, - view: View - ) { - showPrivacyScoreAfterFetching(searchApp, view) - } - private fun ApplicationListItemBinding.showPrivacyScoreAfterFetching( searchApp: Application, view: View @@ -591,4 +587,9 @@ class ApplicationListRVAdapter( lifecycleOwner = null paidAppHandler = null } + + override fun onViewRecycled(holder: ViewHolder) { + privacyInfoViewModel.cancelAppPrivacyInfoFetch(holder.app) + super.onViewRecycled(holder) + } } -- GitLab