| Index: chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| index 5fe243de8451248152d94ddd447f5252d6e62ca3..716fcd00c5519065854b9e076ff22c0d9fb86716 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
|
| @@ -13,6 +13,7 @@ import android.content.IntentFilter;
|
| import android.content.SharedPreferences;
|
| import android.database.Cursor;
|
| import android.net.ConnectivityManager;
|
| +import android.net.NetworkInfo;
|
| import android.net.Uri;
|
| import android.os.AsyncTask;
|
| import android.os.Environment;
|
| @@ -369,6 +370,39 @@ public class DownloadManagerService extends BroadcastReceiver implements
|
| }
|
| updateDownloadProgress(item, status);
|
| scheduleUpdateIfNeeded();
|
| +
|
| + if (!isAutoResumable || sIsNetworkListenerDisabled) return;
|
| + ConnectivityManager cm =
|
| + (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
|
| + NetworkInfo info = cm.getActiveNetworkInfo();
|
| + if (info == null || !info.isConnected()) return;
|
| + DownloadProgress progress = mDownloadProgressMap.get(item.getId());
|
| + if (progress.mCanDownloadWhileMetered && !isActiveNetworkMetered(mContext)) {
|
| + // Normally the download will automatically resume when network is reconnected.
|
| + // However, if there are multiple network connections and the interruption is caused
|
| + // by switching between active networks, onConnectionTypeChanged() will not get called.
|
| + // As a result, we should resume immediately.
|
| + // TODO(qinmin): Handle the case if the interruption is caused by switching between
|
| + // 2 metered networks or 2 non-metered networks on device with multiple antennas.
|
| + scheduleDownloadResumption(item);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Helper method to schedule a download for resumption.
|
| + * @param item DownloadItem to resume.
|
| + */
|
| + private void scheduleDownloadResumption(final DownloadItem item) {
|
| + removeAutoResumableDownload(item.getId());
|
| + // Post a delayed task to avoid an issue that when connectivity status just changed
|
| + // to CONNECTED, immediately establishing a connection will sometimes fail.
|
| + mHandler.postDelayed(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + resumeDownload(LegacyHelpers.buildLegacyContentId(false, item.getId()),
|
| + item, false);
|
| + }
|
| + }, mUpdateDelayInMillis);
|
| }
|
|
|
| /**
|
| @@ -1511,24 +1545,16 @@ public class DownloadManagerService extends BroadcastReceiver implements
|
| if (mAutoResumableDownloadIds.isEmpty()) return;
|
| if (connectionType == ConnectionType.CONNECTION_NONE) return;
|
| boolean isMetered = isActiveNetworkMetered(mContext);
|
| - Iterator<String> iterator = mAutoResumableDownloadIds.iterator();
|
| + // Make a copy of |mAutoResumableDownloadIds| as scheduleDownloadResumption() may delete
|
| + // elements inside the array.
|
| + List<String> copies = new ArrayList<String>(mAutoResumableDownloadIds);
|
| + Iterator<String> iterator = copies.iterator();
|
| while (iterator.hasNext()) {
|
| final String id = iterator.next();
|
| final DownloadProgress progress = mDownloadProgressMap.get(id);
|
| // Introduce some delay in each resumption so we don't start all of them immediately.
|
| if (progress != null && (progress.mCanDownloadWhileMetered || !isMetered)) {
|
| - // Remove the pending resumable item so that the task won't be posted again on the
|
| - // next connectivity change.
|
| - iterator.remove();
|
| - // Post a delayed task to avoid an issue that when connectivity status just changed
|
| - // to CONNECTED, immediately establishing a connection will sometimes fail.
|
| - mHandler.postDelayed(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - resumeDownload(LegacyHelpers.buildLegacyContentId(false, id),
|
| - progress.mDownloadItem, false);
|
| - }
|
| - }, mUpdateDelayInMillis);
|
| + scheduleDownloadResumption(progress.mDownloadItem);
|
| }
|
| }
|
| stopListenToConnectionChangeIfNotNeeded();
|
|
|