Skip to content

Commit

Permalink
Set pending intent mutability (#47)
Browse files Browse the repository at this point in the history
* Set pending intent mutability

* Fix Android S intent flags for all pending intents

* Avoid extra permissions from Android S
  • Loading branch information
britzl committed Sep 7, 2022
1 parent 7bd6ed9 commit f6abf6e
Showing 1 changed file with 18 additions and 7 deletions.
25 changes: 18 additions & 7 deletions extension-push/src/java/com/defold/push/Push.java
Expand Up @@ -196,6 +196,14 @@ public void run() {
});
}

private int createPendingIntentFlags(int flags) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// https://github.com/defold/extension-push/issues/46
flags = flags | PendingIntent.FLAG_IMMUTABLE;
}
return flags;
}

private String createLocalPushNotificationPath(int uid) {
return String.format("%s_%d", Push.SAVED_LOCAL_MESSAGE_NAME, uid);
}
Expand Down Expand Up @@ -263,7 +271,8 @@ private Notification getLocalNotification(final Context appContext, Bundle extra
Intent new_intent = new Intent(appContext, PushDispatchActivity.class).setAction(Push.ACTION_FORWARD_PUSH);
new_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
new_intent.putExtras(extras);
PendingIntent contentIntent = PendingIntent.getActivity(appContext, uid, new_intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
final int flags = createPendingIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
PendingIntent contentIntent = PendingIntent.getActivity(appContext, uid, new_intent, flags);

ApplicationInfo info = appContext.getApplicationInfo();

Expand Down Expand Up @@ -351,10 +360,11 @@ public void scheduleNotification(final Activity activity, int uid, long timestam
intent.setAction("uid" + uid);
intent.putExtra(packageName + DEFOLD_NOTIFICATION, getLocalNotification(appContext, extras, uid));


PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final int flags = createPendingIntentFlags(PendingIntent.FLAG_ONE_SHOT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(appContext, 0, intent, flags);
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// from S the use of exact alarms requires additional permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestampMillis, pendingIntent);
} else {
am.set(AlarmManager.RTC_WAKEUP, timestampMillis, pendingIntent);
Expand All @@ -379,7 +389,8 @@ public void cancelNotification(final Activity activity, int notificationId, Stri

Intent intent = new Intent(activity, LocalNotificationReceiver.class);
intent.setAction("uid" + notificationId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final int flags = createPendingIntentFlags(PendingIntent.FLAG_ONE_SHOT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, intent, flags);
am.cancel(pendingIntent);
}

Expand Down Expand Up @@ -656,8 +667,8 @@ public void showNotification(Context context, Map<String, String> extras) {
extrasBundle.putByte("remote", (byte)1);

int id = (int) (System.currentTimeMillis() % Integer.MAX_VALUE);
PendingIntent contentIntent = PendingIntent.getActivity(context, id,
intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
final int flags = createPendingIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);
PendingIntent contentIntent = PendingIntent.getActivity(context, id, intent, flags);

String fieldTitle = null;
String fieldText = null;
Expand Down

0 comments on commit f6abf6e

Please sign in to comment.