Loading app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt +16 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 } Loading @@ -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) Loading app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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) } Loading Loading @@ -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> ) { Loading app/src/main/java/foundation/e/apps/data/cleanapk/repositories/HomeConverter.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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) -> Loading app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt +21 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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() Loading @@ -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 } } Loading Loading @@ -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") } Loading app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt +16 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 } Loading @@ -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) Loading
app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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) } Loading Loading @@ -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> ) { Loading
app/src/main/java/foundation/e/apps/data/cleanapk/repositories/HomeConverter.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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) -> Loading
app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt +21 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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() Loading @@ -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 } } Loading Loading @@ -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") } Loading
app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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