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

Commit fdec052b authored by Fahim M. Choudhury's avatar Fahim M. Choudhury
Browse files

Merge branch '2695-handling_cleanapk_down' into 'main'

fix: make search results independent of CleanAPK and Google Play

See merge request !504
parents 9322b2a2 7b4560fb
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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"
}

+1 −1
Original line number Diff line number Diff line
@@ -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

+2 −1
Original line number Diff line number Diff line
@@ -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"
+32 −16
Original line number Diff line number Diff line
@@ -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
@@ -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()
@@ -158,7 +162,8 @@ class SearchApiImpl @Inject constructor(
                    query
                ),
                appLoungePreference.isGplaySelected()
            )
            ),
            exception = result.exception
        )
    }

@@ -187,7 +192,8 @@ class SearchApiImpl @Inject constructor(
                    query
                ),
                appLoungePreference.isGplaySelected() || appLoungePreference.isPWASelected()
            )
            ),
            exception = result.exception
        )
    }

@@ -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 =
@@ -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
@@ -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...")
@@ -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 }
@@ -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() {
+3 −1
Original line number Diff line number Diff line
@@ -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