From 4ee1250ce8d7af2acb63b054bd66cfa422943e28 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 14 Oct 2025 09:46:19 +0530 Subject: [PATCH 01/11] refactor: remove authData from categories [apps and games] screen --- .../data/application/ApplicationRepository.kt | 4 +- .../data/application/category/CategoryApi.kt | 2 - .../application/category/CategoryApiImpl.kt | 2 - .../ApplicationListFragment.kt | 8 +- .../ApplicationListViewModel.kt | 82 +++++-------------- .../e/apps/ui/categories/AppsFragment.kt | 5 +- .../apps/ui/categories/CategoriesViewModel.kt | 41 +++------- .../e/apps/ui/categories/GamesFragment.kt | 5 +- 8 files changed, 34 insertions(+), 115 deletions(-) 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 39988d87b..b881666a2 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,7 +19,6 @@ 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 @@ -114,7 +113,6 @@ class ApplicationRepository @Inject constructor( } suspend fun getAppsListBasedOnCategory( - authData: AuthData, category: String, pageUrl: String?, source: Source @@ -122,7 +120,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/CategoryApi.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt index 3349428eb..e835a2a6b 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,7 +18,6 @@ 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 @@ -33,7 +32,6 @@ interface CategoryApi { ): Pair, ResultStatus> 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 8bf89e831..be0a890e8 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 @@ -163,7 +162,6 @@ class CategoryApiImpl @Inject constructor( } override suspend fun getGplayAppsByCategory( - authData: AuthData, category: String, pageUrl: String? ): ResultSupreme, String>> { 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 895c01334..bf4e2b088 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.loadData(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 a89dd1291..0abe64e7a 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,34 @@ import javax.inject.Inject @HiltViewModel class ApplicationListViewModel @Inject constructor( private val applicationRepository: ApplicationRepository -) : LoadingViewModel() { +) : ViewModel() { val appListLiveData: MutableLiveData>?> = MutableLiveData() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptionsList = 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) + fun loadData(category: String, source: String) { + getList(category, source) } - private fun getList(category: String, authData: AuthData, source: String) { + private fun getList(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 +74,20 @@ class ApplicationListViewModel @Inject constructor( } if (!result.isSuccess()) { - val exception = getException(authData, result) + val exception = + if (isCleanApk) CleanApkException( + result.isTimeout(), + result.message.ifBlank { "Data load error" } + ) else GPlayException( + result.isTimeout(), + result.message.ifBlank { "Data load error" } + ) exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) } } } - 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 +102,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 fadb8dd12..f76132bdf 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 @@ -73,10 +73,7 @@ class AppsFragment : TimeoutFragment(R.layout.fragment_apps) { } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.APPLICATION, authObjectList) { - clearAndRestartGPlayLogin() - true - } + categoriesViewModel.loadData(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 163562d95..827085118 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,48 +19,33 @@ 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.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>> = MutableLiveData() + val exceptionsLiveData: MutableLiveData> = MutableLiveData() + val exceptionsList = 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 loadData(type: CategoryType) { + getCategoriesList(type) } - fun getCategoriesList(type: CategoryType, authData: AuthData) { + private fun getCategoriesList(type: CategoryType) { viewModelScope.launch { val categoriesData = applicationRepository.getCategoriesList(type) categoriesList.postValue(categoriesData) @@ -68,18 +53,12 @@ class CategoriesViewModel @Inject constructor( val status = categoriesData.second 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( + exceptionsList.add( + GPlayException( categoriesData.second == ResultStatus.TIMEOUT, status.message.ifBlank { "Data load error" } ) - - exceptionsList.add(exception) + ) exceptionsLiveData.postValue(exceptionsList) } } 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 dbbf2ad7a..420e3d68a 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 @@ -73,10 +73,7 @@ class GamesFragment : TimeoutFragment(R.layout.fragment_games) { } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.GAMES, authObjectList) { - clearAndRestartGPlayLogin() - true - } + categoriesViewModel.loadData(CategoryType.GAMES) } override fun onTimeout( -- GitLab From 973ba29e7ce009060a26482242c9fd044be5c5be Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 14 Oct 2025 10:12:37 +0530 Subject: [PATCH 02/11] refactor: remove unused `getOnDemandModule` function --- .../e/apps/data/application/ApplicationRepository.kt | 9 --------- 1 file changed, 9 deletions(-) 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 b881666a2..3f9bfd3fa 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 @@ -97,15 +97,6 @@ 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> { -- GitLab From 05553eff7141117107324ef091e9d16352e48cda Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 14 Oct 2025 09:43:24 +0530 Subject: [PATCH 03/11] refactor: convert var into local val --- .../e/apps/data/application/category/CategoryApiImpl.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 be0a890e8..8625c88c8 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 @@ -165,17 +165,15 @@ class CategoryApiImpl @Inject constructor( 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 applicationList = (filteredAppList.data ?: emptyList()).toMutableList() - nextPageUrl = cluster.clusterNextPageUrl + val nextPageUrl = cluster.clusterNextPageUrl if (nextPageUrl.isNotEmpty()) { applicationList.add(Application(isPlaceHolder = true)) } -- GitLab From 9702d048adb1f5809610090ee61a5fd2c700ea36 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 14 Oct 2025 17:38:27 +0530 Subject: [PATCH 04/11] refactor: remove authData uses from updates screen --- .../data/updates/UpdatesManagerRepository.kt | 10 +-- .../e/apps/install/updates/UpdatesWorker.kt | 2 +- .../e/apps/ui/updates/UpdatesFragment.kt | 23 ++--- .../e/apps/ui/updates/UpdatesViewModel.kt | 86 +++++++++---------- 4 files changed, 49 insertions(+), 72 deletions(-) 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 581ce4fa9..2ce742136 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 776d6f088..d40a26b8d 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/updates/UpdatesFragment.kt b/app/src/main/java/foundation/e/apps/ui/updates/UpdatesFragment.kt index 559b3f922..69de3d4be 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.loadData() 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 0c15b27cb..dbfc61c38 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,28 +41,16 @@ 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 loadData() { + getUpdates() } fun haveSourcesChanged(): Boolean { @@ -77,35 +63,39 @@ class UpdatesViewModel @Inject constructor( return true } - private fun getUpdates(authData: AuthData?) { + private fun getUpdates() { 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 +114,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 +125,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 +138,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 } } -- GitLab From 3ed6b6f688ee253bbc1e340d0d788efaae170d26 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 13:09:17 +0530 Subject: [PATCH 05/11] refactor: remove redundant type info in name. --- .../e/apps/data/application/category/CategoryApiImpl.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 8625c88c8..e06ec25b3 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 @@ -170,14 +170,14 @@ class CategoryApiImpl @Inject constructor( val cluster = appSources.gplayRepo.getAppsByCategory(category, pageUrl) - val filteredAppList = filterRestrictedGPlayApps(cluster.clusterAppList) - val applicationList = (filteredAppList.data ?: emptyList()).toMutableList() + val filteredApps = filterRestrictedGPlayApps(cluster.clusterAppList) + val applications = (filteredApps.data ?: emptyList()).toMutableList() val nextPageUrl = cluster.clusterNextPageUrl if (nextPageUrl.isNotEmpty()) { - applicationList.add(Application(isPlaceHolder = true)) + applications.add(Application(isPlaceHolder = true)) } - Pair(applicationList, nextPageUrl) + Pair(applications, nextPageUrl) } } -- GitLab From c8f643d213400ab18f06ef7890cf9778988eb710 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 13:12:13 +0530 Subject: [PATCH 06/11] refactor: remove redundant type info in name. --- .../e/apps/ui/applicationlist/ApplicationListViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 0abe64e7a..e7d739609 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 @@ -40,7 +40,7 @@ class ApplicationListViewModel @Inject constructor( val appListLiveData: MutableLiveData>?> = MutableLiveData() val exceptionsLiveData: MutableLiveData> = MutableLiveData() - val exceptionsList = ArrayList() + val exceptions = ArrayList() private var isLoading = false @@ -82,8 +82,8 @@ class ApplicationListViewModel @Inject constructor( result.isTimeout(), result.message.ifBlank { "Data load error" } ) - exceptionsList.add(exception) - exceptionsLiveData.postValue(exceptionsList) + exceptions.add(exception) + exceptionsLiveData.postValue(exceptions) } } } -- GitLab From d4134e383afb1505613fbd9aab3cd72547600436 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 13:12:47 +0530 Subject: [PATCH 07/11] refactor: remove redundant type info in name. --- .../foundation/e/apps/ui/categories/CategoriesViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 827085118..0463d8a7d 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 @@ -38,7 +38,7 @@ class CategoriesViewModel @Inject constructor( val categoriesList: MutableLiveData, ResultStatus>> = MutableLiveData() val exceptionsLiveData: MutableLiveData> = MutableLiveData() - val exceptionsList = ArrayList() + val exceptions = ArrayList() fun loadData(type: CategoryType) { @@ -53,13 +53,13 @@ class CategoriesViewModel @Inject constructor( val status = categoriesData.second if (status != ResultStatus.OK) { - exceptionsList.add( + exceptions.add( GPlayException( categoriesData.second == ResultStatus.TIMEOUT, status.message.ifBlank { "Data load error" } ) ) - exceptionsLiveData.postValue(exceptionsList) + exceptionsLiveData.postValue(exceptions) } } } -- GitLab From c533580f89830bbd80e07873aeb637b3c481fd6e Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 15:31:26 +0530 Subject: [PATCH 08/11] refactor: remove redundant 'loadData' function. --- .../java/foundation/e/apps/ui/categories/AppsFragment.kt | 2 +- .../foundation/e/apps/ui/categories/CategoriesViewModel.kt | 6 +----- .../java/foundation/e/apps/ui/categories/GamesFragment.kt | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) 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 f76132bdf..8a1315ad4 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 @@ -73,7 +73,7 @@ class AppsFragment : TimeoutFragment(R.layout.fragment_apps) { } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.APPLICATION) + 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 0463d8a7d..ee40bdbe5 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 @@ -41,11 +41,7 @@ class CategoriesViewModel @Inject constructor( val exceptions = ArrayList() - fun loadData(type: CategoryType) { - getCategoriesList(type) - } - - private fun getCategoriesList(type: CategoryType) { + fun loadCategoriesList(type: CategoryType) { viewModelScope.launch { val categoriesData = applicationRepository.getCategoriesList(type) categoriesList.postValue(categoriesData) 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 420e3d68a..0c9da5091 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 @@ -73,7 +73,7 @@ class GamesFragment : TimeoutFragment(R.layout.fragment_games) { } override fun loadData(authObjectList: List) { - categoriesViewModel.loadData(CategoryType.GAMES) + categoriesViewModel.loadCategoriesList(CategoryType.GAMES) } override fun onTimeout( -- GitLab From a33d79029d406fe6e551ae63c5cd93b1df838c03 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 15:32:51 +0530 Subject: [PATCH 09/11] refactor: remove redundant 'loadData' function. --- .../e/apps/ui/applicationlist/ApplicationListFragment.kt | 2 +- .../e/apps/ui/applicationlist/ApplicationListViewModel.kt | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) 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 bf4e2b088..6ee84a431 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,7 +230,7 @@ class ApplicationListFragment : * Issue: https://gitlab.e.foundation/e/os/backlog/-/issues/478 */ showLoadingUI() - viewModel.loadData(args.category, args.source) + 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. 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 e7d739609..d23390c89 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 @@ -46,12 +46,7 @@ class ApplicationListViewModel @Inject constructor( private var nextPageUrl: String? = null - - fun loadData(category: String, source: String) { - getList(category, source) - } - - private fun getList(category: String, source: String) { + fun loadList(category: String, source: String) { if (isLoading) { return } -- GitLab From f7c5a7f34cfae9186825df429d43906665b38438 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 15:33:57 +0530 Subject: [PATCH 10/11] refactor: remove redundant 'loadData' function. --- .../java/foundation/e/apps/ui/updates/UpdatesFragment.kt | 2 +- .../java/foundation/e/apps/ui/updates/UpdatesViewModel.kt | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) 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 69de3d4be..c4c607812 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 @@ -277,7 +277,7 @@ class UpdatesFragment : TimeoutFragment(R.layout.fragment_updates), ApplicationI override fun loadData(authObjectList: List) { if (updatesViewModel.haveSourcesChanged()) { showLoadingUI() - updatesViewModel.loadData() + updatesViewModel.loadUpdates() initUpdateAllButton() } } 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 dbfc61c38..4e8d4c9dd 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 @@ -49,10 +49,6 @@ class UpdatesViewModel @Inject constructor( private var previousStores = mapOf() - fun loadData() { - getUpdates() - } - fun haveSourcesChanged(): Boolean { val newStores = stores.getStores() if (newStores == previousStores) { @@ -63,7 +59,7 @@ class UpdatesViewModel @Inject constructor( return true } - private fun getUpdates() { + fun loadUpdates() { viewModelScope.launch { exceptionsList.clear() val updatesResult = updatesManagerRepository.getUpdates() -- GitLab From de64b9eef0e85772da4a52aa974d92301b0d6a22 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Thu, 16 Oct 2025 16:27:27 +0530 Subject: [PATCH 11/11] refactor: account for other sources in `getCategoriesList` --- .../data/application/ApplicationRepository.kt | 4 +-- .../category/CategoriesResponse.kt | 13 ++++++++ .../data/application/category/CategoryApi.kt | 4 +-- .../application/category/CategoryApiImpl.kt | 22 ++++--------- .../e/apps/ui/categories/AppsFragment.kt | 2 +- .../apps/ui/categories/CategoriesViewModel.kt | 32 ++++++++++++------- .../e/apps/ui/categories/GamesFragment.kt | 2 +- .../e/apps/category/CategoryApiTest.kt | 20 ++++++------ 8 files changed, 55 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/data/application/category/CategoriesResponse.kt 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 3f9bfd3fa..471634516 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 @@ -22,9 +22,9 @@ import androidx.lifecycle.LiveData 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 @@ -99,7 +99,7 @@ class ApplicationRepository @Inject constructor( suspend fun getCategoriesList( type: CategoryType, - ): Pair, ResultStatus> { + ): List { return categoryApi.getCategoriesList(type) } 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 000000000..8fa7930da --- /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 e835a2a6b..e67b4e886 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 @@ -20,16 +20,14 @@ package foundation.e.apps.data.application.category 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( category: 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 e06ec25b3..f6b2eb40e 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 @@ -47,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( 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 8a1315ad4..6a6fef615 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,7 +68,7 @@ class AppsFragment : TimeoutFragment(R.layout.fragment_apps) { categoriesViewModel.categoriesList.observe(viewLifecycleOwner) { stopLoadingUI() - categoriesRVAdapter.setData(it.first) + categoriesRVAdapter.setData(it) } } 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 ee40bdbe5..85dc5fde1 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 @@ -26,6 +26,8 @@ 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.enums.Source +import foundation.e.apps.data.login.exceptions.CleanApkException import foundation.e.apps.data.login.exceptions.GPlayException import kotlinx.coroutines.launch import javax.inject.Inject @@ -35,7 +37,7 @@ class CategoriesViewModel @Inject constructor( private val applicationRepository: ApplicationRepository ) : ViewModel() { - val categoriesList: MutableLiveData, ResultStatus>> = + val categoriesList: MutableLiveData> = MutableLiveData() val exceptionsLiveData: MutableLiveData> = MutableLiveData() val exceptions = ArrayList() @@ -44,19 +46,27 @@ class CategoriesViewModel @Inject constructor( fun loadCategoriesList(type: CategoryType) { viewModelScope.launch { val categoriesData = applicationRepository.getCategoriesList(type) - categoriesList.postValue(categoriesData) + val categories: MutableList = mutableListOf() + exceptions.clear() - val status = categoriesData.second - - if (status != ResultStatus.OK) { - exceptions.add( - GPlayException( - 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" } ) - ) - exceptionsLiveData.postValue(exceptions) + 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 0c9da5091..96189f74d 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,7 +68,7 @@ class GamesFragment : TimeoutFragment(R.layout.fragment_games) { categoriesViewModel.categoriesList.observe(viewLifecycleOwner) { stopLoadingUI() - categoriesRVAdapter.setData(it.first) + categoriesRVAdapter.setData(it) } } 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 bf8798149..6631cc1e4 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) } } -- GitLab