summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael W <baddaemon87@gmail.com>2022-02-22 12:38:56 +0100
committerMichael W <baddaemon87@gmail.com>2022-04-18 10:02:01 +0200
commit8ac23932464461557c48b520fbc141efcd8a8ad5 (patch)
treed18d9c5ad21a32d146e75710195da350e370c81a
parenta93fbdbe9cb6cbdbda94b5cae5ad9177f7af1817 (diff)
DeskClock: Add FLAG_IMMUTABLE
* As per recommendations Change-Id: I467c5eec9e7de1cb8084a173e942832c6ac44e27
-rw-r--r--src/com/android/alarmclock/DigitalAppWidgetProvider.java14
-rw-r--r--src/com/android/deskclock/DeskClockBackupAgent.java3
-rw-r--r--src/com/android/deskclock/Utils.java5
-rw-r--r--src/com/android/deskclock/alarms/AlarmNotifications.java32
-rw-r--r--src/com/android/deskclock/alarms/AlarmStateManager.java10
-rw-r--r--src/com/android/deskclock/data/StopwatchNotificationBuilder.java3
-rw-r--r--src/com/android/deskclock/data/TimerModel.java11
-rw-r--r--src/com/android/deskclock/data/TimerNotificationBuilder.java12
8 files changed, 54 insertions, 36 deletions
diff --git a/src/com/android/alarmclock/DigitalAppWidgetProvider.java b/src/com/android/alarmclock/DigitalAppWidgetProvider.java
index 80a724e85..e31f2d801 100644
--- a/src/com/android/alarmclock/DigitalAppWidgetProvider.java
+++ b/src/com/android/alarmclock/DigitalAppWidgetProvider.java
@@ -57,6 +57,7 @@ import java.util.TimeZone;
import static android.app.AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED;
import static android.app.PendingIntent.FLAG_NO_CREATE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT;
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH;
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT;
@@ -210,7 +211,7 @@ public class DigitalAppWidgetProvider extends AppWidgetProvider {
// Tapping on the widget opens the app (if not on the lock screen).
if (Utils.isWidgetClickable(wm, widgetId)) {
final Intent openApp = new Intent(context, DeskClock.class);
- final PendingIntent pi = PendingIntent.getActivity(context, 0, openApp, 0);
+ final PendingIntent pi = PendingIntent.getActivity(context, 0, openApp, FLAG_IMMUTABLE);
rv.setOnClickPendingIntent(R.id.digital_widget, pi);
}
@@ -276,7 +277,8 @@ public class DigitalAppWidgetProvider extends AppWidgetProvider {
// Tapping on the widget opens the city selection activity (if not on the lock screen).
if (Utils.isWidgetClickable(wm, widgetId)) {
final Intent selectCity = new Intent(context, CitySelectionActivity.class);
- final PendingIntent pi = PendingIntent.getActivity(context, 0, selectCity, 0);
+ final PendingIntent pi = PendingIntent.getActivity(context, 0, selectCity,
+ FLAG_IMMUTABLE);
rv.setPendingIntentTemplate(R.id.world_city_list, pi);
}
}
@@ -369,8 +371,8 @@ public class DigitalAppWidgetProvider extends AppWidgetProvider {
final Date nextDay = Utils.getNextDay(new Date(), zones);
// Schedule the next day-change callback; at least one city is displayed.
- final PendingIntent pi =
- PendingIntent.getBroadcast(context, 0, DAY_CHANGE_INTENT, FLAG_UPDATE_CURRENT);
+ final PendingIntent pi = PendingIntent.getBroadcast(context, 0, DAY_CHANGE_INTENT,
+ FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE);
getAlarmManager(context).setExact(AlarmManager.RTC, nextDay.getTime(), pi);
}
@@ -378,8 +380,8 @@ public class DigitalAppWidgetProvider extends AppWidgetProvider {
* Remove the existing day-change callback.
*/
private void removeDayChangeCallback(Context context) {
- final PendingIntent pi =
- PendingIntent.getBroadcast(context, 0, DAY_CHANGE_INTENT, FLAG_NO_CREATE);
+ final PendingIntent pi = PendingIntent.getBroadcast(context, 0, DAY_CHANGE_INTENT,
+ FLAG_NO_CREATE | FLAG_IMMUTABLE);
if (pi != null) {
getAlarmManager(context).cancel(pi);
pi.cancel();
diff --git a/src/com/android/deskclock/DeskClockBackupAgent.java b/src/com/android/deskclock/DeskClockBackupAgent.java
index 4b6665967..2c5867302 100644
--- a/src/com/android/deskclock/DeskClockBackupAgent.java
+++ b/src/com/android/deskclock/DeskClockBackupAgent.java
@@ -90,7 +90,8 @@ public class DeskClockBackupAgent extends BackupAgent {
// Create an Intent to send into DeskClock indicating restore is complete.
final PendingIntent restoreIntent = PendingIntent.getBroadcast(this, 0,
new Intent(ACTION_COMPLETE_RESTORE).setClass(this, AlarmInitReceiver.class),
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
// Deliver the Intent 10 seconds from now.
final long triggerAtMillis = SystemClock.elapsedRealtime() + 10000;
diff --git a/src/com/android/deskclock/Utils.java b/src/com/android/deskclock/Utils.java
index 348c795c1..ef19131b0 100644
--- a/src/com/android/deskclock/Utils.java
+++ b/src/com/android/deskclock/Utils.java
@@ -71,6 +71,7 @@ import java.util.Locale;
import java.util.TimeZone;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.appwidget.AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY;
import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
@@ -280,7 +281,7 @@ public class Utils {
* @return a PendingIntent that will start a service
*/
public static PendingIntent pendingServiceIntent(Context context, Intent intent) {
- return PendingIntent.getService(context, 0, intent, FLAG_UPDATE_CURRENT);
+ return PendingIntent.getService(context, 0, intent, FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE);
}
/**
@@ -291,7 +292,7 @@ public class Utils {
* @return a PendingIntent that will start an activity
*/
public static PendingIntent pendingActivityIntent(Context context, Intent intent) {
- return PendingIntent.getActivity(context, 0, intent, FLAG_UPDATE_CURRENT);
+ return PendingIntent.getActivity(context, 0, intent, FLAG_UPDATE_CURRENT | FLAG_IMMUTABLE);
}
/**
diff --git a/src/com/android/deskclock/alarms/AlarmNotifications.java b/src/com/android/deskclock/alarms/AlarmNotifications.java
index 4c3c8aed6..208ee4fe6 100644
--- a/src/com/android/deskclock/alarms/AlarmNotifications.java
+++ b/src/com/android/deskclock/alarms/AlarmNotifications.java
@@ -122,7 +122,7 @@ public final class AlarmNotifications {
AlarmInstance.HIDE_NOTIFICATION_STATE);
builder.setDeleteIntent(PendingIntent.getService(context, id,
- hideIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ hideIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
}
// Setup up dismiss action
@@ -130,13 +130,13 @@ public final class AlarmNotifications {
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.PREDISMISSED_STATE);
builder.addAction(R.drawable.ic_alarm_off_24dp,
context.getString(R.string.alarm_alert_dismiss_text),
- PendingIntent.getService(context, id,
- dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ PendingIntent.getService(context, id, dismissIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
// Setup content action if instance is owned by alarm
Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
builder.setContentIntent(PendingIntent.getActivity(context, id,
- viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationUtils.createChannel(context, ALARM_UPCOMING_NOTIFICATION_CHANNEL_ID);
@@ -296,13 +296,13 @@ public final class AlarmNotifications {
final int id = instance.hashCode();
builder.addAction(R.drawable.ic_alarm_off_24dp,
context.getString(R.string.alarm_alert_dismiss_text),
- PendingIntent.getService(context, id,
- dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ PendingIntent.getService(context, id, dismissIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
// Setup content action if instance is owned by alarm
Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
- builder.setContentIntent(PendingIntent.getActivity(context, id,
- viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ builder.setContentIntent(PendingIntent.getActivity(context, id, viewAlarmIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationUtils.createChannel(context, ALARM_SNOOZE_NOTIFICATION_CHANNEL_ID);
@@ -341,7 +341,7 @@ public final class AlarmNotifications {
Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context,
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE);
builder.setDeleteIntent(PendingIntent.getService(context, id,
- dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
// Setup content intent
Intent showAndDismiss = AlarmInstance.createIntent(context, AlarmStateManager.class,
@@ -349,7 +349,7 @@ public final class AlarmNotifications {
showAndDismiss.putExtra(EXTRA_NOTIFICATION_ID, id);
showAndDismiss.setAction(AlarmStateManager.SHOW_AND_DISMISS_ALARM_ACTION);
builder.setContentIntent(PendingIntent.getBroadcast(context, id,
- showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT));
+ showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationUtils.createChannel(context, ALARM_MISSED_NOTIFICATION_CHANNEL_ID);
@@ -382,7 +382,8 @@ public final class AlarmNotifications {
AlarmStateManager.ALARM_SNOOZE_TAG, instance, AlarmInstance.SNOOZE_STATE);
snoozeIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true);
PendingIntent snoozePendingIntent = PendingIntent.getService(service,
- ALARM_FIRING_NOTIFICATION_ID, snoozeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ ALARM_FIRING_NOTIFICATION_ID, snoozeIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
notification.addAction(R.drawable.ic_snooze_24dp,
resources.getString(R.string.alarm_alert_snooze_text), snoozePendingIntent);
@@ -391,7 +392,8 @@ public final class AlarmNotifications {
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE);
dismissIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true);
PendingIntent dismissPendingIntent = PendingIntent.getService(service,
- ALARM_FIRING_NOTIFICATION_ID, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ ALARM_FIRING_NOTIFICATION_ID, dismissIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
notification.addAction(R.drawable.ic_alarm_off_24dp,
resources.getString(R.string.alarm_alert_dismiss_text),
dismissPendingIntent);
@@ -400,7 +402,8 @@ public final class AlarmNotifications {
Intent contentIntent = AlarmInstance.createIntent(service, AlarmActivity.class,
instance.mId);
notification.setContentIntent(PendingIntent.getActivity(service,
- ALARM_FIRING_NOTIFICATION_ID, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+ ALARM_FIRING_NOTIFICATION_ID, contentIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
// Setup fullscreen intent
Intent fullScreenIntent = AlarmInstance.createIntent(service, AlarmActivity.class,
@@ -410,7 +413,8 @@ public final class AlarmNotifications {
fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_NO_USER_ACTION);
notification.setFullScreenIntent(PendingIntent.getActivity(service,
- ALARM_FIRING_NOTIFICATION_ID, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT),
+ ALARM_FIRING_NOTIFICATION_ID, fullScreenIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE),
true);
notification.setPriority(NotificationCompat.PRIORITY_HIGH);
diff --git a/src/com/android/deskclock/alarms/AlarmStateManager.java b/src/com/android/deskclock/alarms/AlarmStateManager.java
index 4f91f84df..40a1b5bce 100644
--- a/src/com/android/deskclock/alarms/AlarmStateManager.java
+++ b/src/com/android/deskclock/alarms/AlarmStateManager.java
@@ -248,7 +248,8 @@ public final class AlarmStateManager extends BroadcastReceiver {
final int flags = nextAlarm == null ? PendingIntent.FLAG_NO_CREATE : 0;
final PendingIntent operation = PendingIntent.getBroadcast(context, 0 /* requestCode */,
- AlarmStateManager.createIndicatorIntent(context), flags);
+ AlarmStateManager.createIndicatorIntent(context),
+ flags | PendingIntent.FLAG_IMMUTABLE);
if (nextAlarm != null) {
LogUtils.i("Setting upcoming AlarmClockInfo for alarm: " + nextAlarm.mId);
@@ -257,7 +258,7 @@ public final class AlarmStateManager extends BroadcastReceiver {
// Create an intent that can be used to show or edit details of the next alarm.
PendingIntent viewIntent = PendingIntent.getActivity(context, nextAlarm.hashCode(),
AlarmNotifications.createViewAlarmIntent(context, nextAlarm),
- PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
final AlarmClockInfo info = new AlarmClockInfo(alarmTime, viewIntent);
Utils.updateNextAlarm(alarmManager, info, operation);
@@ -1043,7 +1044,8 @@ public final class AlarmStateManager extends BroadcastReceiver {
// Treat alarm state change as high priority, use foreground broadcasts
stateChangeIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
PendingIntent pendingIntent = PendingIntent.getService(context, instance.hashCode(),
- stateChangeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ stateChangeIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
final AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
if (Utils.isMOrLater()) {
@@ -1061,7 +1063,7 @@ public final class AlarmStateManager extends BroadcastReceiver {
// Create a PendingIntent that will match any one set for this instance
PendingIntent pendingIntent = PendingIntent.getService(context, instance.hashCode(),
createStateChangeIntent(context, ALARM_MANAGER_TAG, instance, null),
- PendingIntent.FLAG_NO_CREATE);
+ PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE);
if (pendingIntent != null) {
AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
diff --git a/src/com/android/deskclock/data/StopwatchNotificationBuilder.java b/src/com/android/deskclock/data/StopwatchNotificationBuilder.java
index 71405f11b..850299a08 100644
--- a/src/com/android/deskclock/data/StopwatchNotificationBuilder.java
+++ b/src/com/android/deskclock/data/StopwatchNotificationBuilder.java
@@ -60,7 +60,8 @@ class StopwatchNotificationBuilder {
.putExtra(Events.EXTRA_EVENT_LABEL, eventLabel);
final PendingIntent pendingShowApp = PendingIntent.getService(context, 0, showApp,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
// Compute some values required below.
final boolean running = stopwatch.isRunning();
diff --git a/src/com/android/deskclock/data/TimerModel.java b/src/com/android/deskclock/data/TimerModel.java
index 33f02c51f..5eb5d43e5 100644
--- a/src/com/android/deskclock/data/TimerModel.java
+++ b/src/com/android/deskclock/data/TimerModel.java
@@ -678,16 +678,19 @@ final class TimerModel {
if (nextExpiringTimer == null) {
// Cancel the existing timer expiration callback.
- final PendingIntent pi = PendingIntent.getService(mContext,
- 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE);
+ final PendingIntent pi = PendingIntent.getService(mContext, 0, intent,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE |
+ PendingIntent.FLAG_IMMUTABLE);
+
if (pi != null) {
mAlarmManager.cancel(pi);
pi.cancel();
}
} else {
// Update the existing timer expiration callback.
- final PendingIntent pi = PendingIntent.getService(mContext,
- 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ final PendingIntent pi = PendingIntent.getService(mContext, 0, intent,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
schedulePendingIntent(mAlarmManager, nextExpiringTimer.getExpirationTime(), pi);
}
}
diff --git a/src/com/android/deskclock/data/TimerNotificationBuilder.java b/src/com/android/deskclock/data/TimerNotificationBuilder.java
index 59727ab7a..1958d531a 100644
--- a/src/com/android/deskclock/data/TimerNotificationBuilder.java
+++ b/src/com/android/deskclock/data/TimerNotificationBuilder.java
@@ -152,7 +152,8 @@ class TimerNotificationBuilder {
final PendingIntent pendingShowApp =
PendingIntent.getService(context, REQUEST_CODE_UPCOMING, showApp,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
final Builder notification = new NotificationCompat.Builder(
context, TIMER_MODEL_NOTIFICATION_CHANNEL_ID)
@@ -198,7 +199,8 @@ class TimerNotificationBuilder {
// Schedule a callback to update the time-sensitive information of the running timer
final PendingIntent pi =
PendingIntent.getService(context, REQUEST_CODE_UPCOMING, updateNotification,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
final long nextMinuteChange = remainingTime % MINUTE_IN_MILLIS;
final long triggerTime = SystemClock.elapsedRealtime() + nextMinuteChange;
@@ -206,7 +208,8 @@ class TimerNotificationBuilder {
} else {
// Cancel the update notification callback.
final PendingIntent pi = PendingIntent.getService(context, 0, updateNotification,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE |
+ PendingIntent.FLAG_IMMUTABLE);
if (pi != null) {
am.cancel(pi);
pi.cancel();
@@ -352,7 +355,8 @@ class TimerNotificationBuilder {
final PendingIntent pendingShowApp =
PendingIntent.getService(context, REQUEST_CODE_MISSING, showApp,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT |
+ PendingIntent.FLAG_IMMUTABLE);
final Builder notification = new NotificationCompat.Builder(
context, TIMER_MODEL_NOTIFICATION_CHANNEL_ID)