diff --git a/app/src/main/java/foundation/e/apps/data/Stores.kt b/app/src/main/java/foundation/e/apps/data/Stores.kt new file mode 100644 index 0000000000000000000000000000000000000000..a1673a8bed9bd61624346b67d251bd0e07026b37 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/Stores.kt @@ -0,0 +1,36 @@ +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() + + fun getHomeDataBuilder(): Map { + 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 diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt b/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt index 9e32ed8171b02fedb71971da981719f9410a2b80..4f097865983419b0833f5bb896f4f9a69c4b6e2c 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/application/ApplicationRepository.kt @@ -52,8 +52,8 @@ class ApplicationRepository @Inject constructor( private val downloadInfoApi: DownloadInfoApi ) { - suspend fun getHomeScreenData(authData: AuthData): LiveData>> { - return homeApi.fetchHomeScreenData(authData) + suspend fun getHomeScreenData(): LiveData>> { + return homeApi.fetchHomeScreenData() } fun getSelectedAppTypes(): List { @@ -68,8 +68,8 @@ class ApplicationRepository @Inject constructor( return appsApi.getApplicationDetails(packageNameList, authData, origin) } - suspend fun getAppFilterLevel(application: Application, authData: AuthData?): FilterLevel { - return appsApi.getAppFilterLevel(application, authData) + suspend fun getAppFilterLevel(application: Application): FilterLevel { + return appsApi.getAppFilterLevel(application) } suspend fun getApplicationDetails( diff --git a/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt index 72f5eb4d6badd69d5472a3d51f579c9f53450413..0cb95409aeca51781fa43e4046d1244e0fd06501 100644 --- a/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt @@ -55,7 +55,7 @@ interface AppsApi { */ fun getFusedAppInstallationStatus(application: Application): Status - suspend fun getAppFilterLevel(application: Application, authData: AuthData?): FilterLevel + suspend fun getAppFilterLevel(application: Application): FilterLevel /** * @return returns true if there is changes in data, otherwise false diff --git a/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt index 9aa108c64630d5d3a8933191adee1d59ff496217..b13cc9cdf5c9753ec04f2ff93f997ce8a2675b97 100644 --- a/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt @@ -215,7 +215,6 @@ class AppsApiImpl @Inject constructor( override suspend fun getAppFilterLevel( application: Application, - authData: AuthData? ): FilterLevel { return applicationDataManager.getAppFilterLevel(application) } diff --git a/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt b/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt index 27508ed84bdb576a423947cc0fad8a489dad7b33..c32a1c1390e5a9a0d1a798b66a8647db29c33c14 100644 --- a/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt @@ -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>> + suspend fun fetchHomeScreenData(): LiveData>> } diff --git a/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt index d81e28a7fcc72d5fb7c9055d9a9345cb297b993d..15c491a4446ae6bb35bb5ad3dd6f690cf8a14855 100644 --- a/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt @@ -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>> { + override suspend fun fetchHomeScreenData(): LiveData>> { val list = mutableListOf() 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, - source: Source, - authData: AuthData, + source: Source ): ResultSupreme> { - - 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, - appType: String - ): MutableList { - 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 - ): List { - val list = mutableListOf() - val gplayHomeData = appSources.gplayRepo.getHomeScreenData() +interface HomeDataBuilder { + suspend fun buildHomeScreenData(list: MutableList): List +} + +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): List { + 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) { @@ -204,3 +179,33 @@ class HomeApiImpl @Inject constructor( } } } + +class CleanApkAppsHomeDataBuilder( + private val cleanApkAppsRepository: CleanApkAppsRepository +) : HomeDataBuilder { + + override suspend fun buildHomeScreenData(list: MutableList): List { + 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): List { + val homes = cleanApkPwaRepository.getHomeScreenData() + + homes.forEach { (title, apps) -> + list.add(Home(title, apps, SearchApi.APP_TYPE_PWA)) + } + + return list + } +} diff --git a/app/src/main/java/foundation/e/apps/data/cleanapk/repositories/CleanApkAppsRepository.kt b/app/src/main/java/foundation/e/apps/data/cleanapk/repositories/CleanApkAppsRepository.kt index b97b3ce301573483c072b9021990feda76ab1cdd..42ef41f9f3acc9794bab948b0b882fae511fda62 100644 --- a/app/src/main/java/foundation/e/apps/data/cleanapk/repositories/CleanApkAppsRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/cleanapk/repositories/CleanApkAppsRepository.kt @@ -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 diff --git a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt index 1de9812272def31dbaf2812842b3b8341b1f5f63..a91df34c0a14aa75496fabec647149c8157d8f99 100644 --- a/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/MainActivityViewModel.kt @@ -179,11 +179,10 @@ class MainActivityViewModel @Inject constructor( */ fun verifyUiFilter(application: Application, method: () -> Unit) { viewModelScope.launch { - val authData = gPlayAuthData if (application.filterLevel.isInitialized()) { method() } else { - applicationRepository.getAppFilterLevel(application, authData).run { + applicationRepository.getAppFilterLevel(application).run { if (isInitialized()) { application.filterLevel = this method() diff --git a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt index 861527a7379b5d5a800fc978a9bc93a931a4d893..c91c41f3a7612ac8a6ecc8349d5ff34437499799 100644 --- a/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt @@ -22,14 +22,11 @@ import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.lifecycle.HiltViewModel import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.login.AuthObject -import foundation.e.apps.data.login.exceptions.CleanApkException -import foundation.e.apps.data.login.exceptions.GPlayException import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import foundation.e.apps.ui.parentFragment.LoadingViewModel @@ -69,12 +66,12 @@ class HomeViewModel @Inject constructor( super.onLoadData(authObjectList, { successAuthList, _ -> successAuthList.find { it is AuthObject.GPlayAuth }?.run { - getHomeScreenData(result.data!! as AuthData, lifecycleOwner) + getHomeScreenData(lifecycleOwner) return@onLoadData } successAuthList.find { it is AuthObject.CleanApk }?.run { - getHomeScreenData(AuthData("", ""), lifecycleOwner) + getHomeScreenData(lifecycleOwner) return@onLoadData } }, retryBlock) @@ -95,31 +92,16 @@ class HomeViewModel @Inject constructor( return true } - fun getHomeScreenData( - authData: AuthData, + private fun getHomeScreenData( lifecycleOwner: LifecycleOwner, ) { viewModelScope.launch { - applicationRepository.getHomeScreenData(authData).observe(lifecycleOwner) { + applicationRepository.getHomeScreenData().observe(lifecycleOwner) { postHomeResult(it) if (it.isSuccess()) { return@observe } - - val exception = - if (authData.aasToken.isNotBlank() || authData.authToken.isNotBlank()) - GPlayException( - it.isTimeout(), - it.message.ifBlank { "Data load error" } - ) - else CleanApkException( - it.isTimeout(), - it.message.ifBlank { "Data load error" } - ) - - exceptionsList.add(exception) - exceptionsLiveData.postValue(exceptionsList) } } } diff --git a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt index 8cda6e3cff0d20e7da276b0d901644618b302273..76b47296719f0486e9dc71be23c4a7d7265be711 100644 --- a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +++ b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt @@ -22,7 +22,6 @@ import android.content.Context import android.text.format.Formatter import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.Constants -import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakeAppLoungePreference import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.enums.FilterLevel @@ -92,10 +91,6 @@ class AppsApiTest { private lateinit var formatterMocked: MockedStatic - companion object { - private val AUTH_DATA = AuthData("e@e.email", "AtadyMsIAtadyM") - } - @Before fun setup() { MockitoAnnotations.openMocks(this) @@ -429,7 +424,7 @@ class AppsApiTest { latest_version_code = 123, ) - val filterLevel = appsApi.getAppFilterLevel(application, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(application) assertEquals("getAppFilterLevel", FilterLevel.UNKNOWN, filterLevel) } @@ -437,7 +432,7 @@ class AppsApiTest { fun `getAppFilterLevel when app is CleanApk`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @@ -456,7 +451,7 @@ class AppsApiTest { fun `getAppFilterLevel when Authdata is NULL`() = runTest { val fusedApp = getFusedAppForFilterLevelTest() - val filterLevel = appsApi.getAppFilterLevel(fusedApp, null) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @@ -467,7 +462,7 @@ class AppsApiTest { this.restriction = Constants.Restriction.UNKNOWN } - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @@ -478,7 +473,7 @@ class AppsApiTest { this.restriction = Constants.Restriction.NOT_RESTRICTED } - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } @@ -501,7 +496,7 @@ class AppsApiTest { ) ).thenReturn(listOf()) - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) } @@ -521,7 +516,7 @@ class AppsApiTest { ) ).thenReturn(listOf()) - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.DATA, filterLevel) } @@ -541,7 +536,7 @@ class AppsApiTest { ) ).thenThrow(RuntimeException()) - val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + val filterLevel = appsApi.getAppFilterLevel(fusedApp) assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) } } diff --git a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt index ab9348c9713c72b360e316edad42050b292c02ce..986f5b487d14c4cf584c38663c9df8b60f782e50 100644 --- a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +++ b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt @@ -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,14 +85,12 @@ class HomeApiTest { @Mock private lateinit var gPlayAPIRepository: PlayStoreRepository + private lateinit var stores: Stores + private lateinit var preferenceManagerModule: FakeAppLoungePreference private lateinit var formatterMocked: MockedStatic - companion object { - private val AUTH_DATA = AuthData("e@e.email", "AtadyMsIAtadyM") - } - @Before fun setup() { MockitoAnnotations.openMocks(this) @@ -100,13 +98,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 ) } @@ -143,7 +146,7 @@ class HomeApiTest { } } - homeApi.fetchHomeScreenData(AUTH_DATA).getOrAwaitValue() + homeApi.fetchHomeScreenData().getOrAwaitValue() delay(500) job.cancel()