Loading app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt +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 /** Loading @@ -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> { Loading app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt +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 Loading @@ -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 { Loading @@ -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 } } app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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) Loading app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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() Loading Loading
app/src/main/java/foundation/e/apps/AppInfoFetchViewModel.kt +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 /** Loading @@ -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> { Loading
app/src/main/java/foundation/e/apps/api/fdroid/FdroidRepository.kt +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 Loading @@ -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 { Loading @@ -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 } }
app/src/main/java/foundation/e/apps/application/ApplicationFragment.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
app/src/main/java/foundation/e/apps/applicationlist/model/ApplicationListRVAdapter.kt +3 −2 Original line number Diff line number Diff line Loading @@ -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() Loading