Merge "Ensure that the copy notification is always cancelable." into mnc-dev
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
index 6e050c6..506ec5833 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java
@@ -173,8 +173,6 @@
                         .setAutoCancel(true);
                 mNotificationManager.notify(mJobId, 0, errorBuilder.build());
             }
-
-            // TODO: Display a toast if the copy was cancelled.
         }
     }
 
@@ -306,13 +304,15 @@
     private void handleCancel(Intent intent) {
         final String cancelledId = intent.getStringExtra(EXTRA_CANCEL);
         // Do nothing if the cancelled ID doesn't match the current job ID. This prevents racey
-        // cancellation requests from affecting unrelated copy jobs.
-        if (Objects.equals(mJobId, cancelledId)) {
+        // cancellation requests from affecting unrelated copy jobs.  However, if the current job ID
+        // is null, the service most likely crashed and was revived by the incoming cancel intent.
+        // In that case, always allow the cancellation to proceed.
+        if (Objects.equals(mJobId, cancelledId) || mJobId == null) {
             // Set the cancel flag. This causes the copy loops to exit.
             mIsCancelled = true;
             // Dismiss the progress notification here rather than in the copy loop. This preserves
             // interactivity for the user in case the copy loop is stalled.
-            mNotificationManager.cancel(mJobId, 0);
+            mNotificationManager.cancel(cancelledId, 0);
         }
     }