diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..b940a74a4c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + open-pull-requests-limit: 1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0bd69ddc39..075ce0fc91 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: distribution: "temurin" java-version: "17" - name: "Gradle Wrapper validation" - uses: gradle/wrapper-validation-action@v2 + uses: gradle/actions/wrapper-validation@v3 - name: "Setup Gradle" uses: gradle/actions/setup-gradle@v3 - name: "Setup matchers" diff --git a/build.gradle b/build.gradle index 52d03667d5..afc034e7d8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,32 +7,32 @@ buildscript { ext.applicationNamespace = "com.google.android.gms" ext.basePackageName = "app.revanced" - ext.annotationVersion = '1.7.1' - ext.appcompatVersion = '1.6.1' + ext.annotationVersion = '1.8.0' + ext.appcompatVersion = '1.7.0' ext.biometricVersion = '1.1.0' - ext.coreVersion = '1.12.0' - ext.fragmentVersion = '1.6.2' - ext.lifecycleVersion = '2.7.0' + ext.coreVersion = '1.13.1' + ext.fragmentVersion = '1.7.1' + ext.lifecycleVersion = '2.8.1' ext.loaderVersion = '1.1.0' - ext.materialVersion = '1.11.0' + ext.materialVersion = '1.12.0' ext.mediarouterVersion = '1.7.0' ext.multidexVersion = '2.0.1' ext.navigationVersion = '2.7.7' ext.preferenceVersion = '1.2.1' ext.recyclerviewVersion = '1.3.2' - ext.webkitVersion = '1.10.0' + ext.webkitVersion = '1.11.0' ext.coroutineVersion = '1.7.3' - ext.kotlinVersion = '1.9.23' + ext.kotlinVersion = '2.0.0' ext.cronetVersion = '102.5005.125' ext.okhttpVersion = '4.12.0' ext.slf4jVersion = '1.7.36' ext.volleyVersion = '1.2.1' ext.wearableVersion = '0.1.1' - ext.wireVersion = '4.9.8' + ext.wireVersion = '4.9.9' - ext.androidBuildGradleVersion = '8.3.0' + ext.androidBuildGradleVersion = '8.3.2' ext.androidBuildVersionTools = '34.0.0' @@ -82,8 +82,8 @@ allprojects { apply plugin: 'idea' group = 'org.microg.gms' - ext.appVersionName = 5.3 - ext.appVersionCode = 240914000 + ext.appVersionName = 5.4 + ext.appVersionCode = 242155000 ext.baseVersion = ext.appVersionCode.toString()[0..1] + '.' + ext.appVersionCode.toString()[2..3] + '.' + ext.appVersionCode.toString()[4..5] version = ext.appVersionName+" GMS-"+ext.baseVersion.replaceAll("\\.", "") ext.isReleaseVersion = false diff --git a/play-services-base/build.gradle b/play-services-base/build.gradle index dc7a3f4d52..057c80fd22 100644 --- a/play-services-base/build.gradle +++ b/play-services-base/build.gradle @@ -30,12 +30,15 @@ android { buildFeatures { aidl = true + buildConfig = true } defaultConfig { versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk + + buildConfigField "String", "BASE_PACKAGE_NAME", "\"$basePackageName\"" } compileOptions { diff --git a/play-services-basement/src/main/AndroidManifest.xml b/play-services-basement/src/main/AndroidManifest.xml index 06561f90b1..442d0642c2 100644 --- a/play-services-basement/src/main/AndroidManifest.xml +++ b/play-services-basement/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ diff --git a/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java b/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java index dd3e09989c..ad10432bcd 100644 --- a/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java +++ b/play-services-basement/src/main/java/org/microg/gms/gcm/GcmConstants.java @@ -63,6 +63,7 @@ public final class GcmConstants { public static final String EXTRA_SENDER_LEGACY = "legacy.sender"; public static final String EXTRA_SEND_TO = "google.to"; public static final String EXTRA_SEND_FROM = "google.from"; + public static final String EXTRA_SENT_TIME = "google.sent_time"; public static final String EXTRA_SIGNATURE = "sig"; public static final String EXTRA_SUBSCIPTION = "subscription"; public static final String EXTRA_SUBTYPE = "subtype"; diff --git a/play-services-cast-framework/build.gradle b/play-services-cast-framework/build.gradle index 267c69ac90..dbc01758bf 100644 --- a/play-services-cast-framework/build.gradle +++ b/play-services-cast-framework/build.gradle @@ -21,6 +21,10 @@ android { versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk + + manifestPlaceholders = [ + basePackageName: "$basePackageName" + ] } compileOptions { diff --git a/play-services-cast-framework/src/main/AndroidManifest.xml b/play-services-cast-framework/src/main/AndroidManifest.xml index 4fddd28710..3de4f33dd1 100644 --- a/play-services-cast-framework/src/main/AndroidManifest.xml +++ b/play-services-cast-framework/src/main/AndroidManifest.xml @@ -9,21 +9,21 @@ - + diff --git a/play-services-cast/core/build.gradle b/play-services-cast/core/build.gradle index 787acccc56..9a256ed892 100644 --- a/play-services-cast/core/build.gradle +++ b/play-services-cast/core/build.gradle @@ -32,6 +32,10 @@ android { versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk + + manifestPlaceholders = [ + basePackageName: "$basePackageName" + ] } buildFeatures { diff --git a/play-services-cast/core/src/main/AndroidManifest.xml b/play-services-cast/core/src/main/AndroidManifest.xml index f25508e6ae..d1095e801b 100644 --- a/play-services-cast/core/src/main/AndroidManifest.xml +++ b/play-services-cast/core/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ - + diff --git a/play-services-core/microg-ui-tools/src/main/res/layout/preference_widget_radiobutton.xml b/play-services-core/microg-ui-tools/src/main/res/layout/preference_widget_radiobutton.xml index 0832e77658..de5c0b7ee5 100644 --- a/play-services-core/microg-ui-tools/src/main/res/layout/preference_widget_radiobutton.xml +++ b/play-services-core/microg-ui-tools/src/main/res/layout/preference_widget_radiobutton.xml @@ -16,9 +16,9 @@ --> \ No newline at end of file + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:clickable="false" + android:focusable="false" /> \ No newline at end of file diff --git a/play-services-core/microg-ui-tools/src/main/res/values/strings.xml b/play-services-core/microg-ui-tools/src/main/res/values/strings.xml index 4920d351bd..107abf1b42 100644 --- a/play-services-core/microg-ui-tools/src/main/res/values/strings.xml +++ b/play-services-core/microg-ui-tools/src/main/res/values/strings.xml @@ -44,7 +44,7 @@ - 5.3 + 5.4 diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index ec37cabfac..20a1768250 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -71,7 +71,7 @@ - + @@ -462,32 +462,27 @@ android:taskAffinity="org.microg.gms.settings" android:theme="@style/AppTheme.Dialog"> - - - - + + + + - - - - - + android:targetActivity="org.microg.gms.ui.MainSettingsActivity" + android:taskAffinity="org.microg.gms.settings"> - - + - - + 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 8ce16fa5be..ff2f0ce660 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 @@ -69,6 +69,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.concurrent.atomic.AtomicInteger; import javax.net.ssl.SSLContext; @@ -548,6 +549,8 @@ private void handleAppMessage(DataMessageStanza msg) { intent.setAction(ACTION_C2DM_RECEIVE); intent.putExtra(EXTRA_FROM, msg.from); intent.putExtra(EXTRA_MESSAGE_ID, msg.id); + if (msg.sent != null && msg.sent != 0) intent.putExtra(EXTRA_SENT_TIME, msg.sent); + if (msg.ttl != null && msg.ttl != 0) intent.putExtra(EXTRA_TTL, msg.ttl); if (msg.persistent_id != null) intent.putExtra(EXTRA_MESSAGE_ID, msg.persistent_id); if (msg.token != null) intent.putExtra(EXTRA_COLLAPSE_KEY, msg.token); if (msg.raw_data != null) { @@ -560,6 +563,10 @@ private void handleAppMessage(DataMessageStanza msg) { intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES); } for (AppData appData : msg.app_data) { + if (appData.key == null) continue; + String key = appData.key.toLowerCase(Locale.US); + // Some keys are exclusively set by the client and not the app. + if (key.equals(EXTRA_FROM) || (key.startsWith("google.") && !key.startsWith("google.c."))) continue; intent.putExtra(appData.key, appData.value_); } diff --git a/play-services-core/src/main/java/org/microg/gms/ui/AccountsFragment.kt b/play-services-core/src/main/java/org/microg/gms/ui/AccountsFragment.kt index 2b89e46a57..49b5234bb3 100644 --- a/play-services-core/src/main/java/org/microg/gms/ui/AccountsFragment.kt +++ b/play-services-core/src/main/java/org/microg/gms/ui/AccountsFragment.kt @@ -1,8 +1,10 @@ package org.microg.gms.ui +import android.accounts.Account import android.accounts.AccountManager import android.content.ActivityNotFoundException import android.content.Intent +import android.graphics.Bitmap import android.os.Bundle import android.provider.Settings import android.util.Log @@ -12,7 +14,8 @@ import android.view.MenuItem import android.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog -import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceCategory @@ -20,12 +23,13 @@ import androidx.preference.PreferenceFragmentCompat import com.google.android.gms.R import com.google.android.material.color.MaterialColors import com.google.android.material.transition.platform.MaterialSharedAxis -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.microg.gms.auth.AuthConstants import org.microg.gms.auth.login.LoginActivity +import org.microg.gms.people.DatabaseHelper +import org.microg.gms.people.PeopleManager class AccountsFragment : PreferenceFragmentCompat() { @@ -33,39 +37,44 @@ class AccountsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.preferences_accounts) - updateAccountList() + updateSettings() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true) reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false) -} + } override fun onResume() { super.onResume() - updateAccountList() + updateSettings() } - private fun updateAccountList() { - val accountManager = AccountManager.get(requireContext()) - val accounts = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) - + private fun clearAccountPreferences() { val preferenceCategory = findPreference("prefcat_current_accounts") + preferenceCategory?.removeAll() + } + + private fun updateSettings() { + val context = requireContext() - if (accounts.isEmpty()) { - preferenceCategory?.isVisible = false - } else { - preferenceCategory?.isVisible = true - preferenceCategory?.removeAll() + val accountManager = AccountManager.get(context) + val accounts = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) + + clearAccountPreferences() - var isFirstAccount = true + val preferenceCategory = findPreference("prefcat_current_accounts") + lifecycleScope.launch(Dispatchers.Main) { accounts.forEach { account -> + val photo = PeopleManager.getOwnerAvatarBitmap(context, account.name, false) val newPreference = Preference(requireContext()).apply { - title = account.name - icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_google_logo) - preferenceCategory?.addPreference(this) + title = getDisplayName(account) + summary = account.name + icon = getCircleBitmapDrawable(photo) + key = "account:${account.name}" + order = 0 setOnPreferenceClickListener { showConfirmationDialog(account.name) @@ -73,9 +82,10 @@ class AccountsFragment : PreferenceFragmentCompat() { } } - if (isFirstAccount) { - isFirstAccount = false - newPreference.summary = getString(R.string.pref_accounts_default) + if (photo == null) { + withContext(Dispatchers.IO) { + PeopleManager.getOwnerAvatarBitmap(context, account.name, true) + }?.let { newPreference.icon = getCircleBitmapDrawable(it) } } preferenceCategory?.addPreference(newPreference) @@ -84,29 +94,18 @@ class AccountsFragment : PreferenceFragmentCompat() { } private fun showConfirmationDialog(accountName: String) { - val alertDialogBuilder = AlertDialog.Builder(requireContext(), R.style.AppTheme_Dialog_Account) - alertDialogBuilder.apply { - setTitle(getString(R.string.dialog_title_remove_account)) - setMessage(getString(R.string.dialog_message_remove_account)) - setPositiveButton(getString(R.string.dialog_confirm_button)) { _, _ -> + AlertDialog.Builder(requireContext(), R.style.AppTheme_Dialog_Account) + .setTitle(getString(R.string.dialog_title_remove_account)) + .setMessage(getString(R.string.dialog_message_remove_account)) + .setPositiveButton(getString(R.string.dialog_confirm_button)) { _, _ -> removeAccount(accountName) - val toastMessage = getString(R.string.toast_remove_account_success, accountName) - showToast(toastMessage) - updateAccountList() - } - setNegativeButton(getString(R.string.dialog_cancel_button)) { dialog, _ -> + }.setNegativeButton(getString(R.string.dialog_cancel_button)) { dialog, _ -> dialog.dismiss() - } - create().show() - } - } - - private fun showToast(message: String) { - Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() + }.create().show() } private fun removeAccount(accountName: String) { - CoroutineScope(Dispatchers.Main).launch { + lifecycleScope.launch(Dispatchers.Main) { val accountManager = AccountManager.get(requireContext()) val accounts = accountManager.getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE) @@ -117,10 +116,14 @@ class AccountsFragment : PreferenceFragmentCompat() { accountManager.removeAccountExplicitly(it) } if (removedSuccessfully) { - updateAccountList() + updateSettings() + val toastMessage = + getString(R.string.toast_remove_account_success, accountName) + showToast(toastMessage) } } catch (e: Exception) { Log.e(tag, "Error removing account: $accountName", e) + showToast(getString(R.string.toast_remove_account_success)) } } } @@ -168,4 +171,26 @@ class AccountsFragment : PreferenceFragmentCompat() { else -> super.onOptionsItemSelected(item) } } + + private fun getDisplayName(account: Account): String? { + val databaseHelper = DatabaseHelper(requireContext()) + val cursor = databaseHelper.getOwner(account.name) + return try { + if (cursor.moveToNext()) { + cursor.getColumnIndex("display_name").takeIf { it >= 0 } + ?.let { cursor.getString(it) }?.takeIf { it.isNotBlank() } + } else null + } finally { + cursor.close() + databaseHelper.close() + } + } + + private fun getCircleBitmapDrawable(bitmap: Bitmap?) = + if (bitmap != null) RoundedBitmapDrawableFactory.create(resources, bitmap) + .also { it.isCircular = true } else null + + private fun showToast(message: String) { + Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show() + } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt index 6ac52845e1..c779d08167 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt @@ -23,7 +23,7 @@ import org.microg.gms.utils.warnOnTransactionIssues private const val TAG = "CredentialService" val FEATURES = arrayOf( - Feature("auth_api_credentials_begin_sign_in", 8), + Feature("auth_api_credentials_begin_sign_in", 9), Feature("auth_api_credentials_sign_out", 2), Feature("auth_api_credentials_authorize", 1), Feature("auth_api_credentials_revoke_access", 1), diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/extensions.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/extensions.kt index 89f2d7291f..7c1623f1d3 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/extensions.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/signin/extensions.kt @@ -55,24 +55,24 @@ fun getServerAuthTokenManager(context: Context, packageName: String, options: Go val serverAuthTokenManager = AuthManager(context, account.name, packageName, "oauth2:server:client_id:${options.serverClientId}:api_scope:${options.scopeUris.joinToString(" ")}") serverAuthTokenManager.includeEmail = if (options.includeEmail) "1" else "0" serverAuthTokenManager.includeProfile = if (options.includeProfile) "1" else "0" - serverAuthTokenManager.setOauth2Prompt(if (options.isForceCodeForRefreshToken) "consent" else "auto") + serverAuthTokenManager.setOauth2Prompt("auto") serverAuthTokenManager.setItCaveatTypes("2") return serverAuthTokenManager } suspend fun performSignIn(context: Context, packageName: String, options: GoogleSignInOptions?, account: Account, permitted: Boolean = false): GoogleSignInAccount? { val authManager = getOAuthManager(context, packageName, options, account) - if (permitted) authManager.isPermitted = true val authResponse = withContext(Dispatchers.IO) { + if (permitted) authManager.isPermitted = true authManager.requestAuth(true) } if (authResponse.auth == null) return null - + val tag = "AuthSignIn" val scopes = options?.scopes.orEmpty().sortedBy { it.scopeUri } val includeId = scopes.any { it.scopeUri == Scopes.OPENID } || scopes.any { it.scopeUri == Scopes.GAMES_LITE } val includeEmail = scopes.any { it.scopeUri == Scopes.EMAIL } || scopes.any { it.scopeUri == Scopes.GAMES_LITE } val includeProfile = scopes.any { it.scopeUri == Scopes.PROFILE } - Log.d("AuthSignIn", "id token requested: ${options?.isIdTokenRequested == true}, serverClientId = ${options?.serverClientId}") + Log.d(tag, "id token requested: ${options?.isIdTokenRequested == true}, serverClientId = ${options?.serverClientId}, permitted = ${authManager.isPermitted}") val idTokenResponse = getIdTokenManager(context, packageName, options, account)?.let { it.isPermitted = authManager.isPermitted withContext(Dispatchers.IO) { it.requestAuth(true) } diff --git a/play-services-core/src/main/res/layout/login_assistant_loading.xml b/play-services-core/src/main/res/layout/login_assistant_loading.xml index 42d276be66..e8b6247b1f 100644 --- a/play-services-core/src/main/res/layout/login_assistant_loading.xml +++ b/play-services-core/src/main/res/layout/login_assistant_loading.xml @@ -20,13 +20,12 @@ android:layout_height="fill_parent" android:orientation="vertical"> - @@ -34,6 +33,7 @@ android:id="@+id/description_text" android:layout_width="fill_parent" android:layout_height="fill_parent" + android:layout_marginTop="18dp" android:layout_marginStart="?android:listPreferredItemPaddingStart" android:layout_marginEnd="?android:listPreferredItemPaddingEnd" android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> diff --git a/play-services-core/src/main/res/values-pt-rBR/strings.xml b/play-services-core/src/main/res/values-pt-rBR/strings.xml index d5a396ffde..09db6584a5 100644 --- a/play-services-core/src/main/res/values-pt-rBR/strings.xml +++ b/play-services-core/src/main/res/values-pt-rBR/strings.xml @@ -169,7 +169,6 @@ Isso pode levar alguns minutos." Adicionar conta Gerenciador de contas Abrir o gerenciador de contas do dispositivo - Conta padrĂ£o diff --git a/play-services-core/src/main/res/values/strings.xml b/play-services-core/src/main/res/values/strings.xml index af786f0638..446df8a341 100644 --- a/play-services-core/src/main/res/values/strings.xml +++ b/play-services-core/src/main/res/values/strings.xml @@ -180,7 +180,6 @@ This can take a couple of minutes" Add account Manage accounts Open device accounts manager - Default account diff --git a/play-services-gcm/build.gradle b/play-services-gcm/build.gradle index 60c68023f8..b888c28654 100644 --- a/play-services-gcm/build.gradle +++ b/play-services-gcm/build.gradle @@ -15,6 +15,10 @@ android { versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk + + manifestPlaceholders = [ + basePackageName: "$basePackageName" + ] } compileOptions { diff --git a/play-services-gcm/src/main/AndroidManifest.xml b/play-services-gcm/src/main/AndroidManifest.xml index 31cd4d453a..cfc1bb78f3 100644 --- a/play-services-gcm/src/main/AndroidManifest.xml +++ b/play-services-gcm/src/main/AndroidManifest.xml @@ -18,7 +18,7 @@ - + diff --git a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmListenerService.java b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmListenerService.java index ccf99acf61..6d911479a2 100644 --- a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmListenerService.java +++ b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmListenerService.java @@ -53,7 +53,7 @@ * android:name=".YourGcmListenerService" * android:exported="false" > * - * + * * * */ diff --git a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmNetworkManager.java b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmNetworkManager.java index a7ee9a8940..fc809ce25d 100644 --- a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmNetworkManager.java +++ b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmNetworkManager.java @@ -67,9 +67,9 @@ *
  * 
+ *     android:permission="${basePackageName}.android.gms.permission.BIND_NETWORK_TASK_SERVICE" >
  *     
- *        
+ *        
  *     
  * 
  * 
diff --git a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java index 1df70bccb0..ed3d5b96a1 100644 --- a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java +++ b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmReceiver.java @@ -44,12 +44,12 @@ *

*

  * 
+ *     android:permission="${basePackageName}.android.c2dm.permission.SEND" >
  *     
- *         
- *         
+ *         
+ *         
  *         
  *     
  * 
diff --git a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmTaskService.java b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmTaskService.java index 0d790589ca..ba7ca20d55 100644 --- a/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmTaskService.java +++ b/play-services-gcm/src/main/java/com/google/android/gms/gcm/GcmTaskService.java @@ -38,10 +38,10 @@ * {@link com.google.android.gms.gcm.GcmTaskService#SERVICE_ACTION_EXECUTE_TASK}. Here's an example: *
  *     
  *              
- *                  
+ *                  
  *              
  *     
  * 
diff --git a/play-services-iid/build.gradle b/play-services-iid/build.gradle index d6b9231620..b7e9024f76 100644 --- a/play-services-iid/build.gradle +++ b/play-services-iid/build.gradle @@ -19,6 +19,10 @@ android { versionName version minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk + + manifestPlaceholders = [ + basePackageName: "$basePackageName" + ] } compileOptions { diff --git a/play-services-iid/src/main/AndroidManifest.xml b/play-services-iid/src/main/AndroidManifest.xml index 5a3b72361e..21c850f3d1 100644 --- a/play-services-iid/src/main/AndroidManifest.xml +++ b/play-services-iid/src/main/AndroidManifest.xml @@ -7,6 +7,6 @@ - + diff --git a/play-services-iid/src/main/java/com/google/android/gms/iid/InstanceIDListenerService.java b/play-services-iid/src/main/java/com/google/android/gms/iid/InstanceIDListenerService.java index c7bf61c78e..6e160f6550 100644 --- a/play-services-iid/src/main/java/com/google/android/gms/iid/InstanceIDListenerService.java +++ b/play-services-iid/src/main/java/com/google/android/gms/iid/InstanceIDListenerService.java @@ -43,7 +43,7 @@ *
  * 
  *     
- *         
+ *         
  *     
  * 
* Do not export this service. Instead, keep it private to prevent other apps