diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml index 21ad79f516a33adfd9001d3d42594fe136bff908..b01b024b653fe45ad950743ee0d5bbf287232c40 100644 --- a/app/detekt-baseline.xml +++ b/app/detekt-baseline.xml @@ -12,9 +12,7 @@ ImplicitDefaultLocale:UpdatesFragment.kt$UpdatesFragment$String.format("%d%%", progress) InstanceOfCheckForException:GPlayHttpClient.kt$GPlayHttpClient$e is SocketTimeoutException InvalidPackageDeclaration:Trackers.kt$package foundation.e.apps.data.exodus - LargeClass:ApplicationApiImpl.kt$ApplicationApiImpl : ApplicationApi LargeClass:ApplicationFragment.kt$ApplicationFragment : TimeoutFragment - LongParameterList:ApplicationApiImpl.kt$ApplicationApiImpl$( private val pkgManagerModule: PkgManagerModule, private val pwaManagerModule: PWAManagerModule, private val preferenceManagerModule: PreferenceManagerModule, @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository, @ApplicationContext private val context: Context ) LongParameterList:ApplicationDialogFragment.kt$ApplicationDialogFragment$( drawable: Int = -1, title: String, message: String, positiveButtonText: String = "", positiveButtonAction: (() -> Unit)? = null, cancelButtonText: String = "", cancelButtonAction: (() -> Unit)? = null, cancellable: Boolean = true, onDismissListener: (() -> Unit)? = null, ) LongParameterList:ApplicationListRVAdapter.kt$ApplicationListRVAdapter$( private val applicationInstaller: ApplicationInstaller, private val privacyInfoViewModel: PrivacyInfoViewModel, private val appInfoFetchViewModel: AppInfoFetchViewModel, private val mainActivityViewModel: MainActivityViewModel, private val currentDestinationId: Int, private var lifecycleOwner: LifecycleOwner?, private var paidAppHandler: ((Application) -> Unit)? = null ) LongParameterList:ApplicationViewModel.kt$ApplicationViewModel$( id: String, packageName: String, origin: Origin, isFdroidLink: Boolean, authObjectList: List<AuthObject>, retryBlock: (failedObjects: List<AuthObject>) -> Boolean, ) @@ -71,8 +69,6 @@ MaxLineLength:AppInstallProcessor.kt$AppInstallProcessor$"Enqueuing App install work is failed for ${fusedDownload.packageName} exception: ${e.localizedMessage}" MaxLineLength:AppInstallProcessor.kt$AppInstallProcessor$fusedDownload.areFilesDownloaded() && (!fusedManagerRepository.isFusedDownloadInstalled(fusedDownload) || fusedDownload.status == Status.INSTALLING) MaxLineLength:AppPrivacyInfo.kt$AppPrivacyInfo - MaxLineLength:ApplicationApi.kt$ApplicationApi$suspend fun getGplayAppsByCategory(authData: AuthData, category: String, pageUrl: String?): ResultSupreme<Pair<List<Application>, String>> - MaxLineLength:ApplicationApiImpl.kt$ApplicationApiImpl$(cleanApkAppsRepository.getAppDetails(result.apps[0]._id) as Response<CleanApkApplication>).body()?.app MaxLineLength:ApplicationFragment.kt$ApplicationFragment.Companion$"https://gitlab.e.foundation/e/os/apps/-/blob/main/app/src/main/java/foundation/e/apps/data/exodus/repositories/PrivacyScoreRepositoryImpl.kt" MaxLineLength:CommonUtilsModule.kt$CommonUtilsModule$* MaxLineLength:DownloadManager.kt$DownloadManager$Timber.e("Download Issue: $downloadId : DownloadManager returns status: $status but the failed because: reason: $reason") @@ -113,7 +109,6 @@ ReturnCount:AppInstallProcessor.kt$AppInstallProcessor$suspend fun enqueueFusedDownload( fusedDownload: FusedDownload, isAnUpdate: Boolean = false ) ReturnCount:AppPrivacyInfoRepositoryImpl.kt$AppPrivacyInfoRepositoryImpl$override suspend fun getAppPrivacyInfo( application: Application, appHandle: String ): Result<AppPrivacyInfo> ReturnCount:AppPrivacyInfoRepositoryImpl.kt$AppPrivacyInfoRepositoryImpl$private fun getAppPrivacyInfo( application: Application, appTrackerData: List<Report>, ): AppPrivacyInfo - ReturnCount:ApplicationApiImpl.kt$ApplicationApiImpl$override fun isAnyFusedAppUpdated( newApplications: List<Application>, oldApplications: List<Application> ): Boolean ReturnCount:DownloadManager.kt$DownloadManager$fun getSizeRequired(downloadId: Long): Long ReturnCount:DownloadManager.kt$DownloadManager$private fun sanitizeStatus(downloadId: Long, status: Int, reason: Int): Int ReturnCount:Extensions.kt$fun Context.isNetworkAvailable(): Boolean @@ -141,7 +136,6 @@ TooGenericExceptionCaught:ApkSignatureManager.kt$ApkSignatureManager$e: Exception TooGenericExceptionCaught:AppInfoFetchViewModel.kt$AppInfoFetchViewModel$e: Exception TooGenericExceptionCaught:AppInstallProcessor.kt$AppInstallProcessor$e: Exception - TooGenericExceptionCaught:ApplicationApiImpl.kt$ApplicationApiImpl$e: Exception TooGenericExceptionCaught:ApplicationViewModel.kt$ApplicationViewModel$e: Exception TooGenericExceptionCaught:BlockedAppRepository.kt$BlockedAppRepository$exception: Exception TooGenericExceptionCaught:CommonUtilsModule.kt$CommonUtilsModule$e: Exception @@ -169,15 +163,12 @@ TooGenericExceptionThrown:AnonymousLoginManager.kt$AnonymousLoginManager$throw Exception( "Error fetching Anonymous credentials\n" + "Network code: ${response.code}\n" + "Success: ${response.isSuccessful}" + response.errorString.run { if (isNotBlank()) "\nError message: $this" else "" } ) TooGenericExceptionThrown:PlayStoreLoginWrapper.kt$PlayStoreLoginWrapper$throw Exception("Validation network code: ${response.code}") TooGenericExceptionThrown:PlayStoreLoginWrapper.kt$PlayStoreLoginWrapper$throw Exception(error) - TooManyFunctions:ApplicationApi.kt$ApplicationApi - TooManyFunctions:ApplicationApiImpl.kt$ApplicationApiImpl : ApplicationApi TooManyFunctions:ApplicationListFragment.kt$ApplicationListFragment : TimeoutFragmentApplicationInstaller TooManyFunctions:ApplicationRepository.kt$ApplicationRepository TooManyFunctions:FusedManagerImpl.kt$FusedManagerImpl : IFusedManager TooManyFunctions:FusedManagerRepository.kt$FusedManagerRepository TooManyFunctions:HomeFragment.kt$HomeFragment : TimeoutFragmentApplicationInstaller TooManyFunctions:IFusedManager.kt$IFusedManager - TooManyFunctions:LoginData.kt$LoginData TooManyFunctions:MainActivityViewModel.kt$MainActivityViewModel : ViewModel TooManyFunctions:PkgManagerModule.kt$PkgManagerModule TooManyFunctions:SearchFragment.kt$SearchFragment : TimeoutFragmentOnQueryTextListenerOnSuggestionListenerApplicationInstaller 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 24f2ac55a78b9ecda5b147263b3faf209922f531..5808dda5929e96a236d8ef98de230ec8bc596e3c 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 @@ -23,6 +23,8 @@ import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.category.CategoryApi import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.ResultStatus @@ -31,6 +33,10 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.data.Home +import foundation.e.apps.data.application.downloadInfo.DownloadInfoApi +import foundation.e.apps.data.application.home.HomeApi +import foundation.e.apps.data.application.search.GplaySearchResult +import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.fusedDownload.models.FusedDownload import javax.inject.Inject @@ -38,18 +44,19 @@ import javax.inject.Singleton @Singleton class ApplicationRepository @Inject constructor( - private val applicationAPIImpl: ApplicationApi, + private val searchAPIImpl: SearchApi, private val homeApi: HomeApi, private val categoryApi: CategoryApi, private val appsApi: AppsApi, + private val downloadInfoApi: DownloadInfoApi ) { suspend fun getHomeScreenData(authData: AuthData): LiveData>> { return homeApi.fetchHomeScreenData(authData) } - fun getApplicationCategoryPreference(): List { - return applicationAPIImpl.getApplicationCategoryPreference() + fun getSelectedAppTypes(): List { + return searchAPIImpl.getSelectedAppTypes() } suspend fun getApplicationDetails( @@ -81,14 +88,14 @@ class ApplicationRepository @Inject constructor( origin: Origin, fusedDownload: FusedDownload ) { - applicationAPIImpl.updateFusedDownloadWithDownloadingInfo( + downloadInfoApi.updateFusedDownloadWithDownloadingInfo( origin, fusedDownload ) } suspend fun getOSSDownloadInfo(id: String, version: String? = null) = - applicationAPIImpl.getOSSDownloadInfo(id, version) + downloadInfoApi.getOSSDownloadInfo(id, version) suspend fun getOnDemandModule( packageName: String, @@ -96,7 +103,7 @@ class ApplicationRepository @Inject constructor( versionCode: Int, offerType: Int ): String? { - return applicationAPIImpl.getOnDemandModule(packageName, moduleName, versionCode, offerType) + return downloadInfoApi.getOnDemandModule(packageName, moduleName, versionCode, offerType) } suspend fun getCategoriesList( @@ -106,21 +113,21 @@ class ApplicationRepository @Inject constructor( } suspend fun getSearchSuggestions(query: String): List { - return applicationAPIImpl.getSearchSuggestions(query) + return searchAPIImpl.getSearchSuggestions(query) } suspend fun getCleanApkSearchResults( query: String, authData: AuthData ): ResultSupreme, Boolean>> { - return applicationAPIImpl.getCleanApkSearchResults(query, authData) + return searchAPIImpl.getCleanApkSearchResults(query, authData) } suspend fun getGplaySearchResults( query: String, nextPageSubBundle: Set? ): GplaySearchResult { - return applicationAPIImpl.getGplaySearchResult(query, nextPageSubBundle) + return searchAPIImpl.getGplaySearchResult(query, nextPageSubBundle) } suspend fun getAppsListBasedOnCategory( diff --git a/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt similarity index 97% rename from app/src/main/java/foundation/e/apps/data/application/AppsApi.kt rename to app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt index 8e3f0491dc30ef4fba674ef84a12d5d411a659d5..1a5ebfa3675379bf67592d751151238581a56db5 100644 --- a/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApi.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.apps import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.application.data.Application diff --git a/app/src/main/java/foundation/e/apps/data/application/AppsApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt similarity index 98% rename from app/src/main/java/foundation/e/apps/data/application/AppsApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt index ea2b781ef88a01d4810a1e0092101e8468ef16b6..e1f00df2f791402b1e88e0f9ce0f2d269929b0fb 100644 --- a/app/src/main/java/foundation/e/apps/data/application/AppsApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt @@ -16,12 +16,13 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.apps 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.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 diff --git a/app/src/main/java/foundation/e/apps/data/application/CategoryApi.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt similarity index 96% rename from app/src/main/java/foundation/e/apps/data/application/CategoryApi.kt rename to app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt index f6afb796ced8c4a0698a7e5de84b1a5c41d32532..3349428eb2787ce28cfea61248b3949238bbc265 100644 --- a/app/src/main/java/foundation/e/apps/data/application/CategoryApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApi.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.category import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.data.ResultSupreme diff --git a/app/src/main/java/foundation/e/apps/data/application/CategoryApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt similarity index 98% rename from app/src/main/java/foundation/e/apps/data/application/CategoryApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt index e222d724208b86548498a3374c3809bca461690b..b705204954621d705022e73104b99c16ce6632a2 100644 --- a/app/src/main/java/foundation/e/apps/data/application/CategoryApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/category/CategoryApiImpl.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.category import android.content.Context import com.aurora.gplayapi.data.models.App @@ -25,6 +25,7 @@ import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme +import foundation.e.apps.data.application.ApplicationDataManager import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.utils.CategoryType diff --git a/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApi.kt b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApi.kt new file mode 100644 index 0000000000000000000000000000000000000000..3384ea816c5dfc9dbb44326a31e2b2e2b762190a --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApi.kt @@ -0,0 +1,41 @@ +/* + * Copyright MURENA SAS 2023 + * 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.application.downloadInfo + +import foundation.e.apps.data.cleanapk.data.download.Download +import foundation.e.apps.data.enums.Origin +import foundation.e.apps.data.fusedDownload.models.FusedDownload +import retrofit2.Response + +interface DownloadInfoApi { + + suspend fun getOnDemandModule( + packageName: String, + moduleName: String, + versionCode: Int, + offerType: Int + ): String? + + suspend fun updateFusedDownloadWithDownloadingInfo( + origin: Origin, + fusedDownload: FusedDownload + ) + + suspend fun getOSSDownloadInfo(id: String, version: String?): Response +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..06126cc3007ff9b932768b36508b722738c29ae2 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt @@ -0,0 +1,102 @@ +/* + * Copyright MURENA SAS 2023 + * 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.application.downloadInfo + +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( + @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, + @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository +) : DownloadInfoApi { + + override suspend fun getOnDemandModule( + packageName: String, + moduleName: String, + versionCode: Int, + offerType: Int + ): String? { + val list = gplayRepository.getOnDemandModule( + packageName, + moduleName, + versionCode, + offerType, + ) + + for (element in list) { + if (element.name == "$moduleName.apk") { + return element.url + } + } + + return null + } + + override suspend fun updateFusedDownloadWithDownloadingInfo( + origin: Origin, + fusedDownload: FusedDownload + ) { + val list = mutableListOf() + when (origin) { + Origin.CLEANAPK -> { + updateDownloadInfoFromCleanApk(fusedDownload, list) + } + + Origin.GPLAY -> { + updateDownloadInfoFromGplay(fusedDownload, list) + } + } + + fusedDownload.downloadURLList = list + } + + private suspend fun updateDownloadInfoFromGplay( + fusedDownload: FusedDownload, + list: MutableList + ) { + val downloadList = + gplayRepository.getDownloadInfo( + fusedDownload.packageName, + fusedDownload.versionCode, + fusedDownload.offerType + ) + fusedDownload.files = downloadList + list.addAll(downloadList.map { it.url }) + } + + private suspend fun updateDownloadInfoFromCleanApk( + fusedDownload: FusedDownload, + list: MutableList + ) { + val downloadInfo = + (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) +} diff --git a/app/src/main/java/foundation/e/apps/data/application/HomeApi.kt b/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt similarity index 95% rename from app/src/main/java/foundation/e/apps/data/application/HomeApi.kt rename to app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt index 7e677be457146de4c67dafb31cf277a797433a8e..27508ed84bdb576a423947cc0fad8a489dad7b33 100644 --- a/app/src/main/java/foundation/e/apps/data/application/HomeApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/home/HomeApi.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.home import androidx.lifecycle.LiveData import com.aurora.gplayapi.data.models.AuthData diff --git a/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt similarity index 93% rename from app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt index 9bc92f99da8e3a404fe2cf002736c2d0e286166c..946ac4dfc577e70aec4bd1ea194cda20dd08720d 100644 --- a/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/home/HomeApiImpl.kt @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.home import android.content.Context import androidx.lifecycle.LiveData @@ -26,7 +26,10 @@ import com.aurora.gplayapi.data.models.AuthData import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R import foundation.e.apps.data.ResultSupreme +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.application.utils.toApplication import foundation.e.apps.data.cleanapk.data.home.HomeScreen import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository @@ -115,19 +118,19 @@ class HomeApiImpl @Inject constructor( } Source.OPEN -> handleNetworkResult { - handleCleanApkHomes(priorList, ApplicationApi.APP_TYPE_OPEN) + handleCleanApkHomes(priorList, SearchApi.APP_TYPE_OPEN) } Source.PWA -> handleNetworkResult { - handleCleanApkHomes(priorList, ApplicationApi.APP_TYPE_PWA) + handleCleanApkHomes(priorList, SearchApi.APP_TYPE_PWA) } } setHomeErrorMessage(result.getResultStatus(), source) priorList.sortBy { when (it.source) { - ApplicationApi.APP_TYPE_OPEN -> AppSourceWeight.OPEN_SOURCE.ordinal - ApplicationApi.APP_TYPE_PWA -> AppSourceWeight.PWA.ordinal + SearchApi.APP_TYPE_OPEN -> AppSourceWeight.OPEN_SOURCE.ordinal + SearchApi.APP_TYPE_PWA -> AppSourceWeight.PWA.ordinal else -> AppSourceWeight.GPLAY.ordinal } } @@ -139,7 +142,7 @@ class HomeApiImpl @Inject constructor( priorList: MutableList, appType: String ): MutableList { - val response = if (appType == ApplicationApi.APP_TYPE_OPEN) { + val response = if (appType == SearchApi.APP_TYPE_OPEN) { (cleanApkAppsRepository.getHomeScreenData() as Response).body() } else { (cleanApkPWARepository.getHomeScreenData() as Response).body() @@ -154,7 +157,7 @@ class HomeApiImpl @Inject constructor( private suspend fun generateCleanAPKHome(home: CleanApkHome, appType: String): List { val list = mutableListOf() - val headings = if (appType == ApplicationApi.APP_TYPE_OPEN) { + val headings = if (appType == SearchApi.APP_TYPE_OPEN) { getOpenSourceHomeCategories() } else { getPWAHomeCategories() diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationApi.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt similarity index 52% rename from app/src/main/java/foundation/e/apps/data/application/ApplicationApi.kt rename to app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt index e6434f15782ccbff117210a2bb341ffece272e18..f539f613cb34cd46bee944f2b8212409d4c4538a 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt @@ -1,33 +1,39 @@ -package foundation.e.apps.data.application +/* + * Copyright MURENA SAS 2023 + * 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.application.search -import androidx.lifecycle.LiveData import com.aurora.gplayapi.SearchSuggestEntry -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.data.ResultSupreme -import foundation.e.apps.data.cleanapk.data.download.Download -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.application.data.Application -import foundation.e.apps.data.application.data.Category -import foundation.e.apps.data.application.data.Home -import foundation.e.apps.data.application.utils.CategoryType -import foundation.e.apps.data.fusedDownload.models.FusedDownload -import retrofit2.Response typealias GplaySearchResult = ResultSupreme, Set>> -interface ApplicationApi { +interface SearchApi { companion object { const val APP_TYPE_ANY = "any" const val APP_TYPE_OPEN = "open" const val APP_TYPE_PWA = "pwa" } - fun getApplicationCategoryPreference(): List + fun getSelectedAppTypes(): List /** * Fetches search results from cleanAPK and GPlay servers and returns them @@ -47,19 +53,4 @@ interface ApplicationApi { ): GplaySearchResult suspend fun getSearchSuggestions(query: String): List - - suspend fun getOnDemandModule( - packageName: String, - moduleName: String, - versionCode: Int, - offerType: Int - ): String? - - suspend fun updateFusedDownloadWithDownloadingInfo( - origin: Origin, - fusedDownload: FusedDownload - ) - - suspend fun getOSSDownloadInfo(id: String, version: String?): Response - } diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt similarity index 68% rename from app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt index fdd6ab9284d1e45748013aa550bdbe70d5c4c6db..a012c82ce6a38a6c70b29bfa71dcf18bd3ffc08e 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt @@ -1,6 +1,6 @@ /* + * Copyright MURENA SAS 2023 * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION * * 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 @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package foundation.e.apps.data.application +package foundation.e.apps.data.application.search import android.content.Context import com.aurora.gplayapi.SearchSuggestEntry @@ -25,17 +25,17 @@ 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.ResultSupreme -import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_ANY -import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_OPEN -import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_PWA +import foundation.e.apps.data.application.ApplicationDataManager +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.search.SearchApi.Companion.APP_TYPE_ANY +import foundation.e.apps.data.application.search.SearchApi.Companion.APP_TYPE_OPEN +import foundation.e.apps.data.application.search.SearchApi.Companion.APP_TYPE_PWA 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.CleanApkDownloadInfoFetcher 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.fusedDownload.models.FusedDownload import foundation.e.apps.data.handleNetworkResult import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.playstore.PlayStoreRepository @@ -53,53 +53,52 @@ import javax.inject.Singleton typealias FusedHomeDeferred = Deferred>> @Singleton -class ApplicationApiImpl @Inject constructor( +class SearchApiImpl @Inject constructor( private val appsApi: AppsApi, private val preferenceManagerModule: PreferenceManagerModule, @Named("gplayRepository") private val gplayRepository: PlayStoreRepository, @Named("cleanApkAppsRepository") private val cleanApkAppsRepository: CleanApkRepository, @Named("cleanApkPWARepository") private val cleanApkPWARepository: CleanApkRepository, private val applicationDataManager: ApplicationDataManager -) : ApplicationApi { +) : SearchApi { @Inject - @ApplicationContext lateinit var context: Context + @ApplicationContext + lateinit var context: Context companion object { private const val KEYWORD_TEST_SEARCH = "facebook" } - override fun getApplicationCategoryPreference(): List { - val prefs = mutableListOf() - if (preferenceManagerModule.isGplaySelected()) prefs.add(APP_TYPE_ANY) - if (preferenceManagerModule.isOpenSourceSelected()) prefs.add(APP_TYPE_OPEN) - if (preferenceManagerModule.isPWASelected()) prefs.add(APP_TYPE_PWA) - return prefs + override fun getSelectedAppTypes(): List { + val selectedAppTypes = mutableListOf() + if (preferenceManagerModule.isGplaySelected()) selectedAppTypes.add(APP_TYPE_ANY) + if (preferenceManagerModule.isOpenSourceSelected()) selectedAppTypes.add(APP_TYPE_OPEN) + if (preferenceManagerModule.isPWASelected()) selectedAppTypes.add(APP_TYPE_PWA) + + return selectedAppTypes } /** - * Fetches search results from cleanAPK and GPlay servers and returns them + * Fetches search results from cleanAPK and returns them * @param query Query * @param authData [AuthData] - * @return A livedata Pair of list of non-nullable [Application] and + * @return A ResultSupreme with Pair of list of non-nullable [Application] and * a Boolean signifying if more search results are being loaded. - * Observe this livedata to display new apps as they are fetched from the network. */ override suspend fun getCleanApkSearchResults( query: String, authData: AuthData ): ResultSupreme, Boolean>> { - val packageSpecificResults = ArrayList() - var finalSearchResult: ResultSupreme, Boolean>> = ResultSupreme.Error() + var finalSearchResult: ResultSupreme, Boolean>> = + ResultSupreme.Error() - fetchPackageSpecificResult(authData, query, packageSpecificResults) + val packageSpecificResults = + fetchPackageSpecificResult(authData, query).data?.first ?: emptyList() val searchResult = mutableListOf() - val cleanApkResults = mutableListOf() - if (preferenceManagerModule.isOpenSourceSelected()) { finalSearchResult = fetchOpenSourceSearchResult( - cleanApkResults, query, searchResult, packageSpecificResults @@ -113,13 +112,14 @@ class ApplicationApiImpl @Inject constructor( packageSpecificResults ) } + return finalSearchResult } private suspend fun fetchPWASearchResult( query: String, searchResult: MutableList, - packageSpecificResults: ArrayList + packageSpecificResults: List ): ResultSupreme, Boolean>> { val pwaApps: MutableList = mutableListOf() val result = handleNetworkResult { @@ -151,11 +151,12 @@ class ApplicationApiImpl @Inject constructor( } private suspend fun fetchOpenSourceSearchResult( - cleanApkResults: MutableList, query: String, searchResult: MutableList, - packageSpecificResults: ArrayList + packageSpecificResults: List ): ResultSupreme, Boolean>> { + val cleanApkResults = mutableListOf() + val result = handleNetworkResult { cleanApkResults.addAll(getCleanAPKSearchResults(query)) cleanApkResults @@ -181,8 +182,8 @@ class ApplicationApiImpl @Inject constructor( private suspend fun fetchPackageSpecificResult( authData: AuthData, query: String, - packageSpecificResults: MutableList ): ResultSupreme, Boolean>> { + val packageSpecificResults: MutableList = mutableListOf() var gplayPackageResult: Application? = null var cleanapkPackageResult: Application? = null @@ -198,8 +199,6 @@ class ApplicationApiImpl @Inject constructor( /* * Currently only show open source package result if exists in both fdroid and gplay. - * This is temporary. - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5783 */ cleanapkPackageResult?.let { packageSpecificResults.add(it) } ?: run { gplayPackageResult?.let { packageSpecificResults.add(it) } @@ -209,27 +208,24 @@ class ApplicationApiImpl @Inject constructor( packageSpecificResults.add(Application(isPlaceHolder = true)) } - /* - * If there was a timeout, return it and don't try to fetch anything else. - * Also send true in the pair to signal more results being loaded. - */ if (result.getResultStatus() != ResultStatus.OK) { return ResultSupreme.create( result.getResultStatus(), Pair(packageSpecificResults, false) ) } + return ResultSupreme.create(result.getResultStatus(), Pair(packageSpecificResults, true)) } /* - * The list packageSpecificResults may contain apps with duplicate package names. - * Example, "org.telegram.messenger" will result in "Telegram" app from Play Store - * and "Telegram FOSS" from F-droid. We show both of them at the top. - * - * But for the other keyword related search results, we do not allow duplicate package names. - * We also filter out apps which are already present in packageSpecificResults list. - */ + * The list packageSpecificResults may contain apps with duplicate package names. + * Example, "org.telegram.messenger" will result in "Telegram" app from Play Store + * and "Telegram FOSS" from F-droid. We show both of them at the top. + * + * But for the other keyword related search results, we do not allow duplicate package names. + * We also filter out apps which are already present in packageSpecificResults list. + */ private fun filterWithKeywordSearch( list: List, packageSpecificResults: List, @@ -250,11 +246,12 @@ class ApplicationApiImpl @Inject constructor( private suspend fun getCleanApkPackageResult( query: String, ): Application? { - getCleanapkSearchResult(query).let { + getCleanApkSearchResult(query).let { if (it.isSuccess() && it.data!!.package_name.isNotBlank()) { return it.data!! } } + return null } @@ -262,15 +259,12 @@ class ApplicationApiImpl @Inject constructor( query: String, authData: AuthData, ): Application? { - try { - appsApi.getApplicationDetails(query, query, authData, Origin.GPLAY).let { - if (it.second == ResultStatus.OK && it.first.package_name.isNotEmpty()) { - return it.first - } + appsApi.getApplicationDetails(query, query, authData, Origin.GPLAY).let { + if (it.second == ResultStatus.OK && it.first.package_name.isNotEmpty()) { + return it.first } - } catch (e: Exception) { - Timber.e(e) } + return null } @@ -280,9 +274,8 @@ class ApplicationApiImpl @Inject constructor( * DO NOT use this to show info on ApplicationFragment as it will not have all the required * information to show for an app. * - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/2629 */ - private suspend fun getCleanapkSearchResult(packageName: String): ResultSupreme { + private suspend fun getCleanApkSearchResult(packageName: String): ResultSupreme { var application = Application() val result = handleNetworkResult { val result = cleanApkAppsRepository.getSearchResult( @@ -294,6 +287,7 @@ class ApplicationApiImpl @Inject constructor( application = result.apps[0] } } + return ResultSupreme.create(result.getResultStatus(), application) } @@ -306,63 +300,6 @@ class ApplicationApiImpl @Inject constructor( return searchSuggesions } - override suspend fun getOnDemandModule( - packageName: String, - moduleName: String, - versionCode: Int, - offerType: Int - ): String? { - val list = gplayRepository.getOnDemandModule( - packageName, - moduleName, - versionCode, - offerType, - ) - for (element in list) { - if (element.name == "$moduleName.apk") { - return element.url - } - } - return null - } - - override suspend fun updateFusedDownloadWithDownloadingInfo( - origin: Origin, - fusedDownload: FusedDownload - ) { - val list = mutableListOf() - when (origin) { - Origin.CLEANAPK -> { - val downloadInfo = - (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo( - fusedDownload.id - ) - .body() - downloadInfo?.download_data?.download_link?.let { list.add(it) } - fusedDownload.signature = downloadInfo?.download_data?.signature ?: "" - } - - Origin.GPLAY -> { - val downloadList = - gplayRepository.getDownloadInfo( - fusedDownload.packageName, - fusedDownload.versionCode, - fusedDownload.offerType - ) - fusedDownload.files = downloadList - list.addAll(downloadList.map { it.url }) - } - } - fusedDownload.downloadURLList = list - } - - override suspend fun getOSSDownloadInfo(id: String, version: String?) = - (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo(id, version) - - /* - * Search-related internal functions - */ - private suspend fun getCleanAPKSearchResults( keyword: String ): List { @@ -376,6 +313,7 @@ class ApplicationApiImpl @Inject constructor( it.updateSource(context) list.add(it) } + return list } @@ -388,7 +326,10 @@ class ApplicationApiImpl @Inject constructor( gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { - return@handleNetworkResult Pair(listOf(), setOf()) + return@handleNetworkResult Pair( + listOf(), + setOf() + ) } val fusedAppList = @@ -417,9 +358,9 @@ class ApplicationApiImpl @Inject constructor( } /* - * This function will replace a GPlay app with F-Droid app if exists, - * else will show the GPlay app itself. - */ + * This function will replace a GPlay app with F-Droid app if exists, + * else will show the GPlay app itself. + */ private suspend fun replaceWithFDroid(gPlayApp: App): Application { val gPlayFusedApp = gPlayApp.toApplication(context) val response = cleanApkAppsRepository.getAppDetails(gPlayApp.packageName) @@ -428,6 +369,7 @@ class ApplicationApiImpl @Inject constructor( this.updateSource(context) isGplayReplaced = true } + return fdroidApp ?: gPlayFusedApp } diff --git a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt index 5367ffe3d7b7e7c9fc0fea9f16c36f01a891b8b7..5b0b9df12a53d56c924a3abb786d21dda350ff21 100644 --- a/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/updates/UpdatesManagerImpl.kt @@ -31,7 +31,7 @@ import foundation.e.apps.data.enums.isUnFiltered import foundation.e.apps.data.faultyApps.FaultyAppRepository import foundation.e.apps.data.fdroid.FdroidRepository import foundation.e.apps.data.application.ApplicationRepository -import foundation.e.apps.data.application.ApplicationApi.Companion.APP_TYPE_ANY +import foundation.e.apps.data.application.search.SearchApi.Companion.APP_TYPE_ANY import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.preference.PreferenceManagerModule import foundation.e.apps.install.pkg.PkgManagerModule @@ -377,6 +377,6 @@ class UpdatesManagerImpl @Inject constructor( } fun getApplicationCategoryPreference(): List { - return applicationRepository.getApplicationCategoryPreference() + return applicationRepository.getSelectedAppTypes() } } diff --git a/app/src/main/java/foundation/e/apps/di/DataModule.kt b/app/src/main/java/foundation/e/apps/di/DataModule.kt index 0d51d6e5796e898ff418234d026a0cdfe38558cf..1863fcadc850d3f1b344f1deced8cc593e5a6692 100644 --- a/app/src/main/java/foundation/e/apps/di/DataModule.kt +++ b/app/src/main/java/foundation/e/apps/di/DataModule.kt @@ -22,12 +22,16 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import foundation.e.apps.data.application.AppsApi -import foundation.e.apps.data.application.AppsApiImpl -import foundation.e.apps.data.application.CategoryApi -import foundation.e.apps.data.application.CategoryApiImpl -import foundation.e.apps.data.application.HomeApi -import foundation.e.apps.data.application.HomeApiImpl +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.apps.AppsApiImpl +import foundation.e.apps.data.application.category.CategoryApi +import foundation.e.apps.data.application.category.CategoryApiImpl +import foundation.e.apps.data.application.downloadInfo.DownloadInfoApi +import foundation.e.apps.data.application.downloadInfo.DownloadInfoApiImpl +import foundation.e.apps.data.application.home.HomeApi +import foundation.e.apps.data.application.home.HomeApiImpl +import foundation.e.apps.data.application.search.SearchApi +import foundation.e.apps.data.application.search.SearchApiImpl import javax.inject.Singleton @Module @@ -45,4 +49,12 @@ interface DataModule { @Singleton @Binds fun getAppsApi(appsApiImpl: AppsApiImpl): AppsApi + + @Singleton + @Binds + fun getSearchApi(searchApi: SearchApiImpl): SearchApi + + @Singleton + @Binds + fun getDownloadInfoApi(downloadInfoApi: DownloadInfoApiImpl): DownloadInfoApi } diff --git a/app/src/main/java/foundation/e/apps/di/RepositoryModule.kt b/app/src/main/java/foundation/e/apps/di/RepositoryModule.kt index a09e75eedf0f3450ba33ef97ff552893911bec88..204767a8ffc96b6f0d58ffeec6ad754c6b4b0a99 100644 --- a/app/src/main/java/foundation/e/apps/di/RepositoryModule.kt +++ b/app/src/main/java/foundation/e/apps/di/RepositoryModule.kt @@ -10,8 +10,6 @@ import foundation.e.apps.data.exodus.repositories.PrivacyScoreRepository import foundation.e.apps.data.exodus.repositories.PrivacyScoreRepositoryImpl import foundation.e.apps.data.fdroid.FdroidRepository import foundation.e.apps.data.fdroid.IFdroidRepository -import foundation.e.apps.data.application.ApplicationApi -import foundation.e.apps.data.application.ApplicationApiImpl import foundation.e.apps.data.fusedDownload.FusedManagerImpl import foundation.e.apps.data.fusedDownload.IFusedManager import javax.inject.Singleton @@ -31,10 +29,6 @@ interface RepositoryModule { @Binds fun getFdroidRepository(fusedManagerImpl: FdroidRepository): IFdroidRepository - @Singleton - @Binds - fun getFusedApi(fusedApiImpl: ApplicationApiImpl): ApplicationApi - @Singleton @Binds fun getPrivacyScoreRepository(privacyScoreRepositoryImpl: PrivacyScoreRepositoryImpl): PrivacyScoreRepository diff --git a/app/src/main/java/foundation/e/apps/install/pkg/PkgManagerModule.kt b/app/src/main/java/foundation/e/apps/install/pkg/PkgManagerModule.kt index fd0a3a74973723433389721c2d20aa91fbd264f7..839aa2d9e737bdda2ce22ae207c7b836cd1cb941 100644 --- a/app/src/main/java/foundation/e/apps/install/pkg/PkgManagerModule.kt +++ b/app/src/main/java/foundation/e/apps/install/pkg/PkgManagerModule.kt @@ -34,7 +34,7 @@ import foundation.e.apps.OpenForTesting import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.Status import foundation.e.apps.data.enums.Type -import foundation.e.apps.data.application.ApplicationApi +import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.fusedDownload.models.FusedDownload import kotlinx.coroutines.DelicateCoroutinesApi import timber.log.Timber @@ -92,7 +92,7 @@ class PkgManagerModule @Inject constructor( * This method should be only used for native apps! * If you are using for any FusedApp, please consider that it can be a PWA! * - * Recommended to use: [ApplicationApi.getFusedAppInstallationStatus]. + * Recommended to use: [SearchApi.getFusedAppInstallationStatus]. */ fun getPackageStatus(packageName: String, versionCode: Int): Status { return if (isInstalled(packageName)) { diff --git a/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt b/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt index 23186b5b722d61e1365196c2e525fa00e991e2a9..c46fa48472ac16231d804fa0649d3302982eead5 100644 --- a/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt +++ b/app/src/main/java/foundation/e/apps/ui/search/SearchViewModel.kt @@ -27,7 +27,7 @@ import com.aurora.gplayapi.data.models.SearchBundle 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.GplaySearchResult +import foundation.e.apps.data.application.search.GplaySearchResult import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.login.exceptions.CleanApkException diff --git a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt index d028feafea5f7838a3e27563cb85b72dacd60b8c..0bf50502f4402c09db7135cfd2d01d706f81db6e 100644 --- a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt +++ b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt @@ -28,7 +28,7 @@ import foundation.e.apps.data.enums.Status import foundation.e.apps.data.faultyApps.FaultyAppRepository import foundation.e.apps.data.fdroid.FdroidRepository import foundation.e.apps.data.application.ApplicationRepository -import foundation.e.apps.data.application.ApplicationApi +import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.updates.UpdatesManagerImpl import foundation.e.apps.util.MainCoroutineRule @@ -318,9 +318,9 @@ class UpdateManagerImptTest { openSourceUpdates: Pair, ResultStatus>, gplayUpdates: Pair, ResultStatus>, selectedApplicationSources: List = mutableListOf( - ApplicationApi.APP_TYPE_ANY, - ApplicationApi.APP_TYPE_OPEN, - ApplicationApi.APP_TYPE_PWA + SearchApi.APP_TYPE_ANY, + SearchApi.APP_TYPE_OPEN, + SearchApi.APP_TYPE_PWA ) ) { Mockito.`when`( @@ -331,7 +331,7 @@ class UpdateManagerImptTest { ) ).thenReturn(openSourceUpdates) - Mockito.`when`(applicationRepository.getApplicationCategoryPreference()) + Mockito.`when`(applicationRepository.getSelectedAppTypes()) .thenReturn(selectedApplicationSources) if (gplayUpdates.first.isNotEmpty()) { 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 ff72d8c191201a194f6d70bb20a2b44875eceea1..533a55a9aeb56cdcf3dc184e733094d32bd3f971 100644 --- a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +++ b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt @@ -30,8 +30,8 @@ import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.Status import foundation.e.apps.data.application.ApplicationDataManager -import foundation.e.apps.data.application.AppsApi -import foundation.e.apps.data.application.AppsApiImpl +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.apps.AppsApiImpl import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.install.pkg.PWAManagerModule 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 179afb6d4adede4a232da2fe71ca497fccf58239..57c9d1428a51dd06e64b1e705f7579820ef35419 100644 --- a/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt +++ b/app/src/test/java/foundation/e/apps/category/CategoryApiTest.kt @@ -24,8 +24,8 @@ import com.aurora.gplayapi.data.models.Category import foundation.e.apps.FakePreferenceModule import foundation.e.apps.R import foundation.e.apps.data.application.ApplicationDataManager -import foundation.e.apps.data.application.CategoryApi -import foundation.e.apps.data.application.CategoryApiImpl +import foundation.e.apps.data.application.category.CategoryApi +import foundation.e.apps.data.application.category.CategoryApiImpl import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.cleanapk.data.categories.Categories import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository diff --git a/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt similarity index 93% rename from app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt rename to app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt index b29ece50a07ea52340507dbc5c7c1ae11dd0510b..ce265ed98b08f94eabbcc578f4303371fea26e85 100644 --- a/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt @@ -20,31 +20,23 @@ package foundation.e.apps.fused 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.App import com.aurora.gplayapi.data.models.AuthData -import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.FakePreferenceModule -import foundation.e.apps.R -import foundation.e.apps.data.cleanapk.data.categories.Categories 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.application.ApplicationApiImpl +import foundation.e.apps.data.application.search.SearchApiImpl import foundation.e.apps.data.application.ApplicationDataManager -import foundation.e.apps.data.application.AppsApi -import foundation.e.apps.data.application.AppsApiImpl +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.apps.AppsApiImpl import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.playstore.PlayStoreRepository import foundation.e.apps.install.pkg.PWAManagerModule import foundation.e.apps.install.pkg.PkgManagerModule import foundation.e.apps.util.MainCoroutineRule -import foundation.e.apps.util.getOrAwaitValue import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay @@ -54,8 +46,6 @@ import okhttp3.ResponseBody import okhttp3.ResponseBody.Companion.toResponseBody import org.junit.After import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Ignore import org.junit.Rule @@ -70,7 +60,7 @@ import org.mockito.kotlin.eq import retrofit2.Response @OptIn(ExperimentalCoroutinesApi::class) -class ApplicationApiImplTest { +class SearchApiImplTest { // Run tasks synchronously @Rule @@ -82,7 +72,7 @@ class ApplicationApiImplTest { @get:Rule var mainCoroutineRule = MainCoroutineRule() - private lateinit var fusedAPIImpl: ApplicationApiImpl + private lateinit var fusedAPIImpl: SearchApiImpl @Mock private lateinit var pwaManagerModule: PWAManagerModule @@ -130,7 +120,7 @@ class ApplicationApiImplTest { applicationDataManager, ) - fusedAPIImpl = ApplicationApiImpl( + fusedAPIImpl = SearchApiImpl( appsApi, preferenceManagerModule, gPlayAPIRepository, diff --git a/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt similarity index 76% rename from app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt rename to app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt index 3d59ee61d1d5155c81f6e115493a1b23a63af9a8..37cbfbf468afa186b951397bbdebb4226b93206b 100644 --- a/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt @@ -18,10 +18,11 @@ package foundation.e.apps.fused import foundation.e.apps.data.application.ApplicationRepository -import foundation.e.apps.data.application.ApplicationApiImpl -import foundation.e.apps.data.application.AppsApi -import foundation.e.apps.data.application.CategoryApi -import foundation.e.apps.data.application.HomeApi +import foundation.e.apps.data.application.apps.AppsApi +import foundation.e.apps.data.application.category.CategoryApi +import foundation.e.apps.data.application.downloadInfo.DownloadInfoApi +import foundation.e.apps.data.application.home.HomeApi +import foundation.e.apps.data.application.search.SearchApi import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test @@ -30,10 +31,11 @@ import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.any -class ApplicationApiRepositoryTest { +class SearchApiRepositoryTest { private lateinit var applicationRepository: ApplicationRepository + @Mock - private lateinit var fusedAPIImpl: ApplicationApiImpl + private lateinit var fusedAPIImpl: SearchApi @Mock private lateinit var homeApi: HomeApi @@ -44,10 +46,14 @@ class ApplicationApiRepositoryTest { @Mock private lateinit var appsApi: AppsApi + @Mock + private lateinit var downloadInfoApi: DownloadInfoApi + @Before fun setup() { MockitoAnnotations.openMocks(this) - applicationRepository = ApplicationRepository(fusedAPIImpl, homeApi, categoryApi, appsApi) + applicationRepository = + ApplicationRepository(fusedAPIImpl, homeApi, categoryApi, appsApi, downloadInfoApi) } @Test 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 b32e0f941d00d2d49d76b93ebb2241dac84bf6ad..2ed361abdf185f93f3a0f7a58a2f9d21a7cedb77 100644 --- a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +++ b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt @@ -25,8 +25,8 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.FakePreferenceModule import foundation.e.apps.data.application.ApplicationDataManager -import foundation.e.apps.data.application.HomeApi -import foundation.e.apps.data.application.HomeApiImpl +import foundation.e.apps.data.application.home.HomeApi +import foundation.e.apps.data.application.home.HomeApiImpl import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.Status import foundation.e.apps.data.playstore.PlayStoreRepository