diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..82c75bb535 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,55 @@ +name: Release + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + name: Release + steps: + - uses: actions/checkout@v6 + + - name: Cache Gradle + uses: burrunan/gradle-cache-action@v3 + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: "temurin" + java-version: "17" + + - name: Build + run: ./gradlew --no-daemon :play-services-core:assembleMapboxUser :play-services-core:assembleMapboxHuawei + + - name: Move + run: | + mkdir play-services-core/build/outputs/apk/releases + mv \ + play-services-core/build/outputs/apk/mapboxUser/release/*.apk \ + play-services-core/build/outputs/apk/mapboxHuawei/release/*.apk \ + play-services-core/build/outputs/apk/releases + + - name: Sign + id: sign_apk + uses: ilharp/sign-android-release@v2 + with: + releaseDir: play-services-core/build/outputs/apk/releases + signingKey: ${{ secrets.SIGNING_KEYSTORE }} + keyAlias: ${{ secrets.SIGNING_KEY_ALIAS }} + keyStorePassword: ${{ secrets.SIGNING_KEYSTORE_PASSWORD }} + keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }} + + - name: Split + uses: jungwinter/split@v2 + id: signed_files + with: + msg: ${{ steps.sign_apk.outputs.signedFiles }} + separator: ':' + + - name: Release + uses: ncipollo/release-action@v1 + with: + artifacts: play-services-core/build/outputs/apk/releases/*-signed.apk diff --git a/README.md b/README.md index b2751354f4..af9f5b99bd 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,22 @@ microG Services is a FLOSS (Free/Libre Open Source Software) framework to allow If you'd like to help translate microG, take a look at [TRANSLATION](TRANSLATION.md). +About this fork +------- +This repository is a fork of [microG GmsCore](https://github.com/microg/GmsCore) to allow patched Google apps to run without root and under a different package name using GmsCore instead of Google Play Services, via the "GmsCore support" patch by ReVanced from [ReVanced Patches](https://github.com/revanced/revanced-patches) with the minimum amount of changes necessary to upstream. + +Goals of this fork: +- Run next to an existing GMS installation such as [microG GmsCore](https://github.com/microg/GmsCore) or Google Play Services. +- Usage with the "GmsCore support" patch by ReVanced from [ReVanced Patches](https://github.com/revanced/revanced-patches) +- Feature parity with upstream + +Nongoals of this fork: +- New features that do not contribute to the goal of this fork +- Bug fixes that do not contribute to the goal of this fork + +Contributing to the fork +------- +You can create an issue or pull request to contribute to the fork. In both cases, ensure it aligns with this fork's goals. License ------- diff --git a/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt b/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt index 0c4f96d1c9..acf388e977 100644 --- a/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt +++ b/play-services-ads-identifier/core/src/main/kotlin/org/microg/gms/ads/identifier/AdvertisingIdService.kt @@ -64,7 +64,7 @@ abstract class AdvertisingIdConfiguration(private val context: Context) { for (packageName in packageNames) { val applicationInfo = context.packageManager.getApplicationInfo(packageName, 0) if (applicationInfo.targetSdkVersion > 33) { - if (context.packageManager.checkPermission("com.google.android.gms.permission.AD_ID", packageName) == PackageManager.PERMISSION_DENIED) { + if (context.packageManager.checkPermission("app.revanced.android.gms.permission.AD_ID", packageName) == PackageManager.PERMISSION_DENIED) { throw SecurityException("Permission not granted") } } diff --git a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt index 1969359ec2..8857e527d3 100644 --- a/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt +++ b/play-services-auth-api-phone/core/src/main/kotlin/org/microg/gms/auth/phone/SmsRetrieverCore.kt @@ -41,7 +41,6 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import org.microg.gms.auth.phone.SmsRetrieverRequestType.RETRIEVER import org.microg.gms.auth.phone.SmsRetrieverRequestType.USER_CONSENT -import org.microg.gms.common.Constants import org.microg.gms.utils.getSignatures import java.nio.charset.StandardCharsets import java.security.MessageDigest @@ -140,7 +139,7 @@ class SmsRetrieverCore(private val context: Context, override val lifecycle: Lif private fun sendUserConsentBroadcast(request: SmsRetrieverRequest, messageBody: String) { val userConsentIntent = Intent(context, UserConsentPromptActivity::class.java) - userConsentIntent.setPackage(Constants.GMS_PACKAGE_NAME) + userConsentIntent.setPackage(context.packageName) userConsentIntent.putExtra(EXTRA_MESSENGER, Messenger(object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { if (Binder.getCallingUid() == Process.myUid()) { diff --git a/play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetriever.java b/play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetriever.java index 63602c3287..24f8630c07 100644 --- a/play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetriever.java +++ b/play-services-auth-api-phone/src/main/java/com/google/android/gms/auth/api/phone/SmsRetriever.java @@ -47,7 +47,7 @@ public class SmsRetriever { * Permission that's used to register the receiver to detect that the broadcaster is the SMS Retriever. */ @NonNull - public static final String SEND_PERMISSION = "com.google.android.gms.auth.api.phone.permission.SEND"; + public static final String SEND_PERMISSION = "app.revanced.android.gms.auth.api.phone.permission.SEND"; /** * Intent action when SMS message is retrieved. */ diff --git a/play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java index ef0909cef4..9ae26b1569 100644 --- a/play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java +++ b/play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java @@ -51,6 +51,9 @@ public class PackageUtils { @Deprecated public static boolean isGooglePackage(@NonNull Context context, @Nullable String packageName) { if (packageName == null) return false; + + packageName = PackageSpoofUtils.spoofPackageName(context.getPackageManager(), packageName); + return new ExtendedPackageInfo(context, packageName).isGoogleOrPlatformPackage(); } @@ -59,7 +62,7 @@ public static boolean isGooglePackage(@NonNull Context context, @Nullable String */ @Deprecated public static boolean callerHasExtendedAccessPermission(@NonNull Context context) { - return context.checkCallingPermission("org.microg.gms.EXTENDED_ACCESS") == PackageManager.PERMISSION_GRANTED; + return context.checkCallingPermission("app.revanced.org.microg.gms.EXTENDED_ACCESS") == PackageManager.PERMISSION_GRANTED; } public static void assertGooglePackagePermission(@NonNull Context context, GooglePackagePermission permission) { @@ -74,7 +77,17 @@ public static void assertGooglePackagePermission(@NonNull Context context, Googl public static boolean callerHasGooglePackagePermission(@NonNull Context context, GooglePackagePermission permission) { for (String packageCandidate : getCallingPackageCandidates(context)) { - if (new ExtendedPackageInfo(context, packageCandidate).hasGooglePackagePermission(permission)) { + String packageName = PackageSpoofUtils.spoofPackageName( + context.getPackageManager(), + packageCandidate + ); + + // See https://github.com/ReVanced/GmsCore/issues/10. + ExtendedPackageInfo extendedPackageInfo = new ExtendedPackageInfo(context, packageName); + if (!extendedPackageInfo.isInstalled()) + return true; + + if (new ExtendedPackageInfo(context, packageName).hasGooglePackagePermission(permission)) { return true; } } @@ -162,7 +175,7 @@ public static byte[] firstSignatureDigestBytes(@NonNull PackageManager packageMa for (Signature sig : info.signingInfo.getSigningCertificateHistory()) { byte[] digest = sha1bytes(sig.toByteArray()); if (digest != null) { - return digest; + return PackageSpoofUtils.spoofBytesSignature(packageManager, packageName, digest); } } } @@ -171,7 +184,7 @@ public static byte[] firstSignatureDigestBytes(@NonNull PackageManager packageMa for (Signature sig : info.signatures) { byte[] digest = sha1bytes(sig.toByteArray()); if (digest != null) { - return digest; + return PackageSpoofUtils.spoofBytesSignature(packageManager, packageName, digest); } } } @@ -185,7 +198,7 @@ public static String getCallingPackage(@NonNull Context context) { if (packageName == null) { packageName = firstPackageFromUserId(context, callingUid); } - return packageName; + return PackageSpoofUtils.spoofPackageName(context.getPackageManager(), packageName); } public static String[] getCallingPackageCandidates(@NonNull Context context) { diff --git a/play-services-base/core/src/main/kotlin/org/microg/gms/common/PackageSpoofUtils.kt b/play-services-base/core/src/main/kotlin/org/microg/gms/common/PackageSpoofUtils.kt new file mode 100644 index 0000000000..cfc508c1c0 --- /dev/null +++ b/play-services-base/core/src/main/kotlin/org/microg/gms/common/PackageSpoofUtils.kt @@ -0,0 +1,157 @@ +package org.microg.gms.common + +import android.content.pm.PackageManager +import android.os.Bundle +import android.util.Log +import com.google.android.gms.common.BuildConfig +import java.util.* + +// Slightly modified implementation from https://github.com/shadow578. +/** + * Utilities to spoof package information. + */ +object PackageSpoofUtils { + private const val TAG = "SpoofUtils" + private const val META_SPOOF_PACKAGE_NAME = + Constants.USER_MICROG_PACKAGE_NAME + ".SPOOFED_PACKAGE_NAME" + private const val META_SPOOF_PACKAGE_SIGNATURE = + Constants.USER_MICROG_PACKAGE_NAME + ".SPOOFED_PACKAGE_SIGNATURE" + + private val spoofedPackageNameCache = HashMap() + private val spoofedPackageSignatureCache = HashMap() + + /** + * Spoof the package name of a package, if a spoofed name is set. + * + * @param packageManager [PackageManager] used to get package information. + * @param realPackageName The real package name. + * @return Either the spoofed or the real package name, depending on if the package requested spoofing. + */ + @JvmStatic + fun spoofPackageName( + packageManager: PackageManager, + realPackageName: String? + ): String? { + if (realPackageName.isNullOrEmpty()) return realPackageName + + val spoofedPackageName = getSpoofedPackageName(packageManager, realPackageName) + return if (!spoofedPackageName.isNullOrEmpty()) { + Log.i(TAG, "Package name of $realPackageName spoofed to $spoofedPackageName") + spoofedPackageName + } else realPackageName + } + + /** + * Spoof the signature of a package, if a spoofed name is set. + * + * @param packageManager [PackageManager] used to get package information. + * @param packageName Name of the package to check. + * @param realSignature The real package signature. + * @return Either the spoofed or the real signature, depending on if the package requested spoofing. + */ + @JvmStatic + @JvmName("spoofStringSignature") + fun spoofSignature( + packageManager: PackageManager, + packageName: String, + realSignature: String? + ): String? { + val spoofedSignature = getSpoofedSignature(packageManager, packageName) + + if (spoofedSignature.isNullOrEmpty()) return realSignature + + Log.i(TAG, "Package signature of $packageName spoofed to $spoofedSignature") + return spoofedSignature + } + + /** + * Spoof the signature of a package, if a spoofed name is set. + * + * @param packageManager [PackageManager] used to get package information. + * @param packageName Name of the package to check. + * @param realSignature The real package signature. + * @return Either the spoofed or the real signature, depending on if the package requested spoofing. + */ + @JvmStatic + @JvmName("spoofBytesSignature") + fun spoofSignature( + packageManager: PackageManager, + packageName: String, + realSignature: ByteArray? + ): ByteArray? { + val spoofedSignatureString = getSpoofedSignature(packageManager, packageName) + + if (spoofedSignatureString.isNullOrEmpty()) return realSignature + + Log.i(TAG, "Package signature of $packageName spoofed to $spoofedSignatureString") + + return spoofedSignatureString.chunked(2) + .map { it.toInt(16).toByte() } + .toByteArray() + } + + /** + * Get the spoofed package name for a package. + * + * @param packageManager [PackageManager] used to get package information. + * @param packageName Name of the package to get the spoofed name of. + * @return Spoofed name string, or null if none set. + */ + private fun getSpoofedPackageName( + packageManager: PackageManager, + packageName: String + ): String? { + return spoofedPackageNameCache[packageName] ?: run { + val meta = getPackageMetadata(packageManager, packageName) + val spoofedPackageName = meta?.getString(META_SPOOF_PACKAGE_NAME) + if (spoofedPackageName != null) { + spoofedPackageNameCache[packageName] = spoofedPackageName + } + + spoofedPackageName + } + } + + /** + * Get the spoofed package signature for a package. + * + * @param packageManager [PackageManager] used to get package information. + * @param packageName Name of the package to get spoofed signature of. + * @return Spoofed signature string, or null if none set. + */ + private fun getSpoofedSignature( + packageManager: PackageManager, + packageName: String + ): String? { + return spoofedPackageSignatureCache[packageName] ?: run { + val meta = getPackageMetadata(packageManager, packageName) + val spoofedSignature = meta?.getString(META_SPOOF_PACKAGE_SIGNATURE) + if (spoofedSignature != null) { + spoofedPackageSignatureCache[packageName] = spoofedSignature + } + + spoofedSignature + } + } + + /** + * Get package metadata. + * + * @param packageManager [PackageManager] used to get package information. + * @param packageName Name of the package to get metadata of. + * @return Package metadata bundle. + */ + private fun getPackageMetadata(packageManager: PackageManager, packageName: String): Bundle? { + return try { + // PackageManager.getPackageInfo() has been deprecated in targetSdkVersion 30+ + // To solve this, add the QUERY_ALL_PACKAGES permission to AndroidManifest.xml + packageManager + .getPackageInfo(packageName, PackageManager.GET_META_DATA) + ?.applicationInfo + ?.metaData + } catch (e: PackageManager.NameNotFoundException) { + Log.e(TAG, "Failed to get application metadata for $packageName", e) + null + } + } +} \ No newline at end of file diff --git a/play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesUtil.java b/play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesUtil.java index fd168573b2..5c77f20795 100644 --- a/play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesUtil.java +++ b/play-services-base/src/main/java/com/google/android/gms/common/GooglePlayServicesUtil.java @@ -137,7 +137,7 @@ public static String getOpenSourceSoftwareLicenseInfo(Context context) { */ public static Context getRemoteContext(Context context) { try { - return context.createPackageContext(Constants.GMS_PACKAGE_NAME, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); + return context.createPackageContext(context.getPackageName(), Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); } catch (PackageManager.NameNotFoundException unused) { return null; } @@ -150,7 +150,7 @@ public static Context getRemoteContext(Context context) { */ public static Resources getRemoteResources(Context context) { try { - return context.getPackageManager().getResourcesForApplication(Constants.GMS_PACKAGE_NAME); + return context.getPackageManager().getResourcesForApplication(context.getPackageName()); } catch (PackageManager.NameNotFoundException unused) { return null; } diff --git a/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java b/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java index 0813431a7b..4ab9554973 100644 --- a/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java +++ b/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java @@ -113,6 +113,10 @@ private String sha1sum(byte[] bytes) { } private String getTargetPackageWithoutPref() { + // Must be self, as we want to bind to our own services, and not to GMS or microG ones, + // in case system GMS is installed alongside. + if (true) return context.getPackageName(); + // Pref: gms > microG > self PackageManager pm = context.getPackageManager(); try { @@ -254,7 +258,7 @@ private Intent getIntent() { if (requireMicrog && !isMicrog(resolveInfo)) { Log.w(TAG, "GMS service found for " + actionString + " but looks not like microG"); } else { - if (isSystemGoogleOrMicrogSig(pm, targetPackage)){ + if (isSystemGoogleOrMicrogSig(pm, targetPackage)) { Log.d(TAG, "GMS service found for " + actionString); return intent; } else { @@ -298,7 +302,7 @@ public boolean isMicrog(ResolveInfo resolveInfo) { if (resolveInfo == null || resolveInfo.serviceInfo == null) return false; if (resolveInfo.serviceInfo.name.startsWith("org.microg.")) return true; try { - PermissionInfo info = context.getPackageManager().getPermissionInfo("org.microg.gms.EXTENDED_ACCESS", 0); + PermissionInfo info = context.getPackageManager().getPermissionInfo("app.revanced.org.microg.gms.EXTENDED_ACCESS", 0); return info.packageName.equals(resolveInfo.serviceInfo.packageName); } catch (PackageManager.NameNotFoundException e) { return false; diff --git a/play-services-basement/src/main/java/org/microg/gms/auth/AuthConstants.java b/play-services-basement/src/main/java/org/microg/gms/auth/AuthConstants.java index 9ee8196f55..057fe62c10 100644 --- a/play-services-basement/src/main/java/org/microg/gms/auth/AuthConstants.java +++ b/play-services-basement/src/main/java/org/microg/gms/auth/AuthConstants.java @@ -23,7 +23,7 @@ public class AuthConstants { public static final String PROVIDER_METHOD_CLEAR_PASSWORD = "clear_password"; public static final String PROVIDER_EXTRA_CLEAR_PASSWORD = "clear_password"; public static final String PROVIDER_EXTRA_ACCOUNTS = "accounts"; - public static final String DEFAULT_ACCOUNT_TYPE = "com.google"; + public static final String DEFAULT_ACCOUNT_TYPE = "app.revanced"; public static final String WORK_ACCOUNT_TYPE = "com.google.work"; public static final String KEY_ACCOUNT_SERVICES = "services"; diff --git a/play-services-basement/src/main/java/org/microg/gms/common/Constants.java b/play-services-basement/src/main/java/org/microg/gms/common/Constants.java index 482e0f37b5..6975d18678 100644 --- a/play-services-basement/src/main/java/org/microg/gms/common/Constants.java +++ b/play-services-basement/src/main/java/org/microg/gms/common/Constants.java @@ -21,7 +21,7 @@ public class Constants { public static final int GMS_VERSION_CODE = (BuildConfig.VERSION_CODE / 1000) * 1000; public static final String GMS_PACKAGE_NAME = "com.google.android.gms"; - public static final String USER_MICROG_PACKAGE_NAME = "org.microg.gms"; + public static final String USER_MICROG_PACKAGE_NAME = "app.revanced.android.gms"; public static final String GSF_PACKAGE_NAME = "com.google.android.gsf"; public static final String GMS_PACKAGE_SIGNATURE_SHA1 = "38918a453d07199354f8b19af05ec6562ced5788"; public static final String GMS_SECONDARY_PACKAGE_SIGNATURE_SHA1 = "bd32424203e0fb25f36b57e5aa356f9bdd1da998"; diff --git a/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java b/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java index de352ec178..93049281fb 100644 --- a/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java +++ b/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java @@ -88,10 +88,10 @@ public final class GcmConstants { public static final String SCHEDULER_ACTION_CANCEL_ALL = "CANCEL_ALL"; public static final String SCHEDULER_ACTION_SCHEDULE = "SCHEDULE_TASK"; - public static final String PERMISSION_GTALK = "com.google.android.gtalkservice.permission.GTALK_SERVICE"; + public static final String PERMISSION_GTALK = "app.revanced.android.gtalkservice.permission.GTALK_SERVICE"; public static final String PERMISSION_NETWORK_TASK = "com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"; - public static final String PERMISSION_RECEIVE = "com.google.android.c2dm.permission.RECEIVE"; - public static final String PERMISSION_SEND = "com.google.android.c2dm.permission.SEND"; + public static final String PERMISSION_RECEIVE = "app.revanced.android.c2dm.permission.RECEIVE"; + public static final String PERMISSION_SEND = "app.revanced.android.c2dm.permission.SEND"; public static final String ERROR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE"; diff --git a/play-services-core/build.gradle b/play-services-core/build.gradle index 4d25419ecd..47fdc6b9ba 100644 --- a/play-services-core/build.gradle +++ b/play-services-core/build.gradle @@ -126,6 +126,8 @@ android { } defaultConfig { + applicationId = "com.google.android.gms" + versionName version versionCode appVersionCode @@ -135,7 +137,7 @@ android { multiDexEnabled true multiDexKeepProguard file('multidex-keep.pro') - manifestPlaceholders = [appLabel:"@string/gms_app_name"] + manifestPlaceholders = [appLabel: "@string/gms_app_name"] resValue "string", "package_id", "com.google.android.gms" buildConfigField "String", "SAFETYNET_KEY", "\"${localProperties.get("safetynet.key", "")}\"" @@ -176,15 +178,17 @@ android { } "huawei" { dimension 'target' + applicationId = "app.revanced.android.gms" versionNameSuffix "-hw" + resValue "string", "package_id", "app.revanced.android.gms" } "user" { dimension 'target' - applicationId = "org.microg.gms" + applicationId = "app.revanced.android.gms" versionNameSuffix "-user" - manifestPlaceholders = [appLabel:"@string/limited_services_app_name"] + manifestPlaceholders = [appLabel: "@string/limited_services_app_name"] matchingFallbacks = ['default'] - resValue "string", "package_id", "org.microg.gms" + resValue "string", "package_id", "app.revanced.android.gms" } "hms" { dimension 'maps' diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 713deb4842..a79dce9650 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -17,124 +17,124 @@ xmlns:tools="http://schemas.android.com/tools"> - + - + @@ -164,12 +164,12 @@ - - - - + + + + - + @@ -214,7 +214,7 @@ + android:permission="app.revanced.org.microg.gms.PROVISION" /> @@ -275,21 +275,21 @@ @@ -538,7 +538,7 @@ @@ -987,7 +987,7 @@ @@ -1506,6 +1506,20 @@ tools:ignore="WearableBindListener" /> + + + + + + diff --git a/play-services-core/src/main/java/com/google/android/gms/auth/TokenActivity.java b/play-services-core/src/main/java/com/google/android/gms/auth/TokenActivity.java index 3e59217e41..7e871db078 100644 --- a/play-services-core/src/main/java/com/google/android/gms/auth/TokenActivity.java +++ b/play-services-core/src/main/java/com/google/android/gms/auth/TokenActivity.java @@ -30,7 +30,7 @@ protected void onCreate(Bundle savedInstanceState) { extras.get("KEY"); Log.d(TAG, extras.toString()); /*AccountManager accountManager = AccountManager.get(this); - accountManager.getAuthToken(new Account(extras.getString("authAccount"), "com.google"), extras.getString("service"), extras.getBundle("callerExtras"), this, new AccountManagerCallback() { + accountManager.getAuthToken(new Account(extras.getString("authAccount"), "app.revanced"), extras.getString("service"), extras.getBundle("callerExtras"), this, new AccountManagerCallback() { @Override public void run(AccountManagerFuture future) { try { diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteContextFactory.java b/play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteContextFactory.java index 80580d8342..d6bb943b48 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteContextFactory.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/DynamiteContextFactory.java @@ -15,12 +15,11 @@ import android.os.Process; import android.util.Log; +import com.google.android.gms.BuildConfig; import com.google.android.gms.chimera.container.DynamiteContext; import com.google.android.gms.chimera.container.DynamiteModuleInfo; import com.google.android.gms.chimera.container.FilteredClassLoader; -import org.microg.gms.common.Constants; - import java.io.File; import java.util.HashMap; import java.util.Map; @@ -49,7 +48,7 @@ public static DynamiteContext createDynamiteContext(String moduleId, Context ori } try { DynamiteModuleInfo moduleInfo = new DynamiteModuleInfo(moduleId); - Context gmsContext = originalContext.createPackageContext(Constants.GMS_PACKAGE_NAME, 0); + Context gmsContext = originalContext.createPackageContext(BuildConfig.APPLICATION_ID, 0); Context originalAppContext = originalContext.getApplicationContext(); DynamiteContext dynamiteContext; diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java index 608cc3c920..b0d023a3d5 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java @@ -7,6 +7,8 @@ import android.content.Context; import android.content.ContextWrapper; +import android.content.res.AssetManager; +import android.content.res.Resources; import android.content.pm.ApplicationInfo; import androidx.annotation.RequiresApi; @@ -48,6 +50,16 @@ public ApplicationInfo getApplicationInfo() { return gmsContext.getApplicationInfo(); } + @Override + public Resources getResources() { + return gmsContext.getResources(); + } + + @Override + public AssetManager getAssets() { + return gmsContext.getAssets(); + } + @Override public Context getApplicationContext() { return appContext; diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java index a517e8f845..34de388dcf 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java @@ -17,6 +17,7 @@ import org.microg.gms.accountaction.ErrorResolverKt; import org.microg.gms.accountaction.Resolution; import org.microg.gms.common.NotOkayException; +import org.microg.gms.common.PackageSpoofUtils; import org.microg.gms.common.PackageUtils; import org.microg.gms.settings.SettingsContract; @@ -331,8 +332,10 @@ public AuthResponse requestAuth(boolean legacy) throws IOException { } AuthRequest request = new AuthRequest().fromContext(context) .source("android") - .app(packageName, getPackageSignature()) - .email(accountName) + .app( + PackageSpoofUtils.spoofPackageName(context.getPackageManager(), packageName), + PackageSpoofUtils.spoofStringSignature(context.getPackageManager(), packageName, getPackageSignature()) + ).email(accountName) .token(getAccountManager().getPassword(getAccount())) .service(service) .delegation(delegationType, delegateeUserId) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 8b55858e8e..c980fd7fdc 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -46,6 +46,7 @@ import androidx.annotation.StringRes; import androidx.webkit.WebViewClientCompat; +import com.google.android.gms.BuildConfig; import com.google.android.gms.R; import org.json.JSONArray; @@ -100,8 +101,8 @@ public class LoginActivity extends AssistantActivity { private static final String GOOGLE_SIGNUP_URL = "https://accounts.google.com/signup"; private static final String MAGIC_USER_AGENT = " MinuteMaid"; private static final String COOKIE_OAUTH_TOKEN = "oauth_token"; - private static final String ACTION_UPDATE_ACCOUNT = "com.google.android.gms.auth.GOOGLE_ACCOUNT_CHANGE"; - private static final String PERMISSION_UPDATE_ACCOUNT = "com.google.android.gms.auth.permission.GOOGLE_ACCOUNT_CHANGE"; + private static final String ACTION_UPDATE_ACCOUNT = "app.revanced.android.gms.auth.GOOGLE_ACCOUNT_CHANGE"; + private static final String PERMISSION_UPDATE_ACCOUNT = "app.revanced.android.gms.auth.permission.GOOGLE_ACCOUNT_CHANGE"; private static final int REQUEST_CODE_SIGNUP = 1001; private final FidoHandler fidoHandler = new FidoHandler(this); @@ -137,7 +138,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (uriPath != null && uriPath.contains("/signup")) { String biz = uri.getQueryParameter("biz"); Intent intent = new Intent(LoginActivity.this, MainActivity.class); - intent.setPackage(GMS_PACKAGE_NAME); + intent.setPackage(BuildConfig.APPLICATION_ID); intent.putExtra(EXTRA_URL, biz != null ? GOOGLE_SIGNUP_URL + "?biz=" + biz : GOOGLE_SIGNUP_URL); startActivityForResult(intent, REQUEST_CODE_SIGNUP); return true; @@ -461,7 +462,7 @@ public void onException(Exception exception) { private void notifyGcmGroupUpdate(String accountName) { Intent intent = new Intent(ACTION_GCM_REGISTER_ACCOUNT); - intent.setPackage(Constants.GMS_PACKAGE_NAME); + intent.setPackage(BuildConfig.APPLICATION_ID); intent.putExtra(KEY_GCM_REGISTER_ACCOUNT_NAME, accountName); sendBroadcast(intent); } diff --git a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java index 88ede1e6f1..1821813bec 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java @@ -30,6 +30,7 @@ import com.google.android.gms.common.internal.CertData; import org.microg.gms.auth.*; import org.microg.gms.auth.login.LoginActivity; +import org.microg.gms.common.PackageSpoofUtils; import org.microg.gms.common.PackageUtils; import org.microg.gms.auth.AuthResponse; import org.microg.gms.utils.PackageManagerUtilsKt; @@ -142,7 +143,7 @@ public Bundle getAuthToken(AccountAuthenticatorResponse response, Account accoun Intent i = new Intent(context, AskPermissionActivity.class); i.putExtras(options); i.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response); - i.putExtra(KEY_ANDROID_PACKAGE_NAME, app); + i.putExtra(KEY_ANDROID_PACKAGE_NAME, PackageSpoofUtils.spoofPackageName(context.getPackageManager(), app)); i.putExtra(KEY_ACCOUNT_TYPE, account.type); i.putExtra(KEY_ACCOUNT_NAME, account.name); i.putExtra(KEY_AUTHTOKEN, authTokenType); diff --git a/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java b/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java index 35b11fd1b4..6dd8d57015 100644 --- a/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java +++ b/play-services-core/src/main/java/org/microg/gms/games/GamesStubService.java @@ -22,6 +22,7 @@ import android.os.RemoteException; import androidx.core.app.PendingIntentCompat; +import com.google.android.gms.BuildConfig; import com.google.android.gms.common.api.CommonStatusCodes; import com.google.android.gms.common.internal.GetServiceRequest; import com.google.android.gms.common.internal.IGmsCallbacks; @@ -50,7 +51,7 @@ public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest reque } if (packageName == null) packageName = GMS_PACKAGE_NAME; Intent intent = new Intent(ACTION_PLAY_GAMES_UPGRADE); - intent.setPackage(GMS_PACKAGE_NAME); + intent.setPackage(BuildConfig.APPLICATION_ID); intent.putExtra(EXTRA_GAME_PACACKE_NAME, packageName); Bundle bundle = new Bundle(); bundle.putParcelable("pendingIntent", PendingIntentCompat.getActivity(this, packageName.hashCode(), intent, FLAG_UPDATE_CURRENT, false)); diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java index 7bce08dbd3..fdbe367b76 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java @@ -45,6 +45,7 @@ import androidx.core.app.PendingIntentCompat; import androidx.legacy.content.WakefulBroadcastReceiver; +import com.google.android.gms.BuildConfig; import com.squareup.wire.Message; import org.microg.gms.checkin.LastCheckinInfo; @@ -506,7 +507,7 @@ private void handleLoginResponse(LoginResponse loginResponse) { private void notifyGcmConnected() { Intent intent = new Intent(ACTION_GCM_CONNECTED); - intent.setPackage(Constants.GMS_PACKAGE_NAME); + intent.setPackage(BuildConfig.APPLICATION_ID); sendBroadcast(intent); } diff --git a/play-services-core/src/main/java/org/microg/gms/gservices/GServices.java b/play-services-core/src/main/java/org/microg/gms/gservices/GServices.java index 66595b26d7..5ecdc435c0 100644 --- a/play-services-core/src/main/java/org/microg/gms/gservices/GServices.java +++ b/play-services-core/src/main/java/org/microg/gms/gservices/GServices.java @@ -22,9 +22,9 @@ import android.net.Uri; public class GServices { - public static final Uri CONTENT_URI = Uri.parse("content://com.google.android.gsf.gservices"); - public static final Uri MAIN_URI = Uri.parse("content://com.google.android.gsf.gservices/main"); - public static final Uri OVERRIDE_URI = Uri.parse("content://com.google.android.gsf.gservices/override"); + public static final Uri CONTENT_URI = Uri.parse("content://app.revanced.android.gsf.gservices"); + public static final Uri MAIN_URI = Uri.parse("content://app.revanced.android.gsf.gservices/main"); + public static final Uri OVERRIDE_URI = Uri.parse("content://app.revanced.android.gsf.gservices/override"); public static int setString(ContentResolver resolver, String key, String value) { ContentValues values = new ContentValues(); diff --git a/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java b/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java index 8ac858d4c1..8aecc8d4f3 100644 --- a/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java @@ -39,7 +39,7 @@ * if certain "experiments" are enabled on the device. */ public class GServicesProvider extends ContentProvider { - public static final Uri CONTENT_URI = Uri.parse("content://com.google.android.gsf.gservices/"); + public static final Uri CONTENT_URI = Uri.parse("content://app.revanced.android.gsf.gservices/"); public static final Uri MAIN_URI = Uri.withAppendedPath(CONTENT_URI, "main"); public static final Uri OVERRIDE_URI = Uri.withAppendedPath(CONTENT_URI, "override"); public static final Uri PREFIX_URI = Uri.withAppendedPath(CONTENT_URI, "prefix"); diff --git a/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt index 1ff998726d..318cbd08bf 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/accountsettings/ui/MainActivity.kt @@ -28,6 +28,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat +import com.google.android.gms.BuildConfig import com.google.android.gms.R import org.microg.gms.accountsettings.ui.bridge.OcAdvertisingIdBridge import org.microg.gms.accountsettings.ui.bridge.OcAndroidIdBridge @@ -334,7 +335,7 @@ class MainActivity : AppCompatActivity() { Log.d(TAG, "updateVerifyNotification: notificationId: $notificationId") if (notificationId == -1) return Intent(ACTION_GCM_NOTIFY_COMPLETE).apply { - setPackage(GMS_PACKAGE_NAME) + setPackage(BuildConfig.APPLICATION_ID) putExtra(EXTRA_NOTIFICATION_ACCOUNT, accountName) }.let { sendBroadcast(it) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/AuthorizationService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/AuthorizationService.kt index 31ac662b19..72f101ac82 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/AuthorizationService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/identity/AuthorizationService.kt @@ -16,6 +16,7 @@ import android.util.Log import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope +import com.google.android.gms.BuildConfig import com.google.android.gms.auth.api.identity.AuthorizationRequest import com.google.android.gms.auth.api.identity.AuthorizationResult import com.google.android.gms.auth.api.identity.ClearTokenRequest @@ -51,7 +52,6 @@ import org.microg.gms.auth.signin.getServerAuthTokenManager import org.microg.gms.auth.signin.performSignIn import org.microg.gms.auth.signin.scopeUris import org.microg.gms.common.AccountUtils -import org.microg.gms.common.Constants import org.microg.gms.common.GmsService import org.microg.gms.common.PackageUtils import java.util.Locale @@ -85,16 +85,6 @@ class AuthorizationServiceImpl(val context: Context, val packageName: String, ov override fun authorize(callback: IAuthorizationCallback?, request: AuthorizationRequest?) { Log.d(TAG, "authorize called, packageName=$packageName request=$request") lifecycleScope.launchWhenStarted { - try { - val result = performAuthorize(request) - Log.d(TAG, "authorize resolved: ${if (result.pendingIntent != null) "pendingIntent" else "silent"}, grantedScopes=${result.grantedScopes.size}") - runCatching { callback?.onAuthorized(Status.SUCCESS, result) } - } catch (e: InvalidAccountException) { - Log.w(TAG, "authorize: invalid account", e) - runCatching { callback?.onAuthorized(Status(CommonStatusCodes.INVALID_ACCOUNT), null) } - } catch (e: Exception) { - Log.w(TAG, "authorize failed, falling back to PendingIntent", e) - runCatching { callback?.onAuthorized(Status.SUCCESS, buildPendingIntentResult(request)) } } } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/KeyRetrievalService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/KeyRetrievalService.kt index b041c75c80..73c5179c47 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/KeyRetrievalService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/folsom/KeyRetrievalService.kt @@ -8,10 +8,6 @@ package org.microg.gms.auth.folsom import android.content.Context import android.os.Parcel import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.google.android.gms.auth.folsom.ProductKey import com.google.android.gms.auth.folsom.RecoveryRequest import com.google.android.gms.auth.folsom.RecoveryResult import com.google.android.gms.auth.folsom.SecurityDomainMember @@ -37,7 +33,6 @@ import com.google.android.gms.common.internal.ConnectionInfo import com.google.android.gms.common.internal.GetServiceRequest import com.google.android.gms.common.internal.IGmsCallbacks import org.microg.gms.BaseService -import org.microg.gms.auth.folsom.utils.LocalKeyManager import org.microg.gms.common.GmsService import org.microg.gms.common.PackageUtils import org.microg.gms.utils.warnOnTransactionIssues @@ -223,95 +218,7 @@ class KeyRetrievalServiceImpl( override fun joinSecurityDomain(callback: IStatusCallback?, accountName: String?, bytes: ByteArray?, type: Int, metadata: ApiMetadata?) { Log.d(TAG, "Not implemented joinSecurityDomain accountName:$accountName type:$type") callback?.onResult(Status.SUCCESS) - } - - override fun resetSecurityDomain(callback: IStatusCallback?, accountName: String?, metadata: ApiMetadata?) { - Log.d(TAG, "Not implemented resetSecurityDomain accountName:$accountName") - callback?.onResult(Status.SUCCESS) - } - - override fun listSecurityDomainMembers(callback: ISecurityDomainMembersCallback?, accountName: String?, metadata: ApiMetadata?) { - if (accountName.isNullOrEmpty()) { - Log.w(TAG, "listSecurityDomainMembers: accountName is null or empty") - callback?.onResult(Status.INTERNAL_ERROR, emptyArray(), metadata ?: ApiMetadata.DEFAULT) - return - } - Log.d(TAG, "listSecurityDomainMembers accountName:$accountName securityDomain:$domainId") - lifecycleScope.launchWhenStarted { - try { - val response = runCatching { - loadSecurityDomainMembers(context, accountName, sessionId, domainId) - }.onFailure { - Log.w(TAG, "listSecurityDomainMembers: load error!", it) - }.getOrNull() - - Log.d(TAG, "listSecurityDomainMembers: response members count=${response?.members?.size ?: 0}") - if (response == null) { - Log.w(TAG, "listSecurityDomainMembers: response is null, domain may not exist") - try { - LocalKeyManager.getInstance(context).clearDomainKeys(accountName, domainId) - Log.d(TAG, "listSecurityDomainMembers: cleared local cache for domain=$domainId") - } catch (e: Exception) { - Log.w(TAG, "listSecurityDomainMembers: failed to clear cache", e) - } - callback?.onResult(Status.SUCCESS, emptyArray(), ApiMetadata.DEFAULT) - return@launchWhenStarted - } - - val memberList = response.members.map { member -> - SecurityDomainMember( - member.memberType ?: 0, member.memberMetadata?.encode() ?: byteArrayOf() - ) - }.toTypedArray() - - Log.d(TAG, "listSecurityDomainMembers: returning ${memberList.size} members") - callback?.onResult(Status.SUCCESS, memberList, ApiMetadata.DEFAULT) - } catch (e: Exception) { - Log.e(TAG, "listSecurityDomainMembers failed", e) - callback?.onResult(Status.INTERNAL_ERROR, emptyArray(), ApiMetadata.DEFAULT) - } - } - } - override fun getDomainState(callback: IByteArrayCallback?, accountName: String?, metadata: ApiMetadata?) { - if (accountName.isNullOrEmpty()) { - Log.w(TAG, "getDomainState: accountName is null or empty") - callback?.onResult(Status.INTERNAL_ERROR, byteArrayOf(), ApiMetadata.DEFAULT) - return - } - Log.d(TAG, "getDomainState accountName:$accountName securityDomain:$domainId") - lifecycleScope.launchWhenStarted { - try { - val localKeyManager = LocalKeyManager.getInstance(context) - try { - localKeyManager.updateLastFetchTimestamp(accountName, domainId, 0L) - Log.d(TAG, "getDomainState: reset fetch timestamp") - } catch (e: Exception) { - Log.w(TAG, "getDomainState: failed to reset timestamp, continuing", e) - } - var serverState: GetSecurityDomainResponse? = null - var membersResponse: ListSecurityDomainMembersResponse? = null - try { - serverState = getSecurityDomain(context, accountName, sessionId, domainId) - membersResponse = loadSecurityDomainMembers(context, accountName, sessionId, domainId) - Log.d(TAG, "getDomainState: serverState=$serverState, members=${membersResponse.members.size}") - } catch (e: Exception) { - Log.e(TAG, "getDomainState: failed to sync domain state", e) - } - val computedState = localKeyManager.computeDomainStatus(accountName, domainId, serverState, membersResponse).also { - localKeyManager.setDomainStatus(accountName, domainId, it) - localKeyManager.updateLastFetchTimestamp(accountName, domainId, System.currentTimeMillis()) - } - Log.d(TAG, "getDomainState: computedState=$computedState") - val responseBytes = serializeDomainStateResponse(computedState.code) - Log.d(TAG, "getDomainState: returning state=$computedState") - callback?.onResult(Status.SUCCESS, responseBytes, ApiMetadata.DEFAULT) - } catch (e: Exception) { - Log.e(TAG, "getDomainState failed", e) - val errorResponse = serializeDomainStateResponse(DomainStatus.UNKNOWN_ERROR.code) - callback?.onResult(Status.INTERNAL_ERROR, errorResponse, ApiMetadata.DEFAULT) - } - } } override fun startUxFlow(callback: IKeyRetrievalCallback?, accountName: String?, type: Int, metadata: ApiMetadata?) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt index a4be92ce34..863d31af04 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/AssistedSignInActivity.kt @@ -9,6 +9,7 @@ import android.content.Intent import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity +import com.google.android.gms.BuildConfig import com.google.android.gms.R import com.google.android.gms.auth.api.identity.BeginSignInRequest import com.google.android.gms.auth.api.identity.GetSignInIntentRequest @@ -20,7 +21,6 @@ import com.google.android.gms.common.api.CommonStatusCodes import com.google.android.gms.common.api.Status import com.google.android.gms.common.internal.safeparcel.SafeParcelableSerializer import org.microg.gms.auth.AuthConstants -import org.microg.gms.common.Constants const val ACTION_ASSISTED_SIGN_IN = "com.google.android.gms.auth.api.credentials.ASSISTED_SIGNIN" const val GET_SIGN_IN_INTENT_REQUEST = "get_sign_in_intent_request" @@ -98,7 +98,7 @@ class AssistedSignInActivity : AppCompatActivity() { Log.d(TAG, "prepareSignIn options:$googleSignInOptions") val signInConfiguration = SignInConfiguration(clientPackageName!!, googleSignInOptions!!) val intent = Intent(this, AuthSignInActivity::class.java).apply { - `package` = Constants.GMS_PACKAGE_NAME + `package` = BuildConfig.APPLICATION_ID putExtra("config", signInConfiguration) putExtra("nonce", signInIntentRequest?.nonce) } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/credential/CredentialManagerService.kt b/play-services-core/src/main/kotlin/org/microg/gms/credential/CredentialManagerService.kt index f354349108..7305599027 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/credential/CredentialManagerService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/credential/CredentialManagerService.kt @@ -15,6 +15,7 @@ import androidx.core.app.PendingIntentCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope +import com.google.android.gms.BuildConfig import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.Feature import com.google.android.gms.common.api.Status @@ -29,7 +30,6 @@ import com.google.android.gms.credential.manager.common.ISettingsCallback import com.google.android.gms.credential.manager.firstparty.internal.ICredentialManagerService import com.google.android.gms.credential.manager.invocationparams.CredentialManagerInvocationParams import org.microg.gms.BaseService -import org.microg.gms.common.Constants import org.microg.gms.common.GmsService import org.microg.gms.common.GooglePackagePermission import org.microg.gms.common.PackageUtils @@ -63,7 +63,7 @@ private class CredentialManagerServiceImpl(private val context: Context, overrid lifecycleScope.launchWhenStarted { runCatching { val intent = Intent().apply { - setClassName(Constants.GMS_PACKAGE_NAME, PASSWORD_MANAGER_CLASS_NAME) + setClassName(BuildConfig.APPLICATION_ID, PASSWORD_MANAGER_CLASS_NAME) putExtra(EXTRA_KEY_ACCOUNT_NAME, params.account.name) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt index e92d36ff99..4bb9bd9e72 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/games/GamesService.kt @@ -22,7 +22,6 @@ import androidx.core.os.bundleOf import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope -import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.Scopes import com.google.android.gms.common.api.CommonStatusCodes @@ -52,8 +51,6 @@ import org.microg.gms.auth.AuthConstants import org.microg.gms.auth.AuthManager import org.microg.gms.auth.AuthPrefs import org.microg.gms.auth.signin.checkAccountAuthStatus -import org.microg.gms.auth.signin.getServerAuthTokenManager -import org.microg.gms.common.Constants import org.microg.gms.common.GmsService import org.microg.gms.common.PackageUtils import org.microg.gms.games.achievements.AchievementsApiClient @@ -587,7 +584,7 @@ class GamesServiceImpl(val context: Context, override val lifecycle: Lifecycle, private fun getGamesIntent(action: String, block: Intent.() -> Unit = {}) = Intent(action).apply { // Jump to internal page implementation - setPackage(Constants.GMS_PACKAGE_NAME) + setPackage(BuildConfig.APPLICATION_ID) putExtra(EXTRA_ACCOUNT_KEY, Integer.toHexString(account.name.hashCode())) putExtra(EXTRA_GAME_PACKAGE_NAME, packageName) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamesUiFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamesUiFragment.kt index 1f25fb1b77..e68b3bc013 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamesUiFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/games/ui/GamesUiFragment.kt @@ -28,6 +28,7 @@ import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.gms.BuildConfig import com.google.android.gms.R import com.google.android.gms.common.Scopes import com.google.android.gms.games.snapshot.SnapshotMetadataEntity @@ -41,7 +42,6 @@ import kotlinx.coroutines.withContext import org.microg.gms.auth.AuthConstants import org.microg.gms.auth.AuthManager import org.microg.gms.auth.signin.SignInConfigurationService -import org.microg.gms.common.Constants import org.microg.gms.games.ACTION_VIEW_ACHIEVEMENTS import org.microg.gms.games.ACTION_VIEW_LEADERBOARDS import org.microg.gms.games.ACTION_VIEW_LEADERBOARDS_SCORES @@ -348,7 +348,7 @@ class GamesUiFragment : BottomSheetDialogFragment() { } }?.adapter = LeaderboardsAdapter(context, loadLeaderboards) { leaderboard -> val intent = Intent(ACTION_VIEW_LEADERBOARDS_SCORES) - intent.setPackage(Constants.GMS_PACKAGE_NAME) + intent.setPackage(BuildConfig.APPLICATION_ID) intent.putExtra(EXTRA_GAME_PACKAGE_NAME, clientPackageName) intent.putExtra(EXTRA_ACCOUNT_KEY, Integer.toHexString(currentAccount?.name.hashCode())) intent.putExtra(EXTRA_LEADERBOARD_ID, leaderboard.id) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmInGmsService.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmInGmsService.kt index 176644145b..19c7ee4fa1 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmInGmsService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmInGmsService.kt @@ -69,7 +69,7 @@ class GcmInGmsService : LifecycleService() { handleIntent(intent) } else { val intent = Intent(ACTION_GCM_RECONNECT).apply { - setPackage(Constants.GMS_PACKAGE_NAME) + setPackage(BuildConfig.APPLICATION_ID) } sendBroadcast(intent) } @@ -117,7 +117,7 @@ class GcmInGmsService : LifecycleService() { } } } - + private suspend fun updateGroupsWithAccount(account: Account, regId: String) { Log.d(TAG, "updateGroupsWithAccount: account: ${account.name}") val authManager = AuthManager(this, account.name, Constants.GMS_PACKAGE_NAME, GMS_GCM_OAUTH_SERVICE).apply { @@ -134,9 +134,9 @@ class GcmInGmsService : LifecycleService() { } Log.d(TAG, "updateGroupsWithAccount extras: $extras") val intent = Intent(GcmConstants.ACTION_GCM_SEND).apply { - setPackage(Constants.GMS_PACKAGE_NAME) + setPackage(BuildConfig.APPLICATION_ID) putExtras(extras) - putExtra(GcmConstants.EXTRA_APP, Intent().apply { setPackage(Constants.GMS_PACKAGE_NAME) }.let { PendingIntentCompat.getBroadcast(this@GcmInGmsService, 0, it, 0, false) }) + putExtra(GcmConstants.EXTRA_APP, Intent().apply { setPackage(BuildConfig.APPLICATION_ID) }.let { PendingIntentCompat.getBroadcast(this@GcmInGmsService, 0, it, 0, false) }) }.also { it.putExtra(GcmConstants.EXTRA_MESSENGER, Messenger(object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { @@ -212,7 +212,7 @@ class GcmInGmsService : LifecycleService() { } else { Log.d(TAG, "registerGcmInGms: sendBroadcast: ${intent.action}") Intent(intent.action).apply { - setPackage(Constants.GMS_PACKAGE_NAME) + setPackage(BuildConfig.APPLICATION_ID) putExtras(intent) }.let { sendBroadcast(it) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsRegistrationHelper.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsRegistrationHelper.kt index 235fddcee4..c7feae3ece 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsRegistrationHelper.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/registeration/ChimeGmsRegistrationHelper.kt @@ -12,6 +12,7 @@ import android.os.LocaleList import android.util.Log import androidx.core.app.NotificationManagerCompat import androidx.core.content.edit +import com.google.android.gms.BuildConfig import google.internal.notifications.v1.AppBlockState import google.internal.notifications.v1.AppRegistration import google.internal.notifications.v1.AppRegistrationContainer @@ -130,7 +131,7 @@ class ChimeGmsRegistrationHelper(val context: Context) { private fun buildDeviceContext() = GmsDeviceContext.build { languageTag = if (SDK_INT >= 24) LocaleList.getDefault().get(0).toLanguageTag() else Locale.getDefault().language gmsDeviceProfile = GmsDeviceProfile.build { - val packageInfo = context.packageManager.getPackageInfo(Constants.GMS_PACKAGE_NAME, 0) + val packageInfo = context.packageManager.getPackageInfo(BuildConfig.APPLICATION_ID, 0) density = context.resources.displayMetrics.density versionName = packageInfo.versionName release = Build.VERSION.RELEASE diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/AccountsFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/AccountsFragment.kt index aff7807ad8..fd2c8619b1 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/AccountsFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/AccountsFragment.kt @@ -21,11 +21,11 @@ import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.TwoStatePreference +import com.google.android.gms.BuildConfig import com.google.android.gms.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.microg.gms.auth.AuthConstants -import org.microg.gms.common.Constants import org.microg.gms.gcm.ACTION_GCM_CONNECTED import org.microg.gms.gcm.ACTION_GCM_REGISTER_ALL_ACCOUNTS import org.microg.gms.people.DatabaseHelper @@ -68,7 +68,7 @@ class AccountsFragment : PreferenceFragmentCompat() { private fun registerGcmInGms() { Intent(ACTION_GCM_REGISTER_ALL_ACCOUNTS).apply { - `package` = Constants.GMS_PACKAGE_NAME + `package` = BuildConfig.APPLICATION_ID }.let { requireContext().sendBroadcast(it) } } diff --git a/play-services-core/src/main/res/xml/authenticator.xml b/play-services-core/src/main/res/xml/authenticator.xml index 16c7aea522..929b2cb414 100644 --- a/play-services-core/src/main/res/xml/authenticator.xml +++ b/play-services-core/src/main/res/xml/authenticator.xml @@ -16,7 +16,7 @@ \ No newline at end of file diff --git a/play-services-core/src/main/res/xml/preferences_accounts.xml b/play-services-core/src/main/res/xml/preferences_accounts.xml index d20d886cd6..53aba14a93 100644 --- a/play-services-core/src/main/res/xml/preferences_accounts.xml +++ b/play-services-core/src/main/res/xml/preferences_accounts.xml @@ -17,7 +17,7 @@ android:title="@string/pref_add_account_summary"> + android:targetPackage="@string/package_id" /> - + diff --git a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java index 1df70bccb0..c134263288 100644 --- a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java +++ b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java @@ -46,7 +46,7 @@ * + * android:permission="app.revanced.android.c2dm.permission.SEND" > * * * diff --git a/play-services-iid/src/main/AndroidManifest.xml b/play-services-iid/src/main/AndroidManifest.xml index 5a3b72361e..bc0701cf8c 100644 --- a/play-services-iid/src/main/AndroidManifest.xml +++ b/play-services-iid/src/main/AndroidManifest.xml @@ -7,6 +7,6 @@ - + diff --git a/play-services-maps/core/mapbox/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java b/play-services-maps/core/mapbox/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java index 0041f0638b..ff15b6b0c1 100644 --- a/play-services-maps/core/mapbox/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java +++ b/play-services-maps/core/mapbox/src/main/java/com/google/android/gms/maps/internal/CreatorImpl.java @@ -29,6 +29,7 @@ import com.google.android.gms.maps.GoogleMapOptions; import com.google.android.gms.maps.StreetViewPanoramaOptions; import com.google.android.gms.maps.model.internal.IBitmapDescriptorFactoryDelegate; +import com.mapbox.mapboxsdk.LibraryLoader; import org.microg.gms.maps.mapbox.CameraUpdateFactoryImpl; import org.microg.gms.maps.mapbox.MapFragmentImpl; @@ -36,6 +37,8 @@ import org.microg.gms.maps.mapbox.StreetViewPanoramaFragmentImpl; import org.microg.gms.maps.mapbox.StreetViewPanoramaViewImpl; import org.microg.gms.maps.mapbox.model.BitmapDescriptorFactoryImpl; +import org.microg.gms.maps.mapbox.utils.MapContext; +import org.microg.gms.maps.mapbox.utils.MultiArchLoader; @Keep public class CreatorImpl extends ICreator.Stub { @@ -68,8 +71,14 @@ public IBitmapDescriptorFactoryDelegate newBitmapDescriptorFactoryDelegate() { @Override public void initV2(IObjectWrapper resources, int flags) { - BitmapDescriptorFactoryImpl.INSTANCE.initialize(ObjectWrapper.unwrapTyped(resources, Resources.class), null); - //ResourcesContainer.set((Resources) ObjectWrapper.unwrap(resources)); + Resources mapResources = ObjectWrapper.unwrapTyped(resources, Resources.class); + ClassLoader moduleClassLoader = CreatorImpl.class.getClassLoader(); + if (moduleClassLoader == null) { + throw new IllegalStateException("Mapbox backend class loader is not available"); + } + BitmapDescriptorFactoryImpl.INSTANCE.initialize(mapResources, null); + MapContext.setModuleResources(mapResources); + LibraryLoader.setLibraryLoader(new MultiArchLoader(moduleClassLoader)); Log.d(TAG, "initV2 " + flags); } diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt index 8dff38050b..57090643ba 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/GoogleMap.kt @@ -36,7 +36,6 @@ import com.google.android.gms.maps.internal.* import com.google.android.gms.maps.model.* import com.google.android.gms.maps.model.CircleOptions import com.google.android.gms.maps.model.internal.* -import com.mapbox.mapboxsdk.LibraryLoader import com.mapbox.mapboxsdk.Mapbox import com.mapbox.mapboxsdk.R import com.mapbox.mapboxsdk.camera.CameraUpdate @@ -60,7 +59,6 @@ import com.mapbox.mapboxsdk.camera.CameraUpdateFactory import com.mapbox.mapboxsdk.location.engine.* import com.mapbox.mapboxsdk.maps.OnMapReadyCallback import org.microg.gms.maps.mapbox.model.* -import org.microg.gms.maps.mapbox.utils.MultiArchLoader import org.microg.gms.maps.mapbox.utils.toGms import org.microg.gms.maps.mapbox.utils.toMapbox import java.util.concurrent.atomic.AtomicBoolean @@ -132,7 +130,6 @@ class GoogleMapImpl(context: Context, var options: GoogleMapOptions) : AbstractG init { BitmapDescriptorFactoryImpl.initialize(mapContext.resources, context.resources) - LibraryLoader.setLibraryLoader(MultiArchLoader(mapContext, context)) runOnMainLooper { Mapbox.getInstance(mapContext, BuildConfig.MAPBOX_KEY, WellKnownTileServer.Mapbox) } diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt index f889239647..7130f5f4ee 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MapContext.kt @@ -20,12 +20,14 @@ import android.content.Context import android.content.ContextWrapper import android.content.Intent import android.content.SharedPreferences +import android.content.res.AssetManager +import android.content.res.Resources import android.view.LayoutInflater -import org.microg.gms.common.Constants import java.io.File -class MapContext(private val context: Context) : ContextWrapper(context.createPackageContext(Constants.GMS_PACKAGE_NAME, Context.CONTEXT_INCLUDE_CODE or Context.CONTEXT_IGNORE_SECURITY)) { +class MapContext(private val context: Context) : ContextWrapper(context) { private var layoutInflater: LayoutInflater? = null + private var theme: Resources.Theme? = null private val appContext: Context get() = context.applicationContext ?: context @@ -49,6 +51,21 @@ class MapContext(private val context: Context) : ContextWrapper(context.createPa return appContext.packageName } + override fun getResources(): Resources { + return getModuleResources() + } + + override fun getAssets(): AssetManager { + return resources.assets + } + + override fun getTheme(): Resources.Theme { + return theme ?: resources.newTheme().also { + it.setTo(context.theme) + theme = it + } + } + override fun getClassLoader(): ClassLoader { return MapContext::class.java.classLoader!! } @@ -76,6 +93,17 @@ class MapContext(private val context: Context) : ContextWrapper(context.createPa } companion object { + private var moduleResources: Resources? = null + + @JvmStatic + fun setModuleResources(resources: Resources) { + moduleResources = resources + } + + private fun getModuleResources(): Resources { + return moduleResources ?: throw IllegalStateException("Resources have not been initialized") + } + val TAG = "GmsMapContext" } } diff --git a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MultiArchLoader.kt b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MultiArchLoader.kt index 5a37a6d83c..e352879f6a 100644 --- a/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MultiArchLoader.kt +++ b/play-services-maps/core/mapbox/src/main/kotlin/org/microg/gms/maps/mapbox/utils/MultiArchLoader.kt @@ -17,45 +17,17 @@ package org.microg.gms.maps.mapbox.utils import android.annotation.SuppressLint -import android.content.Context -import android.content.pm.ApplicationInfo import android.util.Log import com.mapbox.mapboxsdk.LibraryLoader -import org.microg.gms.common.Constants -import org.microg.gms.common.PackageUtils -import java.io.* -import java.util.zip.ZipFile +import dalvik.system.BaseDexClassLoader -class MultiArchLoader(private val mapContext: Context, private val appContext: Context) : LibraryLoader() { +class MultiArchLoader(private val moduleClassLoader: ClassLoader) : LibraryLoader() { @SuppressLint("UnsafeDynamicallyLoadedCode") override fun load(name: String) { try { - val otherAppInfo = mapContext.packageManager.getApplicationInfo(appContext.packageName, 0) - var primaryCpuAbi = ApplicationInfo::class.java.getField("primaryCpuAbi").get(otherAppInfo) as String? - if (primaryCpuAbi == "armeabi") { - primaryCpuAbi = "armeabi-v7a" - } - if (primaryCpuAbi != null) { - val path = "lib/$primaryCpuAbi/lib$name.so" - val cacheFile = File("${appContext.cacheDir.absolutePath}/.gmscore/$path") - cacheFile.parentFile?.mkdirs() - val cacheFileStamp = File("${appContext.cacheDir.absolutePath}/.gmscore/$path.stamp") - val cacheVersion = kotlin.runCatching { cacheFileStamp.readText() }.getOrNull() - // TODO: Use better version indicator - val mapVersion = PackageUtils.versionName(mapContext, Constants.GMS_PACKAGE_NAME) - val apkFile = File(mapContext.packageCodePath) - if (!cacheFile.exists() || cacheVersion == null || cacheVersion != mapVersion) { - val zipFile = ZipFile(apkFile) - val entry = zipFile.getEntry(path) - if (entry != null) { - copyInputStream(zipFile.getInputStream(entry), FileOutputStream(cacheFile)) - } else { - Log.d(TAG, "Can't load native library: $path does not exist in $apkFile") - } - cacheFileStamp.writeText(mapVersion.toString()) - } - Log.d(TAG, "Loading $name from ${cacheFile.getPath()}") - System.load(cacheFile.absolutePath) + findLibrary(name)?.let { path -> + Log.d(TAG, "Loading $name from $path") + System.load(path) return } } catch (e: Exception) { @@ -65,17 +37,8 @@ class MultiArchLoader(private val mapContext: Context, private val appContext: C System.loadLibrary(name) } - @Throws(IOException::class) - private fun copyInputStream(inp: InputStream, out: OutputStream) { - val buffer = ByteArray(1024) - var len: Int = inp.read(buffer) - while (len >= 0) { - out.write(buffer, 0, len) - len = inp.read(buffer) - } - - inp.close() - out.close() + private fun findLibrary(name: String): String? { + return (moduleClassLoader as? BaseDexClassLoader)?.findLibrary(name) } companion object { diff --git a/play-services-nearby/core/package/src/main/AndroidManifest.xml b/play-services-nearby/core/package/src/main/AndroidManifest.xml index 4a226e637e..774894816c 100644 --- a/play-services-nearby/core/package/src/main/AndroidManifest.xml +++ b/play-services-nearby/core/package/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ diff --git a/play-services-nearby/core/src/main/AndroidManifest.xml b/play-services-nearby/core/src/main/AndroidManifest.xml index 9f215f0125..e09a099592 100644 --- a/play-services-nearby/core/src/main/AndroidManifest.xml +++ b/play-services-nearby/core/src/main/AndroidManifest.xml @@ -5,7 +5,7 @@ - + diff --git a/play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Constants.kt b/play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Constants.kt index 2f4293842e..ab1a6d93e3 100644 --- a/play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Constants.kt +++ b/play-services-nearby/core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/Constants.kt @@ -33,7 +33,7 @@ const val CONFIRM_ACTION_STOP = "stop" const val CONFIRM_ACTION_KEYS = "keys" const val CONFIRM_PERMISSION_VALIDITY = 60 * 60 * 1000L -const val PERMISSION_EXPOSURE_CALLBACK = "com.google.android.gms.nearby.exposurenotification.EXPOSURE_CALLBACK" +const val PERMISSION_EXPOSURE_CALLBACK = "app.revanced.android.gms.nearby.exposurenotification.EXPOSURE_CALLBACK" const val TX_POWER_LOW = -15 diff --git a/play-services-nearby/src/main/AndroidManifest.xml b/play-services-nearby/src/main/AndroidManifest.xml index 61148a1ad9..fb6874fffa 100644 --- a/play-services-nearby/src/main/AndroidManifest.xml +++ b/play-services-nearby/src/main/AndroidManifest.xml @@ -8,6 +8,6 @@ + android:permission="app.revanced.android.gms.nearby.exposurenotification.EXPOSURE_CALLBACK"/> diff --git a/play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationClient.java b/play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationClient.java index b703d718d5..41567c9afa 100644 --- a/play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationClient.java +++ b/play-services-nearby/src/main/java/com/google/android/gms/nearby/exposurenotification/ExposureNotificationClient.java @@ -248,7 +248,7 @@ public interface ExposureNotificationClient extends HasApiKey *
  • {@code com.google.android.gms.exposurenotification.ACTION_EXPOSURE_STATE_UPDATED}
  • * - * This receiver should also be guarded by the {@code com.google.android.gms.nearby.exposurenotification.EXPOSURE_CALLBACK} permission so that other apps are not able to fake this broadcast. + * This receiver should also be guarded by the {@code app.revanced.android.gms.nearby.exposurenotification.EXPOSURE_CALLBACK} permission so that other apps are not able to fake this broadcast. */ Task start(); diff --git a/vending-app/src/main/AndroidManifest.xml b/vending-app/src/main/AndroidManifest.xml index 97b1f65042..3975c9d825 100644 --- a/vending-app/src/main/AndroidManifest.xml +++ b/vending-app/src/main/AndroidManifest.xml @@ -28,7 +28,7 @@ tools:ignore="ProtectedPermissions" /> - + diff --git a/vending-app/src/main/java/org/microg/vending/billing/GServices.kt b/vending-app/src/main/java/org/microg/vending/billing/GServices.kt index 60b151324d..309e3d95c5 100644 --- a/vending-app/src/main/java/org/microg/vending/billing/GServices.kt +++ b/vending-app/src/main/java/org/microg/vending/billing/GServices.kt @@ -5,7 +5,7 @@ import android.net.Uri // TODO: Move object GServices { - private val CONTENT_URI: Uri = Uri.parse("content://com.google.android.gsf.gservices") + private val CONTENT_URI: Uri = Uri.parse("content://app.revanced.android.gsf.gservices") fun getString(resolver: ContentResolver, key: String, defaultValue: String?): String? { var result = defaultValue