From 384a1888c0c613513e1debfc0120770e8118a8b4 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Wed, 3 Jan 2024 13:31:44 +0600 Subject: [PATCH 1/2] added dependency container for app sources --- .../e/apps/data/AppSourcesContainer.kt | 33 ++++++++ .../apps/data/application/apps/AppsApiImpl.kt | 19 ++--- .../application/category/CategoryApiImpl.kt | 17 ++--- .../downloadInfo/DownloadInfoApiImpl.kt | 16 ++-- .../apps/data/application/home/HomeApiImpl.kt | 24 ++++-- .../data/application/search/SearchApiImpl.kt | 19 +++-- .../foundation/e/apps/apps/AppsApiTest.kt | 75 +++++++++++++++---- .../e/apps/category/CategoryApiTest.kt | 7 +- .../e/apps/fused/SearchApiImplTest.kt | 11 ++- .../foundation/e/apps/home/HomeApiTest.kt | 7 +- 10 files changed, 159 insertions(+), 69 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt diff --git a/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt b/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt new file mode 100644 index 000000000..8db414f7c --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt @@ -0,0 +1,33 @@ +/* + * 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 . + * + */ + +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 gplayRepository: PlayStoreRepository, + @Named("cleanApkAppsRepository") val cleanApkAppsRepository: CleanApkRepository, + @Named("cleanApkPWARepository") val cleanApkPWARepository: CleanApkRepository +) 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 15ac3e6bf..96fdb7493 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 @@ -22,6 +22,7 @@ import android.content.Context import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData 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.data.Application import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication @@ -44,8 +45,7 @@ import javax.inject.Named class AppsApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, + private val appSourcesContainer: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : AppsApi { @@ -56,15 +56,15 @@ class AppsApiImpl @Inject constructor( override suspend fun getCleanapkAppDetails(packageName: String): Pair { var application = Application() val result = handleNetworkResult { - val result = cleanApkAppsRepository.getSearchResult( + val result = appSourcesContainer.cleanApkAppsRepository.getSearchResult( packageName, KEY_SEARCH_PACKAGE_NAME ).body() if (result?.hasSingleResult() == true) { application = - (cleanApkAppsRepository.getAppDetails(result.apps[0]._id) as Response) - .body()?.app ?: Application() + (appSourcesContainer.cleanApkAppsRepository.getAppDetails(result.apps[0]._id) + as Response).body()?.app ?: Application() } application.updateFilterLevel(null) @@ -135,7 +135,7 @@ class AppsApiImpl @Inject constructor( val applicationList = mutableListOf() val result = handleNetworkResult { - gplayRepository.getAppsDetails(packageNameList).forEach { app -> + appSourcesContainer.gplayRepository.getAppsDetails(packageNameList).forEach { app -> handleFilteredApps(app, authData, applicationList) } } @@ -168,7 +168,7 @@ class AppsApiImpl @Inject constructor( packageName: String, applicationList: MutableList ) = handleNetworkResult { - cleanApkAppsRepository.getSearchResult( + appSourcesContainer.cleanApkAppsRepository.getSearchResult( packageName, KEY_SEARCH_PACKAGE_NAME ).body()?.run { @@ -201,9 +201,10 @@ class AppsApiImpl @Inject constructor( val result = handleNetworkResult { application = if (origin == Origin.CLEANAPK) { - (cleanApkAppsRepository.getAppDetails(id) as Response).body()?.app + (appSourcesContainer.cleanApkAppsRepository.getAppDetails(id) + as Response).body()?.app } else { - val app = gplayRepository.getAppDetails(packageName) as App? + val app = appSourcesContainer.gplayRepository.getAppDetails(packageName) as App? app?.toApplication(context) } diff --git a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt index c70622487..62eb22668 100644 --- a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt @@ -24,6 +24,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.data.Application @@ -47,9 +48,7 @@ import javax.inject.Named class CategoryApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, - @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository, + private val appSourcesContainer: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : CategoryApi { @@ -113,7 +112,7 @@ class CategoryApiImpl @Inject constructor( ): Pair, ResultStatus> { val categoryList = mutableListOf() val result = handleNetworkResult { - val playResponse = gplayRepository.getCategories(type).map { gplayCategory -> + val playResponse = appSourcesContainer.gplayRepository.getCategories(type).map { gplayCategory -> val category = gplayCategory.toCategory() category.drawable = CategoryUtils.provideAppsCategoryIconResource( @@ -140,12 +139,12 @@ class CategoryApiImpl @Inject constructor( val categories = when (source) { Source.OPEN -> { tag = AppTag.OpenSource(context.getString(R.string.open_source)) - cleanApkAppsRepository.getCategories().body() + appSourcesContainer.cleanApkAppsRepository.getCategories().body() } Source.PWA -> { tag = AppTag.PWA(context.getString(R.string.pwa)) - cleanApkPWARepository.getCategories().body() + appSourcesContainer.cleanApkPWARepository.getCategories().body() } else -> null @@ -185,7 +184,7 @@ class CategoryApiImpl @Inject constructor( return handleNetworkResult { val streamCluster = - gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster + appSourcesContainer.gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList) filteredAppList.data?.let { @@ -258,11 +257,11 @@ class CategoryApiImpl @Inject constructor( category: String ) = when (source) { Source.OPEN -> { - cleanApkAppsRepository.getAppsByCategory(category).body() + appSourcesContainer.cleanApkAppsRepository.getAppsByCategory(category).body() } Source.PWA -> { - cleanApkPWARepository.getAppsByCategory(category).body() + appSourcesContainer.cleanApkPWARepository.getAppsByCategory(category).body() } else -> null diff --git a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt index 06126cc30..2e44279aa 100644 --- a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt @@ -18,6 +18,7 @@ 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.repositories.CleanApkRepository import foundation.e.apps.data.enums.Origin @@ -27,8 +28,7 @@ import javax.inject.Inject import javax.inject.Named class DownloadInfoApiImpl @Inject constructor( - @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository + private val appSourcesContainer: AppSourcesContainer ) : DownloadInfoApi { override suspend fun getOnDemandModule( @@ -37,7 +37,7 @@ class DownloadInfoApiImpl @Inject constructor( versionCode: Int, offerType: Int ): String? { - val list = gplayRepository.getOnDemandModule( + val list = appSourcesContainer.gplayRepository.getOnDemandModule( packageName, moduleName, versionCode, @@ -76,7 +76,7 @@ class DownloadInfoApiImpl @Inject constructor( list: MutableList ) { val downloadList = - gplayRepository.getDownloadInfo( + appSourcesContainer.gplayRepository.getDownloadInfo( fusedDownload.packageName, fusedDownload.versionCode, fusedDownload.offerType @@ -90,13 +90,13 @@ class DownloadInfoApiImpl @Inject constructor( list: MutableList ) { val downloadInfo = - (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo( - fusedDownload.id - ).body() + (appSourcesContainer.cleanApkAppsRepository as CleanApkDownloadInfoFetcher) + .getDownloadInfo(fusedDownload.id).body() downloadInfo?.download_data?.download_link?.let { list.add(it) } fusedDownload.signature = downloadInfo?.download_data?.signature ?: "" } override suspend fun getOSSDownloadInfo(id: String, version: String?) = - (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo(id, version) + (appSourcesContainer.cleanApkAppsRepository as CleanApkDownloadInfoFetcher) + .getDownloadInfo(id, version) } 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 7a262ab0d..1259579cc 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 @@ -25,6 +25,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.data.Home @@ -54,9 +55,7 @@ import foundation.e.apps.data.cleanapk.data.home.Home as CleanApkHome class HomeApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, - @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository, + private val appSourcesContainer: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : HomeApi { @@ -143,9 +142,9 @@ class HomeApiImpl @Inject constructor( appType: String ): MutableList { val response = if (appType == SearchApi.APP_TYPE_OPEN) { - (cleanApkAppsRepository.getHomeScreenData() as Response).body() + (appSourcesContainer.cleanApkAppsRepository.getHomeScreenData() as Response).body() } else { - (cleanApkPWARepository.getHomeScreenData() as Response).body() + (appSourcesContainer.cleanApkPWARepository.getHomeScreenData() as Response).body() } response?.home?.let { @@ -182,11 +181,19 @@ class HomeApiImpl @Inject constructor( } "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" -> { - applicationDataManager.prepareApps(home.popular_games_in_last_24_hours, list, value) + applicationDataManager.prepareApps( + home.popular_games_in_last_24_hours, + list, + value + ) } "discover" -> { @@ -230,7 +237,8 @@ class HomeApiImpl @Inject constructor( priorList: MutableList ): List { val list = mutableListOf() - val gplayHomeData = gplayRepository.getHomeScreenData() as Map> + val gplayHomeData = + appSourcesContainer.gplayRepository.getHomeScreenData() as Map> gplayHomeData.map { val fusedApps = it.value.map { app -> app.toApplication(context).apply { diff --git a/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt index be63b44e6..93a1ee0ad 100644 --- a/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt @@ -24,6 +24,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import dagger.hilt.android.qualifiers.ApplicationContext +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.apps.AppsApi @@ -56,9 +57,7 @@ typealias FusedHomeDeferred = Deferred>> class SearchApiImpl @Inject constructor( private val appsApi: AppsApi, private val appLoungePreference: AppLoungePreference, - @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, - @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository, + private val appSourcesContainer: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : SearchApi { @@ -133,7 +132,7 @@ class SearchApiImpl @Inject constructor( val pwaApps: MutableList = mutableListOf() val result = handleNetworkResult { val apps = - cleanApkPWARepository.getSearchResult(query).body()?.apps + appSourcesContainer.cleanApkPWARepository.getSearchResult(query).body()?.apps apps?.forEach { applicationDataManager.updateStatus(it) it.updateType() @@ -287,7 +286,7 @@ class SearchApiImpl @Inject constructor( private suspend fun getCleanApkSearchResult(packageName: String): ResultSupreme { var application = Application() val result = handleNetworkResult { - val result = cleanApkAppsRepository.getSearchResult( + val result = appSourcesContainer.cleanApkAppsRepository.getSearchResult( packageName, "package_name" ).body() @@ -303,7 +302,7 @@ class SearchApiImpl @Inject constructor( override suspend fun getSearchSuggestions(query: String): List { var searchSuggesions = listOf() handleNetworkResult { - searchSuggesions = gplayRepository.getSearchSuggestions(query) + searchSuggesions = appSourcesContainer.gplayRepository.getSearchSuggestions(query) } return searchSuggesions @@ -314,7 +313,7 @@ class SearchApiImpl @Inject constructor( ): List { val list = mutableListOf() val response = - cleanApkAppsRepository.getSearchResult(keyword).body()?.apps + appSourcesContainer.cleanApkAppsRepository.getSearchResult(keyword).body()?.apps response?.forEach { applicationDataManager.updateStatus(it) @@ -332,7 +331,7 @@ class SearchApiImpl @Inject constructor( ): GplaySearchResult { return handleNetworkResult { val searchResults = - gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) + appSourcesContainer.gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!appLoungePreference.isGplaySelected()) { return@handleNetworkResult Pair( @@ -358,7 +357,7 @@ class SearchApiImpl @Inject constructor( if (appList.isNullOrEmpty()) { // Call search api with a common keyword (ex: facebook) // to ensure Gplay is returning empty as search result for other keywords as well - val searchResult = gplayRepository.getSearchResult(KEYWORD_TEST_SEARCH, null) + val searchResult = appSourcesContainer.gplayRepository.getSearchResult(KEYWORD_TEST_SEARCH, null) if (searchResult.first.isEmpty()) { Timber.w("Limited result for search is found...") refreshToken() @@ -372,7 +371,7 @@ class SearchApiImpl @Inject constructor( */ private suspend fun replaceWithFDroid(gPlayApp: App): Application { val gPlayFusedApp = gPlayApp.toApplication(context) - val response = cleanApkAppsRepository.getAppDetails(gPlayApp.packageName) + val response = appSourcesContainer.cleanApkAppsRepository.getAppDetails(gPlayApp.packageName) if (response != null) { val fdroidApp = getCleanApkPackageResult(gPlayFusedApp.package_name)?.apply { this.updateSource(context) 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 49eaaa2ed..f86f01f6f 100644 --- a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +++ b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt @@ -25,6 +25,7 @@ import com.aurora.gplayapi.Constants import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakeAppLoungePreference +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin @@ -77,6 +78,9 @@ class AppsApiTest { @Mock private lateinit var cleanApkAppsRepository: CleanApkRepository + @Mock + private lateinit var cleanApkPWARepository: CleanApkRepository + @Mock private lateinit var gPlayAPIRepository: PlayStoreRepository @@ -99,13 +103,13 @@ class AppsApiTest { preferenceManagerModule = FakeAppLoungePreference(context) applicationDataManager = ApplicationDataManager(gPlayAPIRepository, appLoungePackageManager, pwaManager) - + val appSourcesContainer = + AppSourcesContainer(gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository) appsApi = AppsApiImpl( context, preferenceManagerModule, - gPlayAPIRepository, - cleanApkAppsRepository, - applicationDataManager, + appSourcesContainer, + applicationDataManager ) } @@ -222,15 +226,30 @@ class AppsApiTest { ) ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demoone"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demotwo"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demothree"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) @@ -265,15 +284,30 @@ class AppsApiTest { ) ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demoone"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demotwo"), + eq(123) + ) + ) .thenReturn( Status.INSTALLED ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demothree"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) @@ -308,15 +342,30 @@ class AppsApiTest { ) ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demoone"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demotwo"), + eq(123) + ) + ) .thenReturn( Status.INSTALLED ) - Mockito.`when`(appLoungePackageManager.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + Mockito.`when`( + appLoungePackageManager.getPackageStatus( + eq("foundation.e.demothree"), + eq(123) + ) + ) .thenReturn( Status.UNAVAILABLE ) diff --git a/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt b/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt index 26451db61..e6a96d7e2 100644 --- a/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt +++ b/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt @@ -23,6 +23,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.data.models.Category import foundation.e.apps.FakeAppLoungePreference import foundation.e.apps.R +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.category.CategoryApi import foundation.e.apps.data.application.category.CategoryApiImpl @@ -87,12 +88,12 @@ class CategoryApiTest { preferenceManagerModule = FakeAppLoungePreference(context) val applicationDataManager = ApplicationDataManager(gPlayAPIRepository, appLoungePackageManager, pwaManager) + val appSourcesContainer = + AppSourcesContainer(gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository) categoryApi = CategoryApiImpl( context, preferenceManagerModule, - gPlayAPIRepository, - cleanApkAppsRepository, - cleanApkPWARepository, + appSourcesContainer, applicationDataManager ) } diff --git a/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt index c63435755..ffceefecc 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt @@ -24,6 +24,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.FakeAppLoungePreference +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.cleanapk.data.search.Search import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.Origin @@ -111,21 +112,19 @@ class SearchApiImplTest { preferenceManagerModule = FakeAppLoungePreference(context) applicationDataManager = ApplicationDataManager(gPlayAPIRepository, appLoungePackageManager, pwaManager) - + val appSourcesContainer = + AppSourcesContainer(gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository) appsApi = AppsApiImpl( context, preferenceManagerModule, - gPlayAPIRepository, - cleanApkAppsRepository, + appSourcesContainer, applicationDataManager, ) fusedAPIImpl = SearchApiImpl( appsApi, preferenceManagerModule, - gPlayAPIRepository, - cleanApkAppsRepository, - cleanApkPWARepository, + appSourcesContainer, applicationDataManager ) } 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 27ba23e72..82e5595bf 100644 --- a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +++ b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt @@ -24,6 +24,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakeAppLoungePreference +import foundation.e.apps.data.AppSourcesContainer import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.home.HomeApi import foundation.e.apps.data.application.home.HomeApiImpl @@ -98,12 +99,12 @@ class HomeApiTest { preferenceManagerModule = FakeAppLoungePreference(context) applicationDataManager = ApplicationDataManager(gPlayAPIRepository, appLoungePackageManager, pwaManager) + val appSourcesContainer = + AppSourcesContainer(gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository) homeApi = HomeApiImpl( context, preferenceManagerModule, - gPlayAPIRepository, - cleanApkAppsRepository, - cleanApkPWARepository, + appSourcesContainer, applicationDataManager ) } -- GitLab From 8cc213396ebfd594087b860bc763c76702d51212 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Fri, 5 Jan 2024 11:57:41 +0600 Subject: [PATCH 2/2] renamed appSource components --- .../e/apps/data/AppSourcesContainer.kt | 6 +++--- .../apps/data/application/apps/AppsApiImpl.kt | 19 ++++++++----------- .../application/category/CategoryApiImpl.kt | 17 +++++++---------- .../downloadInfo/DownloadInfoApiImpl.kt | 13 +++++-------- .../apps/data/application/home/HomeApiImpl.kt | 11 ++++------- .../data/application/search/SearchApiImpl.kt | 19 ++++++++----------- 6 files changed, 35 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt b/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt index 8db414f7c..f6735a117 100644 --- a/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt +++ b/app/src/main/java/foundation/e/apps/data/AppSourcesContainer.kt @@ -27,7 +27,7 @@ import javax.inject.Singleton @Singleton class AppSourcesContainer @Inject constructor( - @Named("gplayRepository") val gplayRepository: PlayStoreRepository, - @Named("cleanApkAppsRepository") val cleanApkAppsRepository: CleanApkRepository, - @Named("cleanApkPWARepository") val cleanApkPWARepository: CleanApkRepository + @Named("gplayRepository") val gplayRepo: PlayStoreRepository, + @Named("cleanApkAppsRepository") val cleanApkAppsRepo: CleanApkRepository, + @Named("cleanApkPWARepository") val cleanApkPWARepo: CleanApkRepository ) 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 96fdb7493..ebb9d3111 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 @@ -25,27 +25,24 @@ 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.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.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.Origin import foundation.e.apps.data.enums.ResultStatus import foundation.e.apps.data.enums.Status import foundation.e.apps.data.enums.isUnFiltered import foundation.e.apps.data.handleNetworkResult -import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import retrofit2.Response import javax.inject.Inject -import javax.inject.Named +import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication class AppsApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - private val appSourcesContainer: AppSourcesContainer, + private val appSources: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : AppsApi { @@ -56,14 +53,14 @@ class AppsApiImpl @Inject constructor( override suspend fun getCleanapkAppDetails(packageName: String): Pair { var application = Application() val result = handleNetworkResult { - val result = appSourcesContainer.cleanApkAppsRepository.getSearchResult( + val result = appSources.cleanApkAppsRepo.getSearchResult( packageName, KEY_SEARCH_PACKAGE_NAME ).body() if (result?.hasSingleResult() == true) { application = - (appSourcesContainer.cleanApkAppsRepository.getAppDetails(result.apps[0]._id) + (appSources.cleanApkAppsRepo.getAppDetails(result.apps[0]._id) as Response).body()?.app ?: Application() } @@ -135,7 +132,7 @@ class AppsApiImpl @Inject constructor( val applicationList = mutableListOf() val result = handleNetworkResult { - appSourcesContainer.gplayRepository.getAppsDetails(packageNameList).forEach { app -> + appSources.gplayRepo.getAppsDetails(packageNameList).forEach { app -> handleFilteredApps(app, authData, applicationList) } } @@ -168,7 +165,7 @@ class AppsApiImpl @Inject constructor( packageName: String, applicationList: MutableList ) = handleNetworkResult { - appSourcesContainer.cleanApkAppsRepository.getSearchResult( + appSources.cleanApkAppsRepo.getSearchResult( packageName, KEY_SEARCH_PACKAGE_NAME ).body()?.run { @@ -201,10 +198,10 @@ class AppsApiImpl @Inject constructor( val result = handleNetworkResult { application = if (origin == Origin.CLEANAPK) { - (appSourcesContainer.cleanApkAppsRepository.getAppDetails(id) + (appSources.cleanApkAppsRepo.getAppDetails(id) as Response).body()?.app } else { - val app = appSourcesContainer.gplayRepository.getAppDetails(packageName) as App? + val app = appSources.gplayRepo.getAppDetails(packageName) as App? app?.toApplication(context) } diff --git a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt index 62eb22668..07a84b5e9 100644 --- a/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt @@ -34,21 +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.toCategory 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.ResultStatus import foundation.e.apps.data.enums.Source import foundation.e.apps.data.enums.isUnFiltered import foundation.e.apps.data.handleNetworkResult -import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.data.preference.AppLoungePreference import javax.inject.Inject -import javax.inject.Named class CategoryApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - private val appSourcesContainer: AppSourcesContainer, + private val appSources: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : CategoryApi { @@ -112,7 +109,7 @@ class CategoryApiImpl @Inject constructor( ): Pair, ResultStatus> { val categoryList = mutableListOf() val result = handleNetworkResult { - val playResponse = appSourcesContainer.gplayRepository.getCategories(type).map { gplayCategory -> + val playResponse = appSources.gplayRepo.getCategories(type).map { gplayCategory -> val category = gplayCategory.toCategory() category.drawable = CategoryUtils.provideAppsCategoryIconResource( @@ -139,12 +136,12 @@ class CategoryApiImpl @Inject constructor( val categories = when (source) { Source.OPEN -> { tag = AppTag.OpenSource(context.getString(R.string.open_source)) - appSourcesContainer.cleanApkAppsRepository.getCategories().body() + appSources.cleanApkAppsRepo.getCategories().body() } Source.PWA -> { tag = AppTag.PWA(context.getString(R.string.pwa)) - appSourcesContainer.cleanApkPWARepository.getCategories().body() + appSources.cleanApkPWARepo.getCategories().body() } else -> null @@ -184,7 +181,7 @@ class CategoryApiImpl @Inject constructor( return handleNetworkResult { val streamCluster = - appSourcesContainer.gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster + appSources.gplayRepo.getAppsByCategory(category, pageUrl) as StreamCluster val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList) filteredAppList.data?.let { @@ -257,11 +254,11 @@ class CategoryApiImpl @Inject constructor( category: String ) = when (source) { Source.OPEN -> { - appSourcesContainer.cleanApkAppsRepository.getAppsByCategory(category).body() + appSources.cleanApkAppsRepo.getAppsByCategory(category).body() } Source.PWA -> { - appSourcesContainer.cleanApkPWARepository.getAppsByCategory(category).body() + appSources.cleanApkPWARepo.getAppsByCategory(category).body() } else -> null diff --git a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt index 2e44279aa..29f06a999 100644 --- a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt @@ -20,15 +20,12 @@ 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.repositories.CleanApkRepository import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.fusedDownload.models.FusedDownload -import foundation.e.apps.data.playstore.PlayStoreRepository import javax.inject.Inject -import javax.inject.Named class DownloadInfoApiImpl @Inject constructor( - private val appSourcesContainer: AppSourcesContainer + private val appSources: AppSourcesContainer ) : DownloadInfoApi { override suspend fun getOnDemandModule( @@ -37,7 +34,7 @@ class DownloadInfoApiImpl @Inject constructor( versionCode: Int, offerType: Int ): String? { - val list = appSourcesContainer.gplayRepository.getOnDemandModule( + val list = appSources.gplayRepo.getOnDemandModule( packageName, moduleName, versionCode, @@ -76,7 +73,7 @@ class DownloadInfoApiImpl @Inject constructor( list: MutableList ) { val downloadList = - appSourcesContainer.gplayRepository.getDownloadInfo( + appSources.gplayRepo.getDownloadInfo( fusedDownload.packageName, fusedDownload.versionCode, fusedDownload.offerType @@ -90,13 +87,13 @@ class DownloadInfoApiImpl @Inject constructor( list: MutableList ) { val downloadInfo = - (appSourcesContainer.cleanApkAppsRepository as CleanApkDownloadInfoFetcher) + (appSources.cleanApkAppsRepo as CleanApkDownloadInfoFetcher) .getDownloadInfo(fusedDownload.id).body() downloadInfo?.download_data?.download_link?.let { list.add(it) } fusedDownload.signature = downloadInfo?.download_data?.signature ?: "" } override suspend fun getOSSDownloadInfo(id: String, version: String?) = - (appSourcesContainer.cleanApkAppsRepository as CleanApkDownloadInfoFetcher) + (appSources.cleanApkAppsRepo as CleanApkDownloadInfoFetcher) .getDownloadInfo(id, version) } 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 1259579cc..d8b91b173 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 @@ -33,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.utils.toApplication 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.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 @@ -49,13 +47,12 @@ import kotlinx.coroutines.launch import retrofit2.Response import timber.log.Timber import javax.inject.Inject -import javax.inject.Named import foundation.e.apps.data.cleanapk.data.home.Home as CleanApkHome class HomeApiImpl @Inject constructor( @ApplicationContext private val context: Context, private val appLoungePreference: AppLoungePreference, - private val appSourcesContainer: AppSourcesContainer, + private val appSources: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : HomeApi { @@ -142,9 +139,9 @@ class HomeApiImpl @Inject constructor( appType: String ): MutableList { val response = if (appType == SearchApi.APP_TYPE_OPEN) { - (appSourcesContainer.cleanApkAppsRepository.getHomeScreenData() as Response).body() + (appSources.cleanApkAppsRepo.getHomeScreenData() as Response).body() } else { - (appSourcesContainer.cleanApkPWARepository.getHomeScreenData() as Response).body() + (appSources.cleanApkPWARepo.getHomeScreenData() as Response).body() } response?.home?.let { @@ -238,7 +235,7 @@ class HomeApiImpl @Inject constructor( ): List { val list = mutableListOf() val gplayHomeData = - appSourcesContainer.gplayRepository.getHomeScreenData() as Map> + appSources.gplayRepo.getHomeScreenData() as Map> gplayHomeData.map { val fusedApps = it.value.map { app -> app.toApplication(context).apply { diff --git a/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt index 93a1ee0ad..0a64ad81c 100644 --- a/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt @@ -34,12 +34,10 @@ import foundation.e.apps.data.application.search.SearchApi.Companion.APP_TYPE_PW import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Home import foundation.e.apps.data.application.utils.toApplication -import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus 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 @@ -48,7 +46,6 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject -import javax.inject.Named import javax.inject.Singleton typealias FusedHomeDeferred = Deferred>> @@ -57,7 +54,7 @@ typealias FusedHomeDeferred = Deferred>> class SearchApiImpl @Inject constructor( private val appsApi: AppsApi, private val appLoungePreference: AppLoungePreference, - private val appSourcesContainer: AppSourcesContainer, + private val appSources: AppSourcesContainer, private val applicationDataManager: ApplicationDataManager ) : SearchApi { @@ -132,7 +129,7 @@ class SearchApiImpl @Inject constructor( val pwaApps: MutableList = mutableListOf() val result = handleNetworkResult { val apps = - appSourcesContainer.cleanApkPWARepository.getSearchResult(query).body()?.apps + appSources.cleanApkPWARepo.getSearchResult(query).body()?.apps apps?.forEach { applicationDataManager.updateStatus(it) it.updateType() @@ -286,7 +283,7 @@ class SearchApiImpl @Inject constructor( private suspend fun getCleanApkSearchResult(packageName: String): ResultSupreme { var application = Application() val result = handleNetworkResult { - val result = appSourcesContainer.cleanApkAppsRepository.getSearchResult( + val result = appSources.cleanApkAppsRepo.getSearchResult( packageName, "package_name" ).body() @@ -302,7 +299,7 @@ class SearchApiImpl @Inject constructor( override suspend fun getSearchSuggestions(query: String): List { var searchSuggesions = listOf() handleNetworkResult { - searchSuggesions = appSourcesContainer.gplayRepository.getSearchSuggestions(query) + searchSuggesions = appSources.gplayRepo.getSearchSuggestions(query) } return searchSuggesions @@ -313,7 +310,7 @@ class SearchApiImpl @Inject constructor( ): List { val list = mutableListOf() val response = - appSourcesContainer.cleanApkAppsRepository.getSearchResult(keyword).body()?.apps + appSources.cleanApkAppsRepo.getSearchResult(keyword).body()?.apps response?.forEach { applicationDataManager.updateStatus(it) @@ -331,7 +328,7 @@ class SearchApiImpl @Inject constructor( ): GplaySearchResult { return handleNetworkResult { val searchResults = - appSourcesContainer.gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) + appSources.gplayRepo.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!appLoungePreference.isGplaySelected()) { return@handleNetworkResult Pair( @@ -357,7 +354,7 @@ class SearchApiImpl @Inject constructor( if (appList.isNullOrEmpty()) { // Call search api with a common keyword (ex: facebook) // to ensure Gplay is returning empty as search result for other keywords as well - val searchResult = appSourcesContainer.gplayRepository.getSearchResult(KEYWORD_TEST_SEARCH, null) + val searchResult = appSources.gplayRepo.getSearchResult(KEYWORD_TEST_SEARCH, null) if (searchResult.first.isEmpty()) { Timber.w("Limited result for search is found...") refreshToken() @@ -371,7 +368,7 @@ class SearchApiImpl @Inject constructor( */ private suspend fun replaceWithFDroid(gPlayApp: App): Application { val gPlayFusedApp = gPlayApp.toApplication(context) - val response = appSourcesContainer.cleanApkAppsRepository.getAppDetails(gPlayApp.packageName) + val response = appSources.cleanApkAppsRepo.getAppDetails(gPlayApp.packageName) if (response != null) { val fdroidApp = getCleanApkPackageResult(gPlayFusedApp.package_name)?.apply { this.updateSource(context) -- GitLab