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

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

Merge branch '1799-dependency_container' into 'main'

added dependency container for app sources

See merge request !411
parents 529885e6 8cc21339
Loading
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
/*
 *  Copyright MURENA SAS 2024
 *  Apps  Quickly and easily install Android apps onto your device!
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 */

package foundation.e.apps.data

import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository
import foundation.e.apps.data.playstore.PlayStoreRepository
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Singleton

@Singleton
class AppSourcesContainer @Inject constructor(
    @Named("gplayRepository") val gplayRepo: PlayStoreRepository,
    @Named("cleanApkAppsRepository") val cleanApkAppsRepo: CleanApkRepository,
    @Named("cleanApkPWARepository") val cleanApkPWARepo: CleanApkRepository
)
+11 −13
Original line number Original line Diff line number Diff line
@@ -22,30 +22,27 @@ import android.content.Context
import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.AuthData
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.cleanapk.data.search.Search
import foundation.e.apps.data.cleanapk.data.search.Search
import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.FilterLevel
import foundation.e.apps.data.enums.Origin
import foundation.e.apps.data.enums.Origin
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.enums.Status
import foundation.e.apps.data.enums.isUnFiltered
import foundation.e.apps.data.enums.isUnFiltered
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil
import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil
import retrofit2.Response
import retrofit2.Response
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named
import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication


