diff options
Diffstat (limited to 'src/com/android/providers/downloads/DownloadNotifier.java')
-rw-r--r-- | src/com/android/providers/downloads/DownloadNotifier.java | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/src/com/android/providers/downloads/DownloadNotifier.java b/src/com/android/providers/downloads/DownloadNotifier.java index f3878654..ac52eba2 100644 --- a/src/com/android/providers/downloads/DownloadNotifier.java +++ b/src/com/android/providers/downloads/DownloadNotifier.java @@ -19,6 +19,8 @@ package com.android.providers.downloads; import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE; import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED; import static android.app.DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION; +import static android.provider.Downloads.Impl.STATUS_RUNNING; +import static com.android.providers.downloads.Constants.TAG; import android.app.DownloadManager; import android.app.Notification; @@ -29,9 +31,12 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.net.Uri; +import android.os.SystemClock; import android.provider.Downloads; import android.text.TextUtils; import android.text.format.DateUtils; +import android.util.Log; +import android.util.LongSparseLongArray; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Maps; @@ -66,6 +71,20 @@ public class DownloadNotifier { @GuardedBy("mActiveNotifs") private final HashMap<String, Long> mActiveNotifs = Maps.newHashMap(); + /** + * Current speed of active downloads, mapped from {@link DownloadInfo#mId} + * to speed in bytes per second. + */ + @GuardedBy("mDownloadSpeed") + private final LongSparseLongArray mDownloadSpeed = new LongSparseLongArray(); + + /** + * Last time speed was reproted, mapped from {@link DownloadInfo#mId} to + * {@link SystemClock#elapsedRealtime()}. + */ + @GuardedBy("mDownloadSpeed") + private final LongSparseLongArray mDownloadTouch = new LongSparseLongArray(); + public DownloadNotifier(Context context) { mContext = context; mNotifManager = (NotificationManager) context.getSystemService( @@ -77,6 +96,22 @@ public class DownloadNotifier { } /** + * Notify the current speed of an active download, used for calculating + * estimated remaining time. + */ + public void notifyDownloadSpeed(long id, long bytesPerSecond) { + synchronized (mDownloadSpeed) { + if (bytesPerSecond != 0) { + mDownloadSpeed.put(id, bytesPerSecond); + mDownloadTouch.put(id, SystemClock.elapsedRealtime()); + } else { + mDownloadSpeed.delete(id); + mDownloadTouch.delete(id); + } + } + } + + /** * Update {@link NotificationManager} to reflect the given set of * {@link DownloadInfo}, adding, collapsing, and removing as needed. */ @@ -140,6 +175,7 @@ public class DownloadNotifier { final DownloadInfo info = cluster.iterator().next(); final Uri uri = ContentUris.withAppendedId( Downloads.Impl.ALL_DOWNLOADS_CONTENT_URI, info.mId); + builder.setAutoCancel(true); final String action; if (Downloads.Impl.isStatusError(info.mStatus)) { @@ -167,16 +203,16 @@ public class DownloadNotifier { String remainingText = null; String percentText = null; if (type == TYPE_ACTIVE) { - final DownloadHandler handler = DownloadHandler.getInstance(); - long current = 0; long total = 0; long speed = 0; - for (DownloadInfo info : cluster) { - if (info.mTotalBytes != -1) { - current += info.mCurrentBytes; - total += info.mTotalBytes; - speed += handler.getCurrentSpeed(info.mId); + synchronized (mDownloadSpeed) { + for (DownloadInfo info : cluster) { + if (info.mTotalBytes != -1) { + current += info.mCurrentBytes; + total += info.mTotalBytes; + speed += mDownloadSpeed.get(info.mId); + } } } @@ -283,6 +319,17 @@ public class DownloadNotifier { return ids; } + public void dumpSpeeds() { + synchronized (mDownloadSpeed) { + for (int i = 0; i < mDownloadSpeed.size(); i++) { + final long id = mDownloadSpeed.keyAt(i); + final long delta = SystemClock.elapsedRealtime() - mDownloadTouch.get(id); + Log.d(TAG, "Download " + id + " speed " + mDownloadSpeed.valueAt(i) + "bps, " + + delta + "ms ago"); + } + } + } + /** * Build tag used for collapsing several {@link DownloadInfo} into a single * {@link Notification}. @@ -309,7 +356,7 @@ public class DownloadNotifier { } private static boolean isActiveAndVisible(DownloadInfo download) { - return Downloads.Impl.isStatusInformational(download.mStatus) && + return download.mStatus == STATUS_RUNNING && (download.mVisibility == VISIBILITY_VISIBLE || download.mVisibility == VISIBILITY_VISIBLE_NOTIFY_COMPLETED); } |