Empty WorkContinuation node makes subsequent nodes the head node and replaces the chain.

* Enqueue runnable looks for a node with no pre-requisites to start a REPLACE
* When we insert an empty node in the middle of the chain, the next node
  becomes the new head node, and previously inserted nodes are replaced.
* This fix just treats a then(emptyList) a no-op and returns the existing
  WorkContinuation.

Fixes: b/142835274
Test: Added unit tests. Ran integration tests.
Change-Id: Ib34badf0477771eb06a6bfe68c7d9f4ed664563b
diff --git a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
index 82cf2d4..4228970 100644
--- a/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
+++ b/work/workmanager/src/androidTest/java/androidx/work/impl/WorkContinuationImplTest.java
@@ -168,6 +168,25 @@
     }
 
     @Test
+    public void testContinuation_withEmptyNode_enqueue() throws ExecutionException,
+            InterruptedException {
+        OneTimeWorkRequest first = createTestWorker();
+        OneTimeWorkRequest second = createTestWorker();
+        WorkContinuation continuation = new WorkContinuationImpl(mWorkManagerImpl,
+                Collections.singletonList(first));
+        continuation = continuation.then(Collections.<OneTimeWorkRequest>emptyList());
+        continuation = continuation.then(Collections.singletonList(second));
+        continuation.enqueue().getResult().get();
+        WorkSpec firstWorkSpec = mDatabase.workSpecDao().getWorkSpec(first.getStringId());
+        WorkSpec secondWorkSpec = mDatabase.workSpecDao().getWorkSpec(second.getStringId());
+        assertThat(firstWorkSpec, is(notNullValue()));
+        assertThat(secondWorkSpec, is(notNullValue()));
+        List<String> prerequisites =
+                mDatabase.dependencyDao().getPrerequisites(second.getStringId());
+        assertThat(prerequisites, containsInAnyOrder(first.getStringId()));
+    }
+
+    @Test
     public void testContinuation_chainEnqueue() throws ExecutionException, InterruptedException {
         WorkContinuationImpl continuation =
                 new WorkContinuationImpl(mWorkManagerImpl, createTestWorkerList());
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
index a1e1a44..9ba6b39 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkContinuationImpl.java
@@ -151,11 +151,15 @@
 
     @Override
     public @NonNull WorkContinuation then(@NonNull List<OneTimeWorkRequest> work) {
-        return new WorkContinuationImpl(mWorkManagerImpl,
-                mName,
-                ExistingWorkPolicy.KEEP,
-                work,
-                Collections.singletonList(this));
+        if (work.isEmpty()) {
+            return this;
+        } else {
+            return new WorkContinuationImpl(mWorkManagerImpl,
+                    mName,
+                    ExistingWorkPolicy.KEEP,
+                    work,
+                    Collections.singletonList(this));
+        }
     }
 
     @Override