From 258ed1e8e9822928c0ea052b81f743fb9b0b4f45 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 23 Dec 2024 11:31:08 +0530 Subject: [PATCH 1/5] apps: Add package status check before updating system apps --- .../data/gitlab/SystemAppsUpdatesRepository.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 86e0995c2..ca5a36f07 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 @@ -235,15 +236,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 -- GitLab From 36a6e4e39086a0a26b7302c4f2878fc1f673be9c Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 23 Dec 2024 22:16:47 +0530 Subject: [PATCH 2/5] apps: Only check version code --- .../application/ApplicationDataManager.kt | 4 - .../install/pkg/AppLoungePackageManager.kt | 13 +- .../foundation/e/apps/apps/AppsApiTest.kt | 9 -- .../e/apps/fused/SearchApiImplTest.kt | 2 +- .../foundation/e/apps/home/HomeApiTest.kt | 2 +- .../pkg/AppLoungePackageManagerTest.kt | 146 +----------------- 6 files changed, 6 insertions(+), 170 deletions(-) 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 d142e03e3..42541a53b 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/install/pkg/AppLoungePackageManager.kt b/app/src/main/java/foundation/e/apps/install/pkg/AppLoungePackageManager.kt index b72f8a719..43e97d198 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/test/java/foundation/e/apps/apps/AppsApiTest.kt b/app/src/test/java/foundation/e/apps/apps/AppsApiTest.kt index e76fa0a5a..66206c2bd 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 241d87a56..320a96c21 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 ab9348c97..c284213eb 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 f87f2adeb..023009b36 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, - ) - ) - } - } -- GitLab From 96d36287ffa5e9442b7c7bc72c8652ca212671b8 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 23 Dec 2024 22:21:52 +0530 Subject: [PATCH 3/5] apps: Fix unknown releaseType in official build --- .../gitlab/SystemAppsUpdatesRepository.kt | 13 +++++++++--- .../e/apps/data/gitlab/models/ReleaseInfo.kt | 20 ++++++++----------- 2 files changed, 18 insertions(+), 15 deletions(-) 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 ca5a36f07..bdce73bf5 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 @@ -190,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) } /** 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 cb51761d0..3e280aa81 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() +} -- GitLab From 75198dd301d9cad54c3b47af0ba56496cb3dc956 Mon Sep 17 00:00:00 2001 From: althafvly Date: Mon, 23 Dec 2024 21:59:10 +0530 Subject: [PATCH 4/5] apps: Bump app version to 2.12.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 4060a9d62..c667be75a 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 = { -> -- GitLab From 51b6217587c338b9259b81b9ae6072938c5b1491 Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 24 Dec 2024 13:27:01 +0530 Subject: [PATCH 5/5] apps: Allow to installing system apps without authdata --- .../install/workmanager/AppInstallProcessor.kt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) 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 099f1f8c4..e96a9b5ac 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 -- GitLab