Loading app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +57 −69 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ class FusedApiImpl @Inject constructor( private const val CATEGORY_OPEN_GAMES_ID = "game_open_games" private const val CATEGORY_OPEN_GAMES_TITLE = "Open games" private const val ERROR_GPLAY_API = "Gplay api has faced error!" private const val ERROR_GPLAY_SOURCE_NOT_SELECTED = "Gplay apps are not selected!" private const val TIMEOUT = "Timeout" private const val UNKNOWN = "Unknown" private const val STATUS = "Status: " } /** Loading Loading @@ -166,12 +168,12 @@ class FusedApiImpl @Inject constructor( ): ResultSupreme<List<FusedHome>> { val result = when (source) { Source.GPLAY -> handleResultFromAppSources<List<FusedHome>> { Source.GPLAY -> handleNetworkResult<List<FusedHome>> { priorList.addAll(fetchGPlayHome(authData)) priorList } Source.OPEN -> handleResultFromAppSources { Source.OPEN -> handleNetworkResult { val response = (cleanApkAppsRepository.getHomeScreenData() as Response<HomeScreen>).body() response?.home?.let { Loading @@ -180,7 +182,7 @@ class FusedApiImpl @Inject constructor( priorList } Source.PWA -> handleResultFromAppSources { Source.PWA -> handleNetworkResult { val response = (cleanApkPWARepository.getHomeScreenData() as Response<HomeScreen>).body() response?.home?.let { Loading Loading @@ -291,7 +293,7 @@ class FusedApiImpl @Inject constructor( packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val pwaApps: MutableList<FusedApp> = mutableListOf() val status = runCodeWithTimeout({ val result = handleNetworkResult { val apps = cleanApkPWARepository.getSearchResult(query).body()?.apps apps?.apply { Loading @@ -299,14 +301,14 @@ class FusedApiImpl @Inject constructor( pwaApps.addAll(this) } } }) } if (pwaApps.isNotEmpty() || status != ResultStatus.OK) { if (pwaApps.isNotEmpty() || result.getResultStatus() != ResultStatus.OK) { searchResult.addAll(pwaApps) } return ResultSupreme.create( status, result.getResultStatus(), Pair( filterWithKeywordSearch( searchResult, Loading @@ -324,7 +326,7 @@ class FusedApiImpl @Inject constructor( searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val result = handleResultFromAppSources { val result = handleNetworkResult { cleanApkResults.addAll(getCleanAPKSearchResults(query)) cleanApkResults } Loading Loading @@ -354,7 +356,7 @@ class FusedApiImpl @Inject constructor( var gplayPackageResult: FusedApp? = null var cleanapkPackageResult: FusedApp? = null val status = runCodeWithTimeout({ val result = handleNetworkResult { if (preferenceManagerModule.isGplaySelected()) { gplayPackageResult = getGplayPackagResult(query, authData) } Loading @@ -362,7 +364,7 @@ class FusedApiImpl @Inject constructor( if (preferenceManagerModule.isOpenSourceSelected()) { cleanapkPackageResult = getCleanApkPackageResult(query) } }) } /* * Currently only show open source package result if exists in both fdroid and gplay. Loading @@ -381,10 +383,10 @@ class FusedApiImpl @Inject constructor( * If there was a timeout, return it and don't try to fetch anything else. * Also send true in the pair to signal more results being loaded. */ if (status != ResultStatus.OK) { return ResultSupreme.create(status, Pair(packageSpecificResults, false)) if (result.getResultStatus() != ResultStatus.OK) { return ResultSupreme.create(result.getResultStatus(), Pair(packageSpecificResults, false)) } return ResultSupreme.create(status, Pair(packageSpecificResults, true)) return ResultSupreme.create(result.getResultStatus(), Pair(packageSpecificResults, true)) } /* Loading Loading @@ -449,7 +451,7 @@ class FusedApiImpl @Inject constructor( */ private suspend fun getCleanapkSearchResult(packageName: String): ResultSupreme<FusedApp> { var fusedApp = FusedApp() val status = runCodeWithTimeout({ val result = handleNetworkResult { val result = cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -458,15 +460,15 @@ class FusedApiImpl @Inject constructor( if (result?.apps?.isNotEmpty() == true && result.numberOfResults == 1) { fusedApp = result.apps[0] } }) return ResultSupreme.create(status, fusedApp) } return ResultSupreme.create(result.getResultStatus(), fusedApp) } override suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> { var searchSuggesions = listOf<SearchSuggestEntry>() runCodeWithTimeout({ handleNetworkResult { searchSuggesions = gplayRepository.getSearchSuggestions(query) }) } return searchSuggesions } Loading Loading @@ -526,7 +528,7 @@ class FusedApiImpl @Inject constructor( override suspend fun getPWAApps(category: String): ResultSupreme<Pair<List<FusedApp>, String>> { val list = mutableListOf<FusedApp>() val status = runCodeWithTimeout({ val result = handleNetworkResult { val response = getPWAAppsResponse(category) response?.apps?.forEach { it.updateStatus() Loading @@ -534,13 +536,13 @@ class FusedApiImpl @Inject constructor( it.updateFilterLevel(null) list.add(it) } }) return ResultSupreme.create(status, Pair(list, "")) } return ResultSupreme.create(result.getResultStatus(), Pair(list, "")) } override suspend fun getOpenSourceApps(category: String): ResultSupreme<Pair<List<FusedApp>, String>> { val list = mutableListOf<FusedApp>() val status = runCodeWithTimeout({ val result = handleNetworkResult { val response = getOpenSourceAppsResponse(category) response?.apps?.forEach { it.updateStatus() Loading @@ -548,8 +550,8 @@ class FusedApiImpl @Inject constructor( it.updateFilterLevel(null) list.add(it) } }) return ResultSupreme.create(status, Pair(list, "")) } return ResultSupreme.create(result.getResultStatus(), Pair(list, "")) } /* Loading @@ -560,7 +562,7 @@ class FusedApiImpl @Inject constructor( */ override suspend fun getCleanapkAppDetails(packageName: String): Pair<FusedApp, ResultStatus> { var fusedApp = FusedApp() val status = runCodeWithTimeout({ val result = handleNetworkResult { val result = cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -572,8 +574,8 @@ class FusedApiImpl @Inject constructor( ?: FusedApp() } fusedApp.updateFilterLevel(null) }) return Pair(fusedApp, status) } return Pair(fusedApp, result.getResultStatus()) } override suspend fun getApplicationDetails( Loading Loading @@ -617,7 +619,7 @@ class FusedApiImpl @Inject constructor( * i.e. check timeout for individual package query. */ for (packageName in packageNameList) { status = runCodeWithTimeout({ val result = handleNetworkResult { cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -630,7 +632,9 @@ class FusedApiImpl @Inject constructor( ) } } }) } status = result.getResultStatus() /* * If status is not ok, immediately return. Loading @@ -656,7 +660,7 @@ class FusedApiImpl @Inject constructor( /* * Old code moved from getApplicationDetails() */ val status = runCodeWithTimeout({ val result = handleNetworkResult { gplayRepository.getAppsDetails(packageNameList).forEach { app -> /* * Some apps are restricted to locations. Example "com.skype.m2". Loading @@ -673,9 +677,9 @@ class FusedApiImpl @Inject constructor( ) } } }) } return Pair(fusedAppList, status) return Pair(fusedAppList, result.getResultStatus()) } /** Loading @@ -694,7 +698,7 @@ class FusedApiImpl @Inject constructor( appList: List<App>, ): ResultSupreme<List<FusedApp>> { val filteredFusedApps = mutableListOf<FusedApp>() return handleResultFromAppSources { return handleNetworkResult { appList.forEach { val filter = getAppFilterLevel(it, authData) if (filter.isUnFiltered()) { Loading Loading @@ -785,7 +789,7 @@ class FusedApiImpl @Inject constructor( var response: FusedApp? = null val result = handleResultFromAppSources { val result = handleNetworkResult { response = if (origin == Origin.CLEANAPK) { (cleanApkAppsRepository.getAppDetails(id) as Response<Application>).body()?.app } else { Loading Loading @@ -852,7 +856,7 @@ class FusedApiImpl @Inject constructor( ): ResultSupreme<List<FusedCategory>> { val categoryList = mutableListOf<FusedCategory>() return handleResultFromAppSources { return handleNetworkResult { val playResponse = gplayRepository.getCategories(type).map { app -> val category = app.transformToFusedCategory() updateCategoryDrawable(category) Loading @@ -866,10 +870,8 @@ class FusedApiImpl @Inject constructor( private suspend fun fetchPWACategories( type: CategoryType, ): Triple<ResultStatus, List<FusedCategory>, String> { var errorApplicationCategory = "" var apiStatus: ResultStatus = ResultStatus.OK val fusedCategoriesList = mutableListOf<FusedCategory>() runCodeWithTimeout({ val result = handleNetworkResult { getPWAsCategories()?.let { fusedCategoriesList.addAll( getFusedCategoryBasedOnCategoryType( Loading @@ -877,23 +879,16 @@ class FusedApiImpl @Inject constructor( ) ) } }, { errorApplicationCategory = APP_TYPE_PWA apiStatus = ResultStatus.TIMEOUT }, { errorApplicationCategory = APP_TYPE_PWA apiStatus = ResultStatus.UNKNOWN }) return Triple(apiStatus, fusedCategoriesList, errorApplicationCategory) } return Triple(result.getResultStatus(), fusedCategoriesList, APP_TYPE_PWA) } private suspend fun fetchOpenSourceCategories( type: CategoryType, ): Triple<ResultStatus, List<FusedCategory>, String> { var errorApplicationCategory = "" var apiStatus: ResultStatus = ResultStatus.OK val fusedCategoryList = mutableListOf<FusedCategory>() runCodeWithTimeout({ val result = handleNetworkResult { getOpenSourceCategories()?.let { fusedCategoryList.addAll( getFusedCategoryBasedOnCategoryType( Loading @@ -903,14 +898,9 @@ class FusedApiImpl @Inject constructor( ) ) } }, { errorApplicationCategory = APP_TYPE_OPEN apiStatus = ResultStatus.TIMEOUT }, { errorApplicationCategory = APP_TYPE_OPEN apiStatus = ResultStatus.UNKNOWN }) return Triple(apiStatus, fusedCategoryList, errorApplicationCategory) } return Triple(result.getResultStatus(), fusedCategoryList, APP_TYPE_OPEN) } /** Loading Loading @@ -1078,12 +1068,12 @@ class FusedApiImpl @Inject constructor( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): GplaySearchResult { return handleResultFromAppSources { return handleNetworkResult { val searchResults = gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { return@handleResultFromAppSources Pair(listOf<FusedApp>(), setOf<SearchBundle.SubBundle>()) return@handleNetworkResult Pair(listOf<FusedApp>(), setOf<SearchBundle.SubBundle>()) } val fusedAppList = Loading @@ -1093,19 +1083,17 @@ class FusedApiImpl @Inject constructor( fusedAppList.add(FusedApp(isPlaceHolder = true)) } return@handleResultFromAppSources Pair(fusedAppList.toList(), searchResults.second.toSet()) return@handleNetworkResult Pair(fusedAppList.toList(), searchResults.second.toSet()) } } private suspend fun <T> handleResultFromAppSources(call: suspend () -> T): ResultSupreme<T> { private suspend fun <T> handleNetworkResult(call: suspend () -> T): ResultSupreme<T> { return try { ResultSupreme.Success(call()) } catch (e: SocketTimeoutException) { val message = extractErrorMessage(e) val exception = GPlayException(true, message) val resultTimeout = ResultSupreme.Timeout<T>(exception = exception) val resultTimeout = ResultSupreme.Timeout<T>(exception = e) resultTimeout.message = message resultTimeout } catch (e: GplayHttpRequestException) { val message = extractErrorMessage(e) Loading @@ -1121,12 +1109,12 @@ class FusedApiImpl @Inject constructor( private fun extractErrorMessage(e: Exception): String { val status = when (e) { is GplayHttpRequestException -> e.status.toString() is SocketTimeoutException -> "Timeout" else -> "Unknown" is SocketTimeoutException -> TIMEOUT else -> UNKNOWN } return (e.localizedMessage?.ifBlank { ERROR_GPLAY_API } ?: ERROR_GPLAY_API) + "Status: $status" ?: ERROR_GPLAY_API) + "$STATUS$status" } /* Loading Loading @@ -1431,7 +1419,7 @@ class FusedApiImpl @Inject constructor( var fusedAppList: MutableList<FusedApp> = mutableListOf() var nextPageUrl = "" return handleResultFromAppSources { return handleNetworkResult { val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster Loading app/src/main/java/foundation/e/apps/data/gplay/utils/GPlayHttpClient.kt +3 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import timber.log.Timber import java.io.IOException import java.net.Socket import java.net.SocketTimeoutException import java.net.UnknownHostException import java.util.concurrent.TimeUnit Loading Loading @@ -158,7 +159,8 @@ class GPlayHttpClient @Inject constructor( val call = okHttpClient.newCall(request) buildPlayResponse(call.execute()) } catch (e: Exception) { throw e val status = if (e is SocketTimeoutException) 408 else -1 throw GplayHttpRequestException(status, e.localizedMessage ?: "") } } Loading Loading
app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +57 −69 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ class FusedApiImpl @Inject constructor( private const val CATEGORY_OPEN_GAMES_ID = "game_open_games" private const val CATEGORY_OPEN_GAMES_TITLE = "Open games" private const val ERROR_GPLAY_API = "Gplay api has faced error!" private const val ERROR_GPLAY_SOURCE_NOT_SELECTED = "Gplay apps are not selected!" private const val TIMEOUT = "Timeout" private const val UNKNOWN = "Unknown" private const val STATUS = "Status: " } /** Loading Loading @@ -166,12 +168,12 @@ class FusedApiImpl @Inject constructor( ): ResultSupreme<List<FusedHome>> { val result = when (source) { Source.GPLAY -> handleResultFromAppSources<List<FusedHome>> { Source.GPLAY -> handleNetworkResult<List<FusedHome>> { priorList.addAll(fetchGPlayHome(authData)) priorList } Source.OPEN -> handleResultFromAppSources { Source.OPEN -> handleNetworkResult { val response = (cleanApkAppsRepository.getHomeScreenData() as Response<HomeScreen>).body() response?.home?.let { Loading @@ -180,7 +182,7 @@ class FusedApiImpl @Inject constructor( priorList } Source.PWA -> handleResultFromAppSources { Source.PWA -> handleNetworkResult { val response = (cleanApkPWARepository.getHomeScreenData() as Response<HomeScreen>).body() response?.home?.let { Loading Loading @@ -291,7 +293,7 @@ class FusedApiImpl @Inject constructor( packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val pwaApps: MutableList<FusedApp> = mutableListOf() val status = runCodeWithTimeout({ val result = handleNetworkResult { val apps = cleanApkPWARepository.getSearchResult(query).body()?.apps apps?.apply { Loading @@ -299,14 +301,14 @@ class FusedApiImpl @Inject constructor( pwaApps.addAll(this) } } }) } if (pwaApps.isNotEmpty() || status != ResultStatus.OK) { if (pwaApps.isNotEmpty() || result.getResultStatus() != ResultStatus.OK) { searchResult.addAll(pwaApps) } return ResultSupreme.create( status, result.getResultStatus(), Pair( filterWithKeywordSearch( searchResult, Loading @@ -324,7 +326,7 @@ class FusedApiImpl @Inject constructor( searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): ResultSupreme<Pair<List<FusedApp>, Boolean>> { val result = handleResultFromAppSources { val result = handleNetworkResult { cleanApkResults.addAll(getCleanAPKSearchResults(query)) cleanApkResults } Loading Loading @@ -354,7 +356,7 @@ class FusedApiImpl @Inject constructor( var gplayPackageResult: FusedApp? = null var cleanapkPackageResult: FusedApp? = null val status = runCodeWithTimeout({ val result = handleNetworkResult { if (preferenceManagerModule.isGplaySelected()) { gplayPackageResult = getGplayPackagResult(query, authData) } Loading @@ -362,7 +364,7 @@ class FusedApiImpl @Inject constructor( if (preferenceManagerModule.isOpenSourceSelected()) { cleanapkPackageResult = getCleanApkPackageResult(query) } }) } /* * Currently only show open source package result if exists in both fdroid and gplay. Loading @@ -381,10 +383,10 @@ class FusedApiImpl @Inject constructor( * If there was a timeout, return it and don't try to fetch anything else. * Also send true in the pair to signal more results being loaded. */ if (status != ResultStatus.OK) { return ResultSupreme.create(status, Pair(packageSpecificResults, false)) if (result.getResultStatus() != ResultStatus.OK) { return ResultSupreme.create(result.getResultStatus(), Pair(packageSpecificResults, false)) } return ResultSupreme.create(status, Pair(packageSpecificResults, true)) return ResultSupreme.create(result.getResultStatus(), Pair(packageSpecificResults, true)) } /* Loading Loading @@ -449,7 +451,7 @@ class FusedApiImpl @Inject constructor( */ private suspend fun getCleanapkSearchResult(packageName: String): ResultSupreme<FusedApp> { var fusedApp = FusedApp() val status = runCodeWithTimeout({ val result = handleNetworkResult { val result = cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -458,15 +460,15 @@ class FusedApiImpl @Inject constructor( if (result?.apps?.isNotEmpty() == true && result.numberOfResults == 1) { fusedApp = result.apps[0] } }) return ResultSupreme.create(status, fusedApp) } return ResultSupreme.create(result.getResultStatus(), fusedApp) } override suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> { var searchSuggesions = listOf<SearchSuggestEntry>() runCodeWithTimeout({ handleNetworkResult { searchSuggesions = gplayRepository.getSearchSuggestions(query) }) } return searchSuggesions } Loading Loading @@ -526,7 +528,7 @@ class FusedApiImpl @Inject constructor( override suspend fun getPWAApps(category: String): ResultSupreme<Pair<List<FusedApp>, String>> { val list = mutableListOf<FusedApp>() val status = runCodeWithTimeout({ val result = handleNetworkResult { val response = getPWAAppsResponse(category) response?.apps?.forEach { it.updateStatus() Loading @@ -534,13 +536,13 @@ class FusedApiImpl @Inject constructor( it.updateFilterLevel(null) list.add(it) } }) return ResultSupreme.create(status, Pair(list, "")) } return ResultSupreme.create(result.getResultStatus(), Pair(list, "")) } override suspend fun getOpenSourceApps(category: String): ResultSupreme<Pair<List<FusedApp>, String>> { val list = mutableListOf<FusedApp>() val status = runCodeWithTimeout({ val result = handleNetworkResult { val response = getOpenSourceAppsResponse(category) response?.apps?.forEach { it.updateStatus() Loading @@ -548,8 +550,8 @@ class FusedApiImpl @Inject constructor( it.updateFilterLevel(null) list.add(it) } }) return ResultSupreme.create(status, Pair(list, "")) } return ResultSupreme.create(result.getResultStatus(), Pair(list, "")) } /* Loading @@ -560,7 +562,7 @@ class FusedApiImpl @Inject constructor( */ override suspend fun getCleanapkAppDetails(packageName: String): Pair<FusedApp, ResultStatus> { var fusedApp = FusedApp() val status = runCodeWithTimeout({ val result = handleNetworkResult { val result = cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -572,8 +574,8 @@ class FusedApiImpl @Inject constructor( ?: FusedApp() } fusedApp.updateFilterLevel(null) }) return Pair(fusedApp, status) } return Pair(fusedApp, result.getResultStatus()) } override suspend fun getApplicationDetails( Loading Loading @@ -617,7 +619,7 @@ class FusedApiImpl @Inject constructor( * i.e. check timeout for individual package query. */ for (packageName in packageNameList) { status = runCodeWithTimeout({ val result = handleNetworkResult { cleanApkAppsRepository.getSearchResult( packageName, "package_name" Loading @@ -630,7 +632,9 @@ class FusedApiImpl @Inject constructor( ) } } }) } status = result.getResultStatus() /* * If status is not ok, immediately return. Loading @@ -656,7 +660,7 @@ class FusedApiImpl @Inject constructor( /* * Old code moved from getApplicationDetails() */ val status = runCodeWithTimeout({ val result = handleNetworkResult { gplayRepository.getAppsDetails(packageNameList).forEach { app -> /* * Some apps are restricted to locations. Example "com.skype.m2". Loading @@ -673,9 +677,9 @@ class FusedApiImpl @Inject constructor( ) } } }) } return Pair(fusedAppList, status) return Pair(fusedAppList, result.getResultStatus()) } /** Loading @@ -694,7 +698,7 @@ class FusedApiImpl @Inject constructor( appList: List<App>, ): ResultSupreme<List<FusedApp>> { val filteredFusedApps = mutableListOf<FusedApp>() return handleResultFromAppSources { return handleNetworkResult { appList.forEach { val filter = getAppFilterLevel(it, authData) if (filter.isUnFiltered()) { Loading Loading @@ -785,7 +789,7 @@ class FusedApiImpl @Inject constructor( var response: FusedApp? = null val result = handleResultFromAppSources { val result = handleNetworkResult { response = if (origin == Origin.CLEANAPK) { (cleanApkAppsRepository.getAppDetails(id) as Response<Application>).body()?.app } else { Loading Loading @@ -852,7 +856,7 @@ class FusedApiImpl @Inject constructor( ): ResultSupreme<List<FusedCategory>> { val categoryList = mutableListOf<FusedCategory>() return handleResultFromAppSources { return handleNetworkResult { val playResponse = gplayRepository.getCategories(type).map { app -> val category = app.transformToFusedCategory() updateCategoryDrawable(category) Loading @@ -866,10 +870,8 @@ class FusedApiImpl @Inject constructor( private suspend fun fetchPWACategories( type: CategoryType, ): Triple<ResultStatus, List<FusedCategory>, String> { var errorApplicationCategory = "" var apiStatus: ResultStatus = ResultStatus.OK val fusedCategoriesList = mutableListOf<FusedCategory>() runCodeWithTimeout({ val result = handleNetworkResult { getPWAsCategories()?.let { fusedCategoriesList.addAll( getFusedCategoryBasedOnCategoryType( Loading @@ -877,23 +879,16 @@ class FusedApiImpl @Inject constructor( ) ) } }, { errorApplicationCategory = APP_TYPE_PWA apiStatus = ResultStatus.TIMEOUT }, { errorApplicationCategory = APP_TYPE_PWA apiStatus = ResultStatus.UNKNOWN }) return Triple(apiStatus, fusedCategoriesList, errorApplicationCategory) } return Triple(result.getResultStatus(), fusedCategoriesList, APP_TYPE_PWA) } private suspend fun fetchOpenSourceCategories( type: CategoryType, ): Triple<ResultStatus, List<FusedCategory>, String> { var errorApplicationCategory = "" var apiStatus: ResultStatus = ResultStatus.OK val fusedCategoryList = mutableListOf<FusedCategory>() runCodeWithTimeout({ val result = handleNetworkResult { getOpenSourceCategories()?.let { fusedCategoryList.addAll( getFusedCategoryBasedOnCategoryType( Loading @@ -903,14 +898,9 @@ class FusedApiImpl @Inject constructor( ) ) } }, { errorApplicationCategory = APP_TYPE_OPEN apiStatus = ResultStatus.TIMEOUT }, { errorApplicationCategory = APP_TYPE_OPEN apiStatus = ResultStatus.UNKNOWN }) return Triple(apiStatus, fusedCategoryList, errorApplicationCategory) } return Triple(result.getResultStatus(), fusedCategoryList, APP_TYPE_OPEN) } /** Loading Loading @@ -1078,12 +1068,12 @@ class FusedApiImpl @Inject constructor( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): GplaySearchResult { return handleResultFromAppSources { return handleNetworkResult { val searchResults = gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { return@handleResultFromAppSources Pair(listOf<FusedApp>(), setOf<SearchBundle.SubBundle>()) return@handleNetworkResult Pair(listOf<FusedApp>(), setOf<SearchBundle.SubBundle>()) } val fusedAppList = Loading @@ -1093,19 +1083,17 @@ class FusedApiImpl @Inject constructor( fusedAppList.add(FusedApp(isPlaceHolder = true)) } return@handleResultFromAppSources Pair(fusedAppList.toList(), searchResults.second.toSet()) return@handleNetworkResult Pair(fusedAppList.toList(), searchResults.second.toSet()) } } private suspend fun <T> handleResultFromAppSources(call: suspend () -> T): ResultSupreme<T> { private suspend fun <T> handleNetworkResult(call: suspend () -> T): ResultSupreme<T> { return try { ResultSupreme.Success(call()) } catch (e: SocketTimeoutException) { val message = extractErrorMessage(e) val exception = GPlayException(true, message) val resultTimeout = ResultSupreme.Timeout<T>(exception = exception) val resultTimeout = ResultSupreme.Timeout<T>(exception = e) resultTimeout.message = message resultTimeout } catch (e: GplayHttpRequestException) { val message = extractErrorMessage(e) Loading @@ -1121,12 +1109,12 @@ class FusedApiImpl @Inject constructor( private fun extractErrorMessage(e: Exception): String { val status = when (e) { is GplayHttpRequestException -> e.status.toString() is SocketTimeoutException -> "Timeout" else -> "Unknown" is SocketTimeoutException -> TIMEOUT else -> UNKNOWN } return (e.localizedMessage?.ifBlank { ERROR_GPLAY_API } ?: ERROR_GPLAY_API) + "Status: $status" ?: ERROR_GPLAY_API) + "$STATUS$status" } /* Loading Loading @@ -1431,7 +1419,7 @@ class FusedApiImpl @Inject constructor( var fusedAppList: MutableList<FusedApp> = mutableListOf() var nextPageUrl = "" return handleResultFromAppSources { return handleNetworkResult { val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster Loading
app/src/main/java/foundation/e/apps/data/gplay/utils/GPlayHttpClient.kt +3 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import timber.log.Timber import java.io.IOException import java.net.Socket import java.net.SocketTimeoutException import java.net.UnknownHostException import java.util.concurrent.TimeUnit Loading Loading @@ -158,7 +159,8 @@ class GPlayHttpClient @Inject constructor( val call = okHttpClient.newCall(request) buildPlayResponse(call.execute()) } catch (e: Exception) { throw e val status = if (e is SocketTimeoutException) 408 else -1 throw GplayHttpRequestException(status, e.localizedMessage ?: "") } } Loading