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

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

Refactor: simplify search logic

This commit refactors the search functionality by:
- Consolidating `getCleanApkSearchResults` and `getGplaySearchResult` into a single `search` method in `SearchApi` and `SearchApiImpl`.
- Moving the search logic from `SearchViewModel` to `SearchApiImpl`.
- `SearchApiImpl` now directly calls `SearchProvider` methods for searching by package name and keyword.
- Package name searches are now performed only if the query matches a package name pattern.
- Search result fetching in `SearchViewModel` is simplified to a single call to `searchApi.search(query)`.
- Constants for app types (`APP_TYPE_ANY`, `APP_TYPE_OPEN`, `APP_TYPE_PWA`) are moved from `SearchApi` to `ApplicationRepository`.
- Removed unused `coroutineScope` and `async` calls in `SearchApiImpl`.
parent 640853ce
Loading
Loading
Loading
Loading
Loading
+17 −25
Original line number Diff line number Diff line
@@ -21,40 +21,48 @@ package foundation.e.apps.data.application
import androidx.lifecycle.LiveData
import com.aurora.gplayapi.data.models.AuthData
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.Stores
import foundation.e.apps.data.application.apps.AppsApi
import foundation.e.apps.data.application.category.CategoryApi
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.application.data.Category
import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.application.downloadInfo.DownloadInfoApi
import foundation.e.apps.data.application.home.HomeApi
import foundation.e.apps.data.application.search.SearchApi
import foundation.e.apps.data.application.utils.CategoryType
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.install.models.AppInstall
import foundation.e.apps.data.application.search.SearchResult
import foundation.e.apps.data.application.search.SearchSuggestion
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ApplicationRepository @Inject constructor(
    private val searchApi: SearchApi,
    private val stores: Stores,
    private val homeApi: HomeApi,
    private val categoryApi: CategoryApi,
    private val appsApi: AppsApi,
    private val downloadInfoApi: DownloadInfoApi
) {
    companion object {
        const val APP_TYPE_ANY = "any"
        const val APP_TYPE_OPEN = "open"
        const val APP_TYPE_PWA = "pwa"
    }

    suspend fun getHomeScreenData(): LiveData<ResultSupreme<List<Home>>> {
        return homeApi.fetchHomeScreenData()
    }

    fun getSelectedAppTypes(): List<String> {
        return searchApi.getSelectedAppTypes()
        val selectedAppTypes = mutableListOf<String>()
        if (stores.isStoreEnabled(Source.PLAY_STORE)) selectedAppTypes.add(APP_TYPE_ANY)
        if (stores.isStoreEnabled(Source.OPEN_SOURCE)) selectedAppTypes.add(APP_TYPE_OPEN)
        if (stores.isStoreEnabled(Source.PWA)) selectedAppTypes.add(APP_TYPE_PWA)

        return selectedAppTypes
    }

    suspend fun getApplicationDetails(
@@ -104,22 +112,6 @@ class ApplicationRepository @Inject constructor(
        return categoryApi.getCategoriesList(type)
    }

    suspend fun getSearchSuggestions(query: String): List<SearchSuggestion> {
        return searchApi.getSearchSuggestions(query)
    }

    suspend fun getCleanApkSearchResults(
        query: String
    ): SearchResult {
        return searchApi.getCleanApkSearchResults(query) // TODO: Checkpoint: search
    }

    suspend fun getGplaySearchResults(
        query: String
    ): SearchResult {
        return searchApi.getGplaySearchResult(query)
    }

    suspend fun getAppsListBasedOnCategory(
        authData: AuthData,
        category: String,
+3 −3
Original line number Diff line number Diff line
@@ -22,8 +22,8 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.liveData
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.Stores
import foundation.e.apps.data.application.ApplicationRepository
import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.application.search.SearchApi
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.handleNetworkResult
@@ -78,8 +78,8 @@ class HomeApiImpl @Inject constructor(
        setHomeErrorMessage(result.getResultStatus(), source)
        priorList.sortBy {
            when (it.source) {
                SearchApi.APP_TYPE_OPEN -> AppSourceWeight.OPEN_SOURCE.ordinal
                SearchApi.APP_TYPE_PWA -> AppSourceWeight.PWA.ordinal
                ApplicationRepository.APP_TYPE_OPEN -> AppSourceWeight.OPEN_SOURCE.ordinal
                ApplicationRepository.APP_TYPE_PWA -> AppSourceWeight.PWA.ordinal
                else -> AppSourceWeight.GPLAY.ordinal
            }
        }
+2 −2
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ class CleanApkSearchProvider @Inject constructor(
) : SearchProvider {
    override val source = Source.OPEN_SOURCE

    override suspend fun search(query: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(query) ?: emptyList()
    override suspend fun search(keyword: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(keyword) ?: emptyList()
        return applications.map {
            applicationDataManager.updateStatus(it)
            it.source = source
+20 −10
Original line number Diff line number Diff line
@@ -23,7 +23,9 @@ import foundation.e.apps.data.Stores
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.enums.Source
import kotlinx.coroutines.CancellationException
import timber.log.Timber
import java.io.IOException
import javax.inject.Inject

class GPlaySearchProvider @Inject constructor(
@@ -33,8 +35,8 @@ class GPlaySearchProvider @Inject constructor(
) : SearchProvider {
    override val source = Source.PLAY_STORE

    override suspend fun search(query: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(query) ?: emptyList()
    override suspend fun search(keyword: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(keyword) ?: emptyList()
        val replacedApps = replaceWithFDroid(applications)
        return replacedApps.map {
            applicationDataManager.updateStatus(it)
@@ -55,28 +57,36 @@ class GPlaySearchProvider @Inject constructor(
    }

    private suspend fun replaceWithFDroid(gPlayApps: List<Application>): List<Application> {
        try {
            if (gPlayApps.isEmpty()) return emptyList()
        return try {
            if (gPlayApps.isEmpty()) emptyList<Application>()

            val packageNames = gPlayApps.map { it.package_name }
            val response = appSources.cleanApkAppsRepo.checkAvailablePackages(packageNames)

            if (!response.isSuccessful) {
                return gPlayApps
            }

            val availableApps = response.body()?.apps ?: emptyList()

            return gPlayApps.map { gPlayApp ->
                availableApps.find { it.package_name == gPlayApp.package_name }?.apply {
            gPlayApps.map { gPlayApp ->
                availableApps.find {
                    it.package_name == gPlayApp.package_name
                }?.apply {
                    isGplayReplaced = true
                    source = Source.PLAY_STORE
                } ?: gPlayApp
            }
        } catch (e: Exception) {
        } catch (cancellationException: CancellationException) {
            throw cancellationException
        } catch (e: IOException) {
            Timber.w(e, "Failed to replace Google apps with their F-Droid counterparts.")
            return gPlayApps
            gPlayApps
        }
    }

    override suspend fun getSearchSuggestions(query: String): List<SearchSuggestion> {
        val suggestions = appSources.gplayRepo.getSearchSuggestions(query)
    override suspend fun getSearchSuggestions(keyword: String): List<SearchSuggestion> {
        val suggestions = appSources.gplayRepo.getSearchSuggestions(keyword)
        return suggestions.map {
            SearchSuggestion(it.title, source)
        }
+2 −2
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ class PwaSearchProvider @Inject constructor(
) : SearchProvider {
    override val source = Source.PWA

    override suspend fun search(query: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(query) ?: emptyList()
    override suspend fun search(keyword: String): List<Application> {
        val applications = stores.getStore(source)?.getSearchResults(keyword) ?: emptyList()
        return applications.map {
            applicationDataManager.updateStatus(it)
            it.source = source
Loading