From 0cb84d207003aa2a6fc04d37b9033379ea5f1382 Mon Sep 17 00:00:00 2001 From: Igor Khrupin Date: Thu, 18 Mar 2021 09:14:21 -0700 Subject: [PATCH] Issue #2079. Make PendingIntent mutability explicit, to fix a crash when targeting Android 12 --- .../java/leakcanary/internal/NotificationReceiver.kt | 8 +++++++- .../internal/RequestStoragePermissionActivity.kt | 12 +++++++++--- .../leakcanary/internal/activity/LeakActivity.kt | 8 +++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt b/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt index 8aca4b487b..0be8f5e0c9 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/internal/NotificationReceiver.kt @@ -4,6 +4,7 @@ import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.os.Build import leakcanary.internal.NotificationReceiver.Action.CANCEL_NOTIFICATION import leakcanary.internal.NotificationReceiver.Action.DUMP_HEAP import shark.SharkLog @@ -39,7 +40,12 @@ internal class NotificationReceiver : BroadcastReceiver() { ): PendingIntent { val broadcastIntent = Intent(context, NotificationReceiver::class.java) broadcastIntent.action = action.name - return PendingIntent.getBroadcast(context, 0, broadcastIntent, 0) + val flags = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + PendingIntent.FLAG_IMMUTABLE + } else { + 0 + } + return PendingIntent.getBroadcast(context, 0, broadcastIntent, flags) } } } \ No newline at end of file diff --git a/leakcanary-android-core/src/main/java/leakcanary/internal/RequestStoragePermissionActivity.kt b/leakcanary-android-core/src/main/java/leakcanary/internal/RequestStoragePermissionActivity.kt index 2dcf53f2fa..5ab8e8706c 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/internal/RequestStoragePermissionActivity.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/internal/RequestStoragePermissionActivity.kt @@ -20,18 +20,19 @@ import android.annotation.TargetApi import android.app.Activity import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT +import android.app.PendingIntent.FLAG_IMMUTABLE import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager.PERMISSION_GRANTED -import android.os.Build.VERSION_CODES.M import android.os.Bundle +import android.os.Build import android.widget.Toast import android.widget.Toast.LENGTH_LONG import com.squareup.leakcanary.core.R -@TargetApi(M) // +@TargetApi(Build.VERSION_CODES) // internal class RequestStoragePermissionActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -74,7 +75,12 @@ internal class RequestStoragePermissionActivity : Activity() { fun createPendingIntent(context: Context): PendingIntent { val intent = Intent(context, RequestStoragePermissionActivity::class.java) intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TOP - return PendingIntent.getActivity(context, 1, intent, FLAG_UPDATE_CURRENT) + val flags = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE + } else { + FLAG_UPDATE_CURRENT + } + return PendingIntent.getActivity(context, 1, intent, flags) } } } diff --git a/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt b/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt index f450998a99..b6b6bea37c 100644 --- a/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt +++ b/leakcanary-android-core/src/main/java/leakcanary/internal/activity/LeakActivity.kt @@ -6,6 +6,7 @@ import android.content.Intent import android.net.Uri import android.os.AsyncTask import android.os.Bundle +import android.os.Build import android.view.View import com.squareup.leakcanary.core.R import leakcanary.internal.HeapAnalyzerService @@ -178,7 +179,12 @@ internal class LeakActivity : NavigatingActivity() { val intent = Intent(context, LeakActivity::class.java) intent.putExtra("screens", screens) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - return PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT) + val flags = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + return PendingIntent.getActivity(context, 1, intent, flags) } fun createIntent(context: Context): Intent {