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

Commit 9e4fc575 authored by Hasib Prince's avatar Hasib Prince
Browse files

gpaly search result with pagination

parent dd340bb9
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ package foundation.e.apps.data.fused
import androidx.lifecycle.LiveData
import com.aurora.gplayapi.SearchSuggestEntry
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.enums.FilterLevel
import foundation.e.apps.data.enums.Origin
@@ -114,6 +115,13 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedApi)
        return fusedAPIImpl.getSearchResults(query, authData)
    }

    suspend fun getGplaySearchResults(
        query: String,
        nextPageSubBundle: Set<SearchBundle.SubBundle>?
    ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> {
        return fusedAPIImpl.getGplaySearchResult(query, nextPageSubBundle)
    }

    suspend fun getAppsListBasedOnCategory(
        authData: AuthData,
        category: String,
+6 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData
import com.aurora.gplayapi.SearchSuggestEntry
import com.aurora.gplayapi.data.models.App
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.cleanapk.data.download.Download
import foundation.e.apps.data.enums.FilterLevel
@@ -64,6 +65,11 @@ interface FusedApi {
        authData: AuthData
    ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>>

    suspend fun getGplaySearchResult(
        query: String,
        nextPageSubBundle: Set<SearchBundle.SubBundle>?
    ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>>

    suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry>

    suspend fun getOnDemandModule(
+51 −52
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ package foundation.e.apps.data.fused
import android.content.Context
import android.text.format.Formatter
import androidx.lifecycle.LiveData
import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData
import androidx.lifecycle.map
import com.aurora.gplayapi.Constants
@@ -29,6 +30,7 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.Artwork
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.Category
import com.aurora.gplayapi.data.models.SearchBundle
import com.aurora.gplayapi.data.models.StreamCluster
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
@@ -80,7 +82,7 @@ import javax.inject.Inject
import javax.inject.Named
import javax.inject.Singleton

typealias GplaySearchResultLiveData = LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>>
typealias GplaySearchResultFlow = Flow<ResultSupreme<Pair<List<FusedApp>, Boolean>>>
typealias FusedHomeDeferred = Deferred<ResultSupreme<List<FusedHome>>>

@Singleton
@@ -285,15 +287,15 @@ class FusedApiImpl @Inject constructor(
                ).let { emit(it) }
            }

            if (preferenceManagerModule.isGplaySelected()) {
                emitSource(
                    fetchGplaySearchResults(
                        query,
                        searchResult,
                        packageSpecificResults
                    )
                )
            }
//            if (preferenceManagerModule.isGplaySelected()) {
//                emitSource(
//                    fetchGplaySearchResults(
//                        query,
//                        searchResult,
//                        packageSpecificResults
//                    ).asLiveData()
//                )
//            }
        }
    }

@@ -331,37 +333,25 @@ class FusedApiImpl @Inject constructor(
        )
    }

    private suspend fun fetchGplaySearchResults(
        query: String,
        searchResult: MutableList<FusedApp>,
        packageSpecificResults: ArrayList<FusedApp>
    ): GplaySearchResultLiveData {
        return runFlowWithTimeout(
            {
                getGplaySearchResult(query)
            }, {
            it.second
        }, {
            Pair(listOf(), false) // empty data for timeout
        }
        ).map {
            if (it.isSuccess()) {
                searchResult.addAll(it.data!!.first)
                ResultSupreme.Success(
                    Pair(
                        filterWithKeywordSearch(
                            searchResult,
                            packageSpecificResults,
                            query
                        ),
                        it.data!!.second
                    )
                )
            } else {
                it
            }
        }
    }
//    private suspend fun fetchGplaySearchResults(
//        query: String,
//        searchResult: MutableList<FusedApp>,
//        packageSpecificResults: ArrayList<FusedApp>
//    ): GplaySearchResultFlow = getGplaySearchResult(query).map {
//        if (it.first.isNotEmpty()) {
//            searchResult.addAll(it.first)
//        }
//        ResultSupreme.Success(
//            Pair(
//                filterWithKeywordSearch(
//                    searchResult,
//                    packageSpecificResults,
//                    query
//                ),
//                it.second
//            )
//        )
//    }

    private suspend fun fetchOpenSourceSearchResult(
        fusedAPIImpl: FusedApiImpl,
@@ -1115,18 +1105,26 @@ class FusedApiImpl @Inject constructor(
        return list
    }

    private suspend fun getGplaySearchResult(
    override suspend fun getGplaySearchResult(
        query: String,
    ): Flow<Pair<List<FusedApp>, Boolean>> {
        val searchResults = gplayRepository.getSearchResult(query, null)
        return searchResults.map {
            val fusedAppList = it.first.map { app -> replaceWithFDroid(app) }
            Pair(
        nextPageSubBundle: Set<SearchBundle.SubBundle>?
    ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> {
        val searchResults =
            gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet())
        if (!preferenceManagerModule.isGplaySelected()) {
            return Pair(emptyList(), emptySet())
        }

        val fusedAppList = searchResults.first.map { app -> replaceWithFDroid(app) }.toMutableList()
        if (searchResults.second.isNotEmpty()) {
            fusedAppList.add(FusedApp(isPlaceHolder = true))
        }

        return Pair(
            fusedAppList,
                it.second
            searchResults.second
        )
    }
    }

    /*
         * This function will replace a GPlay app with F-Droid app if exists,
@@ -1431,7 +1429,8 @@ class FusedApiImpl @Inject constructor(
        var nextPageUrl = ""

        val status = runCodeWithTimeout({
            val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster
            val streamCluster =
                gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster
            val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList)
            filteredAppList.data?.let {
                fusedAppList = it.toMutableList()
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import foundation.e.apps.data.fused.utils.CategoryType
import kotlinx.coroutines.flow.Flow

interface GplayStoreRepository : BaseStoreRepository {
    suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Flow<Pair<List<App>, Boolean>>
    suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Pair<List<App>, MutableSet<SearchBundle.SubBundle>>
    suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry>
    suspend fun getAppsByCategory(category: String, pageUrl: String? = null): Any
    suspend fun getCategories(type: CategoryType? = null): List<Category>
+9 −10
Original line number Diff line number Diff line
@@ -128,30 +128,29 @@ class GplayStoreRepositoryImpl @Inject constructor(
    override suspend fun getSearchResult(
        query: String,
        subBundle: MutableSet<SearchBundle.SubBundle>?
    ): Flow<Pair<List<App>, Boolean>> {
        return flow {
            var authData = loginSourceRepository.gplayAuth ?: return@flow
    ): Pair<List<App>, MutableSet<SearchBundle.SubBundle>> {
            var authData = loginSourceRepository.gplayAuth ?: return Pair(emptyList(), mutableSetOf())
            val searchHelper =
                SearchHelper(authData).using(gPlayHttpClient)
            Timber.d("Fetching search result for $query, subBundle: $subBundle")

            subBundle?.let { 
                val searchResult = searchHelper.next(it)
                emitSearchResult(searchResult)
                return@let
                Timber.d("fetching next page search data...")
                return emitSearchResult(searchResult)
            }

            val searchResult = searchHelper.searchResults(query)
            emitSearchResult(searchResult)
        }
            return emitSearchResult(searchResult)

    }

    private suspend fun FlowCollector<Pair<List<App>, Boolean>>.emitSearchResult(
    private fun emitSearchResult(
        searchBundle: SearchBundle
    ) {
    ): Pair<MutableList<App>, MutableSet<SearchBundle.SubBundle>> {
        val apps = searchBundle.appList
        Timber.d("Search result is found: ${apps.size}")
        emit(Pair(apps, searchBundle.subBundles.isNotEmpty()))
        return Pair(apps, searchBundle.subBundles)
    }

    private suspend fun fetchNextSubBundle(
Loading