From 012c2ffc89d1a4a14b99e32ed01f3e26145326e9 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 13 Jul 2021 19:17:42 +0530 Subject: [PATCH 01/12] SettingsProvider: Remove logs * This is really spammy! Change-Id: If1b9cbaa50bf8af37ca7146c6f510ad6875bab35 --- .../org/microg/gms/settings/SettingsProvider.kt | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt b/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt index f635539c..9d39376d 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt @@ -8,7 +8,6 @@ import android.content.SharedPreferences import android.database.Cursor import android.database.MatrixCursor import android.net.Uri -import android.util.Log import androidx.preference.PreferenceManager import org.microg.gms.common.PackageUtils.warnIfNotMainProcess import org.microg.gms.settings.SettingsContract.AUTHORITY @@ -101,8 +100,6 @@ class SettingsProvider : ContentProvider() { } val editor = checkInPrefs.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "check-in update: $key = $value") if (key == CheckIn.ENABLED) { // special case: not saved in checkInPrefs updateCheckInEnabled(value as Boolean) @@ -150,8 +147,6 @@ class SettingsProvider : ContentProvider() { if (values.size() == 0) return val editor = preferences.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "gcm update: $key = $value") when (key) { Gcm.ENABLE_GCM -> editor.putBoolean(key, value as Boolean) Gcm.FULL_LOG -> editor.putBoolean(key, value as Boolean) @@ -186,8 +181,6 @@ class SettingsProvider : ContentProvider() { if (values.size() == 0) return val editor = preferences.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "auth update: $key = $value") when (key) { Auth.TRUST_GOOGLE -> editor.putBoolean(key, value as Boolean) Auth.VISIBLE -> editor.putBoolean(key, value as Boolean) @@ -209,8 +202,6 @@ class SettingsProvider : ContentProvider() { if (values.size() == 0) return val editor = preferences.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "exposure update: $key = $value") when (key) { Exposure.SCANNER_ENABLED -> editor.putBoolean(key, value as Boolean) Exposure.LAST_CLEANUP -> editor.putLong(key, value as Long) @@ -225,10 +216,7 @@ class SettingsProvider : ContentProvider() { valueGetter: (String) -> Any ): MatrixCursor { val row = newRow() - for (key in p) row.add(valueGetter.invoke(key).apply { - // TODO remove log - Log.e("TEST", "$key = $this") - }) + for (key in p) row.add(valueGetter.invoke(key)) return this } From 985f0aea5a37f4c011f92565abfe6fd68f7aadac Mon Sep 17 00:00:00 2001 From: Francesco Saltori Date: Wed, 21 Jul 2021 21:43:16 +0200 Subject: [PATCH 02/12] Remove outdated log message --- .../exposurenotification/ExposureNotificationServiceImpl.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt index 09f8e2d7..f8bbfb12 100644 --- a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt +++ b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt @@ -622,7 +622,6 @@ class ExposureNotificationServiceImpl(private val context: Context, private val } override fun getStatus(params: GetStatusParams) { - Log.w(TAG, "Not yet implemented: getStatus") lifecycleScope.launchSafely { val isAuthorized = ExposureDatabase.with(context) { database -> database.noteAppAction(packageName, "getStatus") From 1d747f6a83e95c8b37768e92984766a790bd8415 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Thu, 19 Aug 2021 03:34:40 +0530 Subject: [PATCH 03/12] Add Stadia to known Google packages Change-Id: Ie70cde85e398dc5eed13fc2294f78088661a743a --- .../src/main/java/org/microg/gms/common/PackageUtils.java | 1 + 1 file changed, 1 insertion(+) 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 368e1905..4abbcd2a 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 @@ -69,6 +69,7 @@ public class PackageUtils { KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.nbu.paisa.user", "80df78bb700f9172bc671779b017ddefefcbf552"); KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.dynamite", "519c5a17a60596e6fe5933b9cb4285e7b0e5eb7b"); KNOWN_GOOGLE_PACKAGES.put("com.google.android.projection.gearhead", "9ca91f9e704d630ef67a23f52bf1577a92b9ca5d"); + KNOWN_GOOGLE_PACKAGES.put("com.google.stadia.android", "133aad3b3d3b580e286573c37f20549f9d3d1cce"); } public static boolean isGooglePackage(Context context, String packageName) { From a0558a5f38fc1e85bf16ccba9a528d1bf982d35a Mon Sep 17 00:00:00 2001 From: Christian Grigis Date: Thu, 15 Jul 2021 18:07:00 +0200 Subject: [PATCH 04/12] EN: Fix permission granting on Android 11 --- .../ui/ExposureNotificationsConfirmActivity.kt | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/play-services-nearby-core-ui/src/main/kotlin/org/microg/gms/nearby/core/ui/ExposureNotificationsConfirmActivity.kt b/play-services-nearby-core-ui/src/main/kotlin/org/microg/gms/nearby/core/ui/ExposureNotificationsConfirmActivity.kt index 6ec05250..dc106094 100644 --- a/play-services-nearby-core-ui/src/main/kotlin/org/microg/gms/nearby/core/ui/ExposureNotificationsConfirmActivity.kt +++ b/play-services-nearby-core-ui/src/main/kotlin/org/microg/gms/nearby/core/ui/ExposureNotificationsConfirmActivity.kt @@ -118,14 +118,26 @@ class ExposureNotificationsConfirmActivity : AppCompatActivity() { } private fun requestPermissions() { - if (Build.VERSION.SDK_INT >= 23) { - requestPermissions(permissions, ++permissionRequestCode) + when { + Build.VERSION.SDK_INT >= 30 -> requestPermissions( + permissions.toSet().minus("android.permission.ACCESS_BACKGROUND_LOCATION").toTypedArray(), ++permissionRequestCode + ) + Build.VERSION.SDK_INT >= 23 -> requestPermissions(permissions, ++permissionRequestCode) } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == this.permissionRequestCode) checkPermissions() + if (requestCode == this.permissionRequestCode) { + when { + Build.VERSION.SDK_INT >= 30 && permissions.contains("android.permission.ACCESS_FINE_LOCATION") -> + requestPermissions( + arrayOf("android.permission.ACCESS_BACKGROUND_LOCATION"), + ++permissionRequestCode + ) + else -> checkPermissions() + } + } } // Bluetooth From d707288ec9e515943ffffa37aa5d8c8c18834a61 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Thu, 1 Jul 2021 22:44:55 +0200 Subject: [PATCH 05/12] Settings: Make provider package dependent and move to core --- play-services-base-core/build.gradle | 6 ++++ .../src/main/AndroidManifest.xml | 9 ++++-- .../microg/gms/settings/SettingsContract.kt | 29 +++++++++++-------- .../microg/gms/settings/SettingsProvider.kt | 27 ++++++++++------- .../src/main/AndroidManifest.xml | 7 ----- .../kotlin/org/microg/gms/auth/AuthPrefs.kt | 4 +-- .../org/microg/gms/checkin/CheckinPrefs.kt | 2 +- .../org/microg/gms/checkin/LastCheckinInfo.kt | 6 ++-- .../org/microg/gms/checkin/ServiceInfo.kt | 4 +-- .../kotlin/org/microg/gms/gcm/GcmPrefs.kt | 20 ++++++------- .../ExposurePreferences.kt | 10 +++---- 11 files changed, 69 insertions(+), 55 deletions(-) rename {play-services-basement => play-services-base-core}/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt (73%) rename {play-services-core => play-services-base-core}/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt (90%) diff --git a/play-services-base-core/build.gradle b/play-services-base-core/build.gradle index 6bc36bec..b9262817 100644 --- a/play-services-base-core/build.gradle +++ b/play-services-base-core/build.gradle @@ -4,6 +4,7 @@ */ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' apply plugin: 'maven-publish' apply plugin: 'signing' @@ -12,6 +13,7 @@ dependencies { api "androidx.lifecycle:lifecycle-service:$lifecycleVersion" implementation "androidx.annotation:annotation:$annotationVersion" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" } android { @@ -24,6 +26,10 @@ android { targetSdkVersion androidTargetSdk } + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/play-services-base-core/src/main/AndroidManifest.xml b/play-services-base-core/src/main/AndroidManifest.xml index 13255d7c..9ae3d128 100644 --- a/play-services-base-core/src/main/AndroidManifest.xml +++ b/play-services-base-core/src/main/AndroidManifest.xml @@ -3,7 +3,12 @@ ~ SPDX-FileCopyrightText: 2020, microG Project Team ~ SPDX-License-Identifier: Apache-2.0 --> - + - + + + diff --git a/play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt similarity index 73% rename from play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt rename to play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt index 53a2ea0f..1287c3ea 100644 --- a/play-services-basement/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt +++ b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsContract.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + package org.microg.gms.settings import android.content.ContentValues @@ -7,13 +12,13 @@ import android.net.Uri import android.os.Binder object SettingsContract { - const val AUTHORITY = "org.microg.gms.settings" - val AUTHORITY_URI: Uri = Uri.parse("content://$AUTHORITY") + fun getAuthority(context: Context) = "${context.packageName}.microg.settings" + fun getAuthorityUri(context: Context): Uri = Uri.parse("content://${getAuthority(context)}") object CheckIn { private const val id = "check-in" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val ENABLED = "checkin_enable_service" const val ANDROID_ID = "androidId" @@ -38,8 +43,8 @@ object SettingsContract { object Gcm { private const val id = "gcm" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val FULL_LOG = "gcm_full_log" const val LAST_PERSISTENT_ID = "gcm_last_persistent_id" @@ -72,8 +77,8 @@ object SettingsContract { object Auth { private const val id = "auth" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val TRUST_GOOGLE = "auth_manager_trust_google" const val VISIBLE = "auth_manager_visible" @@ -86,8 +91,8 @@ object SettingsContract { object Exposure { private const val id = "exposureNotification" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val SCANNER_ENABLED = "exposure_scanner_enabled" const val LAST_CLEANUP = "exposure_last_cleanup" @@ -100,8 +105,8 @@ object SettingsContract { object SafetyNet { private const val id = "safety-net" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" } private fun withoutCallingIdentity(f: () -> T): T { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt similarity index 90% rename from play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt rename to play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt index 9d39376d..b59da582 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt +++ b/play-services-base-core/src/main/kotlin/org/microg/gms/settings/SettingsProvider.kt @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + package org.microg.gms.settings import android.content.ContentProvider @@ -8,13 +13,13 @@ import android.content.SharedPreferences import android.database.Cursor import android.database.MatrixCursor import android.net.Uri -import androidx.preference.PreferenceManager +import android.preference.PreferenceManager import org.microg.gms.common.PackageUtils.warnIfNotMainProcess -import org.microg.gms.settings.SettingsContract.AUTHORITY import org.microg.gms.settings.SettingsContract.Auth import org.microg.gms.settings.SettingsContract.CheckIn import org.microg.gms.settings.SettingsContract.Exposure import org.microg.gms.settings.SettingsContract.Gcm +import org.microg.gms.settings.SettingsContract.getAuthority import java.io.File /** @@ -52,10 +57,10 @@ class SettingsProvider : ContentProvider() { selectionArgs: Array?, sortOrder: String? ): Cursor? = when (uri) { - CheckIn.CONTENT_URI -> queryCheckIn(projection ?: CheckIn.PROJECTION) - Gcm.CONTENT_URI -> queryGcm(projection ?: Gcm.PROJECTION) - Auth.CONTENT_URI -> queryAuth(projection ?: Auth.PROJECTION) - Exposure.CONTENT_URI -> queryExposure(projection ?: Exposure.PROJECTION) + CheckIn.getContentUri(context!!) -> queryCheckIn(projection ?: CheckIn.PROJECTION) + Gcm.getContentUri(context!!) -> queryGcm(projection ?: Gcm.PROJECTION) + Auth.getContentUri(context!!) -> queryAuth(projection ?: Auth.PROJECTION) + Exposure.getContentUri(context!!) -> queryExposure(projection ?: Exposure.PROJECTION) else -> null } @@ -68,10 +73,10 @@ class SettingsProvider : ContentProvider() { warnIfNotMainProcess(context, this.javaClass) if (values == null) return 0 when (uri) { - CheckIn.CONTENT_URI -> updateCheckIn(values) - Gcm.CONTENT_URI -> updateGcm(values) - Auth.CONTENT_URI -> updateAuth(values) - Exposure.CONTENT_URI -> updateExposure(values) + CheckIn.getContentUri(context!!) -> updateCheckIn(values) + Gcm.getContentUri(context!!) -> updateGcm(values) + Auth.getContentUri(context!!) -> updateAuth(values) + Exposure.getContentUri(context!!) -> updateExposure(values) else -> return 0 } return 1 @@ -221,7 +226,7 @@ class SettingsProvider : ContentProvider() { } override fun getType(uri: Uri): String { - return "vnd.android.cursor.item/vnd.$AUTHORITY.${uri.path}" + return "vnd.android.cursor.item/vnd.${getAuthority(context!!)}.${uri.path}" } override fun insert(uri: Uri, values: ContentValues?): Uri? { diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 7ed68b54..40a8d471 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -128,13 +128,6 @@ android:exported="true" android:permission="org.microg.gms.PROVISION" /> - - - - + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.TRUST_GOOGLE)) { c -> c.getInt(0) != 0 } } @JvmStatic fun isAuthVisible(context: Context): Boolean { - return SettingsContract.getSettings(context, Auth.CONTENT_URI, arrayOf(Auth.VISIBLE)) { c -> + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.VISIBLE)) { c -> c.getInt(0) != 0 } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt index bd122c35..84425258 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt @@ -13,7 +13,7 @@ object CheckinPrefs { @JvmStatic fun isEnabled(context: Context): Boolean { val projection = arrayOf(CheckIn.ENABLED) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> c.getInt(0) != 0 } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt index ccdb31af..ab2dc042 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt @@ -48,7 +48,7 @@ data class LastCheckinInfo( CheckIn.VERSION_INFO, CheckIn.DEVICE_DATA_VERSION_INFO, ) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> LastCheckinInfo( androidId = c.getLong(0), digest = c.getString(1), @@ -61,7 +61,7 @@ data class LastCheckinInfo( } @JvmStatic - fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, 0L) put(CheckIn.DIGEST, CheckIn.INITIAL_DIGEST) put(CheckIn.LAST_CHECK_IN, 0L) @@ -71,7 +71,7 @@ data class LastCheckinInfo( } } - fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, androidId) put(CheckIn.DIGEST, digest) put(CheckIn.LAST_CHECK_IN, lastCheckin) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt index e61eb4d1..d42c9e03 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt @@ -20,7 +20,7 @@ data class ServiceConfiguration(val enabled: Boolean) : Serializable suspend fun getCheckinServiceInfo(context: Context): ServiceInfo = withContext(Dispatchers.IO) { val projection = arrayOf(CheckIn.ENABLED, CheckIn.LAST_CHECK_IN, CheckIn.ANDROID_ID) - getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + getSettings(context, CheckIn.getContentUri(context), projection) { c -> ServiceInfo( configuration = ServiceConfiguration(c.getInt(0) != 0), lastCheckin = c.getLong(1), @@ -33,7 +33,7 @@ suspend fun setCheckinServiceConfiguration(context: Context, configuration: Serv val serviceInfo = getCheckinServiceInfo(context) if (serviceInfo.configuration == configuration) return@withContext // enabled state is not already set, setting it now - setSettings(context, CheckIn.CONTENT_URI) { + setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ENABLED, configuration.enabled) } if (configuration.enabled) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt index 1f1e75d4..3a0b8b77 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt @@ -43,7 +43,7 @@ data class GcmPrefs( @JvmStatic fun get(context: Context): GcmPrefs { - return SettingsContract.getSettings(context, Gcm.CONTENT_URI, Gcm.PROJECTION) { c -> + return SettingsContract.getSettings(context, Gcm.getContentUri(context), Gcm.PROJECTION) { c -> GcmPrefs( isGcmLogEnabled = c.getInt(0) != 0, lastPersistedId = c.getString(1), @@ -62,7 +62,7 @@ data class GcmPrefs( fun write(context: Context, config: ServiceConfiguration) { val gcmPrefs = get(context) - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.ENABLE_GCM, config.enabled) put(Gcm.CONFIRM_NEW_APPS, config.confirmNewApps) put(Gcm.NETWORK_MOBILE, config.mobile) @@ -75,7 +75,7 @@ data class GcmPrefs( @JvmStatic fun clearLastPersistedId(context: Context) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, "") } } @@ -124,13 +124,13 @@ data class GcmPrefs( fun learnTimeout(context: Context, pref: String) { Log.d("GmsGcmPrefs", "learnTimeout: $pref") when (pref) { - PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, (learntMobileInterval * 0.95).toInt()) } - PREF_NETWORK_WIFI -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_WIFI -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, (learntWifiInterval * 0.95).toInt()) } - else -> setSettings(context, Gcm.CONTENT_URI) { + else -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, (learntOtherInterval * 0.95).toInt()) } } @@ -142,7 +142,7 @@ data class GcmPrefs( PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> { if (time > learntMobileInterval / 4 * 3) { val newInterval = (learntMobileInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -150,7 +150,7 @@ data class GcmPrefs( PREF_NETWORK_WIFI -> { if (time > learntWifiInterval / 4 * 3) { val newInterval = (learntWifiInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -158,7 +158,7 @@ data class GcmPrefs( else -> { if (time > learntOtherInterval / 4 * 3) { val newInterval = (learntOtherInterval * 1.02).toInt() - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, max(MIN_INTERVAL, min(newInterval, MAX_INTERVAL))) } } @@ -173,7 +173,7 @@ data class GcmPrefs( fun extendLastPersistedId(context: Context, id: String) { val newId = if (lastPersistedId.isNullOrEmpty()) id else "$lastPersistedId|$id" - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, newId) } } diff --git a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt index 03f4bc0a..1c2f792a 100644 --- a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt +++ b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposurePreferences.kt @@ -7,7 +7,7 @@ package org.microg.gms.nearby.exposurenotification import android.content.Context import android.content.Intent -import org.microg.gms.settings.SettingsContract.Exposure.CONTENT_URI +import org.microg.gms.settings.SettingsContract.Exposure.getContentUri import org.microg.gms.settings.SettingsContract.Exposure.LAST_CLEANUP import org.microg.gms.settings.SettingsContract.Exposure.SCANNER_ENABLED import org.microg.gms.settings.SettingsContract.getSettings @@ -16,12 +16,12 @@ import org.microg.gms.settings.SettingsContract.setSettings class ExposurePreferences(private val context: Context) { var enabled - get() = getSettings(context, CONTENT_URI, arrayOf(SCANNER_ENABLED)) { c -> + get() = getSettings(context, getContentUri(context), arrayOf(SCANNER_ENABLED)) { c -> c.getInt(0) != 0 } set(newStatus) { val changed = enabled != newStatus - setSettings(context, CONTENT_URI) { + setSettings(context, getContentUri(context)) { put(SCANNER_ENABLED, newStatus) } if (!changed) return @@ -34,10 +34,10 @@ class ExposurePreferences(private val context: Context) { } var lastCleanup - get() = getSettings(context, CONTENT_URI, arrayOf(LAST_CLEANUP)) { c -> + get() = getSettings(context, getContentUri(context), arrayOf(LAST_CLEANUP)) { c -> c.getLong(0) } - set(value) = setSettings(context, CONTENT_URI) { + set(value) = setSettings(context, getContentUri(context)) { put(LAST_CLEANUP, value) } From 659ece03b4772b231947934793c26810a91b5f6c Mon Sep 17 00:00:00 2001 From: Marvin W Date: Sat, 3 Jul 2021 17:14:57 +0200 Subject: [PATCH 06/12] Add mobstore to dummy service --- play-services-core/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 40a8d471..693ec889 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -740,6 +740,7 @@ + From 60d26b80eb4d618e5bfbd6eaa9f201a0febf534a Mon Sep 17 00:00:00 2001 From: Marvin W Date: Sun, 4 Jul 2021 14:48:44 +0200 Subject: [PATCH 07/12] Clearcut: Get rid of log spam due to missing fields in tracking function --- .../internal/IClearcutLoggerCallbacks.aidl | 2 +- .../gms/clearcut/LogEventParcelable.java | 28 ++++++--- .../gms/phenotype/ExperimentToken.java | 12 ++++ .../gms/phenotype/GenericDimension.java | 17 ++++++ .../playlog/internal/PlayLoggerContext.java | 60 +++++++++---------- .../clearcut/ClearcutLoggerServiceImpl.java | 2 +- 6 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/ExperimentToken.java create mode 100644 play-services-api/src/main/java/com/google/android/gms/phenotype/GenericDimension.java diff --git a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl index 58e796ef..31042db8 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl @@ -3,5 +3,5 @@ package com.google.android.gms.clearcut.internal; import com.google.android.gms.common.api.Status; interface IClearcutLoggerCallbacks { - void onStatus(in Status status) = 0; + oneway void onStatus(in Status status) = 0; } diff --git a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java index 81042a97..6ff57373 100644 --- a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java +++ b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java @@ -18,6 +18,8 @@ package com.google.android.gms.clearcut; import android.util.Base64; +import com.google.android.gms.phenotype.ExperimentToken; +import com.google.android.gms.phenotype.GenericDimension; import com.google.android.gms.playlog.internal.PlayLoggerContext; import org.microg.safeparcel.AutoSafeParcelable; @@ -30,30 +32,36 @@ import java.nio.charset.CharsetDecoder; import java.util.Arrays; public class LogEventParcelable extends AutoSafeParcelable { - @SafeParceled(1) + @Field(1) private int versionCode = 1; - @SafeParceled(2) + @Field(2) public final PlayLoggerContext context; - @SafeParceled(3) + @Field(3) public final byte[] bytes; - @SafeParceled(4) + @Field(4) public final int[] testCodes; - @SafeParceled(5) + @Field(5) public final String[] mendelPackages; - @SafeParceled(6) + @Field(6) public final int[] experimentIds; - @SafeParceled(7) + @Field(7) public final byte[][] experimentTokens; - @SafeParceled(8) + @Field(8) public final boolean addPhenotypeExperimentTokens; + @Field(9) + public final ExperimentToken[] experimentTokenParcelables; + + @Field(10) + public final GenericDimension[] genericDimensions; + private LogEventParcelable() { context = null; bytes = null; @@ -61,6 +69,8 @@ public class LogEventParcelable extends AutoSafeParcelable { mendelPackages = null; experimentTokens = null; addPhenotypeExperimentTokens = false; + experimentTokenParcelables = null; + genericDimensions = null; } public LogEventParcelable(PlayLoggerContext context, byte[] bytes, int[] testCodes, String[] mendelPackages, int[] experimentIds, byte[][] experimentTokens, boolean addPhenotypeExperimentTokens) { @@ -71,6 +81,8 @@ public class LogEventParcelable extends AutoSafeParcelable { this.experimentIds = experimentIds; this.experimentTokens = experimentTokens; this.addPhenotypeExperimentTokens = addPhenotypeExperimentTokens; + this.experimentTokenParcelables = null; + this.genericDimensions = null; } @Override diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/ExperimentToken.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/ExperimentToken.java new file mode 100644 index 00000000..0d618f2f --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/ExperimentToken.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ExperimentToken extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ExperimentToken.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/phenotype/GenericDimension.java b/play-services-api/src/main/java/com/google/android/gms/phenotype/GenericDimension.java new file mode 100644 index 00000000..f10f83c0 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/phenotype/GenericDimension.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class GenericDimension extends AutoSafeParcelable { + @Field(1) + public int a; + @Field(2) + public int b; + + public static final Creator CREATOR = new AutoCreator<>(GenericDimension.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java index ca31fb9b..7f793740 100644 --- a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java +++ b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java @@ -21,55 +21,49 @@ import org.microg.safeparcel.SafeParceled; public class PlayLoggerContext extends AutoSafeParcelable { - @SafeParceled(1) + @Field(1) private int versionCode = 1; - @SafeParceled(2) + @Field(2) public final String packageName; - @SafeParceled(3) + @Field(3) public final int packageVersionCode; - @SafeParceled(4) + @Field(4) public final int logSource; - @SafeParceled(5) - public final String uploadAccount; - - @SafeParceled(6) - public final int loggingId; - - @SafeParceled(7) - public final boolean logAndroidId; - - @SafeParceled(8) + @Field(8) public final String logSourceName; - @SafeParceled(9) + @Field(5) + public final String uploadAccount; + + @Field(6) + public final String loggingId; + + @Field(7) + public final boolean logAndroidId; + + @Field(9) public final boolean isAnonymous; - @SafeParceled(10) + @Field(10) public final int qosTier; + @Field(11) + public final Integer appMobileSpecId; + + @Field(12) + public final boolean scrubMccMnc; + private PlayLoggerContext() { - packageName = uploadAccount = logSourceName = null; - qosTier = packageVersionCode = logSource = loggingId = -1; - isAnonymous = logAndroidId = false; + packageName = uploadAccount = logSourceName = loggingId = null; + qosTier = packageVersionCode = logSource = appMobileSpecId = -1; + isAnonymous = logAndroidId = scrubMccMnc = false; } - public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String uploadAccount, int loggingId, boolean logAndroidId) { - this.packageName = packageName; - this.packageVersionCode = packageVersionCode; - this.logSource = logSource; - this.logSourceName = null; - this.uploadAccount = uploadAccount; - this.loggingId = loggingId; - this.logAndroidId = logAndroidId; - this.isAnonymous = false; - this.qosTier = 0; - } - - public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, int loggingId, boolean isAnonymous, int qosTier) { + public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, String loggingId, boolean isAnonymous, int qosTier, boolean scrubMccMnc) { this.packageName = packageName; this.packageVersionCode = packageVersionCode; this.logSource = logSource; @@ -79,6 +73,8 @@ public class PlayLoggerContext extends AutoSafeParcelable { this.logAndroidId = !isAnonymous; this.isAnonymous = isAnonymous; this.qosTier = qosTier; + this.appMobileSpecId = null; + this.scrubMccMnc = scrubMccMnc; } @Override diff --git a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java index d5e77388..fd1a1dac 100644 --- a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java @@ -29,7 +29,7 @@ public class ClearcutLoggerServiceImpl extends IClearcutLoggerService.Stub { @Override public void log(IClearcutLoggerCallbacks callbacks, LogEventParcelable event) throws RemoteException { - Log.d(TAG, "log: " + event); + // These logs are not really helpful for us, so let's just ignore it. try { callbacks.onStatus(Status.SUCCESS); } catch (Exception ignored) { From 2e286a7e5b6cdc402200efdcf97716150bdf059e Mon Sep 17 00:00:00 2001 From: Marvin W Date: Thu, 19 Aug 2021 17:18:17 +0200 Subject: [PATCH 08/12] Mark oneway functions as oneway in aidl --- .../api/internal/IFirebaseAuthCallbacks.aidl | 22 +++++----- .../internal/IPhenotypeCallbacks.aidl | 4 +- .../internal/ISafetyNetCallbacks.aidl | 16 ++++---- .../org/microg/gms/utils/BinderUtils.kt | 21 ++++++++++ .../cast/internal/ICastDeviceController.aidl | 14 +++---- .../microg/gms/droidguard/DroidGuardHandle.kt | 4 +- .../IFusedLocationProviderCallback.aidl | 2 +- .../internal/IBooleanCallback.aidl | 2 +- .../INearbyExposureNotificationService.aidl | 41 ++++++++++--------- .../ExposureNotificationServiceImpl.kt | 7 +--- 10 files changed, 78 insertions(+), 55 deletions(-) create mode 100644 play-services-base-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt diff --git a/firebase-auth-api/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl b/firebase-auth-api/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl index 9c285521..cd2ea942 100644 --- a/firebase-auth-api/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl +++ b/firebase-auth-api/src/main/aidl/com/google/firebase/auth/api/internal/IFirebaseAuthCallbacks.aidl @@ -8,15 +8,15 @@ import com.google.firebase.auth.api.internal.GetTokenResponse; import com.google.firebase.auth.api.internal.ResetPasswordResponse; interface IFirebaseAuthCallbacks { - void onGetTokenResponse(in GetTokenResponse response) = 0; - void onGetTokenResponseAndUser(in GetTokenResponse response, in GetAccountInfoUser user) = 1; - void onCreateAuthUriResponse(in CreateAuthUriResponse response) = 2; - void onResetPasswordResponse(in ResetPasswordResponse response) = 3; - void onFailure(in Status status) = 4; - void onDeleteAccountResponse() = 5; - void onEmailVerificationResponse() = 6; - - void onSendVerificationCodeResponse(String sessionInfo) = 8; - void onVerificationCompletedResponse(in PhoneAuthCredential credential) = 9; - void onVerificationAutoTimeOut(String sessionInfo) = 10; + oneway void onGetTokenResponse(in GetTokenResponse response) = 0; + oneway void onGetTokenResponseAndUser(in GetTokenResponse response, in GetAccountInfoUser user) = 1; + oneway void onCreateAuthUriResponse(in CreateAuthUriResponse response) = 2; + oneway void onResetPasswordResponse(in ResetPasswordResponse response) = 3; + oneway void onFailure(in Status status) = 4; + oneway void onDeleteAccountResponse() = 5; + oneway void onEmailVerificationResponse() = 6; + //oneway void onSetAccountInfo(String s) = 7 + oneway void onSendVerificationCodeResponse(String sessionInfo) = 8; + oneway void onVerificationCompletedResponse(in PhoneAuthCredential credential) = 9; + oneway void onVerificationAutoTimeOut(String sessionInfo) = 10; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl index 77cfb6d5..acda3c57 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl @@ -4,6 +4,6 @@ import com.google.android.gms.common.api.Status; import com.google.android.gms.phenotype.Configurations; interface IPhenotypeCallbacks { - void onRegister(in Status status) = 0; - void onConfigurations(in Status status, in Configurations configurations) = 3; + oneway void onRegister(in Status status) = 0; + oneway void onConfigurations(in Status status, in Configurations configurations) = 3; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetCallbacks.aidl index 13e1ee40..9c199652 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/safetynet/internal/ISafetyNetCallbacks.aidl @@ -9,12 +9,12 @@ import com.google.android.gms.safetynet.RemoveHarmfulAppData; import com.google.android.gms.safetynet.SafeBrowsingData; interface ISafetyNetCallbacks { - void onAttestationData(in Status status, in AttestationData attestationData) = 0; - void onString(String s) = 1; - void onSafeBrowsingData(in Status status, in SafeBrowsingData safeBrowsingData) = 2; - void onBoolean(in Status status, boolean b) = 3; - void onHarmfulAppsData(in Status status, in List harmfulAppsData) = 4; - void onRecaptchaResult(in Status status, in RecaptchaResultData recaptchaResultData) = 5; - void onHarmfulAppsInfo(in Status status, in HarmfulAppsInfo harmfulAppsInfo) = 7; - void onRemoveHarmfulAppData(in Status status, in RemoveHarmfulAppData removeHarmfulAppData) = 14; + oneway void onAttestationData(in Status status, in AttestationData attestationData) = 0; + oneway void onString(String s) = 1; + oneway void onSafeBrowsingData(in Status status, in SafeBrowsingData safeBrowsingData) = 2; + oneway void onBoolean(in Status status, boolean b) = 3; + oneway void onHarmfulAppsData(in Status status, in List harmfulAppsData) = 4; + oneway void onRecaptchaResult(in Status status, in RecaptchaResultData recaptchaResultData) = 5; + oneway void onHarmfulAppsInfo(in Status status, in HarmfulAppsInfo harmfulAppsInfo) = 7; + oneway void onRemoveHarmfulAppData(in Status status, in RemoveHarmfulAppData removeHarmfulAppData) = 14; } diff --git a/play-services-base-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt b/play-services-base-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt new file mode 100644 index 00000000..f00c97fb --- /dev/null +++ b/play-services-base-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.utils + +import android.os.Binder +import android.os.Parcel +import android.util.Log + +fun warnOnTransactionIssues(tag: String, code: Int, reply: Parcel?, flags: Int, base: () -> Boolean): Boolean { + if (base.invoke()) { + if ((flags and Binder.FLAG_ONEWAY) > 0 && (reply?.dataSize() ?: 0) > 0) { + Log.w(tag, "onTransact[$code] is oneway, but returned data") + } + return true + } + Log.w(tag, "onTransact[$code] is not processed.") + return (flags and Binder.FLAG_ONEWAY) > 0 // Don't return false on oneway transaction to suppress warning +} diff --git a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl index 340c3849..4f91cdda 100644 --- a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl +++ b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl @@ -4,11 +4,11 @@ import com.google.android.gms.cast.LaunchOptions; import com.google.android.gms.cast.JoinOptions; interface ICastDeviceController { - void disconnect() = 0; - void stopApplication(String sessionId) = 4; - void sendMessage(String namespace, String message, long requestId) = 8; - void registerNamespace(String namespace) = 10; - void unregisterNamespace(String namespace) = 11; - void launchApplication(String applicationId, in LaunchOptions launchOptions) = 12; - void joinApplication(String applicationId, String sessionId, in JoinOptions joinOptions) = 13; + oneway void disconnect() = 0; + oneway void stopApplication(String sessionId) = 4; + oneway void sendMessage(String namespace, String message, long requestId) = 8; + oneway void registerNamespace(String namespace) = 10; + oneway void unregisterNamespace(String namespace) = 11; + oneway void launchApplication(String applicationId, in LaunchOptions launchOptions) = 12; + oneway void joinApplication(String applicationId, String sessionId, in JoinOptions joinOptions) = 13; } diff --git a/play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/DroidGuardHandle.kt b/play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/DroidGuardHandle.kt index 07e4fd39..161889c4 100644 --- a/play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/DroidGuardHandle.kt +++ b/play-services-droidguard/src/main/kotlin/org/microg/gms/droidguard/DroidGuardHandle.kt @@ -5,16 +5,18 @@ package org.microg.gms.droidguard +import android.os.ParcelFileDescriptor import com.google.android.gms.droidguard.internal.DroidGuardResultsRequest import com.google.android.gms.droidguard.internal.IDroidGuardHandle class DroidGuardHandle(private val handle: IDroidGuardHandle) { private var state = 0 + var fd: ParcelFileDescriptor? = null fun init(flow: String) { if (state != 0) throw IllegalStateException("init() already called") try { - handle.initWithRequest(flow, DroidGuardResultsRequest().setOpenHandles(openHandles++)) + handle.initWithRequest(flow, DroidGuardResultsRequest().setOpenHandles(openHandles++).also { fd?.let { fd -> it.fd = fd } }) state = 1 } catch (e: Exception) { state = -1 diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl index c0560fe5..44f0d67b 100644 --- a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl @@ -3,5 +3,5 @@ package com.google.android.gms.location.internal; import com.google.android.gms.location.internal.FusedLocationProviderResult; interface IFusedLocationProviderCallback { - void onFusedLocationProviderResult(in FusedLocationProviderResult result) = 0; + oneway void onFusedLocationProviderResult(in FusedLocationProviderResult result) = 0; } diff --git a/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IBooleanCallback.aidl b/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IBooleanCallback.aidl index b1bc31af..391bdd1a 100644 --- a/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IBooleanCallback.aidl +++ b/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/IBooleanCallback.aidl @@ -8,5 +8,5 @@ package com.google.android.gms.nearby.exposurenotification.internal; import com.google.android.gms.common.api.Status; interface IBooleanCallback { - void onResult(in Status status, boolean result); + oneway void onResult(in Status status, boolean result); } diff --git a/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/INearbyExposureNotificationService.aidl b/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/INearbyExposureNotificationService.aidl index 80f7e6ae..3e6f881a 100644 --- a/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/INearbyExposureNotificationService.aidl +++ b/play-services-nearby-api/src/main/aidl/com/google/android/gms/nearby/exposurenotification/internal/INearbyExposureNotificationService.aidl @@ -24,23 +24,26 @@ import com.google.android.gms.nearby.exposurenotification.internal.RequestPreAut import com.google.android.gms.nearby.exposurenotification.internal.RequestPreAuthorizedTemporaryExposureKeyReleaseParams; interface INearbyExposureNotificationService{ - void start(in StartParams params) = 0; - void stop(in StopParams params) = 1; - void isEnabled(in IsEnabledParams params) = 2; - void getTemporaryExposureKeyHistory(in GetTemporaryExposureKeyHistoryParams params) = 3; - void provideDiagnosisKeys(in ProvideDiagnosisKeysParams params) = 4; - - void getExposureSummary(in GetExposureSummaryParams params) = 6; - void getExposureInformation(in GetExposureInformationParams params) = 7; - - void getExposureWindows(in GetExposureWindowsParams params) = 12; - void getVersion(in GetVersionParams params) = 13; - void getCalibrationConfidence(in GetCalibrationConfidenceParams params) = 14; - void getDailySummaries(in GetDailySummariesParams params) = 15; - void setDiagnosisKeysDataMapping(in SetDiagnosisKeysDataMappingParams params) = 16; - void getDiagnosisKeysDataMapping(in GetDiagnosisKeysDataMappingParams params) = 17; - void getStatus(in GetStatusParams params) = 18; - void getPackageConfiguration(in GetPackageConfigurationParams params) = 19; - void requestPreAuthorizedTemporaryExposureKeyHistory(in RequestPreAuthorizedTemporaryExposureKeyHistoryParams params) = 20; - void requestPreAuthorizedTemporaryExposureKeyRelease(in RequestPreAuthorizedTemporaryExposureKeyReleaseParams params) = 21; + oneway void start(in StartParams params) = 0; + oneway void stop(in StopParams params) = 1; + oneway void isEnabled(in IsEnabledParams params) = 2; + oneway void getTemporaryExposureKeyHistory(in GetTemporaryExposureKeyHistoryParams params) = 3; + oneway void provideDiagnosisKeys(in ProvideDiagnosisKeysParams params) = 4; + //oneway void getMaxDiagnosisKeyCount(in GetMaxDiagnosisKeyCountParams params) = 5; + oneway void getExposureSummary(in GetExposureSummaryParams params) = 6; + oneway void getExposureInformation(in GetExposureInformationParams params) = 7; + //oneway void resetAllData(in ResetAllDataParams params) = 8; + //oneway void resetTemporaryExposureKeys(in ResetTemporaryExposureKeysParams params) = 9; + //oneway void startForPackage(in StartForPackageParams params) = 10; + //oneway void isEnabledForPackage(in IsEnabledForPackageParams params) = 11; + oneway void getExposureWindows(in GetExposureWindowsParams params) = 12; + oneway void getVersion(in GetVersionParams params) = 13; + oneway void getCalibrationConfidence(in GetCalibrationConfidenceParams params) = 14; + oneway void getDailySummaries(in GetDailySummariesParams params) = 15; + oneway void setDiagnosisKeysDataMapping(in SetDiagnosisKeysDataMappingParams params) = 16; + oneway void getDiagnosisKeysDataMapping(in GetDiagnosisKeysDataMappingParams params) = 17; + oneway void getStatus(in GetStatusParams params) = 18; + oneway void getPackageConfiguration(in GetPackageConfigurationParams params) = 19; + oneway void requestPreAuthorizedTemporaryExposureKeyHistory(in RequestPreAuthorizedTemporaryExposureKeyHistoryParams params) = 20; + oneway void requestPreAuthorizedTemporaryExposureKeyRelease(in RequestPreAuthorizedTemporaryExposureKeyReleaseParams params) = 21; } diff --git a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt index f8bbfb12..adec6016 100644 --- a/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt +++ b/play-services-nearby-core/src/main/kotlin/org/microg/gms/nearby/exposurenotification/ExposureNotificationServiceImpl.kt @@ -28,6 +28,7 @@ import org.microg.gms.common.PackageUtils import org.microg.gms.nearby.exposurenotification.Constants.* import org.microg.gms.nearby.exposurenotification.proto.TemporaryExposureKeyExport import org.microg.gms.nearby.exposurenotification.proto.TemporaryExposureKeyProto +import org.microg.gms.utils.warnOnTransactionIssues import java.io.File import java.io.InputStream import java.security.MessageDigest @@ -670,11 +671,7 @@ class ExposureNotificationServiceImpl(private val context: Context, private val } } - override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { - if (super.onTransact(code, data, reply, flags)) return true - Log.d(TAG, "onTransact [unknown]: $code, $data, $flags") - return false - } + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(TAG, code, reply, flags) { super.onTransact(code, data, reply, flags) } companion object { private val tempGrantedPermissions: MutableSet> = hashSetOf() From 96cfe2bd9b1798511ea6eb31434049c08b47584a Mon Sep 17 00:00:00 2001 From: Marvin W Date: Mon, 23 Aug 2021 13:11:15 +0200 Subject: [PATCH 09/12] Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 92fecbeb..aa33fe5d 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ def execResult(...args) { return stdout.toString().trim() } -def gmsVersion = "21.21.58" +def gmsVersion = "21.26.58" def gmsVersionCode = Integer.parseInt(gmsVersion.replaceAll('\\.', '')) def gitVersionBase = execResult('git', 'describe', '--tags', '--abbrev=0', '--match=v[0-9]*').substring(1) def gitCommitCount = Integer.parseInt(execResult('git', 'rev-list', '--count', "v$gitVersionBase..HEAD")) From da6399b18c41f9fd629fedc8b9b7f04a76790c12 Mon Sep 17 00:00:00 2001 From: GoldenRetro <90497645+GoldenRetro@users.noreply.github.com> Date: Sat, 11 Sep 2021 09:36:50 +0200 Subject: [PATCH 10/12] MicroG 0.2.22.212658 --- .github/workflows/debug.yml | 2 +- build.gradle | 6 +- gradle/wrapper/gradle-wrapper.properties | 4 +- .../internal/IClearcutLoggerCallbacks.aidl | 2 +- .../internal/IPhenotypeCallbacks.aidl | 4 +- .../gms/clearcut/LogEventParcelable.java | 28 ++++-- .../playlog/internal/PlayLoggerContext.java | 87 +++++++++---------- .../gms/phenotype/ExperimentToken.java | 12 +++ .../gms/phenotype/GenericDimension.java | 17 ++++ play-services-base/build.gradle | 2 +- .../cast/internal/ICastDeviceController.aidl | 14 +-- play-services-core/build.gradle | 7 +- .../microg-ui-tools/build.gradle | 2 +- .../src/main/AndroidManifest.xml | 8 +- .../clearcut/ClearcutLoggerServiceImpl.java | 7 +- .../org/microg/gms/common/PackageUtils.java | 16 ---- .../java/org/microg/gms/gcm/McsService.java | 4 +- .../kotlin/org/microg/gms/auth/AuthPrefs.kt | 4 +- .../org/microg/gms/checkin/CheckinPrefs.kt | 8 +- .../org/microg/gms/checkin/LastCheckinInfo.kt | 6 +- .../org/microg/gms/checkin/ServiceInfo.kt | 4 +- .../kotlin/org/microg/gms/gcm/GcmPrefs.kt | 30 +++---- .../org/microg/gms/gcm/PushRegisterService.kt | 2 +- .../ui/PushNotificationAdvancedFragment.kt | 4 +- .../org/microg/gms/utils/BinderUtils.kt | 21 +++++ .../microg/mgms/settings/SettingsContract.kt | 16 ++-- .../microg/mgms/settings/SettingsProvider.kt | 43 +++++---- .../IFusedLocationProviderCallback.aidl | 2 +- .../internal/LocationRequestUpdateData.java | 14 +-- 29 files changed, 205 insertions(+), 171 deletions(-) create mode 100644 play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java create mode 100644 play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java create mode 100644 play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml index 62035cf6..1913b6f2 100644 --- a/.github/workflows/debug.yml +++ b/.github/workflows/debug.yml @@ -16,7 +16,7 @@ jobs: - name: JDK 8 Setup uses: actions/setup-java@v1 with: - java-version: 1.8 + java-version: 11.0.8 - name: Install NDK run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;21.0.6113669" diff --git a/build.gradle b/build.gradle index cca1397a..65ee0b65 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.0.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath "com.squareup.wire:wire-gradle-plugin:$wireVersion" } @@ -46,8 +46,8 @@ allprojects { apply plugin: 'idea' group = 'org.microg.gms' - version = "0.2.21.212417" - ext.appVersionCode = 212417001 + version = "0.2.22.212658" + ext.appVersionCode = 212658001 ext.isReleaseVersion = false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f80a2f62..5f8423db 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jul 03 09:49:43 CEST 2021 +#Sat Sep 11 09:04:01 CEST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl index 58e796ef..31042db8 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl @@ -3,5 +3,5 @@ package com.google.android.gms.clearcut.internal; import com.google.android.gms.common.api.Status; interface IClearcutLoggerCallbacks { - void onStatus(in Status status) = 0; + oneway void onStatus(in Status status) = 0; } diff --git a/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl b/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl index b238cb01..d7cb4bad 100644 --- a/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeCallbacks.aidl @@ -4,6 +4,6 @@ import com.google.android.gms.common.api.Status; import com.mgoogle.android.gms.phenotype.Configurations; interface IPhenotypeCallbacks { - void onRegister(in Status status) = 0; - void onConfigurations(in Status status, in Configurations configurations) = 3; + oneway void onRegister(in Status status) = 0; + oneway void onConfigurations(in Status status, in Configurations configurations) = 3; } diff --git a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java index 19a5017b..1c3b00ec 100644 --- a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java +++ b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java @@ -18,6 +18,8 @@ package com.google.android.gms.clearcut; import android.util.Base64; +import com.google.android.gms.phenotype.ExperimentToken; +import com.google.android.gms.phenotype.GenericDimension; import com.google.android.gms.playlog.internal.PlayLoggerContext; import org.microg.safeparcel.AutoSafeParcelable; @@ -30,30 +32,36 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; public class LogEventParcelable extends AutoSafeParcelable { - @SafeParceled(1) + @Field(1) private int versionCode = 1; - @SafeParceled(2) + @Field(2) public final PlayLoggerContext context; - @SafeParceled(3) + @Field(3) public final byte[] bytes; - @SafeParceled(4) + @Field(4) public final int[] testCodes; - @SafeParceled(5) + @Field(5) public final String[] mendelPackages; - @SafeParceled(6) + @Field(6) public final int[] experimentIds; - @SafeParceled(7) + @Field(7) public final byte[][] experimentTokens; - @SafeParceled(8) + @Field(8) public final boolean addPhenotypeExperimentTokens; + @Field(9) + public final ExperimentToken[] experimentTokenParcelables; + + @Field(10) + public final GenericDimension[] genericDimensions; + private LogEventParcelable() { context = null; bytes = null; @@ -61,6 +69,8 @@ public class LogEventParcelable extends AutoSafeParcelable { mendelPackages = null; experimentTokens = null; addPhenotypeExperimentTokens = false; + experimentTokenParcelables = null; + genericDimensions = null; } public LogEventParcelable(PlayLoggerContext context, byte[] bytes, int[] testCodes, String[] mendelPackages, int[] experimentIds, byte[][] experimentTokens, boolean addPhenotypeExperimentTokens) { @@ -71,6 +81,8 @@ public class LogEventParcelable extends AutoSafeParcelable { this.experimentIds = experimentIds; this.experimentTokens = experimentTokens; this.addPhenotypeExperimentTokens = addPhenotypeExperimentTokens; + experimentTokenParcelables = null; + genericDimensions = null; } @Override diff --git a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java index 2c7fa4be..9e595a9c 100644 --- a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java +++ b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java @@ -21,55 +21,49 @@ import org.microg.safeparcel.SafeParceled; public class PlayLoggerContext extends AutoSafeParcelable { - @SafeParceled(1) + @Field(1) private int versionCode = 1; - @SafeParceled(2) + @Field(2) public final String packageName; - @SafeParceled(3) + @Field(3) public final int packageVersionCode; - @SafeParceled(4) + @Field(4) public final int logSource; - @SafeParceled(5) - public final String uploadAccount; - - @SafeParceled(6) - public final int loggingId; - - @SafeParceled(7) - public final boolean logAndroidId; - - @SafeParceled(8) + @Field(8) public final String logSourceName; - @SafeParceled(9) + @Field(5) + public final String uploadAccount; + + @Field(6) + public final String loggingId; + + @Field(7) + public final boolean logAndroidId; + + @Field(9) public final boolean isAnonymous; - @SafeParceled(10) + @Field(10) public final int qosTier; + @Field(11) + public final Integer appMobileSpecId; + + @Field(12) + public final boolean scrubMccMnc; + private PlayLoggerContext() { - packageName = uploadAccount = logSourceName = null; - qosTier = packageVersionCode = logSource = loggingId = -1; - isAnonymous = logAndroidId = false; + packageName = uploadAccount = logSourceName = loggingId = null; + qosTier = packageVersionCode = logSource = appMobileSpecId = -1; + isAnonymous = logAndroidId = scrubMccMnc = false; } - public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String uploadAccount, int loggingId, boolean logAndroidId) { - this.packageName = packageName; - this.packageVersionCode = packageVersionCode; - this.logSource = logSource; - this.logSourceName = null; - this.uploadAccount = uploadAccount; - this.loggingId = loggingId; - this.logAndroidId = logAndroidId; - this.isAnonymous = false; - this.qosTier = 0; - } - - public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, int loggingId, boolean isAnonymous, int qosTier) { + public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, String loggingId, boolean isAnonymous, int qosTier, boolean scrubMccMnc) { this.packageName = packageName; this.packageVersionCode = packageVersionCode; this.logSource = logSource; @@ -79,22 +73,25 @@ public class PlayLoggerContext extends AutoSafeParcelable { this.logAndroidId = !isAnonymous; this.isAnonymous = isAnonymous; this.qosTier = qosTier; + this.appMobileSpecId = null; + this.scrubMccMnc = scrubMccMnc; } @Override public String toString() { - return "PlayLoggerContext[" + versionCode + - ", package=" + packageName + - ", packageVersionCode=" + packageVersionCode + - ", logSource=" + logSource + - ", uploadAccount=" + uploadAccount + - ", loggingId=" + loggingId + - ", logAndroidId=" + logAndroidId + - ", logSourceName=" + logSourceName + - ", isAnonymous=" + isAnonymous + - ", qosTier=" + qosTier + - ']'; + final StringBuilder sb = new StringBuilder("PlayLoggerContext[").append(versionCode); + sb.append(", package=").append(packageName); + sb.append(", packageVersionCode=").append(packageVersionCode); + sb.append(", logSource=").append(logSource); + sb.append(", uploadAccount=").append(uploadAccount); + sb.append(", loggingId=").append(loggingId); + sb.append(", logAndroidId=").append(logAndroidId); + sb.append(", logSourceName=").append(logSourceName); + sb.append(", isAnonymous=").append(isAnonymous); + sb.append(", qosTier=").append(qosTier); + sb.append(']'); + return sb.toString(); } - public static Creator CREATOR = new AutoCreator<>(PlayLoggerContext.class); -} + public static Creator CREATOR = new AutoCreator(PlayLoggerContext.class); +} \ No newline at end of file diff --git a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java new file mode 100644 index 00000000..16bb0a60 --- /dev/null +++ b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ExperimentToken extends AutoSafeParcelable { + public static final Creator CREATOR = new AutoCreator<>(ExperimentToken.class); +} \ No newline at end of file diff --git a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java new file mode 100644 index 00000000..3c95f744 --- /dev/null +++ b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.phenotype; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class GenericDimension extends AutoSafeParcelable { + @Field(1) + public int a; + @Field(2) + public int b; + + public static final Creator CREATOR = new AutoCreator<>(GenericDimension.class); +} \ No newline at end of file diff --git a/play-services-base/build.gradle b/play-services-base/build.gradle index 6b287fdd..88cdc9a1 100644 --- a/play-services-base/build.gradle +++ b/play-services-base/build.gradle @@ -39,6 +39,6 @@ dependencies { api project(':play-services-tasks') api project(':play-services-base-api') - implementation 'androidx.fragment:fragment:1.3.5' + implementation 'androidx.fragment:fragment:1.3.6' implementation 'com.google.android.gms:play-services-base:17.6.0' } \ No newline at end of file diff --git a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl index 340c3849..4f91cdda 100644 --- a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl +++ b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastDeviceController.aidl @@ -4,11 +4,11 @@ import com.google.android.gms.cast.LaunchOptions; import com.google.android.gms.cast.JoinOptions; interface ICastDeviceController { - void disconnect() = 0; - void stopApplication(String sessionId) = 4; - void sendMessage(String namespace, String message, long requestId) = 8; - void registerNamespace(String namespace) = 10; - void unregisterNamespace(String namespace) = 11; - void launchApplication(String applicationId, in LaunchOptions launchOptions) = 12; - void joinApplication(String applicationId, String sessionId, in JoinOptions joinOptions) = 13; + oneway void disconnect() = 0; + oneway void stopApplication(String sessionId) = 4; + oneway void sendMessage(String namespace, String message, long requestId) = 8; + oneway void registerNamespace(String namespace) = 10; + oneway void unregisterNamespace(String namespace) = 11; + oneway void launchApplication(String applicationId, in LaunchOptions launchOptions) = 12; + oneway void joinApplication(String applicationId, String sessionId, in JoinOptions joinOptions) = 13; } diff --git a/play-services-core/build.gradle b/play-services-core/build.gradle index 1e6f0b93..84429485 100644 --- a/play-services-core/build.gradle +++ b/play-services-core/build.gradle @@ -21,9 +21,6 @@ apply plugin: 'kotlin-kapt' dependencies { implementation 'com.squareup.wire:wire-runtime:3.6.1' implementation 'de.hdodenhof:circleimageview:3.1.0' - // TODO: Switch to upstream once raw requests are merged - // https://github.com/vitalidze/chromecast-java-api-v2/pull/99 - // implementation "su.litvak.chromecast:api-v2:0.10.4" implementation "info.armills.chromecast-java-api-v2:api-v2-raw-request:0.10.4-raw-request-1" implementation project(':play-services-cronet-core') @@ -33,8 +30,8 @@ dependencies { implementation project(':play-services-cast-api') // AndroidX UI - implementation 'androidx.appcompat:appcompat:1.3.0' - implementation 'androidx.mediarouter:mediarouter:1.2.4' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.mediarouter:mediarouter:1.2.5' implementation "androidx.preference:preference-ktx:$preferenceVersion" implementation "org.microg.gms:conscrypt-gmscore:2.5.1" diff --git a/play-services-core/microg-ui-tools/build.gradle b/play-services-core/microg-ui-tools/build.gradle index 4dc1aaa2..9ba972c5 100644 --- a/play-services-core/microg-ui-tools/build.gradle +++ b/play-services-core/microg-ui-tools/build.gradle @@ -38,7 +38,7 @@ android { } dependencies { - implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'androidx.appcompat:appcompat:1.3.1' implementation "androidx.preference:preference:$preferenceVersion" } diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 66697287..f88e4707 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -91,13 +91,6 @@ android:name="fake-signature" android:value="@string/fake_signature" /> - - - - + diff --git a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java index 05361e81..fd1a1dac 100644 --- a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java @@ -29,7 +29,10 @@ public class ClearcutLoggerServiceImpl extends IClearcutLoggerService.Stub { @Override public void log(IClearcutLoggerCallbacks callbacks, LogEventParcelable event) throws RemoteException { - Log.d(TAG, "log: " + event); - callbacks.onStatus(Status.SUCCESS); + // These logs are not really helpful for us, so let's just ignore it. + try { + callbacks.onStatus(Status.SUCCESS); + } catch (Exception ignored) { + } } } diff --git a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java index af8b3fef..5404fe4e 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java +++ b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java @@ -50,23 +50,7 @@ public class PackageUtils { static { KNOWN_GOOGLE_PACKAGES = new HashMap<>(); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.classroom", "46f6c8987311e131f4f558d8e0ae145bebab6da3"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.inbox", "aa87ce1260c008d801197bb4ecea4ab8929da246"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.playconsole", "d6c35e55b481aefddd74152ca7254332739a81d6"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.travel.onthego", "0cbe08032217d45e61c0bc72f294395ee9ecb5d5"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.tycho", "01b844184e360686aa98b48eb16e05c76d4a72ad"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.contacts", "ee3e2b5d95365c5a1ccc2d8dfe48d94eb33b3ebe"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.wearable.app", "a197f9212f2fed64f0ff9c2a4edf24b9c8801c8c"); KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.youtube.music", "afb0fed5eeaebdd86f56a97742f4b6b33ef59875"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.vr.home", "fc1edc68f7e3e4963c998e95fc38f3de8d1bfc96"); - KNOWN_GOOGLE_PACKAGES.put("com.google.vr.cyclops", "188c5ca3863fa121216157a5baa80755ceda70ab"); - KNOWN_GOOGLE_PACKAGES.put("com.waze", "35b438fe1bc69d975dc8702dc16ab69ebf65f26f"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.wellbeing", "4ebdd02380f1fa0b6741491f0af35625dba76e9f"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.village.boond", "48e7985b8f901df335b5d5223579c81618431c7b"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.subscriptions.red", "de8304ace744ae4c4e05887a27a790815e610ff0"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.meetings", "47a6936b733dbdb45d71997fbe1d610eca36b8bf"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.apps.dynamite", "519c5a17a60596e6fe5933b9cb4285e7b0e5eb7b"); - KNOWN_GOOGLE_PACKAGES.put("com.google.android.projection.gearhead", "9ca91f9e704d630ef67a23f52bf1577a92b9ca5d"); } public static boolean isGooglePackage(Context context, String packageName) { 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 498faea2..7ecfe1a5 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 @@ -293,8 +293,8 @@ public class McsService extends Service implements Handler.Callback { public synchronized static long getCurrentDelay() { long delay = currentDelay == 0 ? 5000 : currentDelay; - if (currentDelay < 60000) currentDelay += 10000; - if (currentDelay >= 60000 && currentDelay < 600000) currentDelay += 60000; + if (currentDelay < GcmPrefs.INTERVAL) currentDelay += 10000; + if (currentDelay >= GcmPrefs.INTERVAL && currentDelay < 600000) currentDelay += GcmPrefs.INTERVAL; return delay; } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/AuthPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/AuthPrefs.kt index 6daaed57..5406bf2a 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/AuthPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/AuthPrefs.kt @@ -8,14 +8,14 @@ object AuthPrefs { @JvmStatic fun isTrustGooglePermitted(context: Context): Boolean { - return SettingsContract.getSettings(context, Auth.CONTENT_URI, arrayOf(Auth.TRUST_GOOGLE)) { c -> + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.TRUST_GOOGLE)) { c -> c.getInt(0) != 0 } } @JvmStatic fun isAuthVisible(context: Context): Boolean { - return SettingsContract.getSettings(context, Auth.CONTENT_URI, arrayOf(Auth.VISIBLE)) { c -> + return SettingsContract.getSettings(context, Auth.getContentUri(context), arrayOf(Auth.VISIBLE)) { c -> c.getInt(0) != 0 } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt index ece388d9..2953ed60 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/CheckinPrefs.kt @@ -14,7 +14,7 @@ object CheckinPrefs { @JvmStatic fun isEnabled(context: Context): Boolean { val projection = arrayOf(CheckIn.ENABLED) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> c.getInt(0) != 0 } } @@ -22,21 +22,21 @@ object CheckinPrefs { @JvmStatic fun isSpoofingEnabled(context: Context): Boolean { val projection = arrayOf(CheckIn.BRAND_SPOOF) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> c.getInt(0) != 0 } } @JvmStatic fun setSpoofingEnabled(context: Context, enabled: Boolean) { - setSettings(context, CheckIn.CONTENT_URI) { + setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.BRAND_SPOOF, enabled) } } @JvmStatic fun hideLauncherIcon(context: Context, enabled: Boolean) { - setSettings(context, CheckIn.CONTENT_URI) { + setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.HIDE_LAUNCHER_ICON, enabled) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt index a7482c46..b3056893 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/LastCheckinInfo.kt @@ -48,7 +48,7 @@ data class LastCheckinInfo( CheckIn.VERSION_INFO, CheckIn.DEVICE_DATA_VERSION_INFO, ) - return SettingsContract.getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + return SettingsContract.getSettings(context, CheckIn.getContentUri(context), projection) { c -> LastCheckinInfo( androidId = c.getLong(0), digest = c.getString(1), @@ -61,7 +61,7 @@ data class LastCheckinInfo( } @JvmStatic - fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun clear(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, 0L) put(CheckIn.DIGEST, CheckIn.INITIAL_DIGEST) put(CheckIn.LAST_CHECK_IN, 0L) @@ -71,7 +71,7 @@ data class LastCheckinInfo( } } - fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.CONTENT_URI) { + fun write(context: Context) = SettingsContract.setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ANDROID_ID, androidId) put(CheckIn.DIGEST, digest) put(CheckIn.LAST_CHECK_IN, lastCheckin) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt index c94ed6ed..1637643b 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/checkin/ServiceInfo.kt @@ -20,7 +20,7 @@ data class ServiceConfiguration(val enabled: Boolean) : Serializable suspend fun getCheckinServiceInfo(context: Context): ServiceInfo = withContext(Dispatchers.IO) { val projection = arrayOf(CheckIn.ENABLED, CheckIn.LAST_CHECK_IN, CheckIn.ANDROID_ID) - getSettings(context, CheckIn.CONTENT_URI, projection) { c -> + getSettings(context, CheckIn.getContentUri(context), projection) { c -> ServiceInfo( configuration = ServiceConfiguration(c.getInt(0) != 0), lastCheckin = c.getLong(1), @@ -33,7 +33,7 @@ suspend fun setCheckinServiceConfiguration(context: Context, configuration: Serv val serviceInfo = getCheckinServiceInfo(context) if (serviceInfo.configuration == configuration) return@withContext // enabled state is not already set, setting it now - setSettings(context, CheckIn.CONTENT_URI) { + setSettings(context, CheckIn.getContentUri(context)) { put(CheckIn.ENABLED, configuration.enabled) } if (configuration.enabled) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt index a0b07402..356ebac4 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt @@ -34,11 +34,11 @@ data class GcmPrefs( const val PREF_NETWORK_ROAMING = Gcm.NETWORK_ROAMING const val PREF_NETWORK_OTHER = Gcm.NETWORK_OTHER - private const val INTERVAL = 1 * 60 * 1000 // 1 minute + public const val INTERVAL = 1 * 60 * 1000 // 1 minute @JvmStatic fun get(context: Context): GcmPrefs { - return SettingsContract.getSettings(context, Gcm.CONTENT_URI, Gcm.PROJECTION) { c -> + return SettingsContract.getSettings(context, Gcm.getContentUri(context), Gcm.PROJECTION) { c -> GcmPrefs( isGcmLogEnabled = c.getInt(0) != 0, lastPersistedId = c.getString(1), @@ -56,7 +56,7 @@ data class GcmPrefs( fun write(context: Context, config: ServiceConfiguration) { val gcmPrefs = get(context) - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.ENABLE_GCM, config.enabled) put(Gcm.NETWORK_MOBILE, config.mobile) put(Gcm.NETWORK_WIFI, config.wifi) @@ -68,7 +68,7 @@ data class GcmPrefs( @JvmStatic fun clearLastPersistedId(context: Context) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, "") } } @@ -104,26 +104,26 @@ data class GcmPrefs( fun getHeartbeatMsFor(pref: String): Int { return if (PREF_NETWORK_ROAMING == pref) { - if (networkRoaming != 0) networkRoaming * 60000 else learntMobileInterval + if (networkRoaming != 0) networkRoaming * GcmPrefs.INTERVAL else learntMobileInterval } else if (PREF_NETWORK_MOBILE == pref) { - if (networkMobile != 0) networkMobile * 60000 else learntMobileInterval + if (networkMobile != 0) networkMobile * GcmPrefs.INTERVAL else learntMobileInterval } else if (PREF_NETWORK_WIFI == pref) { - if (networkWifi != 0) networkWifi * 60000 else learntWifiInterval + if (networkWifi != 0) networkWifi * GcmPrefs.INTERVAL else learntWifiInterval } else { - if (networkOther != 0) networkOther * 60000 else learntOtherInterval + if (networkOther != 0) networkOther * GcmPrefs.INTERVAL else learntOtherInterval } } fun learnTimeout(context: Context, pref: String) { Log.d("GmsGcmPrefs", "learnTimeout: $pref") when (pref) { - PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, (learntMobileInterval * 0.95).toInt()) } - PREF_NETWORK_WIFI -> setSettings(context, Gcm.CONTENT_URI) { + PREF_NETWORK_WIFI -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, (learntWifiInterval * 0.95).toInt()) } - else -> setSettings(context, Gcm.CONTENT_URI) { + else -> setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, (learntOtherInterval * 0.95).toInt()) } } @@ -134,21 +134,21 @@ data class GcmPrefs( when (pref) { PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> { if (time > learntMobileInterval / 4 * 3) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_MOBILE, INTERVAL) } } } PREF_NETWORK_WIFI -> { if (time > learntWifiInterval / 4 * 3) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_WIFI, INTERVAL) } } } else -> { if (time > learntOtherInterval / 4 * 3) { - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LEARNT_OTHER, INTERVAL) } } @@ -163,7 +163,7 @@ data class GcmPrefs( fun extendLastPersistedId(context: Context, id: String) { val newId = if (lastPersistedId.isNullOrEmpty()) id else "$lastPersistedId|$id" - setSettings(context, Gcm.CONTENT_URI) { + setSettings(context, Gcm.getContentUri(context)) { put(Gcm.LAST_PERSISTENT_ID, newId) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt index 9571e931..01c41379 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt @@ -57,7 +57,7 @@ private suspend fun ensureAppRegistrationAllowed(context: Context, database: Gcm if (!GcmPrefs.get(context).isEnabled) throw RuntimeException("GCM disabled") val app = database.getApp(packageName) if (app?.allowRegister == false) { - throw RuntimeException("Push permission not granted to app") + throw RuntimeException("Push permission not granted to $packageName") } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt index c19374fe..5c300d98 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt @@ -89,13 +89,13 @@ class PushNotificationAdvancedFragment : PreferenceFragmentCompat() { private fun getSummaryString(value: Int, learnt: Int): String = when (value) { -1 -> getString(R.string.service_status_disabled_short) 0 -> getString(R.string.service_status_enabled_short) + " / " + getString(R.string.gcm_status_pref_default) + ": " + getHeartbeatString(learnt) - else -> getString(R.string.service_status_enabled_short) + " / " + getString(R.string.gcm_status_pref_manual) + ": " + getHeartbeatString(value * 60000) + else -> getString(R.string.service_status_enabled_short) + " / " + getString(R.string.gcm_status_pref_manual) + ": " + getHeartbeatString(value * GcmPrefs.INTERVAL) } private fun getHeartbeatString(heartbeatMs: Int): String { return if (heartbeatMs < 120000) { (heartbeatMs / 1000).toString() + " " + getString(R.string.gcm_status_pref_sec) - } else (heartbeatMs / 60000).toString() + " " + getString(R.string.gcm_status_pref_min) + } else (heartbeatMs / GcmPrefs.INTERVAL).toString() + " " + getString(R.string.gcm_status_pref_min) } companion object { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt b/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt new file mode 100644 index 00000000..56a9737e --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.utils + +import android.os.Binder +import android.os.Parcel +import android.util.Log + +fun warnOnTransactionIssues(tag: String, code: Int, reply: Parcel?, flags: Int, base: () -> Boolean): Boolean { + if (base.invoke()) { + if ((flags and Binder.FLAG_ONEWAY) > 0 && (reply?.dataSize() ?: 0) > 0) { + Log.w(tag, "onTransact[$code] is oneway, but returned data") + } + return true + } + Log.w(tag, "onTransact[$code] is not processed.") + return (flags and Binder.FLAG_ONEWAY) > 0 // Don't return false on oneway transaction to suppress warning +} \ No newline at end of file diff --git a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt index aa200de4..84a7c321 100644 --- a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt +++ b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt @@ -7,13 +7,13 @@ import android.net.Uri import android.os.Binder object SettingsContract { - const val AUTHORITY = "org.microg.mgms.settings" - val AUTHORITY_URI: Uri = Uri.parse("content://$AUTHORITY") + fun getAuthority(context: Context) = "${context.packageName}.microg.settings" + fun getAuthorityUri(context: Context): Uri = Uri.parse("content://${getAuthority(context)}") object CheckIn { private const val id = "check-in" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val ENABLED = "checkin_enable_service" const val ANDROID_ID = "androidId" @@ -44,8 +44,8 @@ object SettingsContract { object Gcm { private const val id = "gcm" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val FULL_LOG = "gcm_full_log" const val LAST_PERSISTENT_ID = "gcm_last_persistent_id" @@ -76,8 +76,8 @@ object SettingsContract { object Auth { private const val id = "auth" - val CONTENT_URI: Uri = Uri.withAppendedPath(AUTHORITY_URI, id) - const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" const val TRUST_GOOGLE = "auth_manager_trust_google" const val VISIBLE = "auth_manager_visible" diff --git a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt index d191fc6e..b5731eb2 100644 --- a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt +++ b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt @@ -1,3 +1,9 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +@file:Suppress("DEPRECATION") + package org.microg.mgms.settings import android.content.ContentProvider @@ -8,13 +14,13 @@ import android.content.SharedPreferences import android.database.Cursor import android.database.MatrixCursor import android.net.Uri -import android.util.Log -import androidx.preference.PreferenceManager +import android.preference.PreferenceManager import org.microg.gms.common.PackageUtils.warnIfNotMainProcess -import org.microg.mgms.settings.SettingsContract.AUTHORITY +import org.microg.gms.gcm.GcmPrefs import org.microg.mgms.settings.SettingsContract.Auth import org.microg.mgms.settings.SettingsContract.CheckIn import org.microg.mgms.settings.SettingsContract.Gcm +import org.microg.mgms.settings.SettingsContract.getAuthority import java.io.File /** @@ -52,9 +58,9 @@ class SettingsProvider : ContentProvider() { selectionArgs: Array?, sortOrder: String? ): Cursor? = when (uri) { - CheckIn.CONTENT_URI -> queryCheckIn(projection ?: CheckIn.PROJECTION) - Gcm.CONTENT_URI -> queryGcm(projection ?: Gcm.PROJECTION) - Auth.CONTENT_URI -> queryAuth(projection ?: Auth.PROJECTION) + CheckIn.getContentUri(context!!) -> queryCheckIn(projection ?: CheckIn.PROJECTION) + Gcm.getContentUri(context!!) -> queryGcm(projection ?: Gcm.PROJECTION) + Auth.getContentUri(context!!) -> queryAuth(projection ?: Auth.PROJECTION) else -> null } @@ -67,9 +73,9 @@ class SettingsProvider : ContentProvider() { warnIfNotMainProcess(context, this.javaClass) if (values == null) return 0 when (uri) { - CheckIn.CONTENT_URI -> updateCheckIn(values) - Gcm.CONTENT_URI -> updateGcm(values) - Auth.CONTENT_URI -> updateAuth(values) + CheckIn.getContentUri(context!!) -> updateCheckIn(values) + Gcm.getContentUri(context!!) -> updateGcm(values) + Auth.getContentUri(context!!) -> updateAuth(values) else -> return 0 } return 1 @@ -100,8 +106,6 @@ class SettingsProvider : ContentProvider() { } val editor = checkInPrefs.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "check-in update: $key = $value") if (key == CheckIn.ENABLED) { // special case: not saved in checkInPrefs updateCheckInEnabled(value as Boolean) @@ -156,9 +160,9 @@ class SettingsProvider : ContentProvider() { Gcm.NETWORK_ROAMING -> Integer.parseInt(preferences.getString(key, "0") ?: "0") Gcm.NETWORK_OTHER -> Integer.parseInt(preferences.getString(key, "0") ?: "0") - Gcm.LEARNT_MOBILE -> preferences.getInt(key, 60000) - Gcm.LEARNT_WIFI -> preferences.getInt(key, 60000) - Gcm.LEARNT_OTHER -> preferences.getInt(key, 60000) + Gcm.LEARNT_MOBILE -> preferences.getInt(key, GcmPrefs.INTERVAL) + Gcm.LEARNT_WIFI -> preferences.getInt(key, GcmPrefs.INTERVAL) + Gcm.LEARNT_OTHER -> preferences.getInt(key, GcmPrefs.INTERVAL) else -> throw IllegalArgumentException("Unknown key: $key") } @@ -168,8 +172,6 @@ class SettingsProvider : ContentProvider() { if (values.size() == 0) return val editor = preferences.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "gcm update: $key = $value") when (key) { Gcm.ENABLE_GCM -> editor.putBoolean(key, value as Boolean) Gcm.FULL_LOG -> editor.putBoolean(key, value as Boolean) @@ -203,8 +205,6 @@ class SettingsProvider : ContentProvider() { if (values.size() == 0) return val editor = preferences.edit() values.valueSet().forEach { (key, value) -> - // TODO remove log - Log.e("TEST", "auth update: $key = $value") when (key) { Auth.TRUST_GOOGLE -> editor.putBoolean(key, value as Boolean) Auth.VISIBLE -> editor.putBoolean(key, value as Boolean) @@ -219,15 +219,12 @@ class SettingsProvider : ContentProvider() { valueGetter: (String) -> Any ): MatrixCursor { val row = newRow() - for (key in p) row.add(valueGetter.invoke(key).apply { - // TODO remove log - Log.e("TEST", "$key = $this") - }) + for (key in p) row.add(valueGetter.invoke(key)) return this } override fun getType(uri: Uri): String { - return "vnd.android.cursor.item/vnd.$AUTHORITY.${uri.path}" + return "vnd.android.cursor.item/vnd.${getAuthority(context!!)}.${uri.path}" } override fun insert(uri: Uri, values: ContentValues?): Uri? { diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl index c0560fe5..44f0d67b 100644 --- a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IFusedLocationProviderCallback.aidl @@ -3,5 +3,5 @@ package com.google.android.gms.location.internal; import com.google.android.gms.location.internal.FusedLocationProviderResult; interface IFusedLocationProviderCallback { - void onFusedLocationProviderResult(in FusedLocationProviderResult result) = 0; + oneway void onFusedLocationProviderResult(in FusedLocationProviderResult result) = 0; } diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java index 6da81cc3..f364e16a 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java @@ -30,25 +30,25 @@ public class LocationRequestUpdateData extends AutoSafeParcelable { public static final int REQUEST_UPDATES = 1; public static final int REMOVE_UPDATES = 2; - @SafeParceled(1000) + @Field(1000) private int versionCode; - @SafeParceled(1) + @Field(1) public int opCode; - @SafeParceled(2) + @Field(2) public LocationRequestInternal request; - @SafeParceled(3) + @Field(3) public ILocationListener listener; - @SafeParceled(4) + @Field(4) public PendingIntent pendingIntent; - @SafeParceled(5) + @Field(5) public ILocationCallback callback; - @SafeParceled(6) + @Field(6) public IFusedLocationProviderCallback fusedLocationProviderCallback; @Override From a610156db72b9202de53f2ea391ce7babff9a40a Mon Sep 17 00:00:00 2001 From: KevinX8 Date: Sat, 11 Sep 2021 21:10:39 +0300 Subject: [PATCH 11/12] Upgraded AGP to 7.0.2 --- play-services-api/build.gradle | 1 - play-services-base-api/build.gradle | 1 - play-services-base/build.gradle | 1 - play-services-basement/build.gradle | 3 +-- play-services-cast-api/build.gradle | 1 - play-services-cast-framework-api/build.gradle | 1 - play-services-cast/build.gradle | 1 - play-services-core/microg-ui-tools/build.gradle | 1 - play-services-cronet-core/build.gradle | 1 - play-services-iid-api/build.gradle | 1 - play-services-location-api/build.gradle | 1 - play-services-location/build.gradle | 1 - play-services-tasks/build.gradle | 1 - 13 files changed, 1 insertion(+), 14 deletions(-) diff --git a/play-services-api/build.gradle b/play-services-api/build.gradle index 891b041c..3eb582b8 100644 --- a/play-services-api/build.gradle +++ b/play-services-api/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-base-api/build.gradle b/play-services-base-api/build.gradle index ba889533..4f64f888 100644 --- a/play-services-base-api/build.gradle +++ b/play-services-base-api/build.gradle @@ -28,7 +28,6 @@ android { aidlPackageWhiteList "com/google/android/gms/common/images/WebImage.aidl" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-base/build.gradle b/play-services-base/build.gradle index 88cdc9a1..7c7f1b25 100644 --- a/play-services-base/build.gradle +++ b/play-services-base/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-basement/build.gradle b/play-services-basement/build.gradle index a51d937e..ff0dabcc 100644 --- a/play-services-basement/build.gradle +++ b/play-services-basement/build.gradle @@ -21,7 +21,7 @@ dependencies { api "org.microg:safe-parcel:1.7.0" implementation "androidx.annotation:annotation:1.2.0" - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.31' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32' } android { @@ -34,7 +34,6 @@ android { aidlPackageWhiteList "com/google/android/gms/dynamic/IObjectWrapper.aidl" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk buildConfigField "int", "VERSION_CODE", "$appVersionCode" diff --git a/play-services-cast-api/build.gradle b/play-services-cast-api/build.gradle index 6cfc38d1..af8fd50e 100644 --- a/play-services-cast-api/build.gradle +++ b/play-services-cast-api/build.gradle @@ -24,7 +24,6 @@ android { aidlPackageWhiteList "com/google/android/gms/cast/LaunchOptions.aidl" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-cast-framework-api/build.gradle b/play-services-cast-framework-api/build.gradle index bf519984..aa53beca 100644 --- a/play-services-cast-framework-api/build.gradle +++ b/play-services-cast-framework-api/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-cast/build.gradle b/play-services-cast/build.gradle index e174c3c7..788618f5 100755 --- a/play-services-cast/build.gradle +++ b/play-services-cast/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-core/microg-ui-tools/build.gradle b/play-services-core/microg-ui-tools/build.gradle index 9ba972c5..edb1b523 100644 --- a/play-services-core/microg-ui-tools/build.gradle +++ b/play-services-core/microg-ui-tools/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-cronet-core/build.gradle b/play-services-cronet-core/build.gradle index e0246fa3..c734e569 100644 --- a/play-services-cronet-core/build.gradle +++ b/play-services-cronet-core/build.gradle @@ -22,7 +22,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-iid-api/build.gradle b/play-services-iid-api/build.gradle index e25a297b..98613334 100644 --- a/play-services-iid-api/build.gradle +++ b/play-services-iid-api/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-location-api/build.gradle b/play-services-location-api/build.gradle index 3917674a..5066a8dd 100644 --- a/play-services-location-api/build.gradle +++ b/play-services-location-api/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-location/build.gradle b/play-services-location/build.gradle index 260d9566..3c1b7047 100644 --- a/play-services-location/build.gradle +++ b/play-services-location/build.gradle @@ -21,7 +21,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } diff --git a/play-services-tasks/build.gradle b/play-services-tasks/build.gradle index dfd9df89..271759f8 100644 --- a/play-services-tasks/build.gradle +++ b/play-services-tasks/build.gradle @@ -10,7 +10,6 @@ android { buildToolsVersion "$androidBuildVersionTools" defaultConfig { - versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } From ae3feaad7e789ead3d94eb329e8839b74d1d7a62 Mon Sep 17 00:00:00 2001 From: GoldenRetro <90497645+GoldenRetro@users.noreply.github.com> Date: Sat, 11 Sep 2021 21:34:52 +0200 Subject: [PATCH 12/12] Fix manifest provider --- play-services-core/src/main/AndroidManifest.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index f88e4707..0f812cfe 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -91,6 +91,13 @@ android:name="fake-signature" android:value="@string/fake_signature" /> + + + +