Loading app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt +13 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -25,10 +26,19 @@ class PrivacyInfoViewModel @Inject constructor( private val singularAppPrivacyInfoLiveData: MutableLiveData<Result<AppPrivacyInfo>> = MutableLiveData() private val loadPrivacyInfoJobs = ConcurrentHashMap<String, Job>() fun getAppPrivacyInfoLiveData(application: Application): LiveData<Result<AppPrivacyInfo>> { return liveData { emit(fetchEmitAppPrivacyInfo(application)) val privacyInfo = MutableLiveData<Result<AppPrivacyInfo>>() 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<Result<AppPrivacyInfo>> { Loading app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +12 −11 Original line number Diff line number Diff line Loading @@ -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<Boolean> = MutableLiveData() lateinit var app: Application } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { Loading @@ -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) } /* Loading Loading @@ -151,7 +154,7 @@ class ApplicationListRVAdapter( } } showCalculatedPrivacyScoreData(searchApp, view) showPrivacyScoreAfterFetching(searchApp, view) } } Loading Loading @@ -368,7 +371,7 @@ class ApplicationListRVAdapter( } } private fun MaterialButton.getInstallationIssueText( private fun getInstallationIssueText( faultyAppResult: Pair<Boolean, String>, view: View ) = Loading @@ -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 Loading Loading @@ -591,4 +587,9 @@ class ApplicationListRVAdapter( lifecycleOwner = null paidAppHandler = null } override fun onViewRecycled(holder: ViewHolder) { privacyInfoViewModel.cancelAppPrivacyInfoFetch(holder.app) super.onViewRecycled(holder) } } Loading
app/src/main/java/foundation/e/apps/ui/PrivacyInfoViewModel.kt +13 −3 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -25,10 +26,19 @@ class PrivacyInfoViewModel @Inject constructor( private val singularAppPrivacyInfoLiveData: MutableLiveData<Result<AppPrivacyInfo>> = MutableLiveData() private val loadPrivacyInfoJobs = ConcurrentHashMap<String, Job>() fun getAppPrivacyInfoLiveData(application: Application): LiveData<Result<AppPrivacyInfo>> { return liveData { emit(fetchEmitAppPrivacyInfo(application)) val privacyInfo = MutableLiveData<Result<AppPrivacyInfo>>() 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<Result<AppPrivacyInfo>> { Loading
app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +12 −11 Original line number Diff line number Diff line Loading @@ -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<Boolean> = MutableLiveData() lateinit var app: Application } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { Loading @@ -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) } /* Loading Loading @@ -151,7 +154,7 @@ class ApplicationListRVAdapter( } } showCalculatedPrivacyScoreData(searchApp, view) showPrivacyScoreAfterFetching(searchApp, view) } } Loading Loading @@ -368,7 +371,7 @@ class ApplicationListRVAdapter( } } private fun MaterialButton.getInstallationIssueText( private fun getInstallationIssueText( faultyAppResult: Pair<Boolean, String>, view: View ) = Loading @@ -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 Loading Loading @@ -591,4 +587,9 @@ class ApplicationListRVAdapter( lifecycleOwner = null paidAppHandler = null } override fun onViewRecycled(holder: ViewHolder) { privacyInfoViewModel.cancelAppPrivacyInfoFetch(holder.app) super.onViewRecycled(holder) } }