From 55fedc7d1da8a1c25fc5f9c8925e607469a6d8e1 Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Tue, 7 Oct 2025 12:29:32 +0600 Subject: [PATCH 1/4] refactor: use kotlinx serialization for handling AuthData instead of Gson --- app/build.gradle | 2 ++ .../e/apps/data/blockedApps/AppWarningInfo.kt | 10 +++--- .../data/blockedApps/BlockedAppRepository.kt | 6 ++-- .../apps/data/login/PlayStoreAuthenticator.kt | 10 +++--- .../data/login/api/AnonymousLoginManager.kt | 14 ++++----- .../login/api/PlayStoreLoginManagerFactory.kt | 6 ++-- .../data/preference/AppLoungeDataStore.kt | 10 +++--- .../foundation/e/apps/di/CommonUtilsModule.kt | 31 +++++++++++-------- .../e/apps/receivers/DumpAuthData.kt | 8 ++--- .../e/apps/ui/settings/SettingsFragment.kt | 4 --- .../signin/LocaleChangedBroadcastReceiver.kt | 6 ++-- build.gradle | 1 + gradle/libs.versions.toml | 3 ++ 13 files changed, 59 insertions(+), 52 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0e953d9cf..1adf46283 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,7 @@ plugins { id 'kotlin-android' id 'com.google.devtools.ksp' alias libs.plugins.ktlint + alias libs.plugins.kotlin.serialization id 'androidx.navigation.safeargs.kotlin' id 'com.google.dagger.hilt.android' id 'kotlin-allopen' @@ -227,6 +228,7 @@ dependencies { implementation(libs.kotlinx.coroutines.android) testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.kotlin.test) + implementation(libs.kotlinx.serialization.json) // Testing dependencies testImplementation(libs.truth) diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt index f19899379..d5fa57992 100644 --- a/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt +++ b/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt @@ -18,10 +18,12 @@ package foundation.e.apps.data.blockedApps -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class AppWarningInfo( - @SerializedName("not_working_apps") val notWorkingApps: List, - @SerializedName("zero_privacy_apps") val zeroPrivacyApps: List, - @SerializedName("third_party_store_apps") val thirdPartyStoreApps: List = emptyList() + @SerialName("not_working_apps") val notWorkingApps: List, + @SerialName("zero_privacy_apps") val zeroPrivacyApps: List, + @SerialName("third_party_store_apps") val thirdPartyStoreApps: List = emptyList(), ) diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt index 962b1e0d5..f98ba31de 100644 --- a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt @@ -17,10 +17,10 @@ */ package foundation.e.apps.data.blockedApps -import com.google.gson.Gson import foundation.e.apps.data.DownloadManager import foundation.e.apps.data.install.FileManager import kotlinx.coroutines.suspendCancellableCoroutine +import kotlinx.serialization.json.Json import timber.log.Timber import java.io.File import javax.inject.Inject @@ -31,7 +31,7 @@ import kotlin.coroutines.resume @Singleton class BlockedAppRepository @Inject constructor( private val downloadManager: DownloadManager, - private val gson: Gson, + private val json: Json, @Named("cacheDir") private val cacheDir: String, ) { @@ -79,7 +79,7 @@ class BlockedAppRepository @Inject constructor( Timber.d("Blocked list file exists: ${downloadedFile.exists()}") val blockedAppInfoJson = String(downloadedFile.inputStream().readBytes()) Timber.d("Blocked list file contents: $blockedAppInfoJson") - gson.fromJson(blockedAppInfoJson, AppWarningInfo::class.java) + json.decodeFromString(blockedAppInfoJson) } catch (exception: Exception) { Timber.e(exception.localizedMessage ?: "", exception) AppWarningInfo(listOf(), listOf(), listOf()) diff --git a/app/src/main/java/foundation/e/apps/data/login/PlayStoreAuthenticator.kt b/app/src/main/java/foundation/e/apps/data/login/PlayStoreAuthenticator.kt index bb93cc826..f2493cbd1 100644 --- a/app/src/main/java/foundation/e/apps/data/login/PlayStoreAuthenticator.kt +++ b/app/src/main/java/foundation/e/apps/data/login/PlayStoreAuthenticator.kt @@ -20,7 +20,6 @@ package foundation.e.apps.data.login import android.content.Context import com.aurora.gplayapi.data.models.AuthData -import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.ResultStatus @@ -33,6 +32,7 @@ import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.data.preference.AppLoungePreference import foundation.e.apps.data.preference.getSync import foundation.e.apps.data.retryWithBackoff +import kotlinx.serialization.json.Json import timber.log.Timber import java.util.Locale import javax.inject.Inject @@ -47,7 +47,7 @@ import javax.inject.Singleton @Singleton class PlayStoreAuthenticator @Inject constructor( @ApplicationContext private val context: Context, - private val gson: Gson, + private val json: Json, private val appLoungeDataStore: AppLoungeDataStore, private val appLoungePreference: AppLoungePreference, ) : StoreAuthenticator, AuthDataValidator { @@ -122,7 +122,7 @@ class PlayStoreAuthenticator @Inject constructor( val authJson = appLoungeDataStore.authData.getSync() return if (authJson.isBlank()) null else try { - gson.fromJson(authJson, AuthData::class.java) + json.decodeFromString(authJson) } catch (e: Exception) { e.printStackTrace() null @@ -149,8 +149,8 @@ class PlayStoreAuthenticator @Inject constructor( * Converting [authData] to Json and back to [AuthData] fixed it. */ private fun formatAuthData(authData: AuthData): AuthData { - val localAuthDataJson = gson.toJson(authData) - return gson.fromJson(localAuthDataJson, AuthData::class.java) + val localAuthDataJson = json.encodeToString(authData) + return json.decodeFromString(localAuthDataJson) } private suspend fun getAuthDataAnonymously(): ResultSupreme { diff --git a/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt b/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt index 52b600c43..1c898d797 100644 --- a/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt +++ b/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt @@ -19,17 +19,17 @@ package foundation.e.apps.data.login.api import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.PlayResponse -import com.google.gson.Gson import foundation.e.apps.data.playstore.utils.CustomAuthValidator import foundation.e.apps.data.playstore.utils.GPlayHttpClient import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json import java.util.Properties class AnonymousLoginManager( private val gPlayHttpClient: GPlayHttpClient, private val nativeDeviceProperty: Properties, - private val gson: Gson, + private val json: Json, ) : PlayStoreLoginManager { private val tokenUrl: String = "https://eu.gtoken.ecloud.global" @@ -42,8 +42,9 @@ class AnonymousLoginManager( override suspend fun login(): AuthData? { var authData: AuthData? = null withContext(Dispatchers.IO) { - val response = - gPlayHttpClient.postAuth(tokenUrl, gson.toJson(nativeDeviceProperty).toByteArray()) + val response = gPlayHttpClient.postAuth( + tokenUrl, json.encodeToString(nativeDeviceProperty).toByteArray() + ) if (response.code != 200 || !response.isSuccessful) { throw Exception( "Error fetching Anonymous credentials\n" + @@ -55,10 +56,7 @@ class AnonymousLoginManager( } ) } else { - authData = gson.fromJson( - String(response.responseBytes), - AuthData::class.java - ) + authData = json.decodeFromString(String(response.responseBytes)) } } return authData diff --git a/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginManagerFactory.kt b/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginManagerFactory.kt index 4e1ccdafb..121b9d626 100644 --- a/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginManagerFactory.kt +++ b/app/src/main/java/foundation/e/apps/data/login/api/PlayStoreLoginManagerFactory.kt @@ -17,11 +17,11 @@ package foundation.e.apps.data.login.api -import com.google.gson.Gson import foundation.e.apps.data.enums.User import foundation.e.apps.data.playstore.utils.AC2DMTask import foundation.e.apps.data.playstore.utils.GPlayHttpClient import foundation.e.apps.data.preference.AppLoungeDataStore +import kotlinx.serialization.json.Json import java.util.Properties import javax.inject.Inject import javax.inject.Singleton @@ -31,14 +31,14 @@ class PlayStoreLoginManagerFactory @Inject constructor( private val gPlayHttpClient: GPlayHttpClient, private val nativeDeviceProperty: Properties, private val aC2DMTask: AC2DMTask, - private val gson: Gson, + private val json: Json, private val appLoungeDataStore: AppLoungeDataStore, ) { fun createLoginManager(user: User): PlayStoreLoginManager { return when (user) { User.GOOGLE -> GoogleLoginManager(gPlayHttpClient, nativeDeviceProperty, aC2DMTask, appLoungeDataStore) - else -> AnonymousLoginManager(gPlayHttpClient, nativeDeviceProperty, gson) + else -> AnonymousLoginManager(gPlayHttpClient, nativeDeviceProperty, json) } } } diff --git a/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt b/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt index 88f1a3e0c..5e818384b 100644 --- a/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt +++ b/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt @@ -24,15 +24,15 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import com.aurora.gplayapi.data.models.AuthData -import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.data.enums.User +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking +import kotlinx.serialization.json.Json import javax.inject.Inject import javax.inject.Singleton -import kotlinx.coroutines.flow.Flow /** * Difference between [OAUTHTOKEN] and [AASTOKEN]: @@ -55,7 +55,7 @@ import kotlinx.coroutines.flow.Flow class AppLoungeDataStore @Inject constructor( @ApplicationContext private val context: Context, - private val gson: Gson + private val json: Json, ) { companion object { @@ -85,7 +85,7 @@ class AppLoungeDataStore @Inject constructor( suspend fun saveAuthData(authData: AuthData?) { context.dataStore.edit { if (authData == null) it.remove(AUTHDATA) - else it[AUTHDATA] = gson.toJson(authData) + else it[AUTHDATA] = json.encodeToString(authData) } } @@ -94,7 +94,7 @@ class AppLoungeDataStore @Inject constructor( return if (authData.isEmpty()) { AuthData("", "") } else { - gson.fromJson(authData, AuthData::class.java) + json.decodeFromString(authData) } } 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 4524af7a6..209b13f24 100644 --- a/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt +++ b/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt @@ -26,20 +26,21 @@ import android.os.Environment import android.os.StatFs import androidx.annotation.IdRes import androidx.navigation.NavController -import com.google.gson.Gson -import com.google.gson.GsonBuilder +import com.aurora.gplayapi.data.serializers.LocaleSerializer +import com.aurora.gplayapi.data.serializers.PropertiesSerializer import dagger.Module import dagger.Provides 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 +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.contextual import okhttp3.Cache -import java.lang.reflect.Modifier import javax.inject.Named import javax.inject.Singleton @@ -97,19 +98,23 @@ object CommonUtilsModule { return stat.availableBytes } - /** - * Provides an instance of [Gson] to work with - * @return an instance of [Gson] - */ @Singleton @Provides - fun provideGsonInstance(): Gson { - return GsonBuilder() - .excludeFieldsWithModifiers(Modifier.TRANSIENT, Modifier.STATIC) - .addDeserializationExclusionStrategy(ProtobufExclusionStrategy) - .create() + fun providesJsonInstance(): Json { + val module = SerializersModule { + contextual(LocaleSerializer) + contextual(PropertiesSerializer) + } + + return Json { + prettyPrint = true + ignoreUnknownKeys = true + coerceInputValues = true + serializersModule = module + } } + @Singleton @Provides fun provideCache(@ApplicationContext context: Context): Cache { diff --git a/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt b/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt index 499413790..24a3b14a0 100644 --- a/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt +++ b/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt @@ -20,11 +20,11 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.aurora.gplayapi.data.models.AuthData -import com.google.gson.Gson import foundation.e.apps.data.Constants.ACTION_AUTHDATA_DUMP import foundation.e.apps.data.Constants.TAG_AUTHDATA_DUMP import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.data.preference.getSync +import kotlinx.serialization.json.Json import org.json.JSONObject import timber.log.Timber @@ -46,10 +46,10 @@ class DumpAuthData : BroadcastReceiver() { } private fun getAuthDataDump(context: Context): String { - val gson = Gson() + val json = Json // TODO: replace with context.configuration - val authData = AppLoungeDataStore(context, gson).authData.getSync().let { - gson.fromJson(it, AuthData::class.java) + val authData = AppLoungeDataStore(context, json).authData.getSync().let { + json.decodeFromString(it) } val filteredData = JSONObject().apply { put("email", authData.email) diff --git a/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt b/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt index 07c645b2e..8c16ae799 100644 --- a/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt @@ -38,7 +38,6 @@ import androidx.work.ExistingPeriodicWorkPolicy import coil.load import com.aurora.gplayapi.data.models.AuthData import com.google.android.material.snackbar.Snackbar -import com.google.gson.Gson import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.BuildConfig import foundation.e.apps.R @@ -76,9 +75,6 @@ class SettingsFragment : PreferenceFragmentCompat() { @Inject lateinit var stores: Stores - @Inject - lateinit var gson: Gson - @Inject lateinit var clipboardManager: ClipboardManager diff --git a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt index 7b842e20e..219236d2d 100644 --- a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt +++ b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt @@ -22,7 +22,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.aurora.gplayapi.data.models.AuthData -import com.google.gson.Gson import dagger.hilt.android.AndroidEntryPoint import foundation.e.apps.data.preference.AppLoungeDataStore import foundation.e.apps.data.preference.getSync @@ -31,6 +30,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlinx.serialization.json.Json import okhttp3.Cache import timber.log.Timber import javax.inject.Inject @@ -42,7 +42,7 @@ class LocaleChangedBroadcastReceiver : BroadcastReceiver() { @Inject lateinit var appLoungeDataStore: AppLoungeDataStore @Inject - lateinit var gson: Gson + lateinit var json: Json @Inject lateinit var cache: Cache @@ -54,7 +54,7 @@ class LocaleChangedBroadcastReceiver : BroadcastReceiver() { GlobalScope.launch { try { val authDataJson = appLoungeDataStore.authData.getSync() - val authData = gson.fromJson(authDataJson, AuthData::class.java) + val authData = json.decodeFromString(authDataJson) authData.locale = context.resources.configuration.locales[0] appLoungeDataStore.saveAuthData(authData) withContext(Dispatchers.IO) { diff --git a/build.gradle b/build.gradle index 38e1beea7..d88478af2 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ plugins { alias libs.plugins.kotlin.android apply false alias libs.plugins.kotlin.plugin.allopen apply false alias libs.plugins.kotlin.jvm apply false + alias libs.plugins.kotlin.serialization apply false alias libs.plugins.hilt.android apply false alias libs.plugins.ksp apply false alias libs.plugins.navigation.safeargs apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 35047dd77..f5c3b7ded 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,6 +24,7 @@ junitVersion = "1.2.1" kotlin = "2.1.0" hilt = "2.54" kotlinxCoroutinesAndroid = "1.10.1" +kotlinxSerialization = "1.9.0" ksp = "2.1.0-1.0.29" legacySupportV4 = "1.0.0" lifecycleViewmodelKtx = "2.8.7" @@ -81,6 +82,7 @@ kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotl kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesAndroid" } kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesAndroid" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutinesAndroid" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" } legacy-support-v4 = { module = "androidx.legacy:legacy-support-v4", version.ref = "legacySupportV4" } lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycleViewmodelKtx" } lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" } @@ -116,6 +118,7 @@ android-library = { id = "com.android.library", version.ref = "androidGradlePlug kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-plugin-allopen = { id = "org.jetbrains.kotlin.plugin.allopen", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } navigation-safeargs = { id = "androidx.navigation.safeargs", version.ref = "navigation" } -- GitLab From 2d3ad70609349abe1d08060d023fe326019c3f68 Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Tue, 7 Oct 2025 17:00:02 +0600 Subject: [PATCH 2/4] fix: resolve Play Store app installation problem in anonymous mode The fix follows the way Aurora Store handles authData using Json from kotlinx serialization library. --- .../e/apps/data/blockedApps/AppWarningInfo.kt | 4 +-- .../java/foundation/e/apps/data/login/Auth.kt | 31 +++++++++++++++++++ .../data/login/api/AnonymousLoginManager.kt | 16 ++++++++-- 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/data/login/Auth.kt diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt index d5fa57992..1b03fee31 100644 --- a/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt +++ b/app/src/main/java/foundation/e/apps/data/blockedApps/AppWarningInfo.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2024 E FOUNDATION + * Copyright (C) 2022-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,5 +25,5 @@ import kotlinx.serialization.Serializable data class AppWarningInfo( @SerialName("not_working_apps") val notWorkingApps: List, @SerialName("zero_privacy_apps") val zeroPrivacyApps: List, - @SerialName("third_party_store_apps") val thirdPartyStoreApps: List = emptyList(), + @SerialName("third_party_store_apps") val thirdPartyStoreApps: List = emptyList() ) diff --git a/app/src/main/java/foundation/e/apps/data/login/Auth.kt b/app/src/main/java/foundation/e/apps/data/login/Auth.kt new file mode 100644 index 000000000..1d12e2a14 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/data/login/Auth.kt @@ -0,0 +1,31 @@ +/* + * Aurora Store + * Copyright (C) 2021, Rahul Kumar Patel + * + * Aurora Store 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 2 of the License, or + * (at your option) any later version. + * + * Aurora Store 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 Aurora Store. If not, see . + * + */ + +package foundation.e.apps.data.login + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Auth( + val email: String, + + @SerialName("authToken") + val auth: String, +) diff --git a/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt b/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt index 1c898d797..08f81649e 100644 --- a/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt +++ b/app/src/main/java/foundation/e/apps/data/login/api/AnonymousLoginManager.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019-2022 E FOUNDATION + * Copyright (C) 2019-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,17 +13,21 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.data.login.api import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.PlayResponse +import com.aurora.gplayapi.helpers.AuthHelper +import foundation.e.apps.data.login.Auth import foundation.e.apps.data.playstore.utils.CustomAuthValidator import foundation.e.apps.data.playstore.utils.GPlayHttpClient import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json +import java.util.Locale import java.util.Properties class AnonymousLoginManager( @@ -56,7 +60,15 @@ class AnonymousLoginManager( } ) } else { - authData = json.decodeFromString(String(response.responseBytes)) + val auth = json.decodeFromString(String(response.responseBytes)) + authData = AuthHelper.build( + email = auth.email, + token = auth.auth, + tokenType = AuthHelper.Token.AUTH, + isAnonymous = true, + properties = nativeDeviceProperty, + locale = Locale.getDefault() + ) } } return authData -- GitLab From 6fbba3a589e56da86fa183d4ee55ef765ac8450c Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Wed, 8 Oct 2025 10:29:13 +0600 Subject: [PATCH 3/4] chore: update copyright --- .../e/apps/data/blockedApps/BlockedAppRepository.kt | 2 +- .../foundation/e/apps/data/preference/AppLoungeDataStore.kt | 4 ++-- app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt | 4 ++-- .../main/java/foundation/e/apps/receivers/DumpAuthData.kt | 5 ++++- .../java/foundation/e/apps/ui/settings/SettingsFragment.kt | 4 ++-- .../e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt | 4 ++-- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt index f98ba31de..a296c4ee8 100644 --- a/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt +++ b/app/src/main/java/foundation/e/apps/data/blockedApps/BlockedAppRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022-2024 E FOUNDATION + * Copyright (C) 2022-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt b/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt index 5e818384b..7b4dfccae 100644 --- a/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt +++ b/app/src/main/java/foundation/e/apps/data/preference/AppLoungeDataStore.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION + * Copyright (C) 2021-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,6 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.data.preference 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 209b13f24..55789e0f4 100644 --- a/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt +++ b/app/src/main/java/foundation/e/apps/di/CommonUtilsModule.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2021 E FOUNDATION + * Copyright (C) 2021-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,6 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.di diff --git a/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt b/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt index 24a3b14a0..b523b4330 100644 --- a/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt +++ b/app/src/main/java/foundation/e/apps/receivers/DumpAuthData.kt @@ -1,5 +1,7 @@ /* + * Copyright (C) 2025 e Foundation * Copyright MURENA SAS 2023 + * * 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 @@ -11,7 +13,8 @@ * 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 . + * along with this program. If not, see . + * */ package foundation.e.apps.receivers diff --git a/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt b/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt index 8c16ae799..e089ed026 100644 --- a/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/foundation/e/apps/ui/settings/SettingsFragment.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2022-2023 E FOUNDATION + * Copyright (C) 2022-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,6 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.ui.settings diff --git a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt index 219236d2d..509860039 100644 --- a/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt +++ b/app/src/main/java/foundation/e/apps/ui/setup/signin/LocaleChangedBroadcastReceiver.kt @@ -1,6 +1,5 @@ /* - * Apps Quickly and easily install Android apps onto your device! - * Copyright (C) 2022 E FOUNDATION + * Copyright (C) 2022-2025 e Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -14,6 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * */ package foundation.e.apps.ui.setup.signin -- GitLab From 6501e3e68a54001dd3affbe0842ed2a967ce7719 Mon Sep 17 00:00:00 2001 From: Fahim Masud Choudhury Date: Wed, 8 Oct 2025 10:35:36 +0600 Subject: [PATCH 4/4] Revert "bugfix: avoid (de)serializer of protobuf fields" This reverts commit 364176e71e929c043b39fddf8f6fe088882f880d. As Json from kotlinx.serialization is used instead of Gson, changes related to Gson is not needed any more. --- .../e/apps/utils/ProtobufExclusionStrategy.kt | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt diff --git a/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt b/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt deleted file mode 100644 index f6465c37a..000000000 --- a/app/src/main/java/foundation/e/apps/utils/ProtobufExclusionStrategy.kt +++ /dev/null @@ -1,17 +0,0 @@ -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