diff --git a/app/build.gradle b/app/build.gradle index 4060a9d6231e94dae4aef0c41312f0127f33bdc8..c667be75a41921601d33166c8a4e311156c63ba5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ plugins { } def versionMajor = 2 -def versionMinor = 11 +def versionMinor = 12 def versionPatch = 0 def getGitHash = { -> diff --git a/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt b/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt index d142e03e36d5cd6e17d26246d1772221d86a496d..42541a53b975daf7963be64f5e4cba96eec9c9b0 100644 --- a/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt +++ b/app/src/main/java/foundation/e/apps/data/application/ApplicationDataManager.kt @@ -111,13 +111,9 @@ class ApplicationDataManager @Inject constructor( return if (application.is_pwa) { pwaManager.getPwaStatus(application) } else { - val versionName = if (application.isSystemApp) { - application.latest_version_number - } else "" appLoungePackageManager.getPackageStatus( application.package_name, application.latest_version_code, - versionName, ) } } diff --git a/app/src/main/java/foundation/e/apps/data/gitlab/SystemAppsUpdatesRepository.kt b/app/src/main/java/foundation/e/apps/data/gitlab/SystemAppsUpdatesRepository.kt index 86e0995c2557622f20612eb526fd27c743f1f76b..bdce73bf50d072cf2d49018b1ac10ffe2c8fbf22 100644 --- a/app/src/main/java/foundation/e/apps/data/gitlab/SystemAppsUpdatesRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/gitlab/SystemAppsUpdatesRepository.kt @@ -22,6 +22,7 @@ import android.os.Build 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.enums.Status import foundation.e.apps.data.gitlab.UpdatableSystemAppsApi.* import foundation.e.apps.data.gitlab.models.OsReleaseType import foundation.e.apps.data.gitlab.models.SystemAppInfo @@ -189,10 +190,17 @@ class SystemAppsUpdatesRepository @Inject constructor( return SystemInfoProvider.getSystemProperty(SystemInfoProvider.KEY_LINEAGE_DEVICE) ?: "" } + /** + * Available release types are: + * - community + * - official + * - partner + * - test + * - unofficial/UNOFFICIAL + */ private fun getSystemReleaseType(): OsReleaseType { - return SystemInfoProvider.getSystemProperty(SystemInfoProvider.KEY_LINEAGE_RELEASE_TYPE).let { - OsReleaseType.get(it) - } + return OsReleaseType.get(SystemInfoProvider.getSystemProperty( + SystemInfoProvider.KEY_LINEAGE_RELEASE_TYPE) ?: OsReleaseType.TEST.name) } /** @@ -235,15 +243,20 @@ class SystemAppsUpdatesRepository @Inject constructor( ) } - result.data?.run { + if (!result.isSuccess()) { + Timber.e("Failed to get system app info for $it - ${result.message}") + return@forEach + } + + val app: Application = result.data ?: return@forEach + val appStatus = appLoungePackageManager.getPackageStatus(it, app.latest_version_code) + if (appStatus != Status.UPDATABLE) return@forEach + + app.run { applicationDataManager.updateStatus(this) updateList.add(this) updateSource(context) } - - if (!result.isSuccess()) { - Timber.e("Failed to get system app info for $it - ${result.message}") - } } return updateList diff --git a/app/src/main/java/foundation/e/apps/data/gitlab/models/ReleaseInfo.kt b/app/src/main/java/foundation/e/apps/data/gitlab/models/ReleaseInfo.kt index cb51761d0aa0e9904214ceaa9c074974beda593f..3e280aa81d34674110c3f695510878ff2791b7cf 100644 --- a/app/src/main/java/foundation/e/apps/data/gitlab/models/ReleaseInfo.kt +++ b/app/src/main/java/foundation/e/apps/data/gitlab/models/ReleaseInfo.kt @@ -41,19 +41,15 @@ data class ReleaseLinks( ) enum class OsReleaseType { - TEST, - COMMUNITY, - STABLE, - UNKNOWN, - ; - - override fun toString(): String { - return this.name.lowercase() - } + COMMUNITY, OFFICIAL, TEST; companion object { - fun get(value: String?): OsReleaseType { - return OsReleaseType.values().find { it.name == value?.trim()?.uppercase() } ?: UNKNOWN + fun get(value: String?) = when (value?.trim()?.lowercase()) { + "dev", "community" -> COMMUNITY + "official", "stable", "partner" -> OFFICIAL + else -> TEST } } -} \ No newline at end of file + + override fun toString() = name.lowercase() +} diff --git a/app/src/main/java/foundation/e/apps/install/pkg/AppLoungePackageManager.kt b/app/src/main/java/foundation/e/apps/install/pkg/AppLoungePackageManager.kt index b72f8a71977771f30ad36b770a45f9d32e8af482..43e97d19865fe702bd1a407aea39d13090cacf7e 100644 --- a/app/src/main/java/foundation/e/apps/install/pkg/AppLoungePackageManager.kt +++ b/app/src/main/java/foundation/e/apps/install/pkg/AppLoungePackageManager.kt @@ -71,16 +71,10 @@ class AppLoungePackageManager @Inject constructor( } } - private fun isUpdatable(packageName: String, versionCode: Int, versionName: String): Boolean { + private fun isUpdatable(packageName: String, versionCode: Int): Boolean { val packageInfo = getPackageInfo(packageName) ?: return false val installedVersionNumber = PackageInfoCompat.getLongVersionCode(packageInfo) - val installedVersionName = packageInfo.versionName - - val isVersionNumberHigher = versionCode.toLong() > installedVersionNumber - val isVersionNameHigher = - versionName.isNotBlank() && versionName > installedVersionName - - return isVersionNumberHigher || isVersionNameHigher + return versionCode.toLong() > installedVersionNumber } fun getLaunchIntent(packageName: String): Intent? { @@ -105,10 +99,9 @@ class AppLoungePackageManager @Inject constructor( fun getPackageStatus( packageName: String, versionCode: Int, - versionName: String = "", ): Status { return if (isInstalled(packageName)) { - if (isUpdatable(packageName, versionCode, versionName)) { + if (isUpdatable(packageName, versionCode)) { Status.UPDATABLE } else { Status.INSTALLED diff --git a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt index 099f1f8c431885c2b600eeb933548caf0e0810b3..e96a9b5ac75fe22b7bfb3597738dc2fd983cb95e 100644 --- a/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt +++ b/app/src/main/java/foundation/e/apps/install/workmanager/AppInstallProcessor.kt @@ -30,6 +30,7 @@ import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.UpdatesDao import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.enums.Origin +import foundation.e.apps.data.enums.User import foundation.e.apps.data.install.models.AppInstall import foundation.e.apps.data.login.AuthObject import foundation.e.apps.data.playstore.utils.GplayHttpRequestException @@ -103,7 +104,7 @@ class AppInstallProcessor @Inject constructor( appInstall.downloadURLList = mutableListOf(application.url) } - enqueueFusedDownload(appInstall, isAnUpdate) + enqueueFusedDownload(appInstall, isAnUpdate, application.isSystemApp) } /** @@ -115,14 +116,16 @@ class AppInstallProcessor @Inject constructor( */ suspend fun enqueueFusedDownload( appInstall: AppInstall, - isAnUpdate: Boolean = false + isAnUpdate: Boolean = false, + isSystemApp: Boolean = false ) { try { - val authData = appLoungeDataStore.getAuthData() - - if (!appInstall.isFree && authData.isAnonymous) { - EventBus.invokeEvent(AppEvent.ErrorMessageEvent(R.string.paid_app_anonymous_message)) - return + val user = appLoungeDataStore.getUserType() + if (!isSystemApp && (user == User.GOOGLE || user == User.ANONYMOUS)) { + val authData = appLoungeDataStore.getAuthData() + if (!appInstall.isFree && authData.isAnonymous) { + EventBus.invokeEvent(AppEvent.ErrorMessageEvent(R.string.paid_app_anonymous_message)) + } } if (appInstall.type != Type.PWA && !updateDownloadUrls(appInstall)) return 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 e76fa0a5a2607031989186db37f17e257c168c43..66206c2bd8f182eea1f1f155f00ce2eca4e04e99 100644 --- a/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt +++ b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt @@ -226,7 +226,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demoone"), eq(123), - eq(""), ) ) .thenReturn( @@ -236,7 +235,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demotwo"), eq(123), - eq(""), ) ) .thenReturn( @@ -246,7 +244,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demothree"), eq(123), - eq(""), ) ) .thenReturn( @@ -287,7 +284,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demoone"), eq(123), - eq(""), ) ) .thenReturn( @@ -297,7 +293,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demotwo"), eq(123), - eq(""), ) ) .thenReturn( @@ -307,7 +302,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demothree"), eq(123), - eq(""), ) ) .thenReturn( @@ -348,7 +342,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demoone"), eq(123), - eq(""), ) ) .thenReturn( @@ -358,7 +351,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demotwo"), eq(123), - eq(""), ) ) .thenReturn( @@ -368,7 +360,6 @@ class AppsApiTest { appLoungePackageManager.getPackageStatus( eq("foundation.e.demothree"), eq(123), - eq(""), ) ) .thenReturn( 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 241d87a56215eb6076c14f3aba546c5bd645aaee..320a96c21b31701a22f7635f72a2d85aaa47f66b 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchApiImplTest.kt @@ -201,7 +201,7 @@ class SearchApiImplTest { willThrowException: Boolean = false ) { Mockito.`when`(pwaManager.getPwaStatus(any())).thenReturn(Status.UNAVAILABLE) - Mockito.`when`(appLoungePackageManager.getPackageStatus(any(), any(), any())) + Mockito.`when`(appLoungePackageManager.getPackageStatus(any(), any())) .thenReturn(Status.UNAVAILABLE) Mockito.`when`( cleanApkAppsRepository.getSearchResult( diff --git a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt index ab9348c9713c72b360e316edad42050b292c02ce..c284213ebf6474b3cf3244ce76298abed94926e2 100644 --- a/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt +++ b/app/src/test/java/foundation/e/apps/home/HomeApiTest.kt @@ -133,7 +133,7 @@ class HomeApiTest { any() ) ).thenReturn(listOf()) - Mockito.`when`(appLoungePackageManager.getPackageStatus(any(), any(), any())) + Mockito.`when`(appLoungePackageManager.getPackageStatus(any(), any())) .thenReturn(Status.UNAVAILABLE) var hasLimitedDataFound = false diff --git a/app/src/test/java/foundation/e/apps/install/pkg/AppLoungePackageManagerTest.kt b/app/src/test/java/foundation/e/apps/install/pkg/AppLoungePackageManagerTest.kt index f87f2adeb61eea3ba6486677f667d573aa2e8b24..023009b368c9d98f2532c17d6880c15f935db4c0 100644 --- a/app/src/test/java/foundation/e/apps/install/pkg/AppLoungePackageManagerTest.kt +++ b/app/src/test/java/foundation/e/apps/install/pkg/AppLoungePackageManagerTest.kt @@ -54,12 +54,10 @@ class AppLoungePackageManagerTest { private fun mockPackagePresence( expectedPackageName: String, expectedVersionCode: Int, - expectedVersionName: String, optionalFlag: Int = 0, ) { val expectedPackageInfo = mock(PackageInfo::class.java).apply { packageName = expectedPackageName - versionName = expectedVersionName versionCode = expectedVersionCode } Mockito.`when`( @@ -68,7 +66,7 @@ class AppLoungePackageManagerTest { } private fun mockPackagePresence() { - mockPackagePresence(testPackageName, 0, "") + mockPackagePresence(testPackageName, 0) } private fun mockPackageAbsence() { @@ -91,12 +89,10 @@ class AppLoungePackageManagerTest { @Test fun givenPackageInfoIsPresent_thenReturnProperVersionCode() { val installedVersionCode = 40903000 - val installedVersionName = "4.9.3" mockPackagePresence( expectedPackageName = testPackageName, expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, ) assertEquals( @@ -110,152 +106,12 @@ class AppLoungePackageManagerTest { mockPackageAbsence() val newVersionCode = 40903000 - val newVersionName = "4.9.3+20240725" assertEquals( Status.UNAVAILABLE, appLoungePackageManager.getPackageStatus( packageName = testPackageName, versionCode = newVersionCode, - versionName = newVersionName, ) ) } - - @Test - fun givenNewVersionCode_andSameVersionName_whenCheckIsUpdatable_thenReturnStatusUPDATABLE() { - val installedVersionCode = 40903000 - val installedVersionName = "4.9.3" - - mockPackagePresence( - expectedPackageName = testPackageName, - expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, - ) - - val newVersionCode = 40903001 - val newVersionName = "4.9.3" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - } - - @Test - fun givenNewVersionCode_andNewVersionNameBlank_whenCheckIsUpdatable_thenReturnStatusUPDATABLE() { - val installedVersionCode = 40903000 - val installedVersionName = "4.9.3" - - mockPackagePresence( - expectedPackageName = testPackageName, - expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, - ) - - val newVersionCode = 40903001 - val newVersionName = "" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - } - - @Test - fun givenNewVersionName_andSameVersionCode_whenCheckIsUpdatable_thenReturnStatusUPDATABLE() { - val installedVersionCode = 40903000 - val installedVersionName = "4.9.3" - - mockPackagePresence( - expectedPackageName = testPackageName, - expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, - ) - - val newVersionCode = 40903000 - val newVersionName = "4.9.3+20240725" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - } - - @Test - fun givenSameVersionCode_andSameVersionName_whenCheckIsUpdatable_thenReturnStatusINSTALLED() { - val installedVersionCode = 40903000 - val installedVersionName = "4.9.3+20240725" - - mockPackagePresence( - expectedPackageName = testPackageName, - expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, - ) - - val newVersionCode = 40903000 - val newVersionName = "4.9.3+20240725" - - assertEquals( - Status.INSTALLED, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - } - - @Test - fun givenNewVersionName_whenCheckIsUpdatable_thenReturnStatusUPDATABLE() { - val installedVersionCode = 40903000 - val installedVersionName = "4.9.3+20240725" - - mockPackagePresence( - expectedPackageName = testPackageName, - expectedVersionCode = installedVersionCode, - expectedVersionName = installedVersionName, - ) - - var newVersionCode = 40903000 - var newVersionName = "4.9.3+20240726" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - - newVersionCode = 40903000 - newVersionName = "4.9.3+20240825" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - - newVersionCode = 40903000 - newVersionName = "4.9.3+20250725" - - assertEquals( - Status.UPDATABLE, appLoungePackageManager.getPackageStatus( - packageName = testPackageName, - versionCode = newVersionCode, - versionName = newVersionName, - ) - ) - } - }