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

Commit e8b1536b authored by Jonathan Klee's avatar Jonathan Klee
Browse files

Introduce Stores class

parent 1e12dd40
Loading
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
package foundation.e.apps.data

import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.home.CleanApkAppsHomeDataBuilder
import foundation.e.apps.data.application.home.CleanApkPwaHomeDataBuilder
import foundation.e.apps.data.application.home.GooglePlayHomeDataBuilder
import foundation.e.apps.data.application.home.HomeDataBuilder
import foundation.e.apps.data.cleanapk.repositories.CleanApkAppsRepository
import foundation.e.apps.data.cleanapk.repositories.CleanApkPwaRepository
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.playstore.PlayStoreRepository
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class Stores @Inject constructor(
    playStoreRepository: PlayStoreRepository,
    cleanApkAppsRepository: CleanApkAppsRepository,
    cleanApkPwaRepository: CleanApkPwaRepository,
    applicationDataManager: ApplicationDataManager
) {
    private val mapHomeDataBuilder = mutableMapOf<Source, HomeDataBuilder>()

    fun getHomeDataBuilder(): Map<Source, HomeDataBuilder> {
        return mapHomeDataBuilder
    }

    init {
        mapHomeDataBuilder[Source.OPEN] = CleanApkAppsHomeDataBuilder(cleanApkAppsRepository)
        mapHomeDataBuilder[Source.PWA] = CleanApkPwaHomeDataBuilder(cleanApkPwaRepository)
        mapHomeDataBuilder[Source.GPLAY] = GooglePlayHomeDataBuilder(
            playStoreRepository,
            applicationDataManager
        )
    }
}
 No newline at end of file
