Use FLAG_MUTABLE for `PendingIntent`s that we create.
* Android S requires us to be explicit about pending intents.
`FLAG_MUTABLE` is equivalent to the defaults on prior versions of
the platforms.
Test: Ran extensive integration tests locally. All unit tests pass.
Fixes: b/180661597
Change-Id: Ida3f1701fc7d8168abe166f64e78de7bcb62252d
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java b/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
index 744d88d..a156b0a 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
@@ -16,6 +16,7 @@
package androidx.work.impl;
+import static android.app.PendingIntent.FLAG_MUTABLE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
import static android.text.TextUtils.isEmpty;
@@ -31,6 +32,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.arch.core.util.Function;
+import androidx.core.os.BuildCompat;
import androidx.lifecycle.LiveData;
import androidx.work.Configuration;
import androidx.work.ExistingPeriodicWorkPolicy;
@@ -475,7 +477,11 @@
@Override
public PendingIntent createCancelPendingIntent(@NonNull UUID id) {
Intent intent = createCancelWorkIntent(mContext, id.toString());
- return PendingIntent.getService(mContext, 0, intent, FLAG_UPDATE_CURRENT);
+ int flags = FLAG_UPDATE_CURRENT;
+ if (BuildCompat.isAtLeastS()) {
+ flags |= FLAG_MUTABLE;
+ }
+ return PendingIntent.getService(mContext, 0, intent, flags);
}
@Override
diff --git a/work/workmanager/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java b/work/workmanager/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
index 6610214..d22b8e8 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/utils/ForceStopRunnable.java
@@ -17,6 +17,7 @@
package androidx.work.impl.utils;
import static android.app.AlarmManager.RTC_WAKEUP;
+import static android.app.PendingIntent.FLAG_MUTABLE;
import static android.app.PendingIntent.FLAG_NO_CREATE;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
@@ -40,6 +41,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
+import androidx.core.os.BuildCompat;
import androidx.work.Configuration;
import androidx.work.InitializationExceptionHandler;
import androidx.work.Logger;
@@ -296,7 +298,11 @@
static void setAlarm(Context context) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
// Using FLAG_UPDATE_CURRENT, because we only ever want once instance of this alarm.
- PendingIntent pendingIntent = getPendingIntent(context, FLAG_UPDATE_CURRENT);
+ int flags = FLAG_UPDATE_CURRENT;
+ if (BuildCompat.isAtLeastS()) {
+ flags |= FLAG_MUTABLE;
+ }
+ PendingIntent pendingIntent = getPendingIntent(context, flags);
long triggerAt = System.currentTimeMillis() + TEN_YEARS;
if (alarmManager != null) {
if (Build.VERSION.SDK_INT >= 19) {