From 3748e5a88e4441cafecad5b532eae217a5f4c089 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Wed, 6 Dec 2023 17:40:47 +0600 Subject: [PATCH 1/5] fixed: unit test --- .../data/application/ApplicationApiImpl.kt | 22 - .../e/apps/data/application/AppsApi.kt | 8 +- .../apps/data/application/data/Application.kt | 6 +- .../foundation/e/apps/apps/AppsApiTest.kt | 488 ++++++++++++++++++ .../e/apps/fused/ApplicationApiImplTest.kt | 388 +------------- .../fused/ApplicationApiRepositoryTest.kt | 12 +- 6 files changed, 525 insertions(+), 399 deletions(-) create mode 100644 app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt index ca80ce604..fdd6ab928 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt @@ -19,58 +19,36 @@ package foundation.e.apps.data.application import android.content.Context -import android.text.format.Formatter -import com.aurora.gplayapi.Constants import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App -import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle -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.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.data.Application -import foundation.e.apps.data.application.data.Category import foundation.e.apps.data.application.data.Home -import foundation.e.apps.data.application.data.Ratings -import foundation.e.apps.data.application.utils.CategoryType -import foundation.e.apps.data.application.utils.CategoryUtils import foundation.e.apps.data.application.utils.toApplication import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher -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.AppTag -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.Type -import foundation.e.apps.data.enums.isUnFiltered 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 import foundation.e.apps.data.preference.PreferenceManagerModule -import foundation.e.apps.install.pkg.PWAManagerModule -import foundation.e.apps.install.pkg.PkgManagerModule -import foundation.e.apps.ui.applicationlist.ApplicationDiffUtil import foundation.e.apps.utils.eventBus.AppEvent import foundation.e.apps.utils.eventBus.EventBus import kotlinx.coroutines.Deferred import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch -import retrofit2.Response import timber.log.Timber import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton -import com.aurora.gplayapi.data.models.Category as GplayapiCategory -import foundation.e.apps.data.cleanapk.data.app.Application as CleanApkApplication typealias FusedHomeDeferred = Deferred>> diff --git a/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt b/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt index a93d12100..cdbcda5a1 100644 --- a/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/AppsApi.kt @@ -10,11 +10,9 @@ import foundation.e.apps.data.enums.Status interface AppsApi { /* - * Function to search cleanapk using package name. - * Will be used to handle f-droid deeplink. - * - * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5509 - */ + * Function to search cleanapk using package name. + * Will be used to handle f-droid deeplink. + */ suspend fun getCleanapkAppDetails(packageName: String): Pair suspend fun getApplicationDetails( diff --git a/app/src/main/java/foundation/e/apps/data/application/data/Application.kt b/app/src/main/java/foundation/e/apps/data/application/data/Application.kt index f884caaed..ba7836bcc 100644 --- a/app/src/main/java/foundation/e/apps/data/application/data/Application.kt +++ b/app/src/main/java/foundation/e/apps/data/application/data/Application.kt @@ -102,9 +102,9 @@ data class Application( fun updateSource(context: Context) { this.apply { - source = if (origin == Origin.CLEANAPK && is_pwa) context.getString(R.string.pwa) - else if (origin == Origin.CLEANAPK) context.getString(R.string.open_source) - else "" + source = if (origin != Origin.CLEANAPK) "" + else if (is_pwa) context.getString(R.string.pwa) + else context.getString(R.string.open_source) } } } diff --git a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt new file mode 100644 index 000000000..3073a95a7 --- /dev/null +++ b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt @@ -0,0 +1,488 @@ +/* + * Copyright (C) 2022 ECORP + * + * 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.apps + +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 foundation.e.apps.FakePreferenceModule +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.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.data.Application +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 kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +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.Rule +import org.junit.Test +import org.mockito.Mock +import org.mockito.MockedStatic +import org.mockito.Mockito +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.eq + +@OptIn(ExperimentalCoroutinesApi::class) +class AppsApiTest { + + // Run tasks synchronously + @Rule + @JvmField + val instantExecutorRule = InstantTaskExecutorRule() + + // Sets the main coroutines dispatcher to a TestCoroutineScope for unit testing. + @ExperimentalCoroutinesApi + @get:Rule + var mainCoroutineRule = MainCoroutineRule() + + @Mock + private lateinit var pwaManagerModule: PWAManagerModule + + @Mock + private lateinit var pkgManagerModule: PkgManagerModule + + @Mock + private lateinit var context: Context + + @Mock + private lateinit var cleanApkAppsRepository: CleanApkRepository + + @Mock + private lateinit var gPlayAPIRepository: PlayStoreRepository + + private lateinit var appsApi: AppsApi + + private lateinit var applicationDataManager: ApplicationDataManager + + private lateinit var preferenceManagerModule: FakePreferenceModule + + private lateinit var formatterMocked: MockedStatic + + companion object { + private val AUTH_DATA = AuthData("e@e.email", "AtadyMsIAtadyM") + } + + @Before + fun setup() { + MockitoAnnotations.openMocks(this) + formatterMocked = Mockito.mockStatic(Formatter::class.java) + preferenceManagerModule = FakePreferenceModule(context) + applicationDataManager = + ApplicationDataManager(gPlayAPIRepository, pkgManagerModule, pwaManagerModule) + + appsApi = AppsApiImpl( + context, + preferenceManagerModule, + gPlayAPIRepository, + cleanApkAppsRepository, + applicationDataManager, + ) + } + + @After + fun after() { + formatterMocked.close() + } + + @Test + fun `is any app updated when new list is empty`() { + val oldAppList = mutableListOf( + Application( + _id = "111", + status = Status.UNAVAILABLE, + name = "Demo One", + package_name = "foundation.e.demoone" + ), + Application( + _id = "112", + status = Status.INSTALLED, + name = "Demo Two", + package_name = "foundation.e.demotwo" + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree" + ) + ) + + val newAppList = mutableListOf() + val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) + assertTrue("isAnyAppUpdated", isFusedAppUpdated) + } + + @Test + fun `is any app updated when both list are empty`() { + val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(listOf(), listOf()) + assertFalse("isAnyAppUpdated", isFusedAppUpdated) + } + + @Test + fun `is any app updated when any app is uninstalled`() { + val oldAppList = mutableListOf( + Application( + _id = "111", + status = Status.UNAVAILABLE, + name = "Demo One", + package_name = "foundation.e.demoone" + ), + Application( + _id = "112", + status = Status.INSTALLED, + name = "Demo Two", + package_name = "foundation.e.demotwo" + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree" + ) + ) + + val newAppList = mutableListOf( + Application( + _id = "111", + status = Status.UNAVAILABLE, + name = "Demo One", + package_name = "foundation.e.demoone" + ), + Application( + _id = "112", + status = Status.UNAVAILABLE, + name = "Demo Two", + package_name = "foundation.e.demotwo" + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree" + ) + ) + + val isFusedAppUpdated = appsApi.isAnyFusedAppUpdated(newAppList, oldAppList) + assertTrue("isAnyFusedAppUpdated", isFusedAppUpdated) + } + + @Test + fun `has any app install status changed when changed`() { + val oldAppList = mutableListOf( + Application( + _id = "111", + status = Status.UNAVAILABLE, + name = "Demo One", + package_name = "foundation.e.demoone", + latest_version_code = 123 + ), + Application( + _id = "112", + status = Status.INSTALLED, + name = "Demo Two", + package_name = "foundation.e.demotwo", + latest_version_code = 123 + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123 + ) + ) + + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + + val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) + assertTrue("hasInstallStatusUpdated", isAppStatusUpdated) + } + + @Test + fun `has any app install status changed when not changed`() { + val oldAppList = mutableListOf( + Application( + _id = "111", + status = Status.UNAVAILABLE, + name = "Demo One", + package_name = "foundation.e.demoone", + latest_version_code = 123 + ), + Application( + _id = "112", + status = Status.INSTALLED, + name = "Demo Two", + package_name = "foundation.e.demotwo", + latest_version_code = 123 + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123 + ) + ) + + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + .thenReturn( + Status.INSTALLED + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + + val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) + assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) + } + + @Test + fun `has any app install status changed when installation_issue`() { + val oldAppList = mutableListOf( + Application( + _id = "111", + status = Status.INSTALLATION_ISSUE, + name = "Demo One", + package_name = "foundation.e.demoone", + latest_version_code = 123 + ), + Application( + _id = "112", + status = Status.INSTALLED, + name = "Demo Two", + package_name = "foundation.e.demotwo", + latest_version_code = 123 + ), + Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123 + ) + ) + + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) + .thenReturn( + Status.INSTALLED + ) + Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) + .thenReturn( + Status.UNAVAILABLE + ) + + val isAppStatusUpdated = appsApi.isAnyAppInstallStatusChanged(oldAppList) + assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) + } + + + @Test + fun getFusedAppInstallationStatusWhenPWA() { + val application = Application( + _id = "113", + status = Status.UNAVAILABLE, + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123, + is_pwa = true + ) + + Mockito.`when`(pwaManagerModule.getPwaStatus(application)).thenReturn(application.status) + + val installationStatus = appsApi.getFusedAppInstallationStatus(application) + assertEquals("getFusedAppInstallationStatusWhenPWA", application.status, installationStatus) + } + + @Test + fun getFusedAppInstallationStatus() { + val application = Application( + _id = "113", + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123, + ) + + Mockito.`when`( + pkgManagerModule.getPackageStatus( + application.package_name, application.latest_version_code + ) + ).thenReturn(Status.INSTALLED) + + val installationStatus = appsApi.getFusedAppInstallationStatus(application) + assertEquals("getFusedAppInstallationStatusWhenPWA", Status.INSTALLED, installationStatus) + } + + @Test + fun `getAppFilterLevel when package name is empty`() = runTest { + val application = Application( + _id = "113", + name = "Demo Three", + package_name = "", + latest_version_code = 123, + ) + + val filterLevel = appsApi.getAppFilterLevel(application, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.UNKNOWN, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is CleanApk`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest() + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) + } + + private fun getFusedAppForFilterLevelTest(isFree: Boolean = true) = Application( + _id = "113", + name = "Demo Three", + package_name = "foundation.e.demothree", + latest_version_code = 123, + origin = Origin.CLEANAPK, + originalSize = -1, + isFree = isFree, + price = "" + ) + + @Test + fun `getAppFilterLevel when Authdata is NULL`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest() + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, null) + assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is restricted and paid and no price`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest(false).apply { + this.origin = Origin.GPLAY + this.restriction = Constants.Restriction.UNKNOWN + } + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is not_restricted and paid and no price`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest(false).apply { + this.origin = Origin.GPLAY + this.restriction = Constants.Restriction.NOT_RESTRICTED + } + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is restricted and getAppDetails and getDownloadDetails returns success`() = + runTest { + val fusedApp = getFusedAppForFilterLevelTest().apply { + this.origin = Origin.GPLAY + this.restriction = Constants.Restriction.UNKNOWN + } + + Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) + .thenReturn(App(fusedApp.package_name)) + + Mockito.`when`( + gPlayAPIRepository.getDownloadInfo( + fusedApp.package_name, + fusedApp.latest_version_code, + fusedApp.offer_type, + ) + ).thenReturn(listOf()) + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is restricted and getAppDetails throws exception`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest().apply { + this.origin = Origin.GPLAY + this.restriction = Constants.Restriction.UNKNOWN + } + + Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) + .thenThrow(RuntimeException()) + + Mockito.`when`( + gPlayAPIRepository.getDownloadInfo( + fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type + ) + ).thenReturn(listOf()) + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.DATA, filterLevel) + } + + @Test + fun `getAppFilterLevel when app is restricted and getDownoadInfo throws exception`() = runTest { + val fusedApp = getFusedAppForFilterLevelTest().apply { + this.origin = Origin.GPLAY + this.restriction = Constants.Restriction.UNKNOWN + } + + Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) + .thenReturn(App(fusedApp.package_name)) + + Mockito.`when`( + gPlayAPIRepository.getDownloadInfo( + fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type + ) + ).thenThrow(RuntimeException()) + + val filterLevel = appsApi.getAppFilterLevel(fusedApp, AUTH_DATA) + assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) + } +} diff --git a/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt b/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt index 39092ecef..b29ece50a 100644 --- a/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/ApplicationApiImplTest.kt @@ -35,6 +35,9 @@ 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.ApplicationDataManager +import foundation.e.apps.data.application.AppsApi +import foundation.e.apps.data.application.AppsApiImpl import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.utils.CategoryType import foundation.e.apps.data.playstore.PlayStoreRepository @@ -99,6 +102,10 @@ class ApplicationApiImplTest { @Mock private lateinit var gPlayAPIRepository: PlayStoreRepository + private lateinit var appsApi: AppsApi + + private lateinit var applicationDataManager: ApplicationDataManager + private lateinit var preferenceManagerModule: FakePreferenceModule private lateinit var formatterMocked: MockedStatic @@ -112,14 +119,24 @@ class ApplicationApiImplTest { MockitoAnnotations.openMocks(this) formatterMocked = Mockito.mockStatic(Formatter::class.java) preferenceManagerModule = FakePreferenceModule(context) + applicationDataManager = + ApplicationDataManager(gPlayAPIRepository, pkgManagerModule, pwaManagerModule) + + appsApi = AppsApiImpl( + context, + preferenceManagerModule, + gPlayAPIRepository, + cleanApkAppsRepository, + applicationDataManager, + ) + fusedAPIImpl = ApplicationApiImpl( - pkgManagerModule, - pwaManagerModule, + appsApi, preferenceManagerModule, gPlayAPIRepository, cleanApkAppsRepository, cleanApkPWARepository, - context + applicationDataManager ) } @@ -128,275 +145,6 @@ class ApplicationApiImplTest { formatterMocked.close() } - @Test - fun `is any app updated when new list is empty`() { - val oldAppList = mutableListOf( - Application( - _id = "111", - status = Status.UNAVAILABLE, - name = "Demo One", - package_name = "foundation.e.demoone" - ), - Application( - _id = "112", - status = Status.INSTALLED, - name = "Demo Two", - package_name = "foundation.e.demotwo" - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree" - ) - ) - - val newAppList = mutableListOf() - val isFusedAppUpdated = fusedAPIImpl.isAnyFusedAppUpdated(newAppList, oldAppList) - assertTrue("isAnyAppUpdated", isFusedAppUpdated) - } - - @Test - fun `is any app updated when both list are empty`() { - val isFusedAppUpdated = fusedAPIImpl.isAnyFusedAppUpdated(listOf(), listOf()) - assertFalse("isAnyAppUpdated", isFusedAppUpdated) - } - - @Test - fun `is any app updated when any app is uninstalled`() { - val oldAppList = mutableListOf( - Application( - _id = "111", - status = Status.UNAVAILABLE, - name = "Demo One", - package_name = "foundation.e.demoone" - ), - Application( - _id = "112", - status = Status.INSTALLED, - name = "Demo Two", - package_name = "foundation.e.demotwo" - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree" - ) - ) - - val newAppList = mutableListOf( - Application( - _id = "111", - status = Status.UNAVAILABLE, - name = "Demo One", - package_name = "foundation.e.demoone" - ), - Application( - _id = "112", - status = Status.UNAVAILABLE, - name = "Demo Two", - package_name = "foundation.e.demotwo" - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree" - ) - ) - - val isFusedAppUpdated = fusedAPIImpl.isAnyFusedAppUpdated(newAppList, oldAppList) - assertTrue("isAnyFusedAppUpdated", isFusedAppUpdated) - } - - @Test - fun `has any app install status changed when changed`() { - val oldAppList = mutableListOf( - Application( - _id = "111", - status = Status.UNAVAILABLE, - name = "Demo One", - package_name = "foundation.e.demoone", - latest_version_code = 123 - ), - Application( - _id = "112", - status = Status.INSTALLED, - name = "Demo Two", - package_name = "foundation.e.demotwo", - latest_version_code = 123 - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree", - latest_version_code = 123 - ) - ) - - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - - val isAppStatusUpdated = fusedAPIImpl.isAnyAppInstallStatusChanged(oldAppList) - assertTrue("hasInstallStatusUpdated", isAppStatusUpdated) - } - - @Test - fun `has any app install status changed when not changed`() { - val oldAppList = mutableListOf( - Application( - _id = "111", - status = Status.UNAVAILABLE, - name = "Demo One", - package_name = "foundation.e.demoone", - latest_version_code = 123 - ), - Application( - _id = "112", - status = Status.INSTALLED, - name = "Demo Two", - package_name = "foundation.e.demotwo", - latest_version_code = 123 - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree", - latest_version_code = 123 - ) - ) - - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) - .thenReturn( - Status.INSTALLED - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - - val isAppStatusUpdated = fusedAPIImpl.isAnyAppInstallStatusChanged(oldAppList) - assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) - } - - @Test - fun `has any app install status changed when installation_issue`() { - val oldAppList = mutableListOf( - Application( - _id = "111", - status = Status.INSTALLATION_ISSUE, - name = "Demo One", - package_name = "foundation.e.demoone", - latest_version_code = 123 - ), - Application( - _id = "112", - status = Status.INSTALLED, - name = "Demo Two", - package_name = "foundation.e.demotwo", - latest_version_code = 123 - ), - Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree", - latest_version_code = 123 - ) - ) - - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demoone"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demotwo"), eq(123))) - .thenReturn( - Status.INSTALLED - ) - Mockito.`when`(pkgManagerModule.getPackageStatus(eq("foundation.e.demothree"), eq(123))) - .thenReturn( - Status.UNAVAILABLE - ) - - val isAppStatusUpdated = fusedAPIImpl.isAnyAppInstallStatusChanged(oldAppList) - assertFalse("hasInstallStatusUpdated", isAppStatusUpdated) - } - - - @Test - fun getFusedAppInstallationStatusWhenPWA() { - val application = Application( - _id = "113", - status = Status.UNAVAILABLE, - name = "Demo Three", - package_name = "foundation.e.demothree", - latest_version_code = 123, - is_pwa = true - ) - - Mockito.`when`(pwaManagerModule.getPwaStatus(application)).thenReturn(application.status) - - val installationStatus = fusedAPIImpl.getFusedAppInstallationStatus(application) - assertEquals("getFusedAppInstallationStatusWhenPWA", application.status, installationStatus) - } - - @Test - fun getFusedAppInstallationStatus() { - val application = Application( - _id = "113", - name = "Demo Three", - package_name = "foundation.e.demothree", - latest_version_code = 123, - ) - - Mockito.`when`( - pkgManagerModule.getPackageStatus( - application.package_name, application.latest_version_code - ) - ).thenReturn(Status.INSTALLED) - - val installationStatus = fusedAPIImpl.getFusedAppInstallationStatus(application) - assertEquals("getFusedAppInstallationStatusWhenPWA", Status.INSTALLED, installationStatus) - } - - @Test - fun `getAppFilterLevel when package name is empty`() = runTest { - val application = Application( - _id = "113", - name = "Demo Three", - package_name = "", - latest_version_code = 123, - ) - - val filterLevel = fusedAPIImpl.getAppFilterLevel(application, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.UNKNOWN, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is CleanApk`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest() - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) - } - private fun getFusedAppForFilterLevelTest(isFree: Boolean = true) = Application( _id = "113", name = "Demo Three", @@ -408,99 +156,6 @@ class ApplicationApiImplTest { price = "" ) - @Test - fun `getAppFilterLevel when Authdata is NULL`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest() - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, null) - assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is restricted and paid and no price`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest(false).apply { - this.origin = Origin.GPLAY - this.restriction = Constants.Restriction.UNKNOWN - } - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is not_restricted and paid and no price`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest(false).apply { - this.origin = Origin.GPLAY - this.restriction = Constants.Restriction.NOT_RESTRICTED - } - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is restricted and getAppDetails and getDownloadDetails returns success`() = - runTest { - val fusedApp = getFusedAppForFilterLevelTest().apply { - this.origin = Origin.GPLAY - this.restriction = Constants.Restriction.UNKNOWN - } - - Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) - .thenReturn(App(fusedApp.package_name)) - - Mockito.`when`( - gPlayAPIRepository.getDownloadInfo( - fusedApp.package_name, - fusedApp.latest_version_code, - fusedApp.offer_type, - ) - ).thenReturn(listOf()) - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.NONE, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is restricted and getAppDetails throws exception`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest().apply { - this.origin = Origin.GPLAY - this.restriction = Constants.Restriction.UNKNOWN - } - - Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) - .thenThrow(RuntimeException()) - - Mockito.`when`( - gPlayAPIRepository.getDownloadInfo( - fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type - ) - ).thenReturn(listOf()) - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.DATA, filterLevel) - } - - @Test - fun `getAppFilterLevel when app is restricted and getDownoadInfo throws exception`() = runTest { - val fusedApp = getFusedAppForFilterLevelTest().apply { - this.origin = Origin.GPLAY - this.restriction = Constants.Restriction.UNKNOWN - } - - Mockito.`when`(gPlayAPIRepository.getAppDetails(fusedApp.package_name)) - .thenReturn(App(fusedApp.package_name)) - - Mockito.`when`( - gPlayAPIRepository.getDownloadInfo( - fusedApp.package_name, fusedApp.latest_version_code, fusedApp.offer_type - ) - ).thenThrow(RuntimeException()) - - val filterLevel = fusedAPIImpl.getAppFilterLevel(fusedApp, AUTH_DATA) - assertEquals("getAppFilterLevel", FilterLevel.UI, filterLevel) - } - @Ignore("Dependencies are not mockable") @Test fun `getSearchResult When all sources are selected`() = runTest { @@ -647,7 +302,8 @@ class ApplicationApiImplTest { fun testSearchResultWhenDataIsLimited() = runTest { preferenceManagerModule.isGplaySelectedFake = true formatterMocked.`when` { Formatter.formatFileSize(any(), any()) }.thenReturn("15MB") - Mockito.`when`(gPlayAPIRepository.getSearchResult(anyString(), eq(null))).thenReturn(Pair(emptyList(), mutableSetOf())) + Mockito.`when`(gPlayAPIRepository.getSearchResult(anyString(), eq(null))) + .thenReturn(Pair(emptyList(), mutableSetOf())) Mockito.`when`(cleanApkAppsRepository.getAppDetails(any())).thenReturn(null) var isEventBusTriggered = false diff --git a/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt b/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt index 85fa1333b..3d59ee61d 100644 --- a/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt @@ -19,6 +19,7 @@ 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 org.junit.Assert.assertTrue @@ -33,27 +34,32 @@ class ApplicationApiRepositoryTest { private lateinit var applicationRepository: ApplicationRepository @Mock private lateinit var fusedAPIImpl: ApplicationApiImpl + @Mock private lateinit var homeApi: HomeApi + @Mock private lateinit var categoryApi: CategoryApi + @Mock + private lateinit var appsApi: AppsApi + @Before fun setup() { MockitoAnnotations.openMocks(this) - applicationRepository = ApplicationRepository(fusedAPIImpl, homeApi, categoryApi) + applicationRepository = ApplicationRepository(fusedAPIImpl, homeApi, categoryApi, appsApi) } @Test fun isAnyAppUpdated_ReturnsTrue() { - Mockito.`when`(fusedAPIImpl.isAnyFusedAppUpdated(any(), any())).thenReturn(true) + Mockito.`when`(appsApi.isAnyFusedAppUpdated(any(), any())).thenReturn(true) val isAnyAppUpdated = applicationRepository.isAnyFusedAppUpdated(listOf(), listOf()) assertTrue("isAnyAppUpdated", isAnyAppUpdated) } @Test fun isAnyInstallStatusChanged_ReturnsTrue() { - Mockito.`when`(fusedAPIImpl.isAnyAppInstallStatusChanged(any())).thenReturn(true) + Mockito.`when`(appsApi.isAnyAppInstallStatusChanged(any())).thenReturn(true) val isAnyAppUpdated = applicationRepository.isAnyAppInstallStatusChanged(listOf()) assertTrue("isAnyAppUpdated", isAnyAppUpdated) } -- GitLab From e59e2d4dfc52c42363640d1b9cbd66ec07f1cfd2 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Fri, 8 Dec 2023 16:30:24 +0600 Subject: [PATCH 2/5] DowloadInfoApi & searchapi are introduced --- .../data/application/ApplicationRepository.kt | 17 ++--- .../apps/data/application/DownloadInfoApi.kt | 23 +++++++ .../data/application/DownloadInfoApiImpl.kt | 68 +++++++++++++++++++ .../e/apps/data/application/HomeApiImpl.kt | 12 ++-- .../{ApplicationApi.kt => SearchApi.kt} | 29 +------- ...ApplicationApiImpl.kt => SearchApiImpl.kt} | 65 ++---------------- .../e/apps/data/updates/UpdatesManagerImpl.kt | 2 +- .../java/foundation/e/apps/di/DataModule.kt | 12 ++++ .../foundation/e/apps/di/RepositoryModule.kt | 8 +-- .../e/apps/install/pkg/PkgManagerModule.kt | 4 +- .../e/apps/UpdateManagerImptTest.kt | 8 +-- ...ionApiImplTest.kt => SearchApiImplTest.kt} | 18 ++--- ...toryTest.kt => SearchApiRepositoryTest.kt} | 6 +- 13 files changed, 140 insertions(+), 132 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt create mode 100644 app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt rename app/src/main/java/foundation/e/apps/data/application/{ApplicationApi.kt => SearchApi.kt} (57%) rename app/src/main/java/foundation/e/apps/data/application/{ApplicationApiImpl.kt => SearchApiImpl.kt} (84%) rename app/src/test/java/foundation/e/apps/fused/{ApplicationApiImplTest.kt => SearchApiImplTest.kt} (94%) rename app/src/test/java/foundation/e/apps/fused/{ApplicationApiRepositoryTest.kt => SearchApiRepositoryTest.kt} (93%) 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 24f2ac55a..059672ee5 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 @@ -38,10 +38,11 @@ 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>> { @@ -49,7 +50,7 @@ class ApplicationRepository @Inject constructor( } fun getApplicationCategoryPreference(): List { - return applicationAPIImpl.getApplicationCategoryPreference() + return searchAPIImpl.getApplicationCategoryPreference() } suspend fun getApplicationDetails( @@ -81,14 +82,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 +97,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 +107,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/DownloadInfoApi.kt b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt new file mode 100644 index 000000000..e167fe858 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt @@ -0,0 +1,23 @@ +package foundation.e.apps.data.application + +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/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt new file mode 100644 index 000000000..522e53f3e --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt @@ -0,0 +1,68 @@ +package foundation.e.apps.data.application + +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 -> { + 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) +} \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt index 9bc92f99d..f037f7b33 100644 --- a/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/HomeApiImpl.kt @@ -115,19 +115,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 +139,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 +154,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/SearchApi.kt similarity index 57% rename from app/src/main/java/foundation/e/apps/data/application/ApplicationApi.kt rename to app/src/main/java/foundation/e/apps/data/application/SearchApi.kt index e6434f157..2bfe9f0de 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt @@ -1,26 +1,14 @@ package foundation.e.apps.data.application -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" @@ -47,19 +35,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/SearchApiImpl.kt similarity index 84% rename from app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt index fdd6ab928..17398339d 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt @@ -25,17 +25,15 @@ 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.SearchApi.Companion.APP_TYPE_ANY +import foundation.e.apps.data.application.SearchApi.Companion.APP_TYPE_OPEN +import foundation.e.apps.data.application.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,14 +51,14 @@ 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 @@ -306,59 +304,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 */ 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 5367ffe3d..7a4da2c57 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.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 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 0d51d6e57..cf9eb4604 100644 --- a/app/src/main/java/foundation/e/apps/di/DataModule.kt +++ b/app/src/main/java/foundation/e/apps/di/DataModule.kt @@ -26,8 +26,12 @@ 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.DownloadInfoApi +import foundation.e.apps.data.application.DownloadInfoApiImpl import foundation.e.apps.data.application.HomeApi import foundation.e.apps.data.application.HomeApiImpl +import foundation.e.apps.data.application.SearchApi +import foundation.e.apps.data.application.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 a09e75eed..9447ff569 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,8 @@ 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.application.SearchApi +import foundation.e.apps.data.application.SearchApiImpl import foundation.e.apps.data.fusedDownload.FusedManagerImpl import foundation.e.apps.data.fusedDownload.IFusedManager import javax.inject.Singleton @@ -31,10 +31,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 fd0a3a749..293a0d0ab 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.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/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt index d028feafe..17b9fca6d 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.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`( 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 94% 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 b29ece50a..49761d0cd 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.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.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 93% 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 3d59ee61d..89979ab9e 100644 --- a/app/src/test/java/foundation/e/apps/fused/ApplicationApiRepositoryTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt @@ -18,7 +18,7 @@ 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.SearchApiImpl import foundation.e.apps.data.application.AppsApi import foundation.e.apps.data.application.CategoryApi import foundation.e.apps.data.application.HomeApi @@ -30,10 +30,10 @@ 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: SearchApiImpl @Mock private lateinit var homeApi: HomeApi -- GitLab From 6a53ceddd520dd73abbbb484e1ffdd13daaae316 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Sun, 10 Dec 2023 15:48:39 +0600 Subject: [PATCH 3/5] refactor: Search api --- .../data/application/ApplicationRepository.kt | 4 +- .../data/application/DownloadInfoApiImpl.kt | 46 ++++++---- .../e/apps/data/application/SearchApi.kt | 2 +- .../e/apps/data/application/SearchApiImpl.kt | 87 +++++++++---------- .../e/apps/data/updates/UpdatesManagerImpl.kt | 2 +- .../e/apps/UpdateManagerImptTest.kt | 2 +- .../e/apps/fused/SearchApiRepositoryTest.kt | 8 +- 7 files changed, 86 insertions(+), 65 deletions(-) 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 059672ee5..5f5d343ae 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 @@ -49,8 +49,8 @@ class ApplicationRepository @Inject constructor( return homeApi.fetchHomeScreenData(authData) } - fun getApplicationCategoryPreference(): List { - return searchAPIImpl.getApplicationCategoryPreference() + fun getSelectedAppTypes(): List { + return searchAPIImpl.getSelectedAppTypes() } suspend fun getApplicationDetails( diff --git a/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt index 522e53f3e..70b92c471 100644 --- a/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt @@ -25,11 +25,13 @@ class DownloadInfoApiImpl @Inject constructor( versionCode, offerType, ) + for (element in list) { if (element.name == "$moduleName.apk") { return element.url } } + return null } @@ -40,29 +42,43 @@ class DownloadInfoApiImpl @Inject constructor( 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 ?: "" + updateDownloadInfoFromCleanApk(fusedDownload, list) } Origin.GPLAY -> { - val downloadList = - gplayRepository.getDownloadInfo( - fusedDownload.packageName, - fusedDownload.versionCode, - fusedDownload.offerType - ) - fusedDownload.files = downloadList - list.addAll(downloadList.map { it.url }) + 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) } \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt b/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt index 2bfe9f0de..b28b0b83d 100644 --- a/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt @@ -15,7 +15,7 @@ interface SearchApi { const val APP_TYPE_PWA = "pwa" } - fun getApplicationCategoryPreference(): List + fun getSelectedAppTypes(): List /** * Fetches search results from cleanAPK and GPlay servers and returns them diff --git a/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt index 17398339d..c8766b633 100644 --- a/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt @@ -61,43 +61,42 @@ class SearchApiImpl @Inject constructor( ) : 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 @@ -111,13 +110,14 @@ class SearchApiImpl @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 { @@ -149,11 +149,12 @@ class SearchApiImpl @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 @@ -179,8 +180,8 @@ class SearchApiImpl @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 @@ -196,8 +197,6 @@ class SearchApiImpl @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) } @@ -207,27 +206,24 @@ class SearchApiImpl @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, @@ -248,11 +244,12 @@ class SearchApiImpl @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 } @@ -269,6 +266,7 @@ class SearchApiImpl @Inject constructor( } catch (e: Exception) { Timber.e(e) } + return null } @@ -278,9 +276,8 @@ class SearchApiImpl @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( @@ -292,6 +289,7 @@ class SearchApiImpl @Inject constructor( application = result.apps[0] } } + return ResultSupreme.create(result.getResultStatus(), application) } @@ -304,10 +302,6 @@ class SearchApiImpl @Inject constructor( return searchSuggesions } - /* - * Search-related internal functions - */ - private suspend fun getCleanAPKSearchResults( keyword: String ): List { @@ -321,6 +315,7 @@ class SearchApiImpl @Inject constructor( it.updateSource(context) list.add(it) } + return list } @@ -333,7 +328,10 @@ class SearchApiImpl @Inject constructor( gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { - return@handleNetworkResult Pair(listOf(), setOf()) + return@handleNetworkResult Pair( + listOf(), + setOf() + ) } val fusedAppList = @@ -362,9 +360,9 @@ class SearchApiImpl @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) @@ -373,6 +371,7 @@ class SearchApiImpl @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 7a4da2c57..a55a15f95 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 @@ -377,6 +377,6 @@ class UpdatesManagerImpl @Inject constructor( } fun getApplicationCategoryPreference(): List { - return applicationRepository.getApplicationCategoryPreference() + return applicationRepository.getSelectedAppTypes() } } diff --git a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt index 17b9fca6d..da86b1e74 100644 --- a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt +++ b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt @@ -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/fused/SearchApiRepositoryTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt index 89979ab9e..aa6eb7199 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt @@ -21,6 +21,7 @@ import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.SearchApiImpl import foundation.e.apps.data.application.AppsApi import foundation.e.apps.data.application.CategoryApi +import foundation.e.apps.data.application.DownloadInfoApi import foundation.e.apps.data.application.HomeApi import org.junit.Assert.assertTrue import org.junit.Before @@ -32,6 +33,7 @@ import org.mockito.kotlin.any class SearchApiRepositoryTest { private lateinit var applicationRepository: ApplicationRepository + @Mock private lateinit var fusedAPIImpl: SearchApiImpl @@ -44,10 +46,14 @@ class SearchApiRepositoryTest { @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 -- GitLab From 5c9ba8fde0e4f1c580ac4648ef7d91f5eda5d081 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Mon, 11 Dec 2023 22:56:52 +0600 Subject: [PATCH 4/5] refactor: package structure --- .../data/application/ApplicationRepository.kt | 6 +++ .../apps/data/application/DownloadInfoApi.kt | 23 ---------- .../data/application/{ => apps}/AppsApi.kt | 2 +- .../application/{ => apps}/AppsApiImpl.kt | 28 ++++++------ .../application/{ => category}/CategoryApi.kt | 2 +- .../{ => category}/CategoryApiImpl.kt | 28 ++++++------ .../downloadInfo/DownloadInfoApi.kt | 42 +++++++++++++++++ .../{ => downloadInfo}/DownloadInfoApiImpl.kt | 23 +++++++++- .../data/application/{ => home}/HomeApi.kt | 2 +- .../application/{ => home}/HomeApiImpl.kt | 30 +++++++------ .../application/{ => search}/SearchApi.kt | 21 ++++++++- .../application/{ => search}/SearchApiImpl.kt | 45 +++++++++---------- .../e/apps/data/updates/UpdatesManagerImpl.kt | 2 +- .../java/foundation/e/apps/di/DataModule.kt | 20 ++++----- .../foundation/e/apps/di/RepositoryModule.kt | 2 - .../e/apps/install/pkg/PkgManagerModule.kt | 2 +- .../e/apps/ui/search/SearchViewModel.kt | 2 +- .../e/apps/UpdateManagerImptTest.kt | 2 +- .../foundation/e/apps/apps/AppsApiTest.kt | 6 +-- .../e/apps/category/CategoryApiTest.kt | 4 +- .../e/apps/fused/SearchApiImplTest.kt | 6 +-- .../e/apps/fused/SearchApiRepositoryTest.kt | 10 ++--- .../foundation/e/apps/home/HomeApiTest.kt | 4 +- 23 files changed, 190 insertions(+), 122 deletions(-) delete mode 100644 app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt rename app/src/main/java/foundation/e/apps/data/application/{ => apps}/AppsApi.kt (97%) rename app/src/main/java/foundation/e/apps/data/application/{ => apps}/AppsApiImpl.kt (90%) rename app/src/main/java/foundation/e/apps/data/application/{ => category}/CategoryApi.kt (96%) rename app/src/main/java/foundation/e/apps/data/application/{ => category}/CategoryApiImpl.kt (90%) create mode 100644 app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApi.kt rename app/src/main/java/foundation/e/apps/data/application/{ => downloadInfo}/DownloadInfoApiImpl.kt (76%) rename app/src/main/java/foundation/e/apps/data/application/{ => home}/HomeApi.kt (95%) rename app/src/main/java/foundation/e/apps/data/application/{ => home}/HomeApiImpl.kt (89%) rename app/src/main/java/foundation/e/apps/data/application/{ => search}/SearchApi.kt (60%) rename app/src/main/java/foundation/e/apps/data/application/{ => search}/SearchApiImpl.kt (87%) 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 5f5d343ae..5808dda59 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 diff --git a/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt b/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt deleted file mode 100644 index e167fe858..000000000 --- a/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApi.kt +++ /dev/null @@ -1,23 +0,0 @@ -package foundation.e.apps.data.application - -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/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 8e3f0491d..1a5ebfa36 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 90% 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 ea2b781ef..fd15e42f5 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 @@ -1,27 +1,29 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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. + * 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 . * - * 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 +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 f6afb796c..3349428eb 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 90% 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 e222d7242..a09a01483 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 @@ -1,22 +1,23 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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. + * 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 . * - * 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 +package foundation.e.apps.data.application.category import android.content.Context import com.aurora.gplayapi.data.models.App @@ -25,6 +26,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 000000000..58d95793a --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApi.kt @@ -0,0 +1,42 @@ +/* + * 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/DownloadInfoApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt similarity index 76% rename from app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt index 70b92c471..a026e3a4f 100644 --- a/app/src/main/java/foundation/e/apps/data/application/DownloadInfoApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/downloadInfo/DownloadInfoApiImpl.kt @@ -1,4 +1,23 @@ -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.downloadInfo import foundation.e.apps.data.cleanapk.CleanApkDownloadInfoFetcher import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository @@ -81,4 +100,4 @@ class DownloadInfoApiImpl @Inject constructor( override suspend fun getOSSDownloadInfo(id: String, version: String?) = (cleanApkAppsRepository as CleanApkDownloadInfoFetcher).getDownloadInfo(id, version) -} \ No newline at end of file +} 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 7e677be45..27508ed84 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 89% 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 f037f7b33..4074f77ad 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 @@ -1,22 +1,23 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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. + * 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 . * - * 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 +package foundation.e.apps.data.application.home import android.content.Context import androidx.lifecycle.LiveData @@ -26,7 +27,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 diff --git a/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt similarity index 60% rename from app/src/main/java/foundation/e/apps/data/application/SearchApi.kt rename to app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt index b28b0b83d..4fb372807 100644 --- a/app/src/main/java/foundation/e/apps/data/application/SearchApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt @@ -1,4 +1,23 @@ -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 com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.AuthData diff --git a/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt similarity index 87% rename from app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt rename to app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt index c8766b633..87d533639 100644 --- a/app/src/main/java/foundation/e/apps/data/application/SearchApiImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApiImpl.kt @@ -1,22 +1,23 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION + * 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 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. + * 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 . * - * 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 +package foundation.e.apps.data.application.search import android.content.Context import com.aurora.gplayapi.SearchSuggestEntry @@ -25,9 +26,11 @@ 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.SearchApi.Companion.APP_TYPE_ANY -import foundation.e.apps.data.application.SearchApi.Companion.APP_TYPE_OPEN -import foundation.e.apps.data.application.SearchApi.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 @@ -257,14 +260,10 @@ class SearchApiImpl @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 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 a55a15f95..5b0b9df12 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.SearchApi.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 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 cf9eb4604..1863fcadc 100644 --- a/app/src/main/java/foundation/e/apps/di/DataModule.kt +++ b/app/src/main/java/foundation/e/apps/di/DataModule.kt @@ -22,16 +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.DownloadInfoApi -import foundation.e.apps.data.application.DownloadInfoApiImpl -import foundation.e.apps.data.application.HomeApi -import foundation.e.apps.data.application.HomeApiImpl -import foundation.e.apps.data.application.SearchApi -import foundation.e.apps.data.application.SearchApiImpl +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 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 9447ff569..204767a8f 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.SearchApi -import foundation.e.apps.data.application.SearchApiImpl import foundation.e.apps.data.fusedDownload.FusedManagerImpl import foundation.e.apps.data.fusedDownload.IFusedManager import javax.inject.Singleton 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 293a0d0ab..839aa2d9e 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.SearchApi +import foundation.e.apps.data.application.search.SearchApi import foundation.e.apps.data.fusedDownload.models.FusedDownload import kotlinx.coroutines.DelicateCoroutinesApi import timber.log.Timber 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 23186b5b7..c46fa4847 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 da86b1e74..0bf50502f 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.SearchApi +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 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 898fc8093..533a55a9a 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 @@ -44,7 +44,6 @@ 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 import org.junit.Test import org.mockito.Mock @@ -114,6 +113,7 @@ class AppsApiTest { fun after() { formatterMocked.close() } + @Test fun `is any app updated when new list is empty`() { val oldAppList = mutableListOf( 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 179afb6d4..57c9d1428 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/SearchApiImplTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt index 49761d0cd..ce265ed98 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt @@ -28,10 +28,10 @@ import foundation.e.apps.data.cleanapk.data.search.Search import foundation.e.apps.data.cleanapk.repositories.CleanApkRepository import foundation.e.apps.data.enums.Origin import foundation.e.apps.data.enums.Status -import foundation.e.apps.data.application.SearchApiImpl +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.playstore.PlayStoreRepository import foundation.e.apps.install.pkg.PWAManagerModule diff --git a/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt index 7651382e7..37cbfbf46 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiRepositoryTest.kt @@ -18,11 +18,11 @@ package foundation.e.apps.fused import foundation.e.apps.data.application.ApplicationRepository -import foundation.e.apps.data.application.AppsApi -import foundation.e.apps.data.application.CategoryApi -import foundation.e.apps.data.application.DownloadInfoApi -import foundation.e.apps.data.application.HomeApi -import foundation.e.apps.data.application.SearchApi +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 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 b32e0f941..2ed361abd 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 -- GitLab From 75bd1d0bddd27263d6d440fb60f9f162b2c858e0 Mon Sep 17 00:00:00 2001 From: Hasib Prince Date: Tue, 12 Dec 2023 23:11:42 +0600 Subject: [PATCH 5/5] updated detekt baseline and copyrights --- app/detekt-baseline.xml | 9 ------- .../apps/data/application/apps/AppsApiImpl.kt | 25 +++++++++---------- .../application/category/CategoryApiImpl.kt | 25 +++++++++---------- .../downloadInfo/DownloadInfoApi.kt | 25 +++++++++---------- .../downloadInfo/DownloadInfoApiImpl.kt | 25 +++++++++---------- .../apps/data/application/home/HomeApiImpl.kt | 25 +++++++++---------- .../apps/data/application/search/SearchApi.kt | 25 +++++++++---------- .../data/application/search/SearchApiImpl.kt | 25 +++++++++---------- 8 files changed, 84 insertions(+), 100 deletions(-) diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml index 21ad79f51..b01b024b6 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/apps/AppsApiImpl.kt b/app/src/main/java/foundation/e/apps/data/application/apps/AppsApiImpl.kt index fd15e42f5..e1f00df2f 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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.apps 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 a09a01483..b70520495 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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.category 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 index 58d95793a..3384ea816 100644 --- 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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 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 a026e3a4f..06126cc30 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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 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 4074f77ad..946ac4dfc 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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.home diff --git a/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt index 4fb372807..f539f613c 100644 --- a/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt +++ b/app/src/main/java/foundation/e/apps/data/application/search/SearchApi.kt @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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 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 87d533639..a012c82ce 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 @@ -1,20 +1,19 @@ /* - * Copyright MURENA SAS 2023 - * Apps Quickly and easily install Android apps onto your device! + * 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 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 . + * 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 -- GitLab