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

Commit befeddba authored by Jonathan Klee's avatar Jonathan Klee
Browse files

Merge branch '2964-u-cancel-jobs-properly' into 'main'

Cancel loading of ratings when view is recycled

See merge request !541
parents 06700f98 08a4eefd
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)
    }
}