+2 −2
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ class ApplicationRepository @Inject constructor(
    private val downloadInfoApi: DownloadInfoApi
) {

    suspend fun getHomeScreenData(authData: AuthData): LiveData<ResultSupreme<List<Home>>> {
        return homeApi.fetchHomeScreenData(authData)
    suspend fun getHomeScreenData(): LiveData<ResultSupreme<List<Home>>> {
        return homeApi.fetchHomeScreenData()
    }

    fun getSelectedAppTypes(): List<String> {
+1 −3
Original line number Diff line number Diff line
@@ -24,7 +24,5 @@ import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.application.data.Home

interface HomeApi {
    suspend fun fetchHomeScreenData(
        authData: AuthData,
    ): LiveData<ResultSupreme<List<Home>>>
    suspend fun fetchHomeScreenData(): LiveData<ResultSupreme<List<Home>>>
}
+61 −56
Original line number Diff line number Diff line
@@ -23,16 +23,19 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.liveData
import com.aurora.gplayapi.data.models.AuthData
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.ResultSupreme
import foundation.e.apps.data.Stores
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Home
import foundation.e.apps.data.application.search.FusedHomeDeferred
import foundation.e.apps.data.application.search.SearchApi
import foundation.e.apps.data.cleanapk.repositories.CleanApkAppsRepository
import foundation.e.apps.data.cleanapk.repositories.CleanApkPwaRepository
import foundation.e.apps.data.enums.ResultStatus
import foundation.e.apps.data.enums.Source
import foundation.e.apps.data.handleNetworkResult
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.utils.eventBus.AppEvent
import foundation.e.apps.utils.eventBus.EventBus
@@ -46,21 +49,16 @@ import javax.inject.Inject
class HomeApiImpl @Inject constructor(
    @ApplicationContext private val context: Context,
    private val appLoungePreference: AppLoungePreference,
    private val appSources: AppSourcesContainer,
    private val applicationDataManager: ApplicationDataManager
    private val stores: Stores
) : HomeApi {

    companion object {
        private const val THRESHOLD_LIMITED_RESULT_HOME_PAGE = 4
    }

    private enum class AppSourceWeight {
        GPLAY,
        OPEN_SOURCE,
        PWA
    }

    override suspend fun fetchHomeScreenData(authData: AuthData): LiveData<ResultSupreme<List<Home>>> {
    override suspend fun fetchHomeScreenData(): LiveData<ResultSupreme<List<Home>>> {
        val list = mutableListOf<Home>()
        var resultGplay: FusedHomeDeferred? = null
        var resultOpenSource: FusedHomeDeferred? = null
@@ -70,15 +68,15 @@ class HomeApiImpl @Inject constructor(
            coroutineScope {

                if (appLoungePreference.isGplaySelected()) {
                    resultGplay = async { loadHomeData(list, Source.GPLAY, authData) }
                    resultGplay = async { loadHomeData(list, Source.GPLAY) }
                }

                if (appLoungePreference.isOpenSourceSelected()) {
                    resultOpenSource = async { loadHomeData(list, Source.OPEN, authData) }
                    resultOpenSource = async { loadHomeData(list, Source.OPEN) }
                }

                if (appLoungePreference.isPWASelected()) {
                    resultPWA = async { loadHomeData(list, Source.PWA, authData) }
                    resultPWA = async { loadHomeData(list, Source.PWA) }
                }

                resultGplay?.await()?.let {
@@ -98,26 +96,11 @@ class HomeApiImpl @Inject constructor(

    private suspend fun loadHomeData(
        priorList: MutableList<Home>,
        source: Source,
        authData: AuthData,
        source: Source
    ): ResultSupreme<List<Home>> {

        val result = when (source) {
            Source.GPLAY -> handleNetworkResult {
                fetchGPlayHome(authData, priorList)
            }

            Source.OPEN -> handleNetworkResult {
                handleCleanApkHomes(priorList, SearchApi.APP_TYPE_OPEN)
            }

            Source.PWA -> handleNetworkResult {
                handleCleanApkHomes(priorList, SearchApi.APP_TYPE_PWA)
            }

            Source.GITLAB_RELEASES -> {
                ResultSupreme.Error(message = "Gitlab source not allowed")
            }
        val result = handleNetworkResult {
            val homeDataBuilder = stores.getHomeDataBuilder()[source]
            homeDataBuilder?.buildHomeScreenData(priorList)
        }

        setHomeErrorMessage(result.getResultStatus(), source)
@@ -132,23 +115,6 @@ class HomeApiImpl @Inject constructor(
        return ResultSupreme.create(result.getResultStatus(), priorList)
    }

    private suspend fun handleCleanApkHomes(
        priorList: MutableList<Home>,
        appType: String
    ): MutableList<Home> {
        val homes = if (appType == SearchApi.APP_TYPE_OPEN) {
            appSources.cleanApkAppsRepo.getHomeScreenData()
        } else {
            appSources.cleanApkPWARepo.getHomeScreenData()
        }

        homes.forEach { (title, list) ->
            priorList.add(Home(title, list, appType))
        }

        return priorList
    }

    private fun setHomeErrorMessage(apiStatus: ResultStatus, source: Source) {
        if (apiStatus != ResultStatus.OK) {
            apiStatus.message = when (source) {
@@ -159,15 +125,25 @@ class HomeApiImpl @Inject constructor(
            }
        }
    }
}

    private suspend fun fetchGPlayHome(
        authData: AuthData,
        priorList: MutableList<Home>
    ): List<Home> {
        val list = mutableListOf<Home>()
        val gplayHomeData = appSources.gplayRepo.getHomeScreenData()
interface HomeDataBuilder {
    suspend fun buildHomeScreenData(list: MutableList<Home>): List<Home>
}

class GooglePlayHomeDataBuilder(
    private val gPlayRepo: PlayStoreRepository,
    private val applicationDataManager: ApplicationDataManager
) : HomeDataBuilder {

        gplayHomeData.map {
    companion object {
        private const val THRESHOLD_LIMITED_RESULT_HOME_PAGE = 4
    }

    override suspend fun buildHomeScreenData(list: MutableList<Home>): List<Home> {
        val gPlayHomeData = gPlayRepo.getHomeScreenData()

        gPlayHomeData.map {
            val fusedApps = it.value.map { app ->
                app.apply {
                    applicationDataManager.updateStatus(this)
@@ -180,8 +156,7 @@ class HomeApiImpl @Inject constructor(
        handleLimitedResult(list)
        Timber.d("HomePageData: $list")

        priorList.addAll(list)
        return priorList
        return list
    }

    private fun handleLimitedResult(homeList: List<Home>) {
@@ -204,3 +179,33 @@ class HomeApiImpl @Inject constructor(
        }
    }
}

class CleanApkAppsHomeDataBuilder(
    private val cleanApkAppsRepository: CleanApkAppsRepository
) : HomeDataBuilder {

    override suspend fun buildHomeScreenData(list: MutableList<Home>): List<Home> {
        val homes = cleanApkAppsRepository.getHomeScreenData()

        homes.forEach { (title, apps) ->
            list.add(Home(title, apps, SearchApi.APP_TYPE_OPEN))
        }

        return list
    }
}

class CleanApkPwaHomeDataBuilder(
    private val cleanApkPwaRepository: CleanApkPwaRepository
) : HomeDataBuilder {

    override suspend fun buildHomeScreenData(list: MutableList<Home>): List<Home> {
        val homes = cleanApkPwaRepository.getHomeScreenData()

        homes.forEach { (title, apps) ->
            list.add(Home(title, apps, SearchApi.APP_TYPE_PWA))
        }

        return list
    }
}
+0 −3
Original line number Diff line number Diff line
@@ -18,12 +18,9 @@

package foundation.e.apps.data.cleanapk.repositories

import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher
import foundation.e.apps.data.cleanapk.CleanApkRetrofit
import foundation.e.apps.data.cleanapk.data.app.CleanApkApplication
import foundation.e.apps.data.cleanapk.data.categories.Categories
import foundation.e.apps.data.cleanapk.data.download.Download
import foundation.e.apps.data.cleanapk.data.search.Search
Loading