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

Commit c1e1e1e5 authored by Hasib Prince's avatar Hasib Prince
Browse files

Merge branch 'main' of gitlab.e.foundation:e/os/apps

parents f1c32007 3732f83d
Loading
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ import foundation.e.apps.setup.signin.SignInViewModel
import foundation.e.apps.updates.UpdatesNotifier
import foundation.e.apps.utils.enums.Status
import foundation.e.apps.utils.enums.User
import foundation.e.apps.utils.parentFragment.TimeoutFragment
import foundation.e.apps.utils.modules.CommonUtilsModule
import foundation.e.apps.utils.parentFragment.TimeoutFragment
import kotlinx.coroutines.launch
import java.io.File
import java.util.UUID
@@ -143,8 +143,11 @@ class MainActivity : AppCompatActivity() {
                        Log.d(TAG, "Timeout validating auth data!")
                        val lastFragment = navHostFragment.childFragmentManager.fragments[0]
                        if (lastFragment is TimeoutFragment) {
                            Log.d(TAG, "Displaying timeout from MainActivity on fragment: "
                                    + lastFragment::class.java.name)
                            Log.d(
                                TAG,
                                "Displaying timeout from MainActivity on fragment: " +
                                    lastFragment::class.java.name
                            )
                            lastFragment.onTimeout()
                        }
                    }
