Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb28b5ea authored by Hasib Prince's avatar Hasib Prince
Browse files

error handling updated for cleanApkApps.

parent c219119b
Loading
Loading
Loading
Loading
Loading
+57 −69
Original line number Diff line number Diff line
@@ -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: "
    }

    /**
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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,
@@ -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
        }
@@ -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)
            }
@@ -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.
@@ -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))
    }

    /*
@@ -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"
@@ -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
    }
@@ -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()
@@ -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()
@@ -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, ""))
    }

    /*
@@ -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"
@@ -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(
@@ -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"
@@ -630,7 +632,9 @@ class FusedApiImpl @Inject constructor(
                        )
                    }
                }
            })
            }

            status = result.getResultStatus()

            /*
             * If status is not ok, immediately return.
@@ -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".
@@ -673,9 +677,9 @@ class FusedApiImpl @Inject constructor(
                    )
                }
            }
        })
        }

        return Pair(fusedAppList, status)
        return Pair(fusedAppList, result.getResultStatus())
    }

    /**
@@ -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()) {
@@ -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 {
@@ -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)
@@ -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(
@@ -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(
@@ -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)
    }

    /**
@@ -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 =
@@ -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)
@@ -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"
    }

    /*
@@ -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

+3 −1
Original line number Diff line number Diff line
@@ -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
@@ -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 ?: "")
        }
    }