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

Commit 4e5f797c authored by Fahim M. Choudhury's avatar Fahim M. Choudhury Committed by Mohammed Althaf T
Browse files

refactor: hide apps from search and other places when they are not visible and downloadable

parent 51c7c453
Loading
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -24,21 +24,23 @@ import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.install.pkg.PwaManager
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.install.pkg.AppLoungePackageManager
import foundation.e.apps.install.pkg.PwaManager
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ApplicationDataManager @Inject constructor(
    private val appLoungePackageManager: AppLoungePackageManager,
    private val pwaManager: PwaManager
    private val pwaManager: PwaManager,
    private val playStoreRepository: PlayStoreRepository
) {
    fun updateFilterLevel(application: Application) {
    suspend fun updateFilterLevel(application: Application) {
        application.filterLevel = getAppFilterLevel(application)
    }

    fun prepareApps(
    suspend fun prepareApps(
        appList: List<Application>,
        list: MutableList<Home>,
        value: String
@@ -53,13 +55,14 @@ class ApplicationDataManager @Inject constructor(
        }
    }

    fun getAppFilterLevel(application: Application): FilterLevel {
    suspend fun getAppFilterLevel(application: Application): FilterLevel {
        return when {
            application.package_name.isBlank() -> FilterLevel.UNKNOWN
            !application.isFree && application.price.isBlank() -> FilterLevel.UI
            application.source == Source.PWA || application.source == Source.OPEN_SOURCE -> FilterLevel.NONE
            application.source == Source.SYSTEM_APP -> FilterLevel.NONE
            !isRestricted(application) -> FilterLevel.NONE
            !isApplicationVisible(application) -> FilterLevel.DATA
            application.originalSize == 0L -> FilterLevel.UI
            else -> FilterLevel.NONE
        }
@@ -69,6 +72,14 @@ class ApplicationDataManager @Inject constructor(
        return application.restriction != Constants.Restriction.NOT_RESTRICTED
    }

    /*
    * Some apps are not visible because of geo-restriction, banning, etc.
    */
    private suspend fun isApplicationVisible(application: Application): Boolean {
        val appDetails = playStoreRepository.getAppDetailsWeb(application.package_name)
        return appDetails != null
    }

    fun updateStatus(application: Application) {
        if (application.status != Status.INSTALLATION_ISSUE) {
            application.status = getFusedAppInstallationStatus(application)
+3 −3
Original line number Diff line number Diff line
@@ -23,12 +23,12 @@ import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Application
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.enums.isUnFiltered
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil
import javax.inject.Inject
import foundation.e.apps.data.enums.Source

class AppsApiImpl @Inject constructor(
    private val stores: Stores,
@@ -50,7 +50,7 @@ class AppsApiImpl @Inject constructor(
    /*
     * Handy method to run on an instance of FusedApp to update its filter level.
     */
    private fun Application.updateFilterLevel() {
    private suspend fun Application.updateFilterLevel() {
        this.filterLevel = applicationDataManager.getAppFilterLevel(this)
    }

@@ -116,7 +116,7 @@ class AppsApiImpl @Inject constructor(
     *
     * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5174
     */
    private fun handleFilteredApps(
    private suspend fun handleFilteredApps(
        app: Application,
        applicationList: MutableList<Application>
    ) {
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ class HomeConverter @Inject constructor(
    private val applicationDataManager: ApplicationDataManager
) {

    fun toGenericHome(cleanApkHome: CleanApkHome, appType: String): List<Home> {
    suspend fun toGenericHome(cleanApkHome: CleanApkHome, appType: String): List<Home> {
        val list = mutableListOf<Home>()

        openSourceCategories.forEach { (key, value) ->
+21 −5
Original line number Diff line number Diff line
@@ -19,9 +19,7 @@
package foundation.e.apps.data.playstore

import android.content.Context
import android.os.Build
import com.aurora.gplayapi.SearchSuggestEntry
import com.aurora.gplayapi.data.models.App as GplayApp
import com.aurora.gplayapi.data.models.Category
import com.aurora.gplayapi.data.models.ContentRating
import com.aurora.gplayapi.data.models.File
@@ -31,10 +29,12 @@ import com.aurora.gplayapi.helpers.ContentRatingHelper
import com.aurora.gplayapi.helpers.PurchaseHelper
import com.aurora.gplayapi.helpers.contracts.TopChartsContract.Chart
import com.aurora.gplayapi.helpers.contracts.TopChartsContract.Type
import com.aurora.gplayapi.helpers.web.WebAppDetailsHelper
import com.aurora.gplayapi.helpers.web.WebCategoryHelper
import com.aurora.gplayapi.helpers.web.WebCategoryStreamHelper
import com.aurora.gplayapi.helpers.web.WebSearchHelper
import com.aurora.gplayapi.helpers.web.WebTopChartsHelper
import dagger.Lazy
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
import foundation.e.apps.data.StoreRepository
@@ -44,6 +44,7 @@ import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.application.utils.CategoryType
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.login.AuthenticatorRepository
import foundation.e.apps.data.playstore.utils.GPlayHttpClient
import foundation.e.apps.utils.SystemInfoProvider
@@ -51,13 +52,16 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
import com.aurora.gplayapi.data.models.App as GplayApp

@Suppress("TooManyFunctions")
class PlayStoreRepository @Inject constructor(
    @ApplicationContext private val context: Context,
    private val gPlayHttpClient: GPlayHttpClient,
    private val authenticatorRepository: AuthenticatorRepository,
    private val applicationDataManager: ApplicationDataManager
    private val applicationDataManager: Lazy<ApplicationDataManager> // Used Lazy to break circular dependency
) : StoreRepository {

    override suspend fun getHomeScreenData(list: MutableList<Home>): List<Home> {
        val homeScreenData = mutableMapOf<String, List<Application>>()
        val homeElements = createTopChartElements()
@@ -74,8 +78,8 @@ class PlayStoreRepository @Inject constructor(
        homeScreenData.map {
            val fusedApps = it.value.map { app ->
                app.apply {
                    applicationDataManager.updateStatus(this)
                    applicationDataManager.updateFilterLevel(this)
                    applicationDataManager.get().updateStatus(this)
                    applicationDataManager.get().updateFilterLevel(this)
                    source = Source.PLAY_STORE
                }
            }
@@ -157,6 +161,18 @@ class PlayStoreRepository @Inject constructor(
        return appDetails?.toApplication(context) ?: Application()
    }

    suspend fun getAppDetailsWeb(packageName: String): Application? {
        val webAppDetailsHelper = WebAppDetailsHelper().using(gPlayHttpClient)

        return withContext(Dispatchers.IO) {
            val result =
                handleNetworkResult { webAppDetailsHelper.getAppByPackageName(packageName) }
            val app = result.data ?: return@withContext null

            app.toApplication(context)
        }
    }

    private fun isEmulator(): Boolean {
        return SystemInfoProvider.getSystemProperty("ro.boot.qemu").equals("1")
    }
+4 −4
Original line number Diff line number Diff line
@@ -24,16 +24,16 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.aurora.gplayapi.Constants
import foundation.e.apps.FakeAppLoungePreference
import foundation.e.apps.data.Stores
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.apps.AppsApi
import foundation.e.apps.data.application.apps.AppsApiImpl
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.install.pkg.PwaManager
import foundation.e.apps.install.pkg.AppLoungePackageManager
import foundation.e.apps.install.pkg.PwaManager
import foundation.e.apps.util.MainCoroutineRule
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
@@ -92,7 +92,7 @@ class AppsApiTest {
        formatterMocked = Mockito.mockStatic(Formatter::class.java)
        preferenceManagerModule = FakeAppLoungePreference(context)
        applicationDataManager =
            ApplicationDataManager(appLoungePackageManager, pwaManager)
            ApplicationDataManager(appLoungePackageManager, pwaManager, playStoreRepository)
        appsApi = AppsApiImpl(
            stores,
            applicationDataManager
Loading