Skip to content

Commit 9e6c03d

Browse files
authored
Add immutable flag to all pending intents. Mandatory for Android 12. (#450)
1 parent 727a933 commit 9e6c03d

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

AndroidSDKCore/src/main/java/com/leanplum/utils/BuildUtil.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
package com.leanplum.utils;
2222

23+
import android.app.PendingIntent;
2324
import android.content.Context;
2425
import android.os.Build;
2526

@@ -53,4 +54,17 @@ private static int getTargetSdkVersion(Context context) {
5354
}
5455
return targetSdk;
5556
}
57+
58+
/**
59+
* Adds immutable property to the intent flags. Mandatory when targeting API 31.
60+
*
61+
* @param flags The default flags.
62+
* @return Flags with additional immutable property set.
63+
*/
64+
public static int createIntentFlags(int flags) {
65+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
66+
return flags | PendingIntent.FLAG_IMMUTABLE;
67+
}
68+
return flags;
69+
}
5670
}

AndroidSDKLocation/src/main/java/com/leanplum/LocationManagerImplementation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.leanplum.internal.Log;
4747
import com.leanplum.internal.Util;
4848
import com.leanplum.models.GeofenceEventType;
49+
import com.leanplum.utils.BuildUtil;
4950
import com.leanplum.utils.SharedPreferencesUtil;
5051

5152
import java.util.ArrayList;
@@ -395,7 +396,8 @@ private String getRegionName(String geofenceRequestId) {
395396
private PendingIntent getTransitionPendingIntent() {
396397
Context context = Leanplum.getContext();
397398
Intent intent = new Intent(context, ReceiveTransitionsIntentService.class);
398-
return PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
399+
return PendingIntent.getService(context, 0, intent,
400+
BuildUtil.createIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT));
399401
}
400402

401403
@Override

AndroidSDKPush/src/main/java/com/leanplum/LeanplumPushService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ private static void showNotification(Context context, final Bundle message) {
308308
intent.addCategory("lpAction");
309309
intent.putExtras(message);
310310
PendingIntent contentIntent = PendingIntent.getBroadcast(context.getApplicationContext(),
311-
new Random().nextInt(), intent, 0);
311+
new Random().nextInt(), intent, BuildUtil.createIntentFlags(0));
312312

313313
String title = Util.getApplicationName(context.getApplicationContext());
314314
if (message.getString("title") != null) {
@@ -651,7 +651,8 @@ public static void unregister() {
651651
try {
652652
Intent unregisterIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER");
653653
Context context = Leanplum.getContext();
654-
unregisterIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0));
654+
unregisterIntent.putExtra("app",
655+
PendingIntent.getBroadcast(context, 0, new Intent(), BuildUtil.createIntentFlags(0)));
655656
unregisterIntent.setPackage("com.google.android.gms");
656657
context.startService(unregisterIntent);
657658
} catch (Throwable t) {
@@ -686,7 +687,7 @@ static void showDeviceRegisteredPush(Context context, Context currentContext) {
686687
.setContentTitle("Leanplum")
687688
.setContentText("Your device is registered.");
688689
builder.setContentIntent(PendingIntent.getActivity(
689-
currentContext.getApplicationContext(), 0, new Intent(), 0));
690+
currentContext.getApplicationContext(), 0, new Intent(), BuildUtil.createIntentFlags(0)));
690691
NotificationManager mNotificationManager =
691692
(NotificationManager) currentContext.getSystemService(
692693
Context.NOTIFICATION_SERVICE);

AndroidSDKPush/src/main/java/com/leanplum/internal/LeanplumLocalPushHelper.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.leanplum.ActionContext;
3232
import com.leanplum.Leanplum;
3333
import com.leanplum.LeanplumLocalPushListenerService;
34+
import com.leanplum.utils.BuildUtil;
3435
import com.leanplum.utils.SharedPreferencesUtil;
3536

3637
import java.io.Serializable;
@@ -71,7 +72,7 @@ static boolean scheduleLocalPush(ActionContext actionContext, String messageId,
7172
} else if (existingEta >= eta) {
7273
PendingIntent existingIntent = PendingIntent.getBroadcast(
7374
context, messageId.hashCode(), intentAlarm,
74-
PendingIntent.FLAG_UPDATE_CURRENT);
75+
BuildUtil.createIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT));
7576
alarmManager.cancel(existingIntent);
7677
}
7778
}
@@ -123,7 +124,7 @@ static boolean scheduleLocalPush(ActionContext actionContext, String messageId,
123124
// Schedule notification.
124125
PendingIntent operation = PendingIntent.getBroadcast(
125126
context, messageId.hashCode(), intentAlarm,
126-
PendingIntent.FLAG_UPDATE_CURRENT);
127+
BuildUtil.createIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT));
127128

128129
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Util.isXiaomiDevice()) {
129130
// Improve delivery of local pushes, particularly for offline and locked devices.
@@ -156,7 +157,8 @@ static void cancelLocalPush(Context context, String messageId) {
156157
Intent intentAlarm = LeanplumLocalPushListenerService.getIntent(context);
157158
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
158159
PendingIntent existingIntent = PendingIntent.getBroadcast(
159-
context, messageId.hashCode(), intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT);
160+
context, messageId.hashCode(), intentAlarm,
161+
BuildUtil.createIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT));
160162
if (alarmManager != null && existingIntent != null) {
161163
alarmManager.cancel(existingIntent);
162164
}

0 commit comments

Comments
 (0)