Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08a4eefd authored by Jonathan Klee's avatar Jonathan Klee
Browse files

Cancel loading of ratings when view is recycled

So that we prevent ugly timeouts
parent 1f5d8cd5
Loading
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -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<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>> {
+12 −11
Original line number Diff line number Diff line
@@ -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 {
@@ -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<Boolean, String>,
        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)
    }
}