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

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

Introduce Stores class

parent 853e1c00
Loading
Loading
Loading
Loading
Loading
+32 −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
) {
    val mapHomeDataBuilder = mutableMapOf<Source, HomeDataBuilder>()

    init {
        mapHomeDataBuilder[Source.OPEN] = CleanApkAppsHomeDataBuilder(cleanApkAppsRepository)
        mapHomeDataBuilder[Source.PWA] = CleanApkPwaHomeDataBuilder(cleanApkPwaRepository)
        mapHomeDataBuilder[Source.GPLAY] = GooglePlayHomeDataBuilder(
            playStoreRepository,
            applicationDataManager
        )
    }
}
 No newline at end of file
+60 −48
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,14 +49,9 @@ 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,
@@ -102,22 +100,12 @@ class HomeApiImpl @Inject constructor(
        authData: AuthData,
    ): ResultSupreme<List<Home>> {

        val result = when (source) {
            Source.GPLAY -> handleNetworkResult {
                fetchGPlayHome(authData, priorList)
        if (source == Source.GPLAY) {
            (stores.mapHomeDataBuilder[source] as GooglePlayHomeDataBuilder).authData = authData
        }

            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 {
            stores.mapHomeDataBuilder[source]?.buildHomeScreenData(priorList)
        }

        setHomeErrorMessage(result.getResultStatus(), source)
@@ -132,23 +120,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 +130,27 @@ 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>
}

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

    companion object {
        private const val THRESHOLD_LIMITED_RESULT_HOME_PAGE = 4
    }

    var authData: AuthData? = null

    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 +163,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 +186,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
    }
}
+12 −5
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import android.text.format.Formatter
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.aurora.gplayapi.data.models.AuthData
import foundation.e.apps.FakeAppLoungePreference
import foundation.e.apps.data.AppSourcesContainer
import foundation.e.apps.data.Stores
import foundation.e.apps.data.application.ApplicationDataManager
import foundation.e.apps.data.application.data.Application
import foundation.e.apps.data.application.home.HomeApi
@@ -85,6 +85,8 @@ class HomeApiTest {
    @Mock
    private lateinit var gPlayAPIRepository: PlayStoreRepository

    private lateinit var stores: Stores

    private lateinit var preferenceManagerModule: FakeAppLoungePreference

    private lateinit var formatterMocked: MockedStatic<Formatter>
@@ -100,13 +102,18 @@ class HomeApiTest {
        preferenceManagerModule = FakeAppLoungePreference(context)
        applicationDataManager =
            ApplicationDataManager(gPlayAPIRepository, appLoungePackageManager, pwaManager)
        val appSourcesContainer =
            AppSourcesContainer(gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository)

        stores = Stores(
            gPlayAPIRepository,
            cleanApkAppsRepository,
            cleanApkPWARepository,
            applicationDataManager
        )

        homeApi = HomeApiImpl(
            context,
            preferenceManagerModule,
            appSourcesContainer,
            applicationDataManager
            stores
        )
    }