Loading app/src/main/java/foundation/e/apps/data/fused/FusedAPIRepository.kt +2 −2 Original line number Diff line number Diff line Loading @@ -108,10 +108,10 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedApi) return fusedAPIImpl.getSearchSuggestions(query) } fun getSearchResults( suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> { ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { return fusedAPIImpl.getSearchResults(query, authData) } Loading app/src/main/java/foundation/e/apps/data/fused/FusedApi.kt +2 −2 Original line number Diff line number Diff line Loading @@ -60,10 +60,10 @@ interface FusedApi { * a Boolean signifying if more search results are being loaded. * Observe this livedata to display new apps as they are fetched from the network. */ fun getSearchResults( suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> suspend fun getGplaySearchResult( query: String, Loading app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +965 −970 Original line number Diff line number Diff line Loading @@ -246,22 +246,21 @@ class FusedApiImpl @Inject constructor( * a Boolean signifying if more search results are being loaded. * Observe this livedata to display new apps as they are fetched from the network. */ override fun getSearchResults( override suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> { ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { /* * Returning livedata to improve performance, so that we do not have to wait forever * for all results to be fetched from network before showing them. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5171 */ return liveData { val packageSpecificResults = ArrayList<FusedApp>() var finalSearchResult: ResultSupreme<Pair<List<FusedApp>, Boolean>> = ResultSupreme.Error() fetchPackageSpecificResult(authData, query, packageSpecificResults).let { if (it.data?.second != true) { // if there are no data to load emit(it) return@liveData return it } } Loading @@ -269,22 +268,20 @@ class FusedApiImpl @Inject constructor( val cleanApkResults = mutableListOf<FusedApp>() if (preferenceManagerModule.isOpenSourceSelected()) { fetchOpenSourceSearchResult( this@FusedApiImpl, finalSearchResult = fetchOpenSourceSearchResult( cleanApkResults, query, searchResult, packageSpecificResults ).let { emit(it) } ) } if (preferenceManagerModule.isPWASelected()) { fetchPWASearchResult( this@FusedApiImpl, finalSearchResult = fetchPWASearchResult( query, searchResult, packageSpecificResults ).let { emit(it) } ) } // if (preferenceManagerModule.isGplaySelected()) { Loading @@ -296,17 +293,16 @@ class FusedApiImpl @Inject constructor( // ).asLiveData() // ) // } } return finalSearchResult } private suspend fun fetchPWASearchResult( fusedAPIImpl: FusedApiImpl, query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val pwaApps: MutableList<FusedApp> = mutableListOf() val status = fusedAPIImpl.runCodeWithTimeout({ val status = runCodeWithTimeout({ val apps = cleanApkPWARepository.getSearchResult(query).body()?.apps apps?.apply { Loading Loading @@ -354,13 +350,12 @@ class FusedApiImpl @Inject constructor( // } private suspend fun fetchOpenSourceSearchResult( fusedAPIImpl: FusedApiImpl, cleanApkResults: MutableList<FusedApp>, query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val status = fusedAPIImpl.runCodeWithTimeout({ val status = runCodeWithTimeout({ cleanApkResults.addAll(getCleanAPKSearchResults(query)) }) Loading app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +6 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,12 @@ class ApplicationListRVAdapter( onPlaceHolderShow?.invoke() // Do not process anything else for this entry return } else { val progressBar = holder.binding.placeholderProgressBar holder.binding.root.children.forEach { it.visibility = if (it != progressBar) View.VISIBLE else View.INVISIBLE } } holder.binding.apply { Loading app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt +31 −32 Original line number Diff line number Diff line Loading @@ -98,39 +98,33 @@ class SearchViewModel @Inject constructor( * without having to wait for all of the apps. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5171 */ fun getSearchResults(query: String, authData: AuthData, lifecycleOwner: LifecycleOwner) { viewModelScope.launch(Dispatchers.Main) { searchResultLiveData.removeObservers(lifecycleOwner) searchResultLiveData = fusedAPIRepository.getSearchResults(query, authData) private fun getSearchResults(query: String, authData: AuthData, lifecycleOwner: LifecycleOwner) { viewModelScope.launch(Dispatchers.IO) { val searchResultSupreme = fusedAPIRepository.getSearchResults(query, authData) searchResultLiveData.observe(lifecycleOwner) { searchResult.postValue(it) searchResult.postValue(searchResultSupreme) if (!it.isSuccess()) { if (!searchResultSupreme.isSuccess()) { val exception = if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { GPlayException( it.isTimeout(), it.message.ifBlank { "Data load error" } searchResultSupreme.isTimeout(), searchResultSupreme.message.ifBlank { "Data load error" } ) } else { CleanApkException( it.isTimeout(), it.message.ifBlank { "Data load error" } searchResultSupreme.isTimeout(), searchResultSupreme.message.ifBlank { "Data load error" } ) } exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) } } withContext(Dispatchers.IO) { nextSubBundle = null fetchGplayData(query) } } } fun loadMore(query: String) { Loading @@ -150,10 +144,15 @@ class SearchViewModel @Inject constructor( val searchResult = searchResult.value val currentAppList = searchResult?.data?.first?.toMutableList() ?: mutableListOf() currentAppList.removeIf { item -> item.isPlaceHolder } currentAppList.plus(gplaySearchResult.first) currentAppList.addAll(gplaySearchResult.first) val finalResult = if (searchResult is ResultSupreme.Success) { ResultSupreme.Success(Pair(currentAppList.toList(), gplaySearchResult.second.isNotEmpty())) ResultSupreme.Success( Pair( currentAppList.toList(), gplaySearchResult.second.isNotEmpty() ) ) } else { ResultSupreme.Error() } Loading Loading
app/src/main/java/foundation/e/apps/data/fused/FusedAPIRepository.kt +2 −2 Original line number Diff line number Diff line Loading @@ -108,10 +108,10 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedApi) return fusedAPIImpl.getSearchSuggestions(query) } fun getSearchResults( suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> { ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { return fusedAPIImpl.getSearchResults(query, authData) } Loading
app/src/main/java/foundation/e/apps/data/fused/FusedApi.kt +2 −2 Original line number Diff line number Diff line Loading @@ -60,10 +60,10 @@ interface FusedApi { * a Boolean signifying if more search results are being loaded. * Observe this livedata to display new apps as they are fetched from the network. */ fun getSearchResults( suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> suspend fun getGplaySearchResult( query: String, Loading
app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +965 −970 Original line number Diff line number Diff line Loading @@ -246,22 +246,21 @@ class FusedApiImpl @Inject constructor( * a Boolean signifying if more search results are being loaded. * Observe this livedata to display new apps as they are fetched from the network. */ override fun getSearchResults( override suspend fun getSearchResults( query: String, authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> { ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { /* * Returning livedata to improve performance, so that we do not have to wait forever * for all results to be fetched from network before showing them. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5171 */ return liveData { val packageSpecificResults = ArrayList<FusedApp>() var finalSearchResult: ResultSupreme<Pair<List<FusedApp>, Boolean>> = ResultSupreme.Error() fetchPackageSpecificResult(authData, query, packageSpecificResults).let { if (it.data?.second != true) { // if there are no data to load emit(it) return@liveData return it } } Loading @@ -269,22 +268,20 @@ class FusedApiImpl @Inject constructor( val cleanApkResults = mutableListOf<FusedApp>() if (preferenceManagerModule.isOpenSourceSelected()) { fetchOpenSourceSearchResult( this@FusedApiImpl, finalSearchResult = fetchOpenSourceSearchResult( cleanApkResults, query, searchResult, packageSpecificResults ).let { emit(it) } ) } if (preferenceManagerModule.isPWASelected()) { fetchPWASearchResult( this@FusedApiImpl, finalSearchResult = fetchPWASearchResult( query, searchResult, packageSpecificResults ).let { emit(it) } ) } // if (preferenceManagerModule.isGplaySelected()) { Loading @@ -296,17 +293,16 @@ class FusedApiImpl @Inject constructor( // ).asLiveData() // ) // } } return finalSearchResult } private suspend fun fetchPWASearchResult( fusedAPIImpl: FusedApiImpl, query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val pwaApps: MutableList<FusedApp> = mutableListOf() val status = fusedAPIImpl.runCodeWithTimeout({ val status = runCodeWithTimeout({ val apps = cleanApkPWARepository.getSearchResult(query).body()?.apps apps?.apply { Loading Loading @@ -354,13 +350,12 @@ class FusedApiImpl @Inject constructor( // } private suspend fun fetchOpenSourceSearchResult( fusedAPIImpl: FusedApiImpl, cleanApkResults: MutableList<FusedApp>, query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val status = fusedAPIImpl.runCodeWithTimeout({ val status = runCodeWithTimeout({ cleanApkResults.addAll(getCleanAPKSearchResults(query)) }) Loading
app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +6 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,12 @@ class ApplicationListRVAdapter( onPlaceHolderShow?.invoke() // Do not process anything else for this entry return } else { val progressBar = holder.binding.placeholderProgressBar holder.binding.root.children.forEach { it.visibility = if (it != progressBar) View.VISIBLE else View.INVISIBLE } } holder.binding.apply { Loading
app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt +31 −32 Original line number Diff line number Diff line Loading @@ -98,39 +98,33 @@ class SearchViewModel @Inject constructor( * without having to wait for all of the apps. * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5171 */ fun getSearchResults(query: String, authData: AuthData, lifecycleOwner: LifecycleOwner) { viewModelScope.launch(Dispatchers.Main) { searchResultLiveData.removeObservers(lifecycleOwner) searchResultLiveData = fusedAPIRepository.getSearchResults(query, authData) private fun getSearchResults(query: String, authData: AuthData, lifecycleOwner: LifecycleOwner) { viewModelScope.launch(Dispatchers.IO) { val searchResultSupreme = fusedAPIRepository.getSearchResults(query, authData) searchResultLiveData.observe(lifecycleOwner) { searchResult.postValue(it) searchResult.postValue(searchResultSupreme) if (!it.isSuccess()) { if (!searchResultSupreme.isSuccess()) { val exception = if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) { GPlayException( it.isTimeout(), it.message.ifBlank { "Data load error" } searchResultSupreme.isTimeout(), searchResultSupreme.message.ifBlank { "Data load error" } ) } else { CleanApkException( it.isTimeout(), it.message.ifBlank { "Data load error" } searchResultSupreme.isTimeout(), searchResultSupreme.message.ifBlank { "Data load error" } ) } exceptionsList.add(exception) exceptionsLiveData.postValue(exceptionsList) } } withContext(Dispatchers.IO) { nextSubBundle = null fetchGplayData(query) } } } fun loadMore(query: String) { Loading @@ -150,10 +144,15 @@ class SearchViewModel @Inject constructor( val searchResult = searchResult.value val currentAppList = searchResult?.data?.first?.toMutableList() ?: mutableListOf() currentAppList.removeIf { item -> item.isPlaceHolder } currentAppList.plus(gplaySearchResult.first) currentAppList.addAll(gplaySearchResult.first) val finalResult = if (searchResult is ResultSupreme.Success) { ResultSupreme.Success(Pair(currentAppList.toList(), gplaySearchResult.second.isNotEmpty())) ResultSupreme.Success( Pair( currentAppList.toList(), gplaySearchResult.second.isNotEmpty() ) ) } else { ResultSupreme.Error() } Loading