Immutable pending intents

This commit is contained in:
M66B 2021-03-27 18:54:55 +01:00
parent 5b73fb8403
commit fbc8112104
10 changed files with 72 additions and 31 deletions

View File

@ -968,7 +968,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
Intent update = new Intent(Intent.ACTION_VIEW, Uri.parse(info.html_url));
update.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piUpdate = PendingIntent.getActivity(
PendingIntent piUpdate = PendingIntentCompat.getActivity(
ActivityView.this, REQUEST_UPDATE, update, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(piUpdate);

View File

@ -1707,7 +1707,7 @@ class Core {
Intent intent = new Intent(context, ServiceUI.class);
intent.setAction("exists:" + message.id);
PendingIntent piExists = PendingIntent.getService(
PendingIntent piExists = PendingIntentCompat.getService(
context, ServiceUI.PI_EXISTS, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
@ -4084,10 +4084,12 @@ class Core {
content = new Intent(context, ActivityView.class)
.setAction("unified" + (notify_remove ? ":" + group : ""));
content.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent piContent = PendingIntent.getActivity(context, ActivityView.REQUEST_UNIFIED, content, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piContent = PendingIntentCompat.getActivity(
context, ActivityView.REQUEST_UNIFIED, content, PendingIntent.FLAG_UPDATE_CURRENT);
Intent clear = new Intent(context, ServiceUI.class).setAction("clear:" + group);
PendingIntent piClear = PendingIntent.getService(context, ServiceUI.PI_CLEAR, clear, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piClear = PendingIntentCompat.getService(
context, ServiceUI.PI_CLEAR, clear, PendingIntent.FLAG_UPDATE_CURRENT);
// Build title
String title = context.getResources().getQuantityString(
@ -4196,7 +4198,8 @@ class Core {
Intent thread = new Intent(context, ServiceUI.class);
thread.setAction("ignore:" + message.id);
thread.putExtra("view", true);
piContent = PendingIntent.getService(context, ServiceUI.PI_THREAD, thread, PendingIntent.FLAG_UPDATE_CURRENT);
piContent = PendingIntentCompat.getService(
context, ServiceUI.PI_THREAD, thread, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
Intent thread = new Intent(context, ActivityView.class);
thread.setAction("thread:" + message.id);
@ -4205,11 +4208,13 @@ class Core {
thread.putExtra("folder", message.folder);
thread.putExtra("thread", message.thread);
thread.putExtra("filter_archive", !EntityFolder.ARCHIVE.equals(message.folderType));
piContent = PendingIntent.getActivity(context, ActivityView.REQUEST_THREAD, thread, PendingIntent.FLAG_UPDATE_CURRENT);
piContent = PendingIntentCompat.getActivity(
context, ActivityView.REQUEST_THREAD, thread, PendingIntent.FLAG_UPDATE_CURRENT);
}
Intent ignore = new Intent(context, ServiceUI.class).setAction("ignore:" + message.id);
PendingIntent piIgnore = PendingIntent.getService(context, ServiceUI.PI_IGNORED, ignore, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piIgnore = PendingIntentCompat.getService(
context, ServiceUI.PI_IGNORED, ignore, PendingIntent.FLAG_UPDATE_CURRENT);
// Get channel name
String channelName = EntityAccount.getNotificationChannelId(0);
@ -4313,7 +4318,8 @@ class Core {
Intent trash = new Intent(context, ServiceUI.class)
.setAction("trash:" + message.id)
.putExtra("group", group);
PendingIntent piTrash = PendingIntent.getService(context, ServiceUI.PI_TRASH, trash, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piTrash = PendingIntentCompat.getService(
context, ServiceUI.PI_TRASH, trash, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionTrash = new NotificationCompat.Action.Builder(
R.drawable.twotone_delete_24,
context.getString(R.string.title_advanced_notify_action_trash),
@ -4332,7 +4338,8 @@ class Core {
Intent junk = new Intent(context, ServiceUI.class)
.setAction("junk:" + message.id)
.putExtra("group", group);
PendingIntent piJunk = PendingIntent.getService(context, ServiceUI.PI_JUNK, junk, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piJunk = PendingIntentCompat.getService(
context, ServiceUI.PI_JUNK, junk, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionJunk = new NotificationCompat.Action.Builder(
R.drawable.twotone_report_problem_24,
context.getString(R.string.title_advanced_notify_action_junk),
@ -4350,7 +4357,8 @@ class Core {
Intent archive = new Intent(context, ServiceUI.class)
.setAction("archive:" + message.id)
.putExtra("group", group);
PendingIntent piArchive = PendingIntent.getService(context, ServiceUI.PI_ARCHIVE, archive, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piArchive = PendingIntentCompat.getService(
context, ServiceUI.PI_ARCHIVE, archive, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionArchive = new NotificationCompat.Action.Builder(
R.drawable.twotone_archive_24,
context.getString(R.string.title_advanced_notify_action_archive),
@ -4372,7 +4380,8 @@ class Core {
Intent move = new Intent(context, ServiceUI.class)
.setAction("move:" + message.id)
.putExtra("group", group);
PendingIntent piMove = PendingIntent.getService(context, ServiceUI.PI_MOVE, move, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piMove = PendingIntentCompat.getService(
context, ServiceUI.PI_MOVE, move, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionMove = new NotificationCompat.Action.Builder(
R.drawable.twotone_folder_24,
folder.getDisplayName(context),
@ -4394,7 +4403,8 @@ class Core {
.putExtra("reference", message.id)
.putExtra("group", group);
reply.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piReply = PendingIntent.getActivity(context, ActivityCompose.PI_REPLY, reply, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piReply = PendingIntentCompat.getActivity(
context, ActivityCompose.PI_REPLY, reply, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionReply = new NotificationCompat.Action.Builder(
R.drawable.twotone_reply_24,
context.getString(R.string.title_advanced_notify_action_reply),
@ -4414,7 +4424,8 @@ class Core {
Intent reply = new Intent(context, ServiceUI.class)
.setAction("reply:" + message.id)
.putExtra("group", group);
PendingIntent piReply = PendingIntent.getService(context, ServiceUI.PI_REPLY_DIRECT, reply, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piReply = PendingIntentCompat.getService(
context, ServiceUI.PI_REPLY_DIRECT, reply, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionReply = new NotificationCompat.Action.Builder(
R.drawable.twotone_reply_24,
context.getString(R.string.title_advanced_notify_action_reply_direct),
@ -4433,7 +4444,8 @@ class Core {
Intent flag = new Intent(context, ServiceUI.class)
.setAction("flag:" + message.id)
.putExtra("group", group);
PendingIntent piFlag = PendingIntent.getService(context, ServiceUI.PI_FLAG, flag, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piFlag = PendingIntentCompat.getService(
context, ServiceUI.PI_FLAG, flag, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionFlag = new NotificationCompat.Action.Builder(
R.drawable.baseline_star_24,
context.getString(R.string.title_advanced_notify_action_flag),
@ -4450,7 +4462,8 @@ class Core {
Intent seen = new Intent(context, ServiceUI.class)
.setAction("seen:" + message.id)
.putExtra("group", group);
PendingIntent piSeen = PendingIntent.getService(context, ServiceUI.PI_SEEN, seen, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piSeen = PendingIntentCompat.getService(
context, ServiceUI.PI_SEEN, seen, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionSeen = new NotificationCompat.Action.Builder(
R.drawable.twotone_visibility_24,
context.getString(R.string.title_advanced_notify_action_seen),
@ -4467,7 +4480,8 @@ class Core {
Intent snooze = new Intent(context, ServiceUI.class)
.setAction("snooze:" + message.id)
.putExtra("group", group);
PendingIntent piSnooze = PendingIntent.getService(context, ServiceUI.PI_SNOOZE, snooze, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piSnooze = PendingIntentCompat.getService(
context, ServiceUI.PI_SNOOZE, snooze, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Action.Builder actionSnooze = new NotificationCompat.Action.Builder(
R.drawable.twotone_timelapse_24,
context.getString(R.string.title_advanced_notify_action_snooze),
@ -4604,7 +4618,7 @@ class Core {
Intent intent = new Intent(context, ActivityView.class);
intent.setAction("error");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(
PendingIntent pi = PendingIntentCompat.getActivity(
context, ActivityView.REQUEST_ERROR, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification

View File

@ -454,7 +454,8 @@ public class EntityMessage implements Serializable {
static void snooze(Context context, long id, Long wakeup) {
Intent snoozed = new Intent(context, ServiceUI.class);
snoozed.setAction("wakeup:" + id);
PendingIntent pi = PendingIntent.getService(context, ServiceUI.PI_WAKEUP, snoozed, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntentCompat.getService(
context, ServiceUI.PI_WAKEUP, snoozed, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (wakeup == null || wakeup == Long.MAX_VALUE) {

View File

@ -30,10 +30,26 @@ public class PendingIntentCompat {
private PendingIntentCompat() {
}
public static int FLAG_MUTABLE = 0x02000000;
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
return PendingIntent.getActivity(context, requestCode, intent, flags);
else
return PendingIntent.getActivity(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
}
public static PendingIntent getService(Context context, int requestCode, @NonNull Intent intent, int flags) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
return PendingIntent.getService(context, requestCode, intent, flags);
else
return PendingIntent.getService(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
}
static PendingIntent getForegroundService(Context context, int requestCode, @NonNull Intent intent, int flags) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
return PendingIntent.getService(context, requestCode, intent, flags);
else
return PendingIntent.getForegroundService(context, requestCode, intent, flags);
return PendingIntent.getForegroundService(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE);
}
}

View File

@ -250,7 +250,8 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
Intent intent = new Intent(context, ActivityView.class);
intent.setAction("outbox");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return PendingIntent.getActivity(context, ActivityView.REQUEST_OUTBOX, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return PendingIntentCompat.getActivity(
context, ActivityView.REQUEST_OUTBOX, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {

View File

@ -893,7 +893,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
Intent why = new Intent(this, ActivityView.class);
why.setAction("why");
why.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piWhy = PendingIntent.getActivity(this, ActivityView.REQUEST_WHY, why, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piWhy = PendingIntentCompat.getActivity(
this, ActivityView.REQUEST_WHY, why, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification
NotificationCompat.Builder builder =
@ -929,7 +930,8 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
Intent alert = new Intent(this, ActivityView.class);
alert.setAction("alert");
alert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piAlert = PendingIntent.getActivity(this, ActivityView.REQUEST_ALERT, alert, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent piAlert = PendingIntentCompat.getActivity(
this, ActivityView.REQUEST_ALERT, alert, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification
NotificationCompat.Builder builder =

View File

@ -608,7 +608,7 @@ public class ServiceUI extends IntentService {
Intent intent = new Intent(context, ServiceUI.class);
intent.setAction("sync");
intent.putExtra("reschedule", true);
PendingIntent piSync = PendingIntent.getService(
PendingIntent piSync = PendingIntentCompat.getService(
context, ServiceUI.PI_SYNC, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
@ -636,7 +636,8 @@ public class ServiceUI extends IntentService {
private static PendingIntent getBannerIntent(Context context) {
Intent intent = new Intent(context, ServiceUI.class);
intent.setAction("banner");
return PendingIntent.getService(context, ServiceUI.PI_BANNER, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return PendingIntentCompat.getService(
context, ServiceUI.PI_BANNER, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
static void scheduleBanner(Context context, boolean set) {
@ -660,7 +661,8 @@ public class ServiceUI extends IntentService {
private static PendingIntent getProtocolIntent(Context context) {
Intent intent = new Intent(context, ServiceUI.class);
intent.setAction("protocol");
return PendingIntent.getService(context, ServiceUI.PI_PROTOCOL, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return PendingIntentCompat.getService(
context, ServiceUI.PI_PROTOCOL, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
static void scheduleProtocol(Context context, boolean set) {

View File

@ -73,20 +73,23 @@ public class Widget extends AppWidgetProvider {
view.putExtra("type", folders.get(0).type);
view.putExtra("refresh", true);
view.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
pi = PendingIntent.getActivity(context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
pi = PendingIntentCompat.getActivity(
context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
if (account < 0) {
Intent view = new Intent(context, ActivityView.class);
view.setAction("unified");
view.putExtra("refresh", true);
view.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
pi = PendingIntent.getActivity(context, ActivityView.REQUEST_UNIFIED, view, PendingIntent.FLAG_UPDATE_CURRENT);
pi = PendingIntentCompat.getActivity(
context, ActivityView.REQUEST_UNIFIED, view, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
Intent view = new Intent(context, ActivityView.class);
view.setAction("folders:" + account);
view.putExtra("refresh", true);
view.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
pi = PendingIntent.getActivity(context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
pi = PendingIntentCompat.getActivity(
context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
}
}

View File

@ -40,7 +40,8 @@ public class WidgetSync extends AppWidgetProvider {
try {
Intent intent = new Intent(enabled ? ServiceExternal.ACTION_DISABLE : ServiceExternal.ACTION_ENABLE);
PendingIntent pi = PendingIntent.getService(context, ServiceExternal.PI_WIDGET_ENABLE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntentCompat.getService(
context, ServiceExternal.PI_WIDGET_ENABLE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
for (int appWidgetId : appWidgetIds) {
boolean semi = prefs.getBoolean("widget." + appWidgetId + ".semi", true);
int background = prefs.getInt("widget." + appWidgetId + ".background", Color.TRANSPARENT);

View File

@ -55,7 +55,8 @@ public class WidgetUnified extends AppWidgetProvider {
view.putExtra("type", type);
view.putExtra("refresh", true);
view.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pi = PendingIntent.getActivity(context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pi = PendingIntentCompat.getActivity(
context, appWidgetId, view, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_unified);
@ -88,7 +89,7 @@ public class WidgetUnified extends AppWidgetProvider {
thread.putExtra("filter_archive", !EntityFolder.ARCHIVE.equals(type));
thread.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piItem = PendingIntent.getActivity(
context, ActivityView.REQUEST_WIDGET, thread, PendingIntent.FLAG_UPDATE_CURRENT);
context, ActivityView.REQUEST_WIDGET, thread, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntentCompat.FLAG_MUTABLE);
views.setPendingIntentTemplate(R.id.lv, piItem);