diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt b/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt index 39988d87b5a70c8afcdbcb2a1925ec6cf7d8755a..471634516c6f4dcd81e9e5baf24e970c85204e6e 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt @@ -19,13 +19,12 @@ package foundation.e.apps.data.application import androidx.lifecycle.LiveData -import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.Stores import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.category.CategoriesResponse import foundation.e.apps.data.application.category.CategoryApi import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.application.downloadInfo.DownloadInfoApi import foundation.e.apps.data.application.home.HomeApi @@ -98,23 +97,13 @@ class ApplicationRepository @Inject constructor( suspend fun getOSSDownloadInfo(id: String, version: String? = null) = downloadInfoApi.getOSSDownloadInfo(id, version) - suspend fun getOnDemandModule( - packageName: String, - moduleName: String, - versionCode: Long, - offerType: Int - ): String? { - return downloadInfoApi.getOnDemandModule(packageName, moduleName, versionCode, offerType) - } - suspend fun getCategoriesList( type: CategoryType, - ): Pair, ResultStatus> { + ): List { return categoryApi.getCategoriesList(type) } suspend fun getAppsListBasedOnCategory( - authData: AuthData, category: String, pageUrl: String?, source: Source @@ -122,7 +111,7 @@ class ApplicationRepository @Inject constructor( return when (source) { Source.OPEN_SOURCE -> categoryApi.getCleanApkAppsByCategory(category, Source.OPEN_SOURCE) Source.PWA -> categoryApi.getCleanApkAppsByCategory(category, Source.PWA) - else -> categoryApi.getGplayAppsByCategory(authData, category, pageUrl) + else -> categoryApi.getGplayAppsByCategory(category, pageUrl) } } diff --git a/app/src/main/java/foundation/e/apps/data/application/category/CategoriesResponse.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoriesResponse.kt new file mode 100644 index 0000000000000000000000000000000000000000..8fa7930dab197e0e0bc42d4935c45f3b0871e48f --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoriesResponse.kt @@ -0,0 +1,13 @@ +package foundation.e.apps.data.application.category + +import foundation.e.apps.data.application.data.Category +import foundation.e.apps.data.application.utils.CategoryType +import foundation.e.apps.data.enums.ResultStatus +import foundation.e.apps.data.enums.Source + +data class CategoriesResponse( + val categories: List, + val type: CategoryType, + val source: Source, + val status: ResultStatus +) diff --git a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt index 3349428eb2787ce28cfea61248b3949238bbc265..e67b4e886e0b986774be8f7c0a44c11e7e287c0b 100644 --- a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt @@ -18,22 +18,18 @@ package foundation.e.apps.data.application.category -import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.utils.CategoryType -import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Source interface CategoryApi { suspend fun getCategoriesList( type: CategoryType, - ): Pair, ResultStatus> + ): List suspend fun getGplayAppsByCategory( - authData: AuthData, category: String, pageUrl: String? ): ResultSupreme, String>> diff --git a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt index 8bf89e8313252456ef54ca1623b30350cc61888f..f6b2eb40e2a0260ef327e5ae56134f5814f62016 100644 --- a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt @@ -20,7 +20,6 @@ package foundation.e.apps.data.application.category import android.content.Context import com.aurora.gplayapi.data.models.App -import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.AppSourcesContainer @@ -48,25 +47,15 @@ class CategoryApiImpl @Inject constructor( private val applicationDataManager: ApplicationDataManager ) : CategoryApi { - override suspend fun getCategoriesList(type: CategoryType): Pair, ResultStatus> { - val categoriesList = mutableListOf() - var apiStatus = handleAllSourcesCategories(categoriesList, type) - - categoriesList.sortBy { item -> item.title.lowercase() } - return Pair(categoriesList, apiStatus) - } - - private suspend fun handleAllSourcesCategories( - categoriesList: MutableList, - type: CategoryType, - ): ResultStatus { - val categoryResults: MutableList = mutableListOf() + override suspend fun getCategoriesList(type: CategoryType) : List { + val categoryResponses = mutableListOf() for ((source, _) in stores.getStores()) { - categoryResults.add(fetchCategoryResult(categoriesList, type, source)) + val categories = mutableListOf() + val status = fetchCategoryResult(categories, type, source) + categoryResponses.add(CategoriesResponse(categories, type, source, status)) } - - return categoryResults.find { it != ResultStatus.OK } ?: ResultStatus.OK + return categoryResponses } private suspend fun fetchCategoryResult( @@ -163,25 +152,22 @@ class CategoryApiImpl @Inject constructor( } override suspend fun getGplayAppsByCategory( - authData: AuthData, category: String, pageUrl: String? ): ResultSupreme, String>> { - var applicationList: MutableList = mutableListOf() - var nextPageUrl = "" return handleNetworkResult { val cluster = appSources.gplayRepo.getAppsByCategory(category, pageUrl) - val filteredAppList = filterRestrictedGPlayApps(cluster.clusterAppList) - applicationList = (filteredAppList.data ?: emptyList()).toMutableList() + val filteredApps = filterRestrictedGPlayApps(cluster.clusterAppList) + val applications = (filteredApps.data ?: emptyList()).toMutableList() - nextPageUrl = cluster.clusterNextPageUrl + val nextPageUrl = cluster.clusterNextPageUrl if (nextPageUrl.isNotEmpty()) { - applicationList.add(Application(isPlaceHolder = true)) + applications.add(Application(isPlaceHolder = true)) } - Pair(applicationList, nextPageUrl) + Pair(applications, nextPageUrl) } } diff --git a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerRepository.kt b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerRepository.kt index 581ce4fa9f9db61bc893690f9d22ab019a568448..2ce742136e0d9b53c60058b60e6150dd0e5244bc 100644 --- a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerRepository.kt @@ -18,22 +18,23 @@ package foundation.e.apps.data.updates -import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.application.UpdatesDao import foundation.e.apps.data.application.data.Application +import foundation.e.apps.data.enums.Source import javax.inject.Inject class UpdatesManagerRepository @Inject constructor( private val updatesManagerImpl: UpdatesManagerImpl ) { - suspend fun getUpdates(authData: AuthData): Pair, ResultStatus> { + suspend fun getUpdates(): Pair, ResultStatus> { if (UpdatesDao.hasAnyAppsForUpdate()) { return Pair(UpdatesDao.appsAwaitingForUpdate, ResultStatus.OK) } return updatesManagerImpl.getUpdates().run { - val filteredApps = first.filter { !(!it.isFree && authData.isAnonymous) } + val filteredApps = + first.filter { !(!it.isFree && it.source == Source.PLAY_STORE && !it.isPurchased) } UpdatesDao.addItemsForUpdate(filteredApps) Pair(filteredApps, this.second) } @@ -43,7 +44,4 @@ class UpdatesManagerRepository @Inject constructor( return updatesManagerImpl.getUpdatesOSS() } - fun getApplicationCategoryPreference(): List { - return updatesManagerImpl.getApplicationCategoryPreference() - } } diff --git a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt index 776d6f0882a1ff28f9235be82d55426529efbcf3..d40a26b8dc23369130828c9769911c66ca700283 100644 --- a/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt +++ b/app/src/main/java/foundation/e/apps/install/updates/UpdatesWorker.kt @@ -118,7 +118,7 @@ class UpdatesWorker @AssistedInject constructor( * apps from Google Play store. * The user check will be more useful in No-Google mode. */ - val updateData = updatesManagerRepository.getUpdates(authData) + val updateData = updatesManagerRepository.getUpdates() appsNeededToUpdate.addAll(updateData.first) resultStatus = updateData.second } else if (user != User.UNAVAILABLE) { diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt index 895c0133422ecc4ed63024d63eecb0e71c488ef3..6ee84a431687a482c3c3cdc4fd79d74279a53ab1 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListFragment.kt @@ -230,11 +230,7 @@ class ApplicationListFragment : * Issue: https://gitlab.e.foundation/e/os/backlog/-/issues/478 */ showLoadingUI() - viewModel.loadData(args.category, args.source, authObjectList) { - clearAndRestartGPlayLogin() - true - } - + viewModel.loadList(args.category, args.source) if (args.source != "Open Source" && args.source != "PWA") { /* * For Play store apps we try to load more apps on reaching end of list. @@ -245,7 +241,6 @@ class ApplicationListFragment : super.onScrollStateChanged(recyclerView, newState) if (!recyclerView.canScrollVertically(1)) { viewModel.loadMore( - authObjectList.find { it is AuthObject.GPlayAuth }, args.category ) } @@ -262,7 +257,6 @@ class ApplicationListFragment : if (this is ApplicationListRVAdapter) { onPlaceHolderShow = { viewModel.loadMore( - authObjectList.find { it is AuthObject.GPlayAuth }, args.category ) } diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt index a89dd1291dd33fd7e1d16d3ae3d23b8015f2e07e..d23390c89f34ce90f347ff89fa4e36d07c4e99f1 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListViewModel.kt @@ -19,18 +19,16 @@ package foundation.e.apps.ui.applicationlist import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Source import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.exceptions.CleanApkException import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import javax.inject.Inject @@ -38,60 +36,29 @@ import javax.inject.Inject @HiltViewModel class ApplicationListViewModel @Inject constructor( private val applicationRepository: ApplicationRepository -) : LoadingViewModel() { +) : ViewModel() { val appListLiveData: MutableLiveData>?> = MutableLiveData() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptions = ArrayList() private var isLoading = false private var nextPageUrl: String? = null - private var currentAuthListObject: List? = null - - fun loadData( - category: String, - source: String, - authObjectList: List, - retryBlock: (failedObjects: List) -> Boolean, - ) { - super.onLoadData(authObjectList, { successAuthList, _ -> - - // if token is refreshed, then reset all data - if (currentAuthListObject != null && currentAuthListObject != authObjectList) { - appListLiveData.postValue(ResultSupreme.Success(emptyList())) - nextPageUrl = null - } - - if (appListLiveData.value?.data?.isNotEmpty() == true && currentAuthListObject == authObjectList) { - appListLiveData.postValue(appListLiveData.value) - return@onLoadData - } - - this.currentAuthListObject = authObjectList - successAuthList.find { it is AuthObject.GPlayAuth }?.run { - getList(category, result.data!! as AuthData, source) - return@onLoadData - } - - successAuthList.find { it is AuthObject.CleanApk }?.run { - getList(category, AuthData("", ""), source) - return@onLoadData - } - }, retryBlock) - } - - private fun getList(category: String, authData: AuthData, source: String) { + fun loadList(category: String, source: String) { if (isLoading) { return } + val sourceType = Source.fromString(source) + val isCleanApk = sourceType != Source.PLAY_STORE viewModelScope.launch(Dispatchers.IO) { isLoading = true val result = applicationRepository.getAppsListBasedOnCategory( - authData, category, nextPageUrl, - Source.fromString(source) + sourceType ).apply { isLoading = false } @@ -102,28 +69,20 @@ class ApplicationListViewModel @Inject constructor( } if (!result.isSuccess()) { - val exception = getException(authData, result) - exceptionsList.add(exception) - exceptionsLiveData.postValue(exceptionsList) + val exception = + if (isCleanApk) CleanApkException( + result.isTimeout(), + result.message.ifBlank { "Data load error" } + ) else GPlayException( + result.isTimeout(), + result.message.ifBlank { "Data load error" } + ) + exceptions.add(exception) + exceptionsLiveData.postValue(exceptions) } } } - private fun getException( - authData: AuthData, - result: ResultSupreme, String>> - ) = if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { - GPlayException( - result.isTimeout(), - result.message.ifBlank { "Data load error" } - ) - } else { - CleanApkException( - result.isTimeout(), - result.message.ifBlank { "Data load error" } - ) - } - private fun updateNextPageUrl(nextPageUrl: String?) { this.nextPageUrl = nextPageUrl } @@ -138,21 +97,15 @@ class ApplicationListViewModel @Inject constructor( return applicationRepository.isAnyFusedAppUpdated(newApplications, oldApplications) } - fun loadMore(gPlayAuth: AuthObject?, category: String) { + fun loadMore(category: String) { viewModelScope.launch(Dispatchers.IO) { - val authData: AuthData? = when { - gPlayAuth !is AuthObject.GPlayAuth -> null - !gPlayAuth.result.isSuccess() -> null - else -> gPlayAuth.result.data!! - } - if (isLoading || authData == null || nextPageUrl.isNullOrEmpty()) { + if (isLoading || nextPageUrl.isNullOrEmpty()) { return@launch } isLoading = true val result = applicationRepository.getAppsListBasedOnCategory( - authData, category, nextPageUrl, Source.PLAY_STORE diff --git a/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt b/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt index fadb8dd123421944ea4061f6d85a3a8cd96528c4..6a6fef615564b5e6bb73db9f789d51dd78031480 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/AppsFragment.kt @@ -68,15 +68,12 @@ class AppsFragment : TimeoutFragment(R.layout.fragment_apps) { categoriesViewModel.categoriesList.observe(viewLifecycleOwner) { stopLoadingUI() - categoriesRVAdapter.setData(it.first) + categoriesRVAdapter.setData(it) } } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.APPLICATION, authObjectList) { - clearAndRestartGPlayLogin() - true - } + categoriesViewModel.loadCategoriesList(CategoryType.APPLICATION) } override fun onTimeout( diff --git a/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt b/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt index 163562d95fefa79ca1f03537dc7d53be5f9eb4b1..85dc5fde1dcfdfc91f579464ec5086cfa8111807 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/CategoriesViewModel.kt @@ -19,69 +19,54 @@ package foundation.e.apps.ui.categories import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.utils.CategoryType -import foundation.e.apps.data.login.AuthObject +import foundation.e.apps.data.enums.Source import foundation.e.apps.data.login.exceptions.CleanApkException import foundation.e.apps.data.login.exceptions.GPlayException -import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class CategoriesViewModel @Inject constructor( private val applicationRepository: ApplicationRepository -) : LoadingViewModel() { +) : ViewModel() { - val categoriesList: MutableLiveData, ResultStatus>> = + val categoriesList: MutableLiveData> = MutableLiveData() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptions = ArrayList() - fun loadData( - type: CategoryType, - authObjectList: List, - retryBlock: (failedObjects: List) -> Boolean, - ) { - super.onLoadData(authObjectList, { successAuthList, _ -> - successAuthList.find { it is AuthObject.GPlayAuth }?.run { - getCategoriesList(type, result.data!! as AuthData) - return@onLoadData - } - - successAuthList.find { it is AuthObject.CleanApk }?.run { - getCategoriesList(type, AuthData("", "")) - return@onLoadData - } - }, retryBlock) - } - - fun getCategoriesList(type: CategoryType, authData: AuthData) { + fun loadCategoriesList(type: CategoryType) { viewModelScope.launch { val categoriesData = applicationRepository.getCategoriesList(type) - categoriesList.postValue(categoriesData) - - val status = categoriesData.second + val categories: MutableList = mutableListOf() + exceptions.clear() - if (status != ResultStatus.OK) { - val exception = - if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - GPlayException( - categoriesData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) - else CleanApkException( - categoriesData.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } + for (data in categoriesData) { + if (data.status != ResultStatus.OK) { + val error = if (data.source == Source.PLAY_STORE) GPlayException( + data.status == ResultStatus.TIMEOUT, + data.status.message.ifBlank { "Data load error" } + ) else CleanApkException( + data.status == ResultStatus.TIMEOUT, + data.status.message.ifBlank { "Data load error" } ) - - exceptionsList.add(exception) - exceptionsLiveData.postValue(exceptionsList) + exceptions.add(error) + continue + } + categories.addAll(data.categories) } + + categories.sortBy { item -> item.title.lowercase() } + categoriesList.postValue(categories) + exceptionsLiveData.postValue(exceptions) } } } diff --git a/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt b/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt index dbbf2ad7aa98c15c5c0294085e3362c51d36ced2..96189f74d65f980801195c89c01b85a8db42c2c7 100644 --- a/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/categories/GamesFragment.kt @@ -68,15 +68,12 @@ class GamesFragment : TimeoutFragment(R.layout.fragment_games) { categoriesViewModel.categoriesList.observe(viewLifecycleOwner) { stopLoadingUI() - categoriesRVAdapter.setData(it.first) + categoriesRVAdapter.setData(it) } } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.GAMES, authObjectList) { - clearAndRestartGPlayLogin() - true - } + categoriesViewModel.loadCategoriesList(CategoryType.GAMES) } override fun onTimeout( diff --git a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt index 559b3f922f1feeae53802f800b231093770c7828..c4c607812041303eb4a0d9c8de1967139a2b06aa 100644 --- a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt @@ -136,10 +136,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI } private fun observeUpdateList(listAdapter: ApplicationListRVAdapter?) { - updatesViewModel.updatesList.observe(viewLifecycleOwner) { result -> - - val appsUpdateList = result.first - val resultStatus = result.second + updatesViewModel.updatesList.observe(viewLifecycleOwner) { appsUpdateList -> // Put system apps on top val appsToDisplay = appsUpdateList.sortedByDescending { it.isSystemApp } @@ -157,13 +154,6 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI { _binding?.recyclerView?.scrollToPosition(0) }, SCROLL_TO_TOP_DELAY_MILLIS ) - - Timber.d("===>> observeupdate list called") - if (resultStatus != ResultStatus.OK) { - val exception = GPlayException(resultStatus == ResultStatus.TIMEOUT) - val alertDialogBuilder = AlertDialog.Builder(requireContext()) - onTimeout(exception, alertDialogBuilder) - } } } @@ -191,7 +181,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI } private fun shouldUpdateButtonEnable(workInfoList: List) = - !updatesViewModel.updatesList.value?.first.isNullOrEmpty() && + updatesViewModel.updatesList.value?.isNotEmpty() == true && ( workInfoList.isNullOrEmpty() || ( @@ -287,10 +277,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI override fun loadData(authObjectList: List) { if (updatesViewModel.haveSourcesChanged()) { showLoadingUI() - updatesViewModel.loadData(authObjectList) { - clearAndRestartGPlayLogin() - true - } + updatesViewModel.loadUpdates() initUpdateAllButton() } } @@ -353,11 +340,11 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI private fun observeDownloadList() { mainActivityViewModel.downloadList.observe(viewLifecycleOwner) { list -> - val appList = updatesViewModel.updatesList.value?.first?.toMutableList() ?: emptyList() + val appList = updatesViewModel.updatesList.value?.toMutableList() ?: emptyList() appList.let { mainActivityViewModel.updateStatusOfFusedApps(appList, list) } - updatesViewModel.updatesList.apply { value = Pair(appList, value?.second) } + updatesViewModel.updatesList.apply { value = appList } } } diff --git a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt index 0c15b27cb0ec1711c91b139084c60deb5c2edb1f..4e8d4c9dd72fbf468a3001defc9fa8fd2cdf5edb 100644 --- a/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesViewModel.kt @@ -19,9 +19,9 @@ package foundation.e.apps.ui.updates import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.work.WorkInfo -import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.StoreRepository import foundation.e.apps.data.Stores @@ -30,11 +30,9 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.enums.Source -import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.exceptions.CleanApkException import foundation.e.apps.data.login.exceptions.GPlayException import foundation.e.apps.data.updates.UpdatesManagerRepository -import foundation.e.apps.ui.parentFragment.LoadingViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -43,30 +41,14 @@ class UpdatesViewModel @Inject constructor( private val updatesManagerRepository: UpdatesManagerRepository, private val applicationRepository: ApplicationRepository, private val stores: Stores -) : LoadingViewModel() { +) : ViewModel() { - val updatesList: MutableLiveData, ResultStatus?>> = MutableLiveData() + val updatesList: MutableLiveData> = MutableLiveData() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptionsList = ArrayList() private var previousStores = mapOf() - fun loadData( - authObjectList: List, - retryBlock: (failedObjects: List) -> Boolean, - ) { - super.onLoadData(authObjectList, { successAuthList, _ -> - - successAuthList.find { it is AuthObject.GPlayAuth }?.run { - getUpdates(result.data!! as AuthData) - return@onLoadData - } - - successAuthList.find { it is AuthObject.CleanApk }?.run { - getUpdates(null) - return@onLoadData - } - }, retryBlock) - } - fun haveSourcesChanged(): Boolean { val newStores = stores.getStores() if (newStores == previousStores) { @@ -77,35 +59,39 @@ class UpdatesViewModel @Inject constructor( return true } - private fun getUpdates(authData: AuthData?) { + fun loadUpdates() { viewModelScope.launch { - val updatesResult = if (authData != null) { - updatesManagerRepository.getUpdates(authData) - } else { - updatesManagerRepository.getUpdatesOSS() + exceptionsList.clear() + val updatesResult = updatesManagerRepository.getUpdates() + val ossUpdatesResult = updatesManagerRepository.getUpdatesOSS() + + updatesList.postValue( + mutableListOf().apply { + addAll(updatesResult.first) + addAll(ossUpdatesResult.first) + }.toList() + ) + + if (updatesResult.second != ResultStatus.OK) { + val status = updatesResult.second + exceptionsList.add( + GPlayException( + updatesResult.second == ResultStatus.TIMEOUT, + status.message.ifBlank { "Data load error" } + ) + ) } - - updatesList.postValue(updatesResult) - - val status = updatesResult.second - - if (status != ResultStatus.OK) { - val exception = - if (authData != null && - (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - ) { - GPlayException( - updatesResult.second == ResultStatus.TIMEOUT, - status.message.ifBlank { "Data load error" } - ) - } else CleanApkException( + if (ossUpdatesResult.second != ResultStatus.OK) { + val status = ossUpdatesResult.second + exceptionsList.add( + CleanApkException( updatesResult.second == ResultStatus.TIMEOUT, status.message.ifBlank { "Data load error" } ) - - exceptionsList.add(exception) - exceptionsLiveData.postValue(exceptionsList) + ) } + + exceptionsLiveData.postValue(exceptionsList) } } @@ -124,7 +110,7 @@ class UpdatesViewModel @Inject constructor( private fun checkWorkIsForUpdateByTag(tags: List): Boolean { updatesList.value?.let { - it.first.find { fusedApp -> tags.contains(fusedApp._id) }?.let { foundApp -> + it.find { fusedApp -> tags.contains(fusedApp._id) }?.let { foundApp -> return listOf( Status.INSTALLED, Status.UPDATABLE @@ -135,7 +121,9 @@ class UpdatesViewModel @Inject constructor( } fun hasAnyUpdatableApp(): Boolean { - return updatesList.value?.first?.any { it.status == Status.UPDATABLE || it.status == Status.INSTALLATION_ISSUE } == true + return updatesList.value?.any { + it.status == Status.UPDATABLE || it.status == Status.INSTALLATION_ISSUE + } == true } fun hasAnyPendingAppsForUpdate(): Boolean { @@ -146,6 +134,6 @@ class UpdatesViewModel @Inject constructor( Status.DOWNLOADED, Status.INSTALLING ) - return updatesList.value?.first?.any { pendingStatesForUpdate.contains(it.status) } == true + return updatesList.value?.any { pendingStatesForUpdate.contains(it.status) } == true } } diff --git a/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt b/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt index bf8798149bbe03ca13dc011bcfc4073d466eb958..6631cc1e48c05e5bf9a57ee2da74aeead9cb42cb 100644 --- a/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt +++ b/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt @@ -129,9 +129,9 @@ class CategoryApiTest { Mockito.`when`(appLoungePreference.isPWASelected()).thenReturn(true) val categoryListResponse = - categoryApi.getCategoriesList(CategoryType.APPLICATION) + categoryApi.getCategoriesList(CategoryType.APPLICATION).map { it.categories }.flatten() - Assert.assertEquals("getCategory", 3, categoryListResponse.first.size) + Assert.assertEquals("getCategory", 3, categoryListResponse.size) } @Test @@ -152,9 +152,9 @@ class CategoryApiTest { fakeStores.disableStore(Source.PLAY_STORE) val categoryListResponse = - categoryApi.getCategoriesList(CategoryType.APPLICATION) + categoryApi.getCategoriesList(CategoryType.APPLICATION).map { it.categories }.flatten() - Assert.assertEquals("getCategory", 3, categoryListResponse.first.size) + Assert.assertEquals("getCategory", 3, categoryListResponse.size) } @Test @@ -171,9 +171,9 @@ class CategoryApiTest { fakeStores.disableStore(Source.OPEN_SOURCE) val categoryListResponse = - categoryApi.getCategoriesList(CategoryType.APPLICATION) + categoryApi.getCategoriesList(CategoryType.APPLICATION).map { it.categories }.flatten() - Assert.assertEquals("getCategory", 4, categoryListResponse.first.size) + Assert.assertEquals("getCategory", 4, categoryListResponse.size) } @Test @@ -190,8 +190,8 @@ class CategoryApiTest { val categoryListResponse = categoryApi.getCategoriesList(CategoryType.APPLICATION) - Assert.assertEquals("getCategory", 0, categoryListResponse.first.size) - Assert.assertEquals("getCategory", ResultStatus.UNKNOWN, categoryListResponse.second) + Assert.assertEquals("getCategory", 0, categoryListResponse.map { it.categories }.flatten().size) + Assert.assertEquals("getCategory", ResultStatus.UNKNOWN, categoryListResponse.map { it.status }.first()) } @Test @@ -225,8 +225,8 @@ class CategoryApiTest { Mockito.`when`(appLoungePreference.isPWASelected()).thenReturn(true) val categoryListResponse = - categoryApi.getCategoriesList(CategoryType.APPLICATION) + categoryApi.getCategoriesList(CategoryType.APPLICATION).map { it.categories }.flatten() - Assert.assertEquals("getCategory", 11, categoryListResponse.first.size) + Assert.assertEquals("getCategory", 11, categoryListResponse.size) } }