class AppsApiImpl @Inject constructor(
class AppsApiImpl @Inject constructor(
    @ApplicationContext private val context: Context,
    @ApplicationContext private val context: Context,
    private val appLoungePreference: AppLoungePreference,
    private val appLoungePreference: AppLoungePreference,
    @Named("gplayRepository") private val gplayRepository: PlayStoreRepository,
    private val appSources: AppSourcesContainer,
    @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository,
    private val applicationDataManager: ApplicationDataManager
    private val applicationDataManager: ApplicationDataManager
) : AppsApi {
) : AppsApi {


@@ -56,15 +53,15 @@ class AppsApiImpl @Inject constructor(
    override suspend fun getCleanapkAppDetails(packageName: String): Pair<Application, ResultStatus> {
    override suspend fun getCleanapkAppDetails(packageName: String): Pair<Application, ResultStatus> {
        var application = Application()
        var application = Application()
        val result = handleNetworkResult {
        val result = handleNetworkResult {
            val result = cleanApkAppsRepository.getSearchResult(
            val result = appSources.cleanApkAppsRepo.getSearchResult(
                packageName,
                packageName,
                KEY_SEARCH_PACKAGE_NAME
                KEY_SEARCH_PACKAGE_NAME
            ).body()
            ).body()


            if (result?.hasSingleResult() == true) {
            if (result?.hasSingleResult() == true) {
                application =
                application =
                    (cleanApkAppsRepository.getAppDetails(result.apps[0]._id) as Response<CleanApkApplication>)
                    (appSources.cleanApkAppsRepo.getAppDetails(result.apps[0]._id)
                        .body()?.app ?: Application()
                            as Response<CleanApkApplication>).body()?.app ?: Application()
            }
            }


            application.updateFilterLevel(null)
            application.updateFilterLevel(null)
@@ -135,7 +132,7 @@ class AppsApiImpl @Inject constructor(
        val applicationList = mutableListOf<Application>()
        val applicationList = mutableListOf<Application>()


        val result = handleNetworkResult {
        val result = handleNetworkResult {
            gplayRepository.getAppsDetails(packageNameList).forEach { app ->
            appSources.gplayRepo.getAppsDetails(packageNameList).forEach { app ->
                handleFilteredApps(app, authData, applicationList)
                handleFilteredApps(app, authData, applicationList)
            }
            }
        }
        }
@@ -168,7 +165,7 @@ class AppsApiImpl @Inject constructor(
        packageName: String,
        packageName: String,
        applicationList: MutableList<Application>
        applicationList: MutableList<Application>
    ) = handleNetworkResult {
    ) = handleNetworkResult {
        cleanApkAppsRepository.getSearchResult(
        appSources.cleanApkAppsRepo.getSearchResult(
            packageName,
            packageName,
            KEY_SEARCH_PACKAGE_NAME
            KEY_SEARCH_PACKAGE_NAME
        ).body()?.run {
        ).body()?.run {
@@ -201,9 +198,10 @@ class AppsApiImpl @Inject constructor(


        val result = handleNetworkResult {
        val result = handleNetworkResult {
            application = if (origin == Origin.CLEANAPK) {
            application = if (origin == Origin.CLEANAPK) {
                (cleanApkAppsRepository.getAppDetails(id) as Response<CleanApkApplication>).body()?.app
                (appSources.cleanApkAppsRepo.getAppDetails(id)
                        as Response<CleanApkApplication>).body()?.app
            } else {
            } else {
                val app = gplayRepository.getAppDetails(packageName) as App?
                val app = appSources.gplayRepo.getAppDetails(packageName) as App?
                app?.toApplication(context)
                app?.toApplication(context)
            }
            }


+8 −12
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.StreamCluster
import com.aurora.gplayapi.data.models.StreamCluster
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
import foundation.e.apps.R
import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.application.data.Application
@@ -33,23 +34,18 @@ import foundation.e.apps.data.application.utils.CategoryUtils
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.application.utils.toCategory
import foundation.e.apps.data.application.utils.toCategory
import foundation.e.apps.data.cleanapk.data.categories.Categories
import foundation.e.apps.data.cleanapk.data.categories.Categories
import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository
import foundation.e.apps.data.enums.AppTag
import foundation.e.apps.data.enums.AppTag
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.isUnFiltered
import foundation.e.apps.data.enums.isUnFiltered
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.data.preference.AppLoungePreference
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named


class CategoryApiImpl @Inject constructor(
class CategoryApiImpl @Inject constructor(
    @ApplicationContext private val context: Context,
    @ApplicationContext private val context: Context,
    private val appLoungePreference: AppLoungePreference,
    private val appLoungePreference: AppLoungePreference,
    @Named("gplayRepository") private val gplayRepository: PlayStoreRepository,
    private val appSources: AppSourcesContainer,
    @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository,
    @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository,
    private val applicationDataManager: ApplicationDataManager
    private val applicationDataManager: ApplicationDataManager
) : CategoryApi {
) : CategoryApi {


@@ -113,7 +109,7 @@ class CategoryApiImpl @Inject constructor(
    ): Pair<List<Category>, ResultStatus> {
    ): Pair<List<Category>, ResultStatus> {
        val categoryList = mutableListOf<Category>()
        val categoryList = mutableListOf<Category>()
        val result = handleNetworkResult {
        val result = handleNetworkResult {
            val playResponse = gplayRepository.getCategories(type).map { gplayCategory ->
            val playResponse = appSources.gplayRepo.getCategories(type).map { gplayCategory ->
                val category = gplayCategory.toCategory()
                val category = gplayCategory.toCategory()
                category.drawable =
                category.drawable =
                    CategoryUtils.provideAppsCategoryIconResource(
                    CategoryUtils.provideAppsCategoryIconResource(
@@ -140,12 +136,12 @@ class CategoryApiImpl @Inject constructor(
            val categories = when (source) {
            val categories = when (source) {
                Source.OPEN -> {
                Source.OPEN -> {
                    tag = AppTag.OpenSource(context.getString(R.string.open_source))
                    tag = AppTag.OpenSource(context.getString(R.string.open_source))
                    cleanApkAppsRepository.getCategories().body()
                    appSources.cleanApkAppsRepo.getCategories().body()
                }
                }


                Source.PWA -> {
                Source.PWA -> {
                    tag = AppTag.PWA(context.getString(R.string.pwa))
                    tag = AppTag.PWA(context.getString(R.string.pwa))
                    cleanApkPWARepository.getCategories().body()
                    appSources.cleanApkPWARepo.getCategories().body()
                }
                }


                else -> null
                else -> null
@@ -185,7 +181,7 @@ class CategoryApiImpl @Inject constructor(


        return handleNetworkResult {
        return handleNetworkResult {
            val streamCluster =
            val streamCluster =
                gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster
                appSources.gplayRepo.getAppsByCategory(category, pageUrl) as StreamCluster


            val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList)
            val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList)
            filteredAppList.data?.let {
            filteredAppList.data?.let {
@@ -258,11 +254,11 @@ class CategoryApiImpl @Inject constructor(
        category: String
        category: String
    ) = when (source) {
    ) = when (source) {
        Source.OPEN -> {
        Source.OPEN -> {
            cleanApkAppsRepository.getAppsByCategory(category).body()
            appSources.cleanApkAppsRepo.getAppsByCategory(category).body()
        }
        }


        Source.PWA -> {
        Source.PWA -> {
            cleanApkPWARepository.getAppsByCategory(category).body()
            appSources.cleanApkPWARepo.getAppsByCategory(category).body()
        }
        }


        else -> null
        else -> null
+8 −11
Original line number Original line Diff line number Diff line
@@ -18,17 +18,14 @@


package foundation.e.apps.data.application.downloadInfo
package foundation.e.apps.data.application.downloadInfo


import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher
import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher
import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository
import foundation.e.apps.data.enums.Origin
import foundation.e.apps.data.enums.Origin
import foundation.e.apps.data.fusedDownload.models.FusedDownload
import foundation.e.apps.data.fusedDownload.models.FusedDownload
import foundation.e.apps.data.playstore.PlayStoreRepository
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named


class DownloadInfoApiImpl @Inject constructor(
class DownloadInfoApiImpl @Inject constructor(
    @Named("gplayRepository") private val gplayRepository: PlayStoreRepository,
    private val appSources: AppSourcesContainer
    @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository
) : DownloadInfoApi {
) : DownloadInfoApi {


    override suspend fun getOnDemandModule(
    override suspend fun getOnDemandModule(
@@ -37,7 +34,7 @@ class DownloadInfoApiImpl @Inject constructor(
        versionCode: Int,
        versionCode: Int,
        offerType: Int
        offerType: Int
    ): String? {
    ): String? {
        val list = gplayRepository.getOnDemandModule(
        val list = appSources.gplayRepo.getOnDemandModule(
            packageName,
            packageName,
            moduleName,
            moduleName,
            versionCode,
            versionCode,
@@ -76,7 +73,7 @@ class DownloadInfoApiImpl @Inject constructor(
        list: MutableList<String>
        list: MutableList<String>
    ) {
    ) {
        val downloadList =
        val downloadList =
            gplayRepository.getDownloadInfo(
            appSources.gplayRepo.getDownloadInfo(
                fusedDownload.packageName,
                fusedDownload.packageName,
                fusedDownload.versionCode,
                fusedDownload.versionCode,
                fusedDownload.offerType
                fusedDownload.offerType
@@ -90,13 +87,13 @@ class DownloadInfoApiImpl @Inject constructor(
        list: MutableList<String>
        list: MutableList<String>
    ) {
    ) {
        val downloadInfo =
        val downloadInfo =
            (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo(
            (appSources.cleanApkAppsRepo as CleanApkDownloadInfoFetcher)
                fusedDownload.id
                .getDownloadInfo(fusedDownload.id).body()
            ).body()
        downloadInfo?.download_data?.download_link?.let { list.add(it) }
        downloadInfo?.download_data?.download_link?.let { list.add(it) }
        fusedDownload.signature = downloadInfo?.download_data?.signature ?: ""
        fusedDownload.signature = downloadInfo?.download_data?.signature ?: ""
    }
    }


    override suspend fun getOSSDownloadInfo(id: String, version: String?) =
    override suspend fun getOSSDownloadInfo(id: String, version: String?) =
        (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo(id, version)
        (appSources.cleanApkAppsRepo as CleanApkDownloadInfoFetcher)
            .getDownloadInfo(id, version)
}
}
+16 −11
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.AuthData
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.R
import foundation.e.apps.R
import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.application.data.Home
@@ -32,12 +33,10 @@ import foundation.e.apps.data.application.search.FusedHomeDeferred
import foundation.e.apps.data.application.search.SearchApi
import foundation.e.apps.data.application.search.SearchApi
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.application.utils.toApplication
import foundation.e.apps.data.cleanapk.data.home.HomeScreen
import foundation.e.apps.data.cleanapk.data.home.HomeScreen
import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.handleNetworkResult
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.login.AuthObject
import foundation.e.apps.data.playstore.PlayStoreRepository
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.data.preference.AppLoungePreference
import foundation.e.apps.utils.eventBus.AppEvent
import foundation.e.apps.utils.eventBus.AppEvent
import foundation.e.apps.utils.eventBus.EventBus
import foundation.e.apps.utils.eventBus.EventBus
@@ -48,15 +47,12 @@ import kotlinx.coroutines.launch
import retrofit2.Response
import retrofit2.Response
import timber.log.Timber
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named
import foundation.e.apps.data.cleanapk.data.home.Home as CleanApkHome
import foundation.e.apps.data.cleanapk.data.home.Home as CleanApkHome


class HomeApiImpl @Inject constructor(
class HomeApiImpl @Inject constructor(
    @ApplicationContext private val context: Context,
    @ApplicationContext private val context: Context,
    private val appLoungePreference: AppLoungePreference,
    private val appLoungePreference: AppLoungePreference,
    @Named("gplayRepository") private val gplayRepository: PlayStoreRepository,
    private val appSources: AppSourcesContainer,
    @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository,
    @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository,
    private val applicationDataManager: ApplicationDataManager
    private val applicationDataManager: ApplicationDataManager
) : HomeApi {
) : HomeApi {


@@ -143,9 +139,9 @@ class HomeApiImpl @Inject constructor(
        appType: String
        appType: String
    ): MutableList<Home> {
    ): MutableList<Home> {
        val response = if (appType == SearchApi.APP_TYPE_OPEN) {
        val response = if (appType == SearchApi.APP_TYPE_OPEN) {
            (cleanApkAppsRepository.getHomeScreenData() as Response<HomeScreen>).body()
            (appSources.cleanApkAppsRepo.getHomeScreenData() as Response<HomeScreen>).body()
        } else {
        } else {
            (cleanApkPWARepository.getHomeScreenData() as Response<HomeScreen>).body()
            (appSources.cleanApkPWARepo.getHomeScreenData() as Response<HomeScreen>).body()
        }
        }


        response?.home?.let {
        response?.home?.let {
@@ -182,11 +178,19 @@ class HomeApiImpl @Inject constructor(
                }
                }


                "popular_apps_in_last_24_hours" -> {
                "popular_apps_in_last_24_hours" -> {
                    applicationDataManager.prepareApps(home.popular_apps_in_last_24_hours, list, value)
                    applicationDataManager.prepareApps(
                        home.popular_apps_in_last_24_hours,
                        list,
                        value
                    )
                }
                }


                "popular_games_in_last_24_hours" -> {
                "popular_games_in_last_24_hours" -> {
                    applicationDataManager.prepareApps(home.popular_games_in_last_24_hours, list, value)
                    applicationDataManager.prepareApps(
                        home.popular_games_in_last_24_hours,
                        list,
                        value
                    )
                }
                }


                "discover" -> {
                "discover" -> {
@@ -230,7 +234,8 @@ class HomeApiImpl @Inject constructor(
        priorList: MutableList<Home>
        priorList: MutableList<Home>
    ): List<Home> {
    ): List<Home> {
        val list = mutableListOf<Home>()
        val list = mutableListOf<Home>()
        val gplayHomeData = gplayRepository.getHomeScreenData() as Map<String, List<App>>
        val gplayHomeData =
            appSources.gplayRepo.getHomeScreenData() as Map<String, List<App>>
        gplayHomeData.map {
        gplayHomeData.map {
            val fusedApps = it.value.map { app ->
            val fusedApps = it.value.map { app ->
                app.toApplication(context).apply {
                app.toApplication(context).apply {
Loading