Closes download interstitial when download is cancelled externally.

Demo: https://drive.google.com/file/d/1m8d73WtJ5uBoFpBnA1GYlsYE9jYECMDh/view?usp=sharing&resourcekey=0-r2dQtB1tnFFP1_-7lFamJw

(cherry picked from commit 347c90211d0f44216b0c58f88a1c52d460c7fb09)

Bug: 1325280
Change-Id: I5cc9b253b6e55f8a50c05a06ed95529519dddadc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3641421
Reviewed-by: Shakti Sahu <shaktisahu@chromium.org>
Commit-Queue: Alex Mitra <alexmitra@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1003178}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3654182
Auto-Submit: Alex Mitra <alexmitra@chromium.org>
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/branch-heads/5060@{#109}
Cr-Branched-From: b83393d0f4038aeaf67f970a024d8101df7348d1-refs/heads/main@{#1002911}
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java
index 4204ae9..4aae639 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorFactory.java
@@ -22,7 +22,8 @@
     public static DownloadInterstitialCoordinator create(
             Supplier<Context> contextSupplier, String downloadUrl, WindowAndroid windowAndroid) {
         return new DownloadInterstitialCoordinatorImpl(contextSupplier, downloadUrl,
-                OfflineContentAggregatorFactory.get(), SnackbarManagerProvider.from(windowAndroid));
+                OfflineContentAggregatorFactory.get(), SnackbarManagerProvider.from(windowAndroid),
+                () -> NewDownloadTab.closeExistingNewDownloadTab(windowAndroid));
     }
 
     private DownloadInterstitialCoordinatorFactory() {}
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java
index a848830..1e14796 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialCoordinatorImpl.java
@@ -32,12 +32,13 @@
      * @param snackbarManager Snackbar manager for the current activity.
      */
     public DownloadInterstitialCoordinatorImpl(Supplier<Context> contextSupplier,
-            String downloadUrl, OfflineContentProvider provider, SnackbarManager snackbarManager) {
+            String downloadUrl, OfflineContentProvider provider, SnackbarManager snackbarManager,
+            Runnable closeRunnable) {
         mView = DownloadInterstitialView.create(contextSupplier.get());
         PropertyModel model =
                 new PropertyModel.Builder(DownloadInterstitialProperties.ALL_KEYS).build();
         mMediator = new DownloadInterstitialMediator(contextSupplier, model, downloadUrl, provider,
-                snackbarManager, SharedPreferencesManager.getInstance());
+                snackbarManager, SharedPreferencesManager.getInstance(), closeRunnable);
         mModelChangeProcessor = PropertyModelChangeProcessor.create(
                 model, mView, DownloadInterstitialViewBinder::bind);
     }
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java
index 7745981..3d20b94 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediator.java
@@ -62,6 +62,7 @@
     private final SnackbarManager mSnackbarManager;
     private final OfflineContentProvider.Observer mObserver;
     private final SharedPreferencesManager mSharedPrefs;
+    private final Runnable mCloseRunnable;
     private boolean mDownloadIsComplete;
     private boolean mPendingDeletion;
 
@@ -77,13 +78,14 @@
      */
     DownloadInterstitialMediator(Supplier<Context> contextSupplier, PropertyModel model,
             String downloadUrl, OfflineContentProvider provider, SnackbarManager snackbarManager,
-            SharedPreferencesManager sharedPrefs) {
+            SharedPreferencesManager sharedPrefs, Runnable closeRunnable) {
         mContextSupplier = contextSupplier;
         mModel = model;
         mDownloadUrl = downloadUrl;
         mProvider = provider;
         mSnackbarManager = snackbarManager;
         mSharedPrefs = sharedPrefs;
+        mCloseRunnable = closeRunnable;
 
         mModel.set(ListProperties.ENABLE_ITEM_ANIMATIONS, true);
         mModel.set(ListProperties.CALLBACK_OPEN, this::onOpenItem);
@@ -105,7 +107,7 @@
      */
     void destroy() {
         mProvider.removeObserver(mObserver);
-        if (mPendingDeletion || mModel.get(STATE) == State.CANCELLED) {
+        if (mPendingDeletion || mModel.get(STATE) == State.PENDING_REMOVAL) {
             mProvider.removeItem(mModel.get(DOWNLOAD_ITEM).id);
         }
         clearDownloadPendingRemoval();
@@ -137,7 +139,7 @@
                 mModel.set(SECONDARY_BUTTON_IS_VISIBLE, true);
                 mDownloadIsComplete = true;
                 break;
-            case State.CANCELLED:
+            case State.PENDING_REMOVAL:
                 mModel.set(TITLE_TEXT, mContextSupplier.get().getString(R.string.menu_download));
                 mModel.set(PRIMARY_BUTTON_TEXT,
                         mContextSupplier.get().getString(R.string.menu_download));
@@ -174,16 +176,16 @@
     }
 
     private void onCancelItem(OfflineItem item) {
-        setState(State.CANCELLED);
         storeDownloadPendingRemoval(item.id);
         mProvider.pauseDownload(item.id);
+        setState(State.PENDING_REMOVAL);
     }
 
     private void onDeleteItem(OfflineItem item) {
         mPendingDeletion = true;
         storeDownloadPendingRemoval(item.id);
         showDeletedSnackbar();
-        setState(State.CANCELLED);
+        setState(State.PENDING_REMOVAL);
     }
 
     private void onShareItem(OfflineItem item) {
@@ -265,8 +267,11 @@
                     setState(State.SUCCESSFUL);
                 } else if (item.state == OfflineItemState.PAUSED
                         && mModel.get(STATE) != State.PAUSED
-                        && mModel.get(STATE) != State.CANCELLED) {
+                        && mModel.get(STATE) != State.PENDING_REMOVAL) {
                     setState(State.PAUSED);
+                } else if (item.state == OfflineItemState.CANCELLED
+                        && mModel.get(STATE) != State.PENDING_REMOVAL) {
+                    mCloseRunnable.run();
                 }
             }
         };
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java
index 37b9993..5b6645ab 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java
@@ -76,7 +76,8 @@
         mModel.set(DownloadInterstitialProperties.SECONDARY_BUTTON_TEXT, CANCEL_BUTTON_TEXT);
         mProvider.addItem(mItem0);
         mMediator = new DownloadInterstitialMediator(InstrumentationRegistry::getContext, mModel,
-                mItem0.originalUrl, mProvider, mSnackbarManager, sharedPrefsManager);
+                mItem0.originalUrl, mProvider, mSnackbarManager, sharedPrefsManager,
+                () -> { mMediator = null; });
         // Increment progress to trigger onItemUpdated method for OfflineContentProvider observers.
         // This attaches the OfflineItem to the mediator.
         mProvider.incrementProgress(mItem0.id);
