Created abstract downloader class

This commit is contained in:
daniel oeh 2012-08-16 15:09:49 +02:00
parent 853ae9af79
commit 1dd128a46c
10 changed files with 108 additions and 10 deletions

View File

@ -74,7 +74,7 @@
android:theme="@style/Theme.MediaPlayer" android:screenOrientation="portrait"/> android:theme="@style/Theme.MediaPlayer" android:screenOrientation="portrait"/>
<service <service
android:name="de.danoeh.antennapod.service.DownloadService" android:name=".service.download.DownloadService"
android:enabled="true" /> android:enabled="true" />
<service <service
android:name="de.danoeh.antennapod.service.PlaybackService" android:name="de.danoeh.antennapod.service.PlaybackService"

View File

@ -23,7 +23,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.DownloadStatus; import de.danoeh.antennapod.asynctask.DownloadStatus;
import de.danoeh.antennapod.feed.Feed; import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedManager; import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.ConnectionTester; import de.danoeh.antennapod.util.ConnectionTester;
import de.danoeh.antennapod.util.DownloadError; import de.danoeh.antennapod.util.DownloadError;

View File

@ -20,7 +20,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.DownloadlistAdapter; import de.danoeh.antennapod.adapter.DownloadlistAdapter;
import de.danoeh.antennapod.asynctask.DownloadObserver; import de.danoeh.antennapod.asynctask.DownloadObserver;
import de.danoeh.antennapod.asynctask.DownloadStatus; import de.danoeh.antennapod.asynctask.DownloadStatus;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
/** /**

View File

@ -23,8 +23,8 @@ import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.FeedlistFragment; import de.danoeh.antennapod.fragment.FeedlistFragment;
import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.fragment.QueueFragment;
import de.danoeh.antennapod.fragment.UnreadItemlistFragment; import de.danoeh.antennapod.fragment.UnreadItemlistFragment;
import de.danoeh.antennapod.service.DownloadService;
import de.danoeh.antennapod.service.PlaybackService; import de.danoeh.antennapod.service.PlaybackService;
import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.StorageUtils; import de.danoeh.antennapod.util.StorageUtils;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;

View File

@ -5,7 +5,7 @@ import de.danoeh.antennapod.adapter.FeedlistAdapter;
import de.danoeh.antennapod.asynctask.FeedRemover; import de.danoeh.antennapod.asynctask.FeedRemover;
import de.danoeh.antennapod.dialog.ConfirmationDialog; import de.danoeh.antennapod.dialog.ConfirmationDialog;
import de.danoeh.antennapod.feed.*; import de.danoeh.antennapod.feed.*;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;

View File

@ -27,7 +27,7 @@ import de.danoeh.antennapod.adapter.FeedItemlistAdapter;
import de.danoeh.antennapod.feed.Feed; import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedItem; import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager; import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.EpisodeFilter; import de.danoeh.antennapod.util.EpisodeFilter;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;

View File

@ -3,12 +3,13 @@
* to complete, then stops * to complete, then stops
* */ * */
package de.danoeh.antennapod.service; package de.danoeh.antennapod.service.download;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.Thread.UncaughtExceptionHandler; import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
@ -56,6 +57,8 @@ import android.os.Debug;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
public class DownloadService extends Service { public class DownloadService extends Service {
@ -95,6 +98,8 @@ public class DownloadService extends Service {
private DownloadObserver downloadObserver; private DownloadObserver downloadObserver;
private List<DownloadStatus> downloads;
private volatile boolean shutdownInitiated = false; private volatile boolean shutdownInitiated = false;
/** True if service is running. */ /** True if service is running. */
public static boolean isRunning = false; public static boolean isRunning = false;
@ -126,6 +131,7 @@ public class DownloadService extends Service {
Log.d(TAG, "Service started"); Log.d(TAG, "Service started");
isRunning = true; isRunning = true;
completedDownloads = new ArrayList<DownloadStatus>(); completedDownloads = new ArrayList<DownloadStatus>();
downloads = new ArrayList<DownloadStatus>();
registerReceiver(downloadReceiver, createIntentFilter()); registerReceiver(downloadReceiver, createIntentFilter());
registerReceiver(onDownloadsChanged, new IntentFilter( registerReceiver(onDownloadsChanged, new IntentFilter(
ACTION_NOTIFY_DOWNLOADS_CHANGED)); ACTION_NOTIFY_DOWNLOADS_CHANGED));
@ -428,7 +434,7 @@ public class DownloadService extends Service {
} }
/** Check if there's something else to download, otherwise stop */ /** Check if there's something else to download, otherwise stop */
private void queryDownloads() { void queryDownloads() {
int numOfDownloads = requester.getNumberOfDownloads(); int numOfDownloads = requester.getNumberOfDownloads();
if (!shutdownInitiated && numOfDownloads == 0) { if (!shutdownInitiated && numOfDownloads == 0) {
shutdownInitiated = true; shutdownInitiated = true;
@ -660,6 +666,47 @@ public class DownloadService extends Service {
} }
} }
/** Is used to request a new download. */
public static class Request implements Parcelable {
private String destination;
private String source;
public Request(String destination, String source) {
super();
this.destination = destination;
this.source = source;
}
private Request(Parcel in) {
destination = in.readString();
source = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(destination);
dest.writeString(source);
}
public static final Parcelable.Creator<Request> CREATOR = new Parcelable.Creator<Request>() {
public Request createFromParcel(Parcel in) {
return new Request(in);
}
public Request[] newArray(int size) {
return new Request[size];
}
};
}
public DownloadObserver getDownloadObserver() { public DownloadObserver getDownloadObserver() {
return downloadObserver; return downloadObserver;
} }

View File

@ -0,0 +1,51 @@
package de.danoeh.antennapod.service.download;
import android.os.Handler;
/** Downloads files */
public abstract class Downloader extends Thread {
private static final String TAG = "Downloader";
private Handler handler;
private DownloadService downloadService;
protected boolean finished;
protected String destination;
protected String source;
public Downloader(DownloadService downloadService, String destination, String source) {
super();
this.downloadService = downloadService;
this.destination = destination;
this.source = source;
handler = new Handler();
}
/**
* This method must be called when the download was completed, failed,
* or was cancelled
*/
protected void finish() {
if (!finished) {
finished = true;
handler.post(new Runnable() {
@Override
public void run() {
downloadService.queryDownloads();
}
});
}
}
protected abstract void download();
@Override
public final void run() {
download();
}
}

View File

@ -19,7 +19,7 @@ import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedFile; import de.danoeh.antennapod.feed.FeedFile;
import de.danoeh.antennapod.feed.FeedImage; import de.danoeh.antennapod.feed.FeedImage;
import de.danoeh.antennapod.feed.FeedMedia; import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.util.NumberGenerator; import de.danoeh.antennapod.util.NumberGenerator;
import de.danoeh.antennapod.util.URLChecker; import de.danoeh.antennapod.util.URLChecker;

View File

@ -15,7 +15,7 @@ import de.danoeh.antennapod.asynctask.FlattrClickWorker;
import de.danoeh.antennapod.feed.Feed; import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedItem; import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager; import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.service.DownloadService; import de.danoeh.antennapod.service.download.DownloadService;
import de.danoeh.antennapod.storage.DownloadRequester; import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.ShareUtils; import de.danoeh.antennapod.util.ShareUtils;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;