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

Commit b59543b9 authored by Nishith  Khanna's avatar Nishith Khanna
Browse files

Merge branch '3566-token-dispenser-load-optimization' into 'main'

token dispenser load optimization

See merge request !609
parents f801d03f 54e87829
Loading
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ 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.data.playstore.PlayStoreRepository
import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil
import javax.inject.Inject

@@ -102,8 +103,9 @@ class AppsApiImpl @Inject constructor(
    ): Pair<List<Application>, ResultStatus> {
        val applicationList = mutableListOf<Application>()

        for (packageName in packageNameList) {
            val app = stores.getStore(Source.PLAY_STORE)?.getAppDetails(packageName) ?: Application()
        val playStore = stores.getStore(Source.PLAY_STORE) as? PlayStoreRepository
        val apps = playStore?.getAppsDetails(packageNameList).orEmpty()
        for (app in apps) {
            handleFilteredApps(app, applicationList)
        }

+11 −8
Original line number Diff line number Diff line
@@ -154,30 +154,33 @@ class PlayStoreRepository @Inject constructor(
        return categoryList
    }

    override suspend fun getAppDetails(packageName: String): Application =
    suspend fun getAppsDetails(packages: List<String>): List<Application> =
        withContext(Dispatchers.IO) {
            var appDetails: GplayApp
            appDetails = getAppDetailsHelper().getAppByPackageName(packageName)
            var apps = getAppDetailsHelper().getAppByPackageName(packages)

            if (!isEmulator() && appDetails.versionCode == 0L
            if (!isEmulator() && apps.any { it.versionCode == 0L }
                && authenticatorRepository.getGPlayAuthOrThrow().isAnonymous) {
                // Google Play returns limited result ( i.e. version code being 0) with a stale token,
                // so we need to refresh authentication to get a new token.
                Timber.i("Version code is 0 for ${appDetails.packageName}.")
                Timber.i("Version code is 0.")

                refreshPlayStoreAuthentication()

                appDetails = getAppDetailsHelper().getAppByPackageName(packageName)
                apps = getAppDetailsHelper().getAppByPackageName(packages)

                if (appDetails.versionCode == 0L) {
                if (apps.any { it.versionCode == 0L }) {
                    Timber.w("After refreshing auth, version code is still 0. Giving up installation.")
                    throw IllegalStateException("App version code cannot be 0")
                }
            }

            appDetails.toApplication(context)
            apps.map { it.toApplication(context) }
        }

    override suspend fun getAppDetails(packageName: String): Application =
        getAppsDetails(buildList { add(packageName) }).firstOrNull()
            ?: error("No app details found for package: $packageName")

    private fun getAppDetailsHelper(): AppDetailsHelper {
        val authData = authenticatorRepository.getGPlayAuthOrThrow()
        val appDetailsHelper = AppDetailsHelper(authData).using(gPlayHttpClient)
+8 −30
Original line number Diff line number Diff line
@@ -21,24 +21,21 @@ package foundation.e.apps.data.updates
import android.content.Context
import android.content.pm.ApplicationInfo
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.data.application.ApplicationRepository
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.blockedApps.BlockedAppRepository
import foundation.e.apps.data.cleanapk.ApkSignatureManager
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.faultyApps.FaultyAppRepository
import foundation.e.apps.data.fdroid.FDroidRepository
import foundation.e.apps.data.application.ApplicationRepository
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.gitlab.SystemAppsUpdatesRepository
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.install.pkg.AppLoungePackageManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
@@ -264,33 +261,14 @@ class UpdatesManagerImpl @Inject constructor(
        return apiResult.second
    }

    /**
     * Bulk info from gplay api [PlayStoreRepositoryImpl.getAppsDetails] is not providing correct
     * geo restriction status of apps. So we get all individual app information asynchronously.
     * Example: in.startv.hotstar.dplus
     * Issue: https://gitlab.e.foundation/e/backlog/-/issues/7135
     */
    private suspend fun getGPlayUpdates(
        packageNames: List<String>,
    ): Pair<List<Application>, ResultStatus> {

        val appsResults = coroutineScope {
            val deferredResults = packageNames.map { packageName ->
                async {
                    applicationRepository.getApplicationDetails(
                        "",
                        packageName,
        val appsResults = applicationRepository.getApplicationDetails(
            packageNames,
            Source.PLAY_STORE
        )
                }
            }
            deferredResults.awaitAll()
        }

        val status = appsResults.find { it.second != ResultStatus.OK }?.second ?: ResultStatus.OK
        val appsList = appsResults.filter { it.first.package_name.isNotEmpty() }.map { it.first }

        return Pair(appsList, status)
        return Pair(appsResults.first, appsResults.second)
    }

    /**
+8 −0
Original line number Diff line number Diff line
@@ -380,6 +380,14 @@ class UpdateManagerImptTest {
            )
        ).thenReturn(openSourceUpdates)

        Mockito.`when`(
            applicationRepository.getApplicationDetails(
                any(),
                eq(Source.PLAY_STORE)
            )
        ).thenReturn(gplayUpdates)


        Mockito.`when`(applicationRepository.getSelectedAppTypes())
            .thenReturn(selectedApplicationSources)