@@ -111,7 +112,7 @@
         mModel.set(DOWNLOAD_ITEM, null);
         mMediator = new DownloadInterstitialMediator(InstrumentationRegistry::getContext, mModel,
                 item1.originalUrl, mProvider, mSnackbarManager,
-                SharedPreferencesManager.getInstance());
+                SharedPreferencesManager.getInstance(), () -> { mMediator = null; });
         mProvider.incrementProgress(mItem0.id);
         mProvider.addItem(item1);
         mProvider.incrementProgress(item1.id);
@@ -125,7 +126,7 @@
         assertEquals(OfflineItemState.IN_PROGRESS, mModel.get(DOWNLOAD_ITEM).state);
         clickButtonWithText(CANCEL_BUTTON_TEXT);
 
-        assertEquals(DownloadInterstitialProperties.State.CANCELLED, mModel.get(STATE));
+        assertEquals(DownloadInterstitialProperties.State.PENDING_REMOVAL, mModel.get(STATE));
         assertNotEquals(OfflineItemState.IN_PROGRESS, mModel.get(DOWNLOAD_ITEM).state);
     }
 
@@ -195,7 +196,7 @@
         clickButtonWithText(DELETE_BUTTON_TEXT);
 
         assertTrue(mSnackbarShown);
-        assertEquals(DownloadInterstitialProperties.State.CANCELLED, mModel.get(STATE));
+        assertEquals(DownloadInterstitialProperties.State.PENDING_REMOVAL, mModel.get(STATE));
     }
 
     @Test
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
index 3e1718ce..f7850fc 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialProperties.java
@@ -19,7 +19,8 @@
  * UI containing a download ListItem.
  */
 interface DownloadInterstitialProperties extends ListProperties {
-    @IntDef({State.UNKNOWN, State.IN_PROGRESS, State.SUCCESSFUL, State.CANCELLED, State.PAUSED})
+    @IntDef({State.UNKNOWN, State.IN_PROGRESS, State.SUCCESSFUL, State.PENDING_REMOVAL,
+            State.PAUSED})
     /**
      * Keeps track of the state of the DownloadInterstitial. This may be different to the state of
      * the offline item displayed within the UI.
@@ -28,7 +29,7 @@
         int UNKNOWN = 0;
         int IN_PROGRESS = 1;
         int SUCCESSFUL = 2;
-        int CANCELLED = 3;
+        int PENDING_REMOVAL = 3;
         int PAUSED = 4;
     }
 
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialView.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialView.java
index 6379779..b5df2ba 100644
--- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialView.java
+++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialView.java
@@ -80,7 +80,7 @@
      */
     void updateFileInfo(OfflineItem item, PropertyModel model) {
         // TODO(alexmitra): Investigate removing code which sets the item's state directly.
-        if (model.get(STATE) == DownloadInterstitialProperties.State.CANCELLED) {
+        if (model.get(STATE) == DownloadInterstitialProperties.State.PENDING_REMOVAL) {
             item.state = OfflineItemState.CANCELLED;
         } else if (model.get(STATE) == DownloadInterstitialProperties.State.SUCCESSFUL) {
             item.state = OfflineItemState.COMPLETE;