summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-11-28 15:13:12 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-11-28 15:13:12 -0800
commite495c97a17e9387d92e369a52b1212e6f908a8de (patch)
treef3e67013dcfd7213df70dfb7eb76f7ebfe41d9ef
parent8ec8bdebaefcecb8b3e6b9f724aba7b25406db21 (diff)
parentfec5f50a85e1bfc7bb4fa12d04ffa7526c79fad7 (diff)
downloadandroid_packages_providers_DownloadProvider-e495c97a17e9387d92e369a52b1212e6f908a8de.tar.gz
android_packages_providers_DownloadProvider-e495c97a17e9387d92e369a52b1212e6f908a8de.tar.bz2
android_packages_providers_DownloadProvider-e495c97a17e9387d92e369a52b1212e6f908a8de.zip
Merge "Improve download remaining time calculation." into jb-mr1.1-dev
-rw-r--r--src/com/android/providers/downloads/DownloadHandler.java16
-rw-r--r--src/com/android/providers/downloads/DownloadNotifier.java11
-rw-r--r--src/com/android/providers/downloads/DownloadThread.java13
3 files changed, 14 insertions, 26 deletions
diff --git a/src/com/android/providers/downloads/DownloadHandler.java b/src/com/android/providers/downloads/DownloadHandler.java
index dff09eb0..2f02864e 100644
--- a/src/com/android/providers/downloads/DownloadHandler.java
+++ b/src/com/android/providers/downloads/DownloadHandler.java
@@ -37,7 +37,7 @@ public class DownloadHandler {
private final HashMap<Long, DownloadInfo> mDownloadsInProgress =
new HashMap<Long, DownloadInfo>();
@GuardedBy("this")
- private final LongSparseArray<Long> mRemainingMillis = new LongSparseArray<Long>();
+ private final LongSparseArray<Long> mCurrentSpeed = new LongSparseArray<Long>();
private final int mMaxConcurrentDownloadsAllowed = Resources.getSystem().getInteger(
com.android.internal.R.integer.config_MaxConcurrentDownloadsAllowed);
@@ -82,23 +82,19 @@ public class DownloadHandler {
public synchronized void dequeueDownload(long id) {
mDownloadsInProgress.remove(id);
- mRemainingMillis.remove(id);
+ mCurrentSpeed.remove(id);
startDownloadThreadLocked();
if (mDownloadsInProgress.size() == 0 && mDownloadsQueue.size() == 0) {
notifyAll();
}
}
- public synchronized void setRemainingMillis(long id, long millis) {
- mRemainingMillis.put(id, millis);
+ public synchronized void setCurrentSpeed(long id, long speed) {
+ mCurrentSpeed.put(id, speed);
}
- /**
- * Return remaining time until given {@link DownloadInfo} finishes, in
- * milliseconds, or -1 if unknown.
- */
- public synchronized long getRemainingMillis(long id) {
- return mRemainingMillis.get(id, -1L);
+ public synchronized long getCurrentSpeed(long id) {
+ return mCurrentSpeed.get(id, -1L);
}
// right now this is only used by tests. but there is no reason why it can't be used
diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java
index f6e7a2ee..f89d2d02 100644
--- a/src/com/android/providers/downloads/DownloadNotifier.java
+++ b/src/com/android/providers/downloads/DownloadNotifier.java
@@ -163,23 +163,24 @@ public class DownloadNotifier {
long current = 0;
long total = 0;
- long remainingMillis = -1;
+ long speed = 0;
for (DownloadInfo info : cluster) {
if (info.mTotalBytes != -1) {
current += info.mCurrentBytes;
total += info.mTotalBytes;
- remainingMillis = Math.max(
- handler.getRemainingMillis(info.mId), remainingMillis);
+ speed += handler.getCurrentSpeed(info.mId);
}
}
if (total > 0) {
final int percent = (int) ((current * 100) / total);
- if (remainingMillis != -1) {
+ percentText = res.getString(R.string.download_percent, percent);
+
+ if (speed > 0) {
+ final long remainingMillis = ((total - current) * 1000) / speed;
remainingText = res.getString(R.string.download_remaining,
DateUtils.formatDuration(remainingMillis));
}
- percentText = res.getString(R.string.download_percent, percent);
builder.setProgress(100, percent, false);
} else {
diff --git a/src/com/android/providers/downloads/DownloadThread.java b/src/com/android/providers/downloads/DownloadThread.java
index 2bd3d362..34bc8e34 100644
--- a/src/com/android/providers/downloads/DownloadThread.java
+++ b/src/com/android/providers/downloads/DownloadThread.java
@@ -107,8 +107,6 @@ public class DownloadThread extends Thread {
public long mSpeedSampleStart;
/** Bytes transferred since current sample started. */
public long mSpeedSampleBytes;
- /** Estimated time until finished. */
- public long mRemainingMillis;
public State(DownloadInfo info) {
mMimeType = Intent.normalizeMimeType(info.mMimeType);
@@ -443,20 +441,13 @@ public class DownloadThread extends Thread {
if (state.mSpeed == 0) {
state.mSpeed = sampleSpeed;
} else {
- state.mSpeed = (state.mSpeed + sampleSpeed) / 2;
+ state.mSpeed = ((state.mSpeed * 3) + sampleSpeed) / 4;
}
state.mSpeedSampleStart = now;
state.mSpeedSampleBytes = state.mCurrentBytes;
- if (state.mSpeed != 0) {
- state.mRemainingMillis = ((state.mTotalBytes - state.mCurrentBytes) * 1000)
- / state.mSpeed;
- } else {
- state.mRemainingMillis = -1;
- }
-
- DownloadHandler.getInstance().setRemainingMillis(mInfo.mId, state.mRemainingMillis);
+ DownloadHandler.getInstance().setCurrentSpeed(mInfo.mId, state.mSpeed);
}
if (state.mCurrentBytes - state.mBytesNotified > Constants.MIN_PROGRESS_STEP &&