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

Commit 1350a08f authored by Hasib Prince's avatar Hasib Prince
Browse files

AppInfoFetchViewModel is refactored

parent c1fe865c
Loading
Loading
Loading
Loading
Loading
+3 −40
Original line number Diff line number Diff line
package foundation.e.apps

import android.widget.TextView
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.AuthData
import com.google.gson.Gson
import dagger.hilt.android.lifecycle.HiltViewModel
import foundation.e.apps.api.cleanapk.blockedApps.BlockedAppRepository
import foundation.e.apps.api.faultyApps.FaultyAppRepository
import foundation.e.apps.api.fdroid.FdroidRepository
import foundation.e.apps.api.fdroid.models.FdroidEntity
import foundation.e.apps.api.fused.data.FusedApp
import foundation.e.apps.api.gplay.GPlayAPIRepository
import foundation.e.apps.utils.enums.Origin
import foundation.e.apps.utils.modules.DataStoreModule
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject

/**
@@ -34,39 +27,9 @@ class AppInfoFetchViewModel @Inject constructor(
    private val gson: Gson
) : ViewModel() {

    private val fdroidEntries = mutableMapOf<String, FdroidEntity?>()

    fun setAuthorNameIfNeeded(textView: TextView, fusedApp: FusedApp) {
        viewModelScope.launch {
            var authorNameToDisplay = textView.text
            withContext(Dispatchers.Default) {
                fusedApp.run {
                    try {
                        if (author == "unknown" && origin == Origin.CLEANAPK) {

                            withContext(Dispatchers.Main) {
                                textView.text = FdroidEntity.DEFAULT_FDROID_AUTHOR_NAME
                            }

                            var result = fdroidEntries[package_name]
                            if (result == null) {
                                result = fdroidRepository.getFdroidInfo(package_name)?.also {
                                    fdroidEntries[package_name] = it
                                }
                            }
                            result?.authorName?.let {
                                authorNameToDisplay = it
                            }
                        }
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
            }
            withContext(Dispatchers.Main) {
                textView.text = authorNameToDisplay
            }
        }
    fun getAuthorName(fusedApp: FusedApp) = liveData {
        val authorName = fdroidRepository.getAuthorName(fusedApp)
        emit(authorName)
    }

    fun isAppPurchased(app: FusedApp): LiveData<Boolean> {
+23 −1
Original line number Diff line number Diff line
package foundation.e.apps.api.fdroid

import foundation.e.apps.api.fdroid.models.FdroidEntity
import foundation.e.apps.api.fused.data.FusedApp
import foundation.e.apps.utils.enums.Origin
import javax.inject.Inject
import javax.inject.Singleton

@@ -10,13 +12,19 @@ class FdroidRepository @Inject constructor(
    private val fdroidDao: FdroidDao,
) {

    companion object {
        const val UNKNOWN = "unknown"
    }

    private val fdroidEntries = mutableMapOf<String, FdroidEntity?>()

    /**
     * Get Fdroid entity from DB is present.
     * If not present then make an API call, store the fetched result and return the result.
     *
     * Result may be null.
     */
    suspend fun getFdroidInfo(packageName: String): FdroidEntity? {
    private suspend fun getFdroidInfo(packageName: String): FdroidEntity? {
        return fdroidDao.getFdroidEntityFromPackageName(packageName)
            ?: fdroidApi.getFdroidInfoForPackage(packageName)?.let {
                FdroidEntity(packageName, it.authorName).also {
@@ -24,4 +32,18 @@ class FdroidRepository @Inject constructor(
                }
            }
    }

    suspend fun getAuthorName(fusedApp: FusedApp): String {
        if (fusedApp.author != UNKNOWN || fusedApp.origin != Origin.CLEANAPK) {
            return fusedApp.author.ifEmpty { UNKNOWN }
        }

        var result = fdroidEntries[fusedApp.package_name]
        if (result == null) {
            result = getFdroidInfo(fusedApp.package_name)?.also {
                fdroidEntries[fusedApp.package_name] = it
            }
        }
        return result?.authorName ?: FdroidEntity.DEFAULT_FDROID_AUTHOR_NAME
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -190,8 +190,9 @@ class ApplicationFragment : TimeoutFragment(R.layout.fragment_application) {
            binding.titleInclude.apply {
                applicationIcon = appIcon
                appName.text = it.name
                appAuthor.text = it.author
                appInfoFetchViewModel.setAuthorNameIfNeeded(appAuthor, it)
                appInfoFetchViewModel.getAuthorName(it).observe(viewLifecycleOwner) {
                    appAuthor.text = it
                }
                categoryTitle.text = it.category
                if (origin == Origin.CLEANAPK) {
                    appIcon.load(CleanAPKInterface.ASSET_URL + it.icon_image_path)
+3 −2
Original line number Diff line number Diff line
@@ -150,8 +150,9 @@ class ApplicationListRVAdapter(
                action?.let { direction -> view.findNavController().navigate(direction) }
            }
            appTitle.text = searchApp.name
            appAuthor.text = searchApp.author
            appInfoFetchViewModel.setAuthorNameIfNeeded(appAuthor, searchApp)
            appInfoFetchViewModel.getAuthorName(searchApp).observe(lifecycleOwner!!) {
                appAuthor.text = it
            }
            if (searchApp.ratings.usageQualityScore != -1.0) {
                appRating.text = searchApp.ratings.usageQualityScore.toString()
                appRatingBar.rating = searchApp.ratings.usageQualityScore.toFloat()