From dbf8df1230b5e311371a41829edc2b23e1434f18 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 9 Sep 2025 11:10:07 +0530 Subject: [PATCH 1/8] refactor: denest and make it compatible with upstream PlayResponse is data class with immutable variable, our fork make it mutable which is not good and un-necessary anyway. --- .../data/playstore/utils/GPlayHttpClient.kt | 64 ++++++++++--------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/playstore/utils/GPlayHttpClient.kt b/app/src/main/java/foundation/e/apps/data/playstore/utils/GPlayHttpClient.kt index d3570cdc3..235e9ab52 100644 --- a/app/src/main/java/foundation/e/apps/data/playstore/utils/GPlayHttpClient.kt +++ b/app/src/main/java/foundation/e/apps/data/playstore/utils/GPlayHttpClient.kt @@ -196,45 +196,47 @@ class GPlayHttpClient @Inject constructor( } private fun buildPlayResponse(response: Response): PlayResponse { - return PlayResponse().apply { - isSuccessful = response.isSuccessful - code = response.code - val url = response.request.url - - when (code) { - STATUS_CODE_UNAUTHORIZED -> MainScope().launch { - EventBus.invokeEvent( - AppEvent.InvalidAuthEvent(AuthObject.GPlayAuth::class.java.simpleName) - ) - } - - STATUS_CODE_TOO_MANY_REQUESTS -> MainScope().launch { - if (url.toString().contains(SEARCH_SUGGEST)) { - return@launch - } + val url = response.request.url + val code = response.code + val isSuccessful = response.isSuccessful + val errorMessage = if (!isSuccessful) response.message else null + val responseBytes = response.body?.bytes() ?: byteArrayOf() + + when (code) { + STATUS_CODE_UNAUTHORIZED -> MainScope().launch { + EventBus.invokeEvent( + AppEvent.InvalidAuthEvent(AuthObject.GPlayAuth::class.java.simpleName) + ) + } - EventBus.invokeEvent( - AppEvent.TooManyRequests() - ) + STATUS_CODE_TOO_MANY_REQUESTS -> MainScope().launch { + if (url.toString().contains(SEARCH_SUGGEST)) { + return@launch } - } - if (!url.toString().contains(URL_SUBSTRING_PURCHASE) && code !in listOf( - STATUS_CODE_OK, - STATUS_CODE_UNAUTHORIZED + EventBus.invokeEvent( + AppEvent.TooManyRequests() ) - ) { - throw GplayHttpRequestException(code, response.message) } + } - if (response.body != null) { - responseBytes = response.body!!.bytes() - } + if (!url.toString().contains(URL_SUBSTRING_PURCHASE) && code !in listOf( + STATUS_CODE_OK, + STATUS_CODE_UNAUTHORIZED + ) + ) { + throw GplayHttpRequestException(code, response.message) + } - if (!isSuccessful) { - errorString = response.message - } + fun PlayResponse.withErrorString(error: String?): PlayResponse { + return if (error == null) return this else copy(errorString = error) + } + return PlayResponse( + isSuccessful = isSuccessful, + code = code, + responseBytes = responseBytes, + ).withErrorString(errorMessage).apply { _responseCode.value = response.code } } -- GitLab From 0fa46de5d29b6b1df56c64701240fa801e1d0152 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 9 Sep 2025 13:01:58 +0530 Subject: [PATCH 2/8] build: adapt changes from `3.5.0` File was renamed to PlayFile in 3.5.0 [see](https://gitlab.com/AuroraOSS/gplayapi/-/commit/d4cbfb7fed1a4bf7d78ffb01e9a7d064a95c3bdc) --- .../e/apps/data/database/install/AppInstallConverter.kt | 6 +++--- .../java/foundation/e/apps/data/install/AppManagerImpl.kt | 4 ++-- .../foundation/e/apps/data/install/models/AppInstall.kt | 4 ++-- .../e/apps/data/playstore/PlayStoreRepository.kt | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/database/install/AppInstallConverter.kt b/app/src/main/java/foundation/e/apps/data/database/install/AppInstallConverter.kt index ab0ec0f29..70b0f890e 100644 --- a/app/src/main/java/foundation/e/apps/data/database/install/AppInstallConverter.kt +++ b/app/src/main/java/foundation/e/apps/data/database/install/AppInstallConverter.kt @@ -2,7 +2,7 @@ package foundation.e.apps.data.database.install import androidx.room.TypeConverter import com.aurora.gplayapi.data.models.ContentRating -import com.aurora.gplayapi.data.models.File +import com.aurora.gplayapi.data.models.PlayFile import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -25,11 +25,11 @@ class AppInstallConverter { gson.fromJson(value, object : TypeToken>() {}.type) @TypeConverter - fun filesToJsonString(value: List): String = gson.toJson(value) + fun filesToJsonString(value: List): String = gson.toJson(value) @TypeConverter fun jsonStringToFiles(value: String) = - gson.fromJson(value, Array::class.java).toMutableList() + gson.fromJson(value, Array::class.java).toMutableList() @TypeConverter fun fromContentRating(contentRating: ContentRating): String { diff --git a/app/src/main/java/foundation/e/apps/data/install/AppManagerImpl.kt b/app/src/main/java/foundation/e/apps/data/install/AppManagerImpl.kt index 183a65d08..3f05ff0bb 100644 --- a/app/src/main/java/foundation/e/apps/data/install/AppManagerImpl.kt +++ b/app/src/main/java/foundation/e/apps/data/install/AppManagerImpl.kt @@ -45,7 +45,7 @@ import java.io.File import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton -import com.aurora.gplayapi.data.models.File as AuroraFile +import com.aurora.gplayapi.data.models.PlayFile as AuroraFile @Singleton class AppManagerImpl @Inject constructor( @@ -240,7 +240,7 @@ class AppManagerImpl @Inject constructor( count: Int ): File { val downloadingFile = appInstall.files[appInstall.downloadURLList.indexOf(it)] - return if (downloadingFile.type == AuroraFile.FileType.BASE || downloadingFile.type == AuroraFile.FileType.SPLIT) { + return if (downloadingFile.type == AuroraFile.Type.BASE || downloadingFile.type == AuroraFile.Type.SPLIT) { File(parentPath, "${appInstall.packageName}_$count.apk") } else { createObbFileForDownload(appInstall, it) diff --git a/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt b/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt index af28c92a8..9c3489efe 100644 --- a/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt +++ b/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt @@ -4,7 +4,7 @@ import androidx.room.Entity import androidx.room.Ignore import androidx.room.PrimaryKey import com.aurora.gplayapi.data.models.ContentRating -import com.aurora.gplayapi.data.models.File +import com.aurora.gplayapi.data.models.PlayFile import foundation.e.apps.data.cleanapk.CleanApkRetrofit import foundation.e.apps.data.enums.Source import foundation.e.apps.data.enums.Status @@ -26,7 +26,7 @@ data class AppInstall( val offerType: Int = -1, val isFree: Boolean = true, var appSize: Long = 0, - var files: List = mutableListOf(), + var files: List = mutableListOf(), var signature: String = String(), var contentRating: ContentRating = ContentRating() ) { diff --git a/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt b/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt index 6e9e64058..13f78e355 100644 --- a/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt @@ -21,7 +21,7 @@ package foundation.e.apps.data.playstore import android.content.Context import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.ContentRating -import com.aurora.gplayapi.data.models.File +import com.aurora.gplayapi.data.models.PlayFile import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.helpers.AppDetailsHelper import com.aurora.gplayapi.helpers.ContentRatingHelper @@ -235,7 +235,7 @@ class PlayStoreRepository @Inject constructor( idOrPackageName: String, versionCode: Int, offerType: Int - ): List = withContext(Dispatchers.IO) { + ): List = withContext(Dispatchers.IO) { var version = versionCode var offer = offerType @@ -262,8 +262,8 @@ class PlayStoreRepository @Inject constructor( moduleName: String, versionCode: Int, offerType: Int - ): List { - val downloadData = mutableListOf() + ): List { + val downloadData = mutableListOf() val authData = authenticatorRepository.getGPlayAuthOrThrow() withContext(Dispatchers.IO) { -- GitLab From 193b5d5d8f988e7fe6796178bb6014a6061d9589 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Tue, 9 Sep 2025 14:48:47 +0530 Subject: [PATCH 3/8] build: upstream have changed version code from int to long both android/AOSP and gplayapi. [gplayapi](https://gitlab.com/AuroraOSS/gplayapi/-/commit/0258b4e), [PurchaseHelper](https://gitlab.com/AuroraOSS/gplayapi/-/commit/34132e9) and [Android/AOSP](https://developer.android.com/reference/android/content/pm/PackageInfo#versionCode) --- .../e/apps/data/application/ApplicationRepository.kt | 2 +- .../e/apps/data/application/data/Application.kt | 2 +- .../data/application/downloadInfo/DownloadInfoApi.kt | 2 +- .../application/downloadInfo/DownloadInfoApiImpl.kt | 2 +- .../data/application/utils/GplayApiExtensions.kt | 2 +- .../e/apps/data/cleanapk/ApplicationDeserializer.kt | 2 +- .../e/apps/data/gitlab/models/SystemAppInfo.kt | 2 +- .../e/apps/data/install/models/AppInstall.kt | 2 +- .../e/apps/data/playstore/PlayStoreRepository.kt | 12 ++++++------ .../e/apps/install/pkg/AppLoungePackageManager.kt | 6 +++--- .../apps/install/pkg/AppLoungePackageManagerTest.kt | 2 +- 11 files changed, 18 insertions(+), 18 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 ba8966be7..39988d87b 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 @@ -101,7 +101,7 @@ class ApplicationRepository @Inject constructor( suspend fun getOnDemandModule( packageName: String, moduleName: String, - versionCode: Int, + versionCode: Long, offerType: Int ): String? { return downloadInfoApi.getOnDemandModule(packageName, moduleName, versionCode, offerType) 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 b33249020..0ac131503 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 @@ -38,7 +38,7 @@ data class Application( var reportId: Long = -1L, val icon_image_path: String = String(), val last_modified: String = String(), - var latest_version_code: Int = -1, + var latest_version_code: Long = -1, val latest_version_number: String = String(), val latest_downloaded_version: String = String(), val licence: String = String(), 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 fe8bb50b2..b29dbb5f4 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 @@ -28,7 +28,7 @@ interface DownloadInfoApi { suspend fun getOnDemandModule( packageName: String, moduleName: String, - versionCode: Int, + versionCode: Long, offerType: Int ): String? 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 8e6ca6d84..1c36aac86 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 @@ -32,7 +32,7 @@ class DownloadInfoApiImpl @Inject constructor( override suspend fun getOnDemandModule( packageName: String, moduleName: String, - versionCode: Int, + versionCode: Long, offerType: Int ): String? { val result = handleNetworkResult { diff --git a/app/src/main/java/foundation/e/apps/data/application/utils/GplayApiExtensions.kt b/app/src/main/java/foundation/e/apps/data/application/utils/GplayApiExtensions.kt index 0ddc34c77..3263a4ffe 100644 --- a/app/src/main/java/foundation/e/apps/data/application/utils/GplayApiExtensions.kt +++ b/app/src/main/java/foundation/e/apps/data/application/utils/GplayApiExtensions.kt @@ -38,7 +38,7 @@ fun App.toApplication(context: Context): Application { latest_version_code = this.versionCode, latest_version_number = this.versionName, name = this.displayName, - other_images_path = this.screenshots.toList(), + other_images_path = this.screenshots.toList().map { it.url }, package_name = this.packageName, ratings = Ratings( usageQualityScore = diff --git a/app/src/main/java/foundation/e/apps/data/cleanapk/ApplicationDeserializer.kt b/app/src/main/java/foundation/e/apps/data/cleanapk/ApplicationDeserializer.kt index 9c0f2928c..bfeb26698 100644 --- a/app/src/main/java/foundation/e/apps/data/cleanapk/ApplicationDeserializer.kt +++ b/app/src/main/java/foundation/e/apps/data/cleanapk/ApplicationDeserializer.kt @@ -38,7 +38,7 @@ class ApplicationDeserializer : JsonDeserializer { val lastUpdatedOn = lastUpdateJson ?.asJsonObject?.get("update_on")?.asString ?: "" cleanApkApplication.app.updatedOn = lastUpdatedOn - cleanApkApplication.app.latest_version_code = lastUpdateJson?.get("version_code")?.asInt ?: -1 + cleanApkApplication.app.latest_version_code = lastUpdateJson?.get("version_code")?.asLong ?: -1 val appSizeInBinary = (json?.asJsonObject?.get("app")?.asJsonObject?.get(lastUpdate)?.asJsonObject?.get("apk_file_size")?.asString ?: "") diff --git a/app/src/main/java/foundation/e/apps/data/gitlab/models/SystemAppInfo.kt b/app/src/main/java/foundation/e/apps/data/gitlab/models/SystemAppInfo.kt index a80aad312..2008c8bd3 100644 --- a/app/src/main/java/foundation/e/apps/data/gitlab/models/SystemAppInfo.kt +++ b/app/src/main/java/foundation/e/apps/data/gitlab/models/SystemAppInfo.kt @@ -29,7 +29,7 @@ import java.util.UUID data class SystemAppInfo( val name: String, @Json(name = "package_name") val packageName: String, - @Json(name = "version_code") val versionCode: Int, + @Json(name = "version_code") val versionCode: Long, @Json(name = "min_sdk") val minSdk: Int, @Json(name = "version_name") val versionName: String, @Json(name = "url") val downloadUrl: String, diff --git a/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt b/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt index 9c3489efe..a8b48a9ec 100644 --- a/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt +++ b/app/src/main/java/foundation/e/apps/data/install/models/AppInstall.kt @@ -22,7 +22,7 @@ data class AppInstall( val orgStatus: Status = Status.UNAVAILABLE, val type: Type = Type.NATIVE, val iconImageUrl: String = String(), - val versionCode: Int = 1, + val versionCode: Long = 1, val offerType: Int = -1, val isFree: Boolean = true, var appSize: Long = 0, diff --git a/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt b/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt index 13f78e355..132eef9d6 100644 --- a/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/playstore/PlayStoreRepository.kt @@ -159,7 +159,7 @@ class PlayStoreRepository @Inject constructor( var appDetails: GplayApp appDetails = getAppDetailsHelper().getAppByPackageName(packageName) - if (!isEmulator() && appDetails.versionCode == 0 + if (!isEmulator() && appDetails.versionCode == 0L && authenticatorRepository.getGPlayAuthOrThrow().isAnonymous) { // Google Play returns limited result ( i.e. version code being 0) with a stale token, // so we need to refresh authentication to get a new token. @@ -169,7 +169,7 @@ class PlayStoreRepository @Inject constructor( appDetails = getAppDetailsHelper().getAppByPackageName(packageName) - if (appDetails.versionCode == 0) { + if (appDetails.versionCode == 0L) { Timber.w("After refreshing auth, version code is still 0. Giving up installation.") throw IllegalStateException("App version code cannot be 0") } @@ -233,19 +233,19 @@ class PlayStoreRepository @Inject constructor( suspend fun getDownloadInfo( idOrPackageName: String, - versionCode: Int, + versionCode: Long, offerType: Int ): List = withContext(Dispatchers.IO) { var version = versionCode var offer = offerType - if (version == 0) { + if (version == 0L) { val appDetailsHelper = getAppDetails(idOrPackageName) version = appDetailsHelper.latest_version_code offer = appDetailsHelper.offer_type } - if (version == 0) { + if (version == 0L) { throw IllegalStateException("Could not get download details for $idOrPackageName") } @@ -260,7 +260,7 @@ class PlayStoreRepository @Inject constructor( suspend fun getOnDemandModule( packageName: String, moduleName: String, - versionCode: Int, + versionCode: Long, offerType: Int ): List { val downloadData = mutableListOf() 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 f7b1ea3f5..d2a6b2563 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,10 +71,10 @@ class AppLoungePackageManager @Inject constructor( } } - private fun isUpdatable(packageName: String, versionCode: Int): Boolean { + private fun isUpdatable(packageName: String, versionCode: Long): Boolean { val packageInfo = getPackageInfo(packageName) ?: return false val installedVersionNumber = PackageInfoCompat.getLongVersionCode(packageInfo) - return versionCode.toLong() > installedVersionNumber + return versionCode > installedVersionNumber } fun getLaunchIntent(packageName: String): Intent? { @@ -96,7 +96,7 @@ class AppLoungePackageManager @Inject constructor( */ fun getPackageStatus( packageName: String, - versionCode: Int, + versionCode: Long, ): Status { return if (isInstalled(packageName)) { if (isUpdatable(packageName, versionCode)) { 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 023009b36..4e0bd6c5c 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 @@ -105,7 +105,7 @@ class AppLoungePackageManagerTest { fun givenPackageInfoIsAbsent_whenCheckIsUpdatable_thenReturnStatusUNAVAILABLE() { mockPackageAbsence() - val newVersionCode = 40903000 + val newVersionCode = 40903000L assertEquals( Status.UNAVAILABLE, appLoungePackageManager.getPackageStatus( -- GitLab From 364176e71e929c043b39fddf8f6fe088882f880d Mon Sep 17 00:00:00 2001 From: dev-12 Date: Wed, 10 Sep 2025 16:23:35 +0530 Subject: [PATCH 4/8] bugfix: avoid (de)serializer of protobuf fields it is not supported by gson and will cause ` java.lang.IllegalArgumentException: field has type com.google.protobuf.*, got java.util.ArrayList `. it is not needed/intended anyway. --- .../foundation/e/apps/di/CommonUtilsModule.kt | 2 ++ .../e/apps/utils/ProtobufExclusionStrategy.kt | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt diff --git a/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt b/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt index 312ed0537..4524af7a6 100644 --- a/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt +++ b/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt @@ -34,6 +34,7 @@ import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import foundation.e.apps.BuildConfig +import foundation.e.apps.utils.ProtobufExclusionStrategy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -105,6 +106,7 @@ object CommonUtilsModule { fun provideGsonInstance(): Gson { return GsonBuilder() .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC) + .addDeserializationExclusionStrategy(ProtobufExclusionStrategy) .create() } diff --git a/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt b/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt new file mode 100644 index 000000000..f6465c37a --- /dev/null +++ b/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt @@ -0,0 +1,17 @@ +package foundation.e.apps.utils + +import com.google.gson.ExclusionStrategy +import com.google.gson.FieldAttributes + +object ProtobufExclusionStrategy : ExclusionStrategy { + + override fun shouldSkipField(field: FieldAttributes?): Boolean { + if (field == null) return false + val protobufClass = "com.google.protobuf" + + return field.declaredType.typeName.startsWith(protobufClass) || + field.declaringClass.typeName.startsWith(protobufClass) + } + + override fun shouldSkipClass(clazz: Class<*>?): Boolean = false +} -- GitLab From 2de1c4bdf9152af7ab7c78d1abe59e1bc7e970bc Mon Sep 17 00:00:00 2001 From: dev-12 Date: Wed, 17 Sep 2025 16:34:29 +0530 Subject: [PATCH 5/8] bump gplayapi lib --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d6390a2e4..e64952dc9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ hiltCompiler = "1.2.0" hiltWork = "1.2.0" lifecycleExtensions = "1.1.1" fragmentKtx = "1.8.5" -gplayapi = "3.4.5-0" +gplayapi = "3bfc73bc" gson = "2.11.0" jacksonDataformatYaml = "2.17.0" jsoup = "1.17.2" -- GitLab From a5a9adb39c0da700655af12cc9dac17b714ae3c3 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Wed, 17 Sep 2025 18:27:36 +0530 Subject: [PATCH 6/8] replace deprecated uses of `exec` --- app/build.gradle | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2f0568da0..0ede59d70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,13 +14,12 @@ def versionMajor = 2 def versionMinor = 13 def versionPatch = 11 -def getGitHash = { -> - def stdOut = new ByteArrayOutputStream() - exec { - commandLine 'git', 'log', '--pretty=format:%h', '-n', '1' - standardOutput = stdOut - } - return stdOut.toString().trim() +def getGitHashProvider = providers.exec { + commandLine 'git', 'log', '--pretty=format:%h', '-n', '1' +} + +def getGitHash = { + return getGitHashProvider.standardOutput.asText.get().trim() } def getDate = { -> -- GitLab From 5603bd12c50a835e0a85c04a6eeaf69d155d08fa Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Fri, 19 Sep 2025 10:37:42 +0530 Subject: [PATCH 7/8] test: fix broken test after lib upgrade --- .../foundation/e/apps/FakeAppLoungePreference.kt | 16 +++++----------- .../foundation/e/apps/UpdateManagerImptTest.kt | 13 ++++++++----- .../e/apps/fused/SearchRepositoryImplTest.kt | 6 +++++- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/test/java/foundation/e/apps/FakeAppLoungePreference.kt b/app/src/test/java/foundation/e/apps/FakeAppLoungePreference.kt index 240f9b744..7c7adda21 100644 --- a/app/src/test/java/foundation/e/apps/FakeAppLoungePreference.kt +++ b/app/src/test/java/foundation/e/apps/FakeAppLoungePreference.kt @@ -19,20 +19,14 @@ package foundation.e.apps import android.content.Context -import foundation.e.apps.data.enums.User import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.data.preference.AppLoungePreference -import io.mockk.every -import io.mockk.mockk -class FakeAppLoungePreference(private val context: Context) : AppLoungePreference(context, createMockDataStore()) { - companion object { - private fun createMockDataStore(): AppLoungeDataStore { - val mockDataStore = mockk(relaxed = true) - every { mockDataStore.getUserType() } returns User.ANONYMOUS - return mockDataStore - } - } +class FakeAppLoungePreference( + private val context: Context, + appLoungeDataStore: AppLoungeDataStore, +) : AppLoungePreference(context, appLoungeDataStore) { + var isPWASelectedFake = false var isOpenSourceelectedFake = false var isGplaySelectedFake = false diff --git a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt index 971bcdd41..003e516c7 100644 --- a/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt +++ b/app/src/test/java/foundation/e/apps/UpdateManagerImptTest.kt @@ -20,17 +20,17 @@ package foundation.e.apps import android.content.Context import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.aurora.gplayapi.data.models.AuthData +import foundation.e.apps.data.application.ApplicationRepository +import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.blockedApps.BlockedAppRepository import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.ResultStatus +import foundation.e.apps.data.enums.Source 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.search.SearchRepository -import foundation.e.apps.data.application.data.Application -import foundation.e.apps.data.enums.Source import foundation.e.apps.data.gitlab.SystemAppsUpdatesRepository +import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.data.updates.UpdatesManagerImpl import foundation.e.apps.util.MainCoroutineRule import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -82,13 +82,16 @@ class UpdateManagerImptTest { @Mock private lateinit var systemAppsUpdatesRepository: SystemAppsUpdatesRepository + @Mock + private lateinit var appLoungeDataStore: AppLoungeDataStore + val authData = AuthData("e@e.email", "AtadyMsIAtadyM") @Before fun setup() { MockitoAnnotations.openMocks(this) faultyAppRepository = FaultyAppRepository(FakeFaultyAppDao()) - preferenceModule = FakeAppLoungePreference(context) + preferenceModule = FakeAppLoungePreference(context, appLoungeDataStore) pkgManagerModule = FakeAppLoungePackageManager(context, getGplayApps()) updatesManagerImpl = UpdatesManagerImpl( context, diff --git a/app/src/test/java/foundation/e/apps/fused/SearchRepositoryImplTest.kt b/app/src/test/java/foundation/e/apps/fused/SearchRepositoryImplTest.kt index 978e9c737..d44f47bdb 100644 --- a/app/src/test/java/foundation/e/apps/fused/SearchRepositoryImplTest.kt +++ b/app/src/test/java/foundation/e/apps/fused/SearchRepositoryImplTest.kt @@ -37,6 +37,7 @@ import foundation.e.apps.data.cleanapk.repositories.CleanApkPwaRepository import foundation.e.apps.data.enums.Source import foundation.e.apps.data.enums.Status import foundation.e.apps.data.playstore.PlayStoreRepository +import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.install.pkg.AppLoungePackageManager import foundation.e.apps.install.pkg.PwaManager import foundation.e.apps.util.MainCoroutineRule @@ -95,6 +96,9 @@ class SearchRepositoryImplTest { @Mock private lateinit var visibilityFetcher: AppVisibilityResolver + @Mock + private lateinit var appLoungeDataStore: AppLoungeDataStore + private lateinit var appsApi: AppsApi private lateinit var applicationDataManager: ApplicationDataManager @@ -107,7 +111,7 @@ class SearchRepositoryImplTest { fun setup() { MockitoAnnotations.openMocks(this) formatterMocked = Mockito.mockStatic(Formatter::class.java) - preferenceManagerModule = FakeAppLoungePreference(context) + preferenceManagerModule = FakeAppLoungePreference(context, appLoungeDataStore) applicationDataManager = ApplicationDataManager(appLoungePackageManager, pwaManager, visibilityFetcher) val appSourcesContainer = -- GitLab From 85feed4e4b90cc1ac2fb1bea102c3ba95671e8e0 Mon Sep 17 00:00:00 2001 From: dev-12 Date: Sat, 20 Sep 2025 00:57:03 +0530 Subject: [PATCH 8/8] refactor: use long instead of int for package version. upstream packages and AOSP everyone is switching to long due the limits of int. --- .../data/playstore/utils/NativeGsfVersionProvider.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/playstore/utils/NativeGsfVersionProvider.kt b/app/src/main/java/foundation/e/apps/data/playstore/utils/NativeGsfVersionProvider.kt index f94e261c8..9207c0069 100644 --- a/app/src/main/java/foundation/e/apps/data/playstore/utils/NativeGsfVersionProvider.kt +++ b/app/src/main/java/foundation/e/apps/data/playstore/utils/NativeGsfVersionProvider.kt @@ -24,26 +24,26 @@ import android.content.pm.PackageManager import androidx.core.content.pm.PackageInfoCompat class NativeGsfVersionProvider(context: Context) { - private var gsfVersionCode = 0 + private var gsfVersionCode = 0L private val packageManager = context.packageManager init { try { val gsfPkgInfo = packageManager.getPackageInfo(GOOGLE_SERVICES_PACKAGE_ID, 0) - gsfVersionCode = PackageInfoCompat.getLongVersionCode(gsfPkgInfo).toInt() + gsfVersionCode = PackageInfoCompat.getLongVersionCode(gsfPkgInfo) } catch (e: PackageManager.NameNotFoundException) { // com.google.android.gms not found } } - fun getGsfVersionCode(defaultIfNotFound: Boolean): Int { + fun getGsfVersionCode(defaultIfNotFound: Boolean): Long { return if (defaultIfNotFound && gsfVersionCode < GOOGLE_SERVICES_VERSION_CODE) GOOGLE_SERVICES_VERSION_CODE else gsfVersionCode } - fun getVendingVersionCode(): Int { + fun getVendingVersionCode(): Long { return GOOGLE_VENDING_VERSION_CODE } @@ -53,8 +53,8 @@ class NativeGsfVersionProvider(context: Context) { companion object { private const val GOOGLE_SERVICES_PACKAGE_ID = "com.google.android.gms" - private const val GOOGLE_SERVICES_VERSION_CODE = 203019037 - private const val GOOGLE_VENDING_VERSION_CODE = 82151710 + private const val GOOGLE_SERVICES_VERSION_CODE = 203019037L + private const val GOOGLE_VENDING_VERSION_CODE = 82151710L private const val GOOGLE_VENDING_VERSION_STRING = "21.5.17-21 [0] [PR] 326734551" } } -- GitLab