package org.fdroid.fdroid.net;
import android.content.Context;
import android.net.Uri;
import android.support.v4.content.LocalBroadcastManager;
import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.data.Schema;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class DownloaderFactory {
private static LocalBroadcastManager localBroadcastManager;
/**
* Downloads to a temporary file, which *you must delete yourself when
* you are done. It is stored in {@link Context#getCacheDir()} and starts
* with the prefix {@code dl-}.
*/
public static Downloader create(Context context, String urlString)
throws IOException {
File destFile = File.createTempFile("dl-", "", context.getCacheDir());
destFile.deleteOnExit(); // this probably does nothing, but maybe...
return create(context, urlString, destFile);
}
public static Downloader create(Context context, Uri uri, File destFile)
throws IOException {
return create(context, uri.toString(), destFile);
}
public static Downloader create(Context context, String urlString, File destFile)
throws IOException {
URL url = new URL(urlString);
Downloader downloader;
if (localBroadcastManager == null) {
localBroadcastManager = LocalBroadcastManager.getInstance(context);
}
if (isBluetoothAddress(url)) {
String macAddress = url.getHost().replace("-", ":");
downloader = new BluetoothDownloader(macAddress, url, destFile);
} else if (isLocalFile(url)) {
downloader = new LocalFileDownloader(url, destFile);
} else {
final String[] projection = {Schema.RepoTable.Cols.USERNAME, Schema.RepoTable.Cols.PASSWORD};
Repo repo = RepoProvider.Helper.findByUrl(context, Uri.parse(url.toString()), projection);
if (repo == null) {
downloader = new HttpDownloader(url, destFile);
} else {
downloader = new HttpDownloader(url, destFile, repo.username, repo.password);
}
}
return downloader;
}
private static boolean isBluetoothAddress(URL url) {
return "bluetooth".equalsIgnoreCase(url.getProtocol());
}
private static boolean isLocalFile(URL url) {
return "file".equalsIgnoreCase(url.getProtocol());
}
}