From 61e77e55224f877d8a7e0deec8b3121f2eb2112d Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Thu, 5 Jul 2012 22:13:41 +0200 Subject: [PATCH] Rewrote DownloadObserver --- .../asynctask/DownloadObserver.java | 208 ++++++++++-------- 1 file changed, 116 insertions(+), 92 deletions(-) diff --git a/src/de/podfetcher/asynctask/DownloadObserver.java b/src/de/podfetcher/asynctask/DownloadObserver.java index 6d2fed066..3f8183903 100644 --- a/src/de/podfetcher/asynctask/DownloadObserver.java +++ b/src/de/podfetcher/asynctask/DownloadObserver.java @@ -1,18 +1,20 @@ package de.podfetcher.asynctask; -import de.podfetcher.storage.DownloadRequester; -import de.podfetcher.feed.*; -import de.podfetcher.R; -import android.content.Context; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import android.app.DownloadManager; -import android.util.Log; +import android.content.Context; import android.database.Cursor; -import java.util.concurrent.Callable; import android.os.AsyncTask; +import android.util.Log; +import de.podfetcher.R; +import de.podfetcher.feed.FeedFile; +import de.podfetcher.storage.DownloadRequester; /** Observes the status of a specific Download */ -public class DownloadObserver extends - AsyncTask { +public class DownloadObserver extends AsyncTask { private static final String TAG = "DownloadObserver"; /** Types of downloads to observe. */ @@ -28,74 +30,28 @@ public class DownloadObserver extends private DownloadRequester requester; private Context context; - private DownloadStatus[] statusList; + private ArrayList statusList; + private List observer; public DownloadObserver(Context context) { super(); this.context = context; requester = DownloadRequester.getInstance(); + statusList = new ArrayList(); + observer = Collections + .synchronizedList(new ArrayList()); } @Override - protected void onCancelled(Boolean result) { + protected void onCancelled() { Log.d(TAG, "Task was cancelled."); } - protected Boolean doInBackground(FeedFile... files) { + protected Void doInBackground(Void... params) { Log.d(TAG, "Background Task started."); - statusList = new DownloadStatus[files.length]; - for (int i = 0; i < files.length; i++) { - FeedFile feedfile = files[i]; - statusList[i] = new DownloadStatus(feedfile); - - if (feedfile.getFile_url() == null) { - statusList[i].reason = NO_DOWNLOAD_FOUND; - statusList[i].successful = false; - statusList[i].done = true; - } - - if (feedfile.isDownloaded()) { - statusList[i].reason = ALREADY_DOWNLOADED; - statusList[i].successful = false; - statusList[i].done = true; - } - } - while (downloadsLeft() && !isCancelled()) { - for (DownloadStatus status : statusList) { - if (status.done == false) { - Cursor cursor = getDownloadCursor(status.feedfile); - int statusId = getDownloadStatus(cursor, - DownloadManager.COLUMN_STATUS); - getDownloadProgress(cursor, status); - switch (statusId) { - case DownloadManager.STATUS_SUCCESSFUL: - status.statusMsg = R.string.download_successful; - status.successful = true; - status.done = true; - case DownloadManager.STATUS_RUNNING: - status.statusMsg = R.string.download_running; - break; - case DownloadManager.STATUS_FAILED: - status.statusMsg = R.string.download_failed; - requester.notifyDownloadService(context); - status.successful = false; - status.done = true; - status.reason = getDownloadStatus(cursor, - DownloadManager.COLUMN_REASON); - case DownloadManager.STATUS_PENDING: - status.statusMsg = R.string.download_pending; - break; - default: - status.done = true; - status.successful = false; - status.statusMsg = R.string.download_cancelled_msg; - } - } - } - - publishProgress(statusList); - + refreshStatuslist(); + publishProgress(); try { Thread.sleep(DEFAULT_WAITING_INTERVALL); } catch (InterruptedException e) { @@ -103,11 +59,71 @@ public class DownloadObserver extends } } Log.d(TAG, "Background Task finished."); - return Boolean.valueOf(true); + return null; } - public Cursor getDownloadCursor(FeedFile feedfile) { - DownloadManager.Query query = buildQuery(feedfile.getDownloadId()); + @Override + protected void onProgressUpdate(Void... values) { + for (DownloadObserver.Callback callback : observer) { + callback.onProgressUpdate(); + } + } + + private void refreshStatuslist() { + Cursor cursor = getDownloadCursor(); + if (cursor.moveToFirst()) { + do { + long downloadId = getDownloadStatus(cursor, + DownloadManager.COLUMN_ID); + FeedFile feedFile = requester.getFeedFile(downloadId); + DownloadStatus status = findDownloadStatus(feedFile); + if (status == null) { + status = new DownloadStatus(feedFile); + statusList.add(status); + } + + // refresh status + int statusId = getDownloadStatus(cursor, + DownloadManager.COLUMN_STATUS); + getDownloadProgress(cursor, status); + switch (statusId) { + case DownloadManager.STATUS_SUCCESSFUL: + status.statusMsg = R.string.download_successful; + status.successful = true; + status.done = true; + case DownloadManager.STATUS_RUNNING: + status.statusMsg = R.string.download_running; + break; + case DownloadManager.STATUS_FAILED: + status.statusMsg = R.string.download_failed; + requester.notifyDownloadService(context); + status.successful = false; + status.done = true; + status.reason = getDownloadStatus(cursor, + DownloadManager.COLUMN_REASON); + case DownloadManager.STATUS_PENDING: + status.statusMsg = R.string.download_pending; + break; + default: + status.done = true; + status.successful = false; + status.statusMsg = R.string.download_cancelled_msg; + } + } while (cursor.moveToNext()); + } + cursor.close(); + } + + /** Request a cursor with all running Feedfile downloads */ + public Cursor getDownloadCursor() { + // Collect download ids + int numDownloads = requester.getNumberOfDownloads(); + long ids[] = new long[numDownloads]; + for (int i = 0; i < numDownloads; i++) { + ids[i] = requester.downloads.get(i).getDownloadId(); + } + DownloadManager.Query query = new DownloadManager.Query(); + query.setFilterById(ids); DownloadManager manager = (DownloadManager) context .getSystemService(Context.DOWNLOAD_SERVICE); @@ -116,48 +132,56 @@ public class DownloadObserver extends } public int getDownloadStatus(Cursor c, String column) { - if (c.moveToFirst()) { - int status = c.getInt(c.getColumnIndex(column)); - return status; - } else { - return -1; - } + int status = c.getInt(c.getColumnIndex(column)); + return status; } private void getDownloadProgress(Cursor c, DownloadStatus status) { - if (c.moveToFirst()) { - status.size = c.getLong(c - .getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); - status.soFar = c - .getLong(c - .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); - status.progressPercent = (int) (((double) status.soFar / (double) status.size) * 100); - Log.d(TAG, "Setting progress to " + status.progressPercent); - } - } - - private DownloadManager.Query buildQuery(long id) { - DownloadManager.Query query = new DownloadManager.Query(); - query.setFilterById(id); - return query; + status.size = c.getLong(c + .getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); + status.soFar = c + .getLong(c + .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); + status.progressPercent = (int) (((double) status.soFar / (double) status.size) * 100); + Log.d(TAG, "Setting progress to " + status.progressPercent); } public Context getContext() { return context; } - public DownloadStatus[] getStatusList() { + public DownloadStatus findDownloadStatus(FeedFile f) { + for (DownloadStatus status : statusList) { + if (status.feedfile == f) { + return status; + } + } + return null; + } + + public ArrayList getStatusList() { return statusList; } private boolean downloadsLeft() { - boolean result = false; - for (int i = 0; i < statusList.length; i++) { - if (statusList[i].done == false) { + for (DownloadStatus status : statusList) { + if (status.done == false) { return true; } } - return result; + return false; + } + + public void registerCallback(DownloadObserver.Callback callback) { + observer.add(callback); + } + + public void unregisterCallback(DownloadObserver.Callback callback) { + observer.remove(callback); + } + + public interface Callback { + public void onProgressUpdate(); } }