Workaround NPE in PersistableBundle.getExtras().
Test: Existing unit tests pass. Ran integration test app.
Fixes: b/138441699
Change-Id: I0b48e0009a7d83c343a3d26112b94c057470c281
diff --git a/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java b/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
index aa28fb2..bbc87a0 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
@@ -16,6 +16,8 @@
package androidx.work.impl.background.systemjob;
+import static androidx.work.impl.background.systemjob.SystemJobInfoConverter.EXTRA_WORK_SPEC_ID;
+
import android.app.Application;
import android.app.job.JobParameters;
import android.app.job.JobService;
@@ -24,6 +26,7 @@
import android.text.TextUtils;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.work.Logger;
@@ -86,22 +89,14 @@
}
@Override
- public boolean onStartJob(JobParameters params) {
+ public boolean onStartJob(@NonNull JobParameters params) {
if (mWorkManagerImpl == null) {
Logger.get().debug(TAG, "WorkManager is not initialized; requesting retry.");
jobFinished(params, true);
return false;
}
- PersistableBundle extras = params.getExtras();
- // This can be null, possibly on a device-specific/API-specific (23) situation. b/134028277
- //noinspection ConstantConditions
- if (extras == null) {
- Logger.get().error(TAG, "No extras in JobParameters.");
- return false;
- }
-
- String workSpecId = extras.getString(SystemJobInfoConverter.EXTRA_WORK_SPEC_ID);
+ String workSpecId = getWorkSpecIdFromJobParameters(params);
if (TextUtils.isEmpty(workSpecId)) {
Logger.get().error(TAG, "WorkSpec id not found!");
return false;
@@ -152,21 +147,13 @@
}
@Override
- public boolean onStopJob(JobParameters params) {
+ public boolean onStopJob(@NonNull JobParameters params) {
if (mWorkManagerImpl == null) {
Logger.get().debug(TAG, "WorkManager is not initialized; requesting retry.");
return true;
}
- PersistableBundle extras = params.getExtras();
- // This can be null, possibly on a device-specific/API-specific (23) situation. b/134028277
- //noinspection ConstantConditions
- if (extras == null) {
- Logger.get().error(TAG, "No extras in JobParameters.");
- return false;
- }
-
- String workSpecId = extras.getString(SystemJobInfoConverter.EXTRA_WORK_SPEC_ID);
+ String workSpecId = getWorkSpecIdFromJobParameters(params);
if (TextUtils.isEmpty(workSpecId)) {
Logger.get().error(TAG, "WorkSpec id not found!");
return false;
@@ -192,4 +179,18 @@
jobFinished(parameters, needsReschedule);
}
}
+
+ @Nullable
+ @SuppressWarnings("ConstantConditions")
+ private static String getWorkSpecIdFromJobParameters(@NonNull JobParameters parameters) {
+ try {
+ PersistableBundle extras = parameters.getExtras();
+ if (extras != null && extras.containsKey(EXTRA_WORK_SPEC_ID)) {
+ return extras.getString(EXTRA_WORK_SPEC_ID);
+ }
+ } catch (NullPointerException e) {
+ // b/138441699: BaseBundle.getString sometimes throws an NPE. Ignore and return null.
+ }
+ return null;
+ }
}