Loading app/src/main/java/foundation/e/apps/data/NetworkHandler.kt +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ private fun extractErrorMessage(e: Exception): String { is SocketTimeoutException -> TIMEOUT else -> UNKNOWN } return (e.localizedMessage?.ifBlank { ERROR_GPLAY_API } ?: ERROR_GPLAY_API) + " $STATUS $status" } Loading app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ import foundation.e.apps.data.application.search.GplaySearchResult import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.ui.search.SearchResult import foundation.e.apps.data.application.search.SearchResult import javax.inject.Inject import javax.inject.Singleton Loading app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt +2 −1 Original line number Diff line number Diff line Loading @@ -23,10 +23,11 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.data.Application import foundation.e.apps.ui.search.SearchResult typealias GplaySearchResult = ResultSupreme<Pair<List<Application>, Set<SearchBundle.SubBundle>>> typealias SearchResult = ResultSupreme<Pair<List<Application>, Boolean>> interface SearchApi { companion object { const val APP_TYPE_ANY = "any" Loading app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt +32 −16 Original line number Diff line number Diff line Loading @@ -38,8 +38,9 @@ import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.handleNetworkResult import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.exceptions.CleanApkIOException import foundation.e.apps.data.login.exceptions.GPlayIOException import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.ui.search.SearchResult import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Deferred Loading Loading @@ -94,7 +95,10 @@ class SearchApiImpl @Inject constructor( query: String, authData: AuthData ): SearchResult { var finalSearchResult: SearchResult = ResultSupreme.Error() var finalSearchResult: SearchResult = ResultSupreme.Error( message = "", exception = CleanApkIOException("Unable to reach CleanAPK API") ) val packageSpecificResults = fetchPackageSpecificResult(authData, query).data?.first ?: emptyList() Loading Loading @@ -158,7 +162,8 @@ class SearchApiImpl @Inject constructor( query ), appLoungePreference.isGplaySelected() ) ), exception = result.exception ) } Loading Loading @@ -187,7 +192,8 @@ class SearchApiImpl @Inject constructor( query ), appLoungePreference.isGplaySelected() || appLoungePreference.isPWASelected() ) ), exception = result.exception ) } Loading Loading @@ -333,7 +339,7 @@ class SearchApiImpl @Inject constructor( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): GplaySearchResult { return handleNetworkResult { val result = handleNetworkResult { coroutineScope { launch(Dispatchers.IO) { doDummySearch() } } val searchResults = Loading @@ -354,6 +360,11 @@ class SearchApiImpl @Inject constructor( return@handleNetworkResult Pair(fusedAppList.toList(), searchResults.second.toSet()) } return if (result.isSuccess()) result else ResultSupreme.Error( message = "", exception = GPlayIOException("Unable to reach Google Play API") ) } // Initiate a dummy search to ensure Google Play returns enough results for the search query Loading @@ -369,7 +380,8 @@ class SearchApiImpl @Inject constructor( val dummySearchPackageNames = DUMMY_SEARCH_EXPECTED_APPS.map { it.second } val searchedAppsPackageNames = searchedApps.map { it.packageName } val isSearchContainingResults = searchedAppsPackageNames.containsAll(dummySearchPackageNames) val isSearchContainingResults = searchedAppsPackageNames.containsAll(dummySearchPackageNames) if (!isSearchContainingResults) { Timber.d("Search didn't return enough results, refreshing token...") Loading @@ -383,7 +395,7 @@ class SearchApiImpl @Inject constructor( * else will show the GPlay app itself. */ private suspend fun replaceWithFDroid(gPlayApps: List<App>): List<Application> { try { if (gPlayApps.isEmpty()) return emptyList() val packageNames = gPlayApps.map { it.packageName } Loading @@ -397,6 +409,10 @@ class SearchApiImpl @Inject constructor( updateSource(context) } ?: gPlayApp.toApplication(context) } } catch (e: Exception) { Timber.w(e, "Failed to replace Google apps with their F-Droid counterparts.") return gPlayApps.map { it.toApplication(context) } } } private fun refreshToken() { Loading app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt +3 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,9 @@ package foundation.e.apps.data.login.exceptions /** * This exception is for all CleanApk data loading exceptions. */ class CleanApkException( open class CleanApkException( val isTimeout: Boolean, message: String? = null, ) : LoginException(message) class CleanApkIOException(message: String) : CleanApkException(false, message) Loading
app/src/main/java/foundation/e/apps/data/NetworkHandler.kt +1 −0 Original line number Diff line number Diff line Loading @@ -75,6 +75,7 @@ private fun extractErrorMessage(e: Exception): String { is SocketTimeoutException -> TIMEOUT else -> UNKNOWN } return (e.localizedMessage?.ifBlank { ERROR_GPLAY_API } ?: ERROR_GPLAY_API) + " $STATUS $status" } Loading
app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -39,7 +39,7 @@ import foundation.e.apps.data.application.search.GplaySearchResult import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.ui.search.SearchResult import foundation.e.apps.data.application.search.SearchResult import javax.inject.Inject import javax.inject.Singleton Loading
app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt +2 −1 Original line number Diff line number Diff line Loading @@ -23,10 +23,11 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.data.Application import foundation.e.apps.ui.search.SearchResult typealias GplaySearchResult = ResultSupreme<Pair<List<Application>, Set<SearchBundle.SubBundle>>> typealias SearchResult = ResultSupreme<Pair<List<Application>, Boolean>> interface SearchApi { companion object { const val APP_TYPE_ANY = "any" Loading
app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt +32 −16 Original line number Diff line number Diff line Loading @@ -38,8 +38,9 @@ import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.handleNetworkResult import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.exceptions.CleanApkIOException import foundation.e.apps.data.login.exceptions.GPlayIOException import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.ui.search.SearchResult import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Deferred Loading Loading @@ -94,7 +95,10 @@ class SearchApiImpl @Inject constructor( query: String, authData: AuthData ): SearchResult { var finalSearchResult: SearchResult = ResultSupreme.Error() var finalSearchResult: SearchResult = ResultSupreme.Error( message = "", exception = CleanApkIOException("Unable to reach CleanAPK API") ) val packageSpecificResults = fetchPackageSpecificResult(authData, query).data?.first ?: emptyList() Loading Loading @@ -158,7 +162,8 @@ class SearchApiImpl @Inject constructor( query ), appLoungePreference.isGplaySelected() ) ), exception = result.exception ) } Loading Loading @@ -187,7 +192,8 @@ class SearchApiImpl @Inject constructor( query ), appLoungePreference.isGplaySelected() || appLoungePreference.isPWASelected() ) ), exception = result.exception ) } Loading Loading @@ -333,7 +339,7 @@ class SearchApiImpl @Inject constructor( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): GplaySearchResult { return handleNetworkResult { val result = handleNetworkResult { coroutineScope { launch(Dispatchers.IO) { doDummySearch() } } val searchResults = Loading @@ -354,6 +360,11 @@ class SearchApiImpl @Inject constructor( return@handleNetworkResult Pair(fusedAppList.toList(), searchResults.second.toSet()) } return if (result.isSuccess()) result else ResultSupreme.Error( message = "", exception = GPlayIOException("Unable to reach Google Play API") ) } // Initiate a dummy search to ensure Google Play returns enough results for the search query Loading @@ -369,7 +380,8 @@ class SearchApiImpl @Inject constructor( val dummySearchPackageNames = DUMMY_SEARCH_EXPECTED_APPS.map { it.second } val searchedAppsPackageNames = searchedApps.map { it.packageName } val isSearchContainingResults = searchedAppsPackageNames.containsAll(dummySearchPackageNames) val isSearchContainingResults = searchedAppsPackageNames.containsAll(dummySearchPackageNames) if (!isSearchContainingResults) { Timber.d("Search didn't return enough results, refreshing token...") Loading @@ -383,7 +395,7 @@ class SearchApiImpl @Inject constructor( * else will show the GPlay app itself. */ private suspend fun replaceWithFDroid(gPlayApps: List<App>): List<Application> { try { if (gPlayApps.isEmpty()) return emptyList() val packageNames = gPlayApps.map { it.packageName } Loading @@ -397,6 +409,10 @@ class SearchApiImpl @Inject constructor( updateSource(context) } ?: gPlayApp.toApplication(context) } } catch (e: Exception) { Timber.w(e, "Failed to replace Google apps with their F-Droid counterparts.") return gPlayApps.map { it.toApplication(context) } } } private fun refreshToken() { Loading
app/src/main/java/foundation/e/apps/data/login/exceptions/CleanApkException.kt +3 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,9 @@ package foundation.e.apps.data.login.exceptions /** * This exception is for all CleanApk data loading exceptions. */ class CleanApkException( open class CleanApkException( val isTimeout: Boolean, message: String? = null, ) : LoginException(message) class CleanApkIOException(message: String) : CleanApkException(false, message)