+0 −1
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import com.google.gson.Gson
import dagger.hilt.android.lifecycle.HiltViewModel
import foundation.e.apps.api.cleanapk.blockedApps.BlockedAppRepository
import foundation.e.apps.api.ecloud.EcloudRepository
import foundation.e.apps.api.fused.FusedAPIImpl
import foundation.e.apps.api.fused.FusedAPIRepository
import foundation.e.apps.api.fused.data.FusedApp
import foundation.e.apps.manager.database.fusedDownload.FusedDownload
+9 −7
Original line number Diff line number Diff line
@@ -161,8 +161,10 @@ sealed class ResultSupreme<T> {
                is Timeout -> ResultStatus.TIMEOUT
                is Error -> ResultStatus.UNKNOWN
            }
            return create(status, newData, message ?: result.message,
                exception ?: result.exception)
            return create(
                status, newData, message ?: result.message,
                exception ?: result.exception
            )
        }
    }
}
+81 −49
Original line number Diff line number Diff line
@@ -27,9 +27,12 @@ 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.StreamBundle
import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.helpers.TopChartsHelper
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
import foundation.e.apps.api.ResultSupreme
import foundation.e.apps.api.cleanapk.CleanAPKInterface
import foundation.e.apps.api.cleanapk.CleanAPKRepository
import foundation.e.apps.api.cleanapk.data.categories.Categories
@@ -45,9 +48,9 @@ import foundation.e.apps.manager.database.fusedDownload.FusedDownload
import foundation.e.apps.manager.pkg.PkgManagerModule
import foundation.e.apps.utils.enums.AppTag
import foundation.e.apps.utils.enums.Origin
import foundation.e.apps.utils.enums.ResultStatus
import foundation.e.apps.utils.enums.Status
import foundation.e.apps.utils.enums.Type
import foundation.e.apps.utils.enums.ResultStatus
import foundation.e.apps.utils.modules.CommonUtilsModule.timeoutDurationInMillis
import foundation.e.apps.utils.modules.PWAManagerModule
import foundation.e.apps.utils.modules.PreferenceManagerModule
@@ -273,30 +276,8 @@ class FusedAPIImpl @Inject constructor(
        fusedDownload.downloadURLList = list
    }

    suspend fun listApps(category: String, browseUrl: String, authData: AuthData): List<FusedApp>? {
        val preferredApplicationType = preferenceManagerModule.preferredApplicationType()

        if (preferredApplicationType != "any") {
            val response = if (preferredApplicationType == "open") {
                getOpenSourceAppsResponse(category)
            } else {
                getPWAAppsResponse(category)
            }
            response?.apps?.forEach {
                it.updateStatus()
                it.updateType()
            }
            return response?.apps
        } else {
            val listApps = gPlayAPIRepository.listApps(browseUrl, authData)
            return listApps.map { app ->
                app.transformToFusedApp()
            }
        }
    }

    suspend fun getPWAApps(category: String): Pair<List<FusedApp>, ResultStatus> {
        var list = mutableListOf<FusedApp>()
    suspend fun getPWAApps(category: String): ResultSupreme<List<FusedApp>> {
        val list = mutableListOf<FusedApp>()
        val status = runCodeBlockWithTimeout({
            val response = getPWAAppsResponse(category)
            response?.apps?.forEach {
@@ -305,10 +286,10 @@ class FusedAPIImpl @Inject constructor(
                list.add(it)
            }
        })
        return Pair(list, status)
        return ResultSupreme.create(status, list)
    }

    suspend fun getOpenSourceApps(category: String): Pair<List<FusedApp>, ResultStatus> {
    suspend fun getOpenSourceApps(category: String): ResultSupreme<List<FusedApp>> {
        val list = mutableListOf<FusedApp>()
        val status = runCodeBlockWithTimeout({
            val response = getOpenSourceAppsResponse(category)
@@ -318,36 +299,54 @@ class FusedAPIImpl @Inject constructor(
                list.add(it)
            }
        })
        return Pair(list, status)
        return ResultSupreme.create(status, list)
    }

    suspend fun getPlayStoreApps(browseUrl: String, authData: AuthData): Pair<List<FusedApp>, ResultStatus> {
        var list = mutableListOf<FusedApp>()
    suspend fun getNextStreamBundle(
        authData: AuthData,
        homeUrl: String,
        currentStreamBundle: StreamBundle,
    ): ResultSupreme<StreamBundle> {
        var streamBundle = StreamBundle()
        val status = runCodeBlockWithTimeout({
            list.addAll(gPlayAPIRepository.listApps(browseUrl, authData).map { app ->
                app.transformToFusedApp()
            streamBundle = gPlayAPIRepository.getNextStreamBundle(authData, homeUrl, currentStreamBundle)
        })
        })
        return Pair(list, status)
        return ResultSupreme.create(status, streamBundle)
    }

    suspend fun getPlayStoreAppCategoryUrls(browseUrl: String, authData: AuthData): List<String> {
        return gPlayAPIRepository.listAppCategoryUrls(browseUrl, authData)
    suspend fun getAdjustedFirstCluster(
        authData: AuthData,
        streamBundle: StreamBundle,
        pointer: Int = 0,
    ): ResultSupreme<StreamCluster> {
        var streamCluster = StreamCluster()
        val status = runCodeBlockWithTimeout({
            streamCluster = gPlayAPIRepository.getAdjustedFirstCluster(authData, streamBundle, pointer)
        })
        return ResultSupreme.create(status, streamCluster)
    }

    suspend fun getAppsAndNextClusterUrl(
        browseUrl: String,
        authData: AuthData
    ): Triple<List<FusedApp>, String, ResultStatus> {
        val appsList = mutableListOf<FusedApp>()
        var nextUrl = ""
    suspend fun getNextStreamCluster(
        authData: AuthData,
        currentStreamCluster: StreamCluster,
    ): ResultSupreme<StreamCluster> {
        var streamCluster = StreamCluster()
        val status = runCodeBlockWithTimeout({
            val gPlayResult = gPlayAPIRepository.getAppsAndNextClusterUrl(browseUrl, authData)
            appsList.addAll(gPlayResult.first.map { app -> app.transformToFusedApp() })
            nextUrl = gPlayResult.second
            streamCluster = gPlayAPIRepository.getNextStreamCluster(authData, currentStreamCluster)
        })
        return ResultSupreme.create(status, streamCluster)
    }

        return Triple(appsList, nextUrl, status)
    suspend fun getPlayStoreApps(browseUrl: String, authData: AuthData): ResultSupreme<List<FusedApp>> {
        val list = mutableListOf<FusedApp>()
        val status = runCodeBlockWithTimeout({
            list.addAll(
                gPlayAPIRepository.listApps(browseUrl, authData).map { app ->
                    app.transformToFusedApp()
                }
            )
        })
        return ResultSupreme.create(status, list)
    }

    suspend fun getApplicationDetails(
@@ -450,6 +449,39 @@ class FusedAPIImpl @Inject constructor(
        return Pair(fusedAppList, status)
    }

    /**
     * Filter out apps which are restricted, whose details cannot be fetched.
     * If an app is restricted, we do try to fetch the app details inside a
     * try-catch block. If that fails, we remove the app, else we keep it even
     * if it is restricted.
     *
     * Popular example: "com.skype.m2"
     *
     * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5174
     * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5131 [2]
     */
    suspend fun filterRestrictedGPlayApps(
        authData: AuthData,
        appList: List<App>,
    ): ResultSupreme<List<FusedApp>> {
        val filteredFusedApps = mutableListOf<FusedApp>()
        val status = runCodeBlockWithTimeout({
            appList.forEach {
                if (it.restriction != Constants.Restriction.NOT_RESTRICTED) {
                    try {
                        gPlayAPIRepository.getAppDetails(it.packageName, authData)?.let { app ->
                            filteredFusedApps.add(app.transformToFusedApp())
                        }
                    } catch (e: Exception) {}
                } else {
                    filteredFusedApps.add(it.transformToFusedApp())
                }
            }
        })

        return ResultSupreme.create(status, filteredFusedApps)
    }

    suspend fun getApplicationDetails(
        id: String,
        packageName: String,
@@ -555,7 +587,6 @@ class FusedAPIImpl @Inject constructor(
            apiStatus = ResultStatus.UNKNOWN
        })


        /*
         * Try within timeout limit to get PWA categories
         */
@@ -922,7 +953,8 @@ class FusedAPIImpl @Inject constructor(
            originalSize = this.size,
            appSize = Formatter.formatFileSize(context, this.size),
            isFree = this.isFree,
            price = this.price
            price = this.price,
            restriction = this.restriction,
        )
        app.updateStatus()
        return app
+30 −8
Original line number Diff line number Diff line
@@ -19,14 +19,18 @@
package foundation.e.apps.api.fused

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.Category
import com.aurora.gplayapi.data.models.StreamBundle
import com.aurora.gplayapi.data.models.StreamCluster
import foundation.e.apps.api.ResultSupreme
import foundation.e.apps.api.fused.data.FusedApp
import foundation.e.apps.api.fused.data.FusedCategory
import foundation.e.apps.api.fused.data.FusedHome
import foundation.e.apps.manager.database.fusedDownload.FusedDownload
import foundation.e.apps.utils.enums.ResultStatus
import foundation.e.apps.utils.enums.Origin
import foundation.e.apps.utils.enums.ResultStatus
import foundation.e.apps.utils.enums.Status
import javax.inject.Inject
import javax.inject.Singleton
@@ -59,6 +63,13 @@ class FusedAPIRepository @Inject constructor(
        return fusedAPIImpl.getApplicationDetails(packageNameList, authData, origin)
    }

    suspend fun filterRestrictedGPlayApps(
        authData: AuthData,
        appList: List<App>,
    ): ResultSupreme<List<FusedApp>> {
        return fusedAPIImpl.filterRestrictedGPlayApps(authData, appList)
    }

    suspend fun getApplicationDetails(
        id: String,
        packageName: String,
@@ -100,16 +111,27 @@ class FusedAPIRepository @Inject constructor(
        return fusedAPIImpl.getSearchResults(query, authData)
    }

    suspend fun listApps(category: String, browseUrl: String, authData: AuthData): List<FusedApp>? {
        return fusedAPIImpl.listApps(category, browseUrl, authData)
    suspend fun getNextStreamBundle(
        authData: AuthData,
        homeUrl: String,
        currentStreamBundle: StreamBundle,
    ): ResultSupreme<StreamBundle> {
        return fusedAPIImpl.getNextStreamBundle(authData, homeUrl, currentStreamBundle)
    }

    suspend fun getPlayStoreAppCategoryUrls(browseUrl: String, authData: AuthData): List<String> {
        return fusedAPIImpl.getPlayStoreAppCategoryUrls(browseUrl, authData)
    suspend fun getAdjustedFirstCluster(
        authData: AuthData,
        streamBundle: StreamBundle,
        pointer: Int = 0,
    ): ResultSupreme<StreamCluster> {
        return fusedAPIImpl.getAdjustedFirstCluster(authData, streamBundle, pointer)
    }

    suspend fun getAppsAndNextClusterUrl(browseUrl: String, authData: AuthData): Triple<List<FusedApp>, String, ResultStatus> {
        return fusedAPIImpl.getAppsAndNextClusterUrl(browseUrl, authData)
    suspend fun getNextStreamCluster(
        authData: AuthData,
        currentStreamCluster: StreamCluster,
    ): ResultSupreme<StreamCluster> {
        return fusedAPIImpl.getNextStreamCluster(authData, currentStreamCluster)
    }

    suspend fun getAppsListBasedOnCategory(
@@ -117,7 +139,7 @@ class FusedAPIRepository @Inject constructor(
        browseUrl: String,
        authData: AuthData,
        source: String
    ): Pair<List<FusedApp>, ResultStatus> {
    ): ResultSupreme<List<FusedApp>> {
        return when (source) {
            "Open Source" -> fusedAPIImpl.getOpenSourceApps(category)
            "PWA" -> fusedAPIImpl.getPWAApps(category)
Loading