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;