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;
+    }
 }