diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2012-07-09 12:46:15 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2012-07-09 12:46:15 +0200 |
commit | d4188088ced4d1a026dc0c25728db1b22536b1f8 (patch) | |
tree | e1e692912ff261200b6dd09e3ce99876827c5b71 | |
parent | fcbb28981f28263c6659d8b225fa5166b7d13e5a (diff) | |
download | AntennaPod-d4188088ced4d1a026dc0c25728db1b22536b1f8.zip |
DownloadService will now create a report when finished
-rw-r--r-- | res/values/strings.xml | 1 | ||||
-rw-r--r-- | src/de/podfetcher/service/DownloadService.java | 96 |
2 files changed, 88 insertions, 9 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml index cb4f58987..5eb71ed17 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -91,5 +91,6 @@ <string name="pref_pauseOnHeadsetDisconnect_title">Headset disconnect</string> <string name="pref_mobileUpdate_title">Mobile Updates</string> <string name="pref_mobileUpdate_sum">Allow updates over the mobile data connection</string> + <string name="download_report_title">All downloads completed</string> </resources>
\ No newline at end of file diff --git a/src/de/podfetcher/service/DownloadService.java b/src/de/podfetcher/service/DownloadService.java index 282c7781f..97eba916f 100644 --- a/src/de/podfetcher/service/DownloadService.java +++ b/src/de/podfetcher/service/DownloadService.java @@ -7,6 +7,7 @@ package de.podfetcher.service; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -17,6 +18,7 @@ import org.xml.sax.SAXException; import de.podfetcher.activity.DownloadActivity; import de.podfetcher.activity.MediaplayerActivity; +import de.podfetcher.activity.PodfetcherActivity; import de.podfetcher.asynctask.DownloadObserver; import de.podfetcher.asynctask.DownloadStatus; import de.podfetcher.feed.*; @@ -26,6 +28,7 @@ import de.podfetcher.syndication.handler.FeedHandler; import de.podfetcher.syndication.handler.UnsupportedFeedtypeException; import de.podfetcher.util.DownloadError; import android.R; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -61,11 +64,14 @@ public class DownloadService extends Service { public static final String EXTRA_DOWNLOAD_ID = "extra.de.podfetcher.service.download_id"; public static final String EXTRA_IMAGE_DOWNLOAD_ID = "extra.de.podfetcher.service.image_download_id"; + private ArrayList<DownloadStatus> completedDownloads; + private ExecutorService syncExecutor; private DownloadRequester requester; private FeedManager manager; private NotificationCompat.Builder notificationBuilder; private int NOTIFICATION_ID = 2; + private int REPORT_ID = 3; /** Needed to determine the duration of a media file */ private MediaPlayer mediaplayer; private DownloadManager downloadManager; @@ -94,6 +100,7 @@ public class DownloadService extends Service { public void onCreate() { Log.d(TAG, "Service started"); isRunning = true; + completedDownloads = new ArrayList<DownloadStatus>(); registerReceiver(downloadReceiver, createIntentFilter()); syncExecutor = Executors.newSingleThreadExecutor(); manager = FeedManager.getInstance(); @@ -118,6 +125,7 @@ public class DownloadService extends Service { mediaplayer.release(); unregisterReceiver(downloadReceiver); downloadObserver.cancel(true); + createReport(); } private IntentFilter createIntentFilter() { @@ -206,8 +214,8 @@ public class DownloadService extends Service { Log.e(TAG, "Download failed"); Log.e(TAG, "reason code is " + reason); successful = false; - long statusId = manager.addDownloadStatus(context, - new DownloadStatus(download, reason, successful)); + long statusId = saveDownloadStatus(new DownloadStatus( + download, reason, successful)); requester.removeDownload(download); sendDownloadHandledIntent(download.getDownloadId(), statusId, false, 0); @@ -221,6 +229,18 @@ public class DownloadService extends Service { }; + /** + * Adds a new DownloadStatus object to the list of completed downloads and + * saves it in the database + * + * @param status + * the download that is going to be saved + */ + private long saveDownloadStatus(DownloadStatus status) { + completedDownloads.add(status); + return manager.addDownloadStatus(this, status); + } + private void sendDownloadHandledIntent(long downloadId, long statusId, boolean feedHasImage, long imageDownloadId) { Intent intent = new Intent(ACTION_DOWNLOAD_HANDLED); @@ -233,6 +253,64 @@ public class DownloadService extends Service { sendBroadcast(intent); } + /** + * Creates a notification at the end of the service lifecycle to notify the + * user about the number of completed downloads. A report will only be + * created if the number of feeds is > 1 or if at least one media file was + * downloaded. + */ + private void createReport() { + // check if report should be created + boolean createReport = false; + int feedCount = 0; + for (DownloadStatus status : completedDownloads) { + if (status.getFeedFile().getClass() == Feed.class) { + feedCount++; + if (feedCount > 1) { + createReport = true; + break; + } + } else if (status.getFeedFile().getClass() == FeedMedia.class) { + createReport = true; + break; + } + } + if (createReport) { + Log.d(TAG, "Creating report"); + int successfulDownloads = 0; + int failedDownloads = 0; + for (DownloadStatus status : completedDownloads) { + if (status.isSuccessful()) { + successfulDownloads++; + } else { + failedDownloads++; + } + } + // create notification object + Notification notification = new NotificationCompat.Builder(this) + .setTicker( + getString(de.podfetcher.R.string.download_report_title)) + .setContentTitle( + getString(de.podfetcher.R.string.download_report_title)) + .setContentText( + successfulDownloads + " Downloads succeeded, " + + failedDownloads + " failed") + .setSmallIcon(R.drawable.stat_notify_sync) + .setLargeIcon( + BitmapFactory.decodeResource(null, + R.drawable.stat_notify_sync)) + .setContentIntent( + PendingIntent.getActivity(this, 0, new Intent(this, + PodfetcherActivity.class), 0)) + .setAutoCancel(true).getNotification(); + NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + nm.notify(REPORT_ID, notification); + + } else { + Log.d(TAG, "No report is created"); + } + } + /** Check if there's something else to download, otherwise stop */ public synchronized void queryDownloads() { int numOfDownloads = requester.getNumberOfDownloads(); @@ -297,7 +375,7 @@ public class DownloadService extends Service { try { feed = handler.parseFeed(feed); Log.d(TAG, feed.getTitle() + " parsed"); - + feed.setDownloadId(0); // Save information of feed in DB savedFeed = manager.updateFeed(service, feed); @@ -328,8 +406,8 @@ public class DownloadService extends Service { requester.removeDownload(feed); cleanup(); - long statusId = manager.addDownloadStatus(service, - new DownloadStatus(savedFeed, reason, successful)); + long statusId = saveDownloadStatus(new DownloadStatus(savedFeed, + reason, successful)); sendDownloadHandledIntent(downloadId, statusId, hasImage, imageId); queryDownloads(); } @@ -360,8 +438,8 @@ public class DownloadService extends Service { image.setDownloaded(true); requester.removeDownload(image); - long statusId = manager.addDownloadStatus(service, - new DownloadStatus(image, 0, true)); + long statusId = saveDownloadStatus(new DownloadStatus(image, 0, + true)); sendDownloadHandledIntent(image.getDownloadId(), statusId, false, 0); image.setDownloadId(0); @@ -395,8 +473,8 @@ public class DownloadService extends Service { media.setDuration(mediaplayer.getDuration()); Log.d(TAG, "Duration of file is " + media.getDuration()); mediaplayer.reset(); - long statusId = manager.addDownloadStatus(service, - new DownloadStatus(media, 0, true)); + long statusId = saveDownloadStatus(new DownloadStatus(media, 0, + true)); sendDownloadHandledIntent(media.getDownloadId(), statusId, false, 0); media.setDownloadId(0); manager.setFeedMedia(service, media); |