diff options
author | Michael W <baddaemon87@gmail.com> | 2022-02-22 12:38:56 +0100 |
---|---|---|
committer | Michael W <baddaemon87@gmail.com> | 2022-04-18 10:02:01 +0200 |
commit | 8ac23932464461557c48b520fbc141efcd8a8ad5 (patch) | |
tree | d18d9c5ad21a32d146e75710195da350e370c81a | |
parent | a93fbdbe9cb6cbdbda94b5cae5ad9177f7af1817 (diff) |
DeskClock: Add FLAG_IMMUTABLE
* As per recommendations
Change-Id: I467c5eec9e7de1cb8084a173e942832c6ac44e27
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) |