Loading app/src/main/java/foundation/e/apps/data/Stores.kt 0 → 100644 +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 app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt +60 −48 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading Loading @@ -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) Loading @@ -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) { Loading @@ -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) Loading @@ -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>) { Loading @@ -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 } } app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +12 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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> Loading @@ -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 ) } Loading Loading
app/src/main/java/foundation/e/apps/data/Stores.kt 0 → 100644 +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
app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt +60 −48 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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, Loading Loading @@ -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) Loading @@ -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) { Loading @@ -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) Loading @@ -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>) { Loading @@ -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 } }
app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +12 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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> Loading @@ -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 ) } Loading