Skip to content

Add extras column db #739

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ data class DownloadTask(
var progress: Int,
var url: String,
var filename: String?,
var extras: String?,
var savedDir: String,
var headers: String,
var mimeType: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import java.net.URL
import java.net.URLDecoder
import java.security.SecureRandom
import java.security.cert.X509Certificate
import java.util.ArrayDeque
import java.util.Locale
import java.util.concurrent.atomic.AtomicBoolean
import java.util.regex.Pattern
Expand All @@ -49,7 +50,6 @@ import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
import java.util.ArrayDeque
import kotlin.collections.ArrayList
import kotlin.collections.HashMap

Expand Down Expand Up @@ -153,6 +153,8 @@ class DownloadWorker(context: Context, params: WorkerParameters) :
inputData.getString(ARG_URL) ?: throw IllegalArgumentException("Argument '$ARG_URL' should not be null")
val filename: String? =
inputData.getString(ARG_FILE_NAME) // ?: throw IllegalArgumentException("Argument '$ARG_FILE_NAME' should not be null")
val extras: String? =
inputData.getString(ARG_EXTRAS)
val savedDir: String = inputData.getString(ARG_SAVED_DIR)
?: throw IllegalArgumentException("Argument '$ARG_SAVED_DIR' should not be null")
val headers: String = inputData.getString(ARG_HEADERS)
Expand All @@ -171,10 +173,10 @@ class DownloadWorker(context: Context, params: WorkerParameters) :
msgComplete = res.getString(R.string.flutter_downloader_notification_complete)
val task = taskDao?.loadTask(id.toString())
log(
"DownloadWorker{url=$url,filename=$filename,savedDir=$savedDir,header=$headers,isResume=$isResume,status=" + (
task?.status
?: "GONE"
)
"DownloadWorker{url=$url,filename=$filename,extras=$extras,savedDir=$savedDir,header=$headers,isResume=$isResume,status=" + (
task?.status
?: "GONE"
)
)

// Task has been deleted or cancelled
Expand Down Expand Up @@ -830,6 +832,7 @@ class DownloadWorker(context: Context, params: WorkerParameters) :
companion object {
const val ARG_URL = "url"
const val ARG_FILE_NAME = "file_name"
const val ARG_EXTRAS = "extras"
const val ARG_SAVED_DIR = "saved_file"
const val ARG_HEADERS = "headers"
const val ARG_IS_RESUME = "is_resume"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
url: String?,
savedDir: String?,
filename: String?,
extras: String?,
headers: String?,
showNotification: Boolean,
openFileFromNotification: Boolean,
Expand All @@ -104,6 +105,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
.putString(DownloadWorker.ARG_URL, url)
.putString(DownloadWorker.ARG_SAVED_DIR, savedDir)
.putString(DownloadWorker.ARG_FILE_NAME, filename)
.putString(DownloadWorker.ARG_EXTRAS, extras)
.putString(DownloadWorker.ARG_HEADERS, headers)
.putBoolean(DownloadWorker.ARG_SHOW_NOTIFICATION, showNotification)
.putBoolean(
Expand Down Expand Up @@ -159,22 +161,23 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
val url: String = call.requireArgument("url")
val savedDir: String = call.requireArgument("saved_dir")
val filename: String? = call.argument("file_name")
val extras: String? = call.argument("extras")
val headers: String = call.requireArgument("headers")
val timeout: Int = call.requireArgument("timeout")
val showNotification: Boolean = call.requireArgument("show_notification")
val openFileFromNotification: Boolean = call.requireArgument("open_file_from_notification")
val requiresStorageNotLow: Boolean = call.requireArgument("requires_storage_not_low")
val saveInPublicStorage: Boolean = call.requireArgument("save_in_public_storage")
val request: WorkRequest = buildRequest(
url, savedDir, filename, headers, showNotification,
url, savedDir, filename, extras, headers, showNotification,
openFileFromNotification, false, requiresStorageNotLow, saveInPublicStorage, timeout
)
WorkManager.getInstance(requireContext()).enqueue(request)
val taskId: String = request.id.toString()
result.success(taskId)
sendUpdateProgress(taskId, DownloadStatus.ENQUEUED, 0)
taskDao!!.insertOrUpdateNewTask(
taskId, url, DownloadStatus.ENQUEUED, 0, filename,
taskId, url, DownloadStatus.ENQUEUED, 0, filename, extras,
savedDir, headers, showNotification, openFileFromNotification, saveInPublicStorage
)
}
Expand All @@ -189,6 +192,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
item["progress"] = task.progress
item["url"] = task.url
item["file_name"] = task.filename
item["extras"] = task.extras
item["saved_dir"] = task.savedDir
item["time_created"] = task.timeCreated
array.add(item)
Expand All @@ -207,6 +211,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
item["progress"] = task.progress
item["url"] = task.url
item["file_name"] = task.filename
item["extras"] = task.extras
item["saved_dir"] = task.savedDir
item["time_created"] = task.timeCreated
array.add(item)
Expand Down Expand Up @@ -250,7 +255,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
val partialFile = File(partialFilePath)
if (partialFile.exists()) {
val request: WorkRequest = buildRequest(
task.url, task.savedDir, task.filename,
task.url, task.savedDir, task.filename, task.extras,
task.headers, task.showNotification, task.openFileFromNotification,
true, requiresStorageNotLow, task.saveInPublicStorage, timeout
)
Expand Down Expand Up @@ -289,7 +294,7 @@ class FlutterDownloaderPlugin : MethodChannel.MethodCallHandler, FlutterPlugin {
if (task != null) {
if (task.status == DownloadStatus.FAILED || task.status == DownloadStatus.CANCELED) {
val request: WorkRequest = buildRequest(
task.url, task.savedDir, task.filename,
task.url, task.savedDir, task.filename, task.extras,
task.headers, task.showNotification, task.openFileFromNotification,
false, requiresStorageNotLow, task.saveInPublicStorage, timeout
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class TaskDao(private val dbHelper: TaskDbHelper) {
TaskEntry.COLUMN_NAME_STATUS,
TaskEntry.COLUMN_NAME_URL,
TaskEntry.COLUMN_NAME_FILE_NAME,
TaskEntry.COLUMN_NAME_EXTRAS,
TaskEntry.COLUMN_NAME_SAVED_DIR,
TaskEntry.COLUMN_NAME_HEADERS,
TaskEntry.COLUMN_NAME_MIME_TYPE,
Expand All @@ -29,6 +30,7 @@ class TaskDao(private val dbHelper: TaskDbHelper) {
status: DownloadStatus,
progress: Int,
fileName: String?,
extras: String?,
savedDir: String?,
headers: String?,
showNotification: Boolean,
Expand All @@ -42,6 +44,7 @@ class TaskDao(private val dbHelper: TaskDbHelper) {
values.put(TaskEntry.COLUMN_NAME_STATUS, status.ordinal)
values.put(TaskEntry.COLUMN_NAME_PROGRESS, progress)
values.put(TaskEntry.COLUMN_NAME_FILE_NAME, fileName)
values.put(TaskEntry.COLUMN_NAME_EXTRAS, extras)
values.put(TaskEntry.COLUMN_NAME_SAVED_DIR, savedDir)
values.put(TaskEntry.COLUMN_NAME_HEADERS, headers)
values.put(TaskEntry.COLUMN_NAME_MIME_TYPE, "unknown")
Expand Down Expand Up @@ -235,6 +238,7 @@ class TaskDao(private val dbHelper: TaskDbHelper) {
val progress = cursor.getInt(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_PROGRESS))
val url = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_URL))
val filename = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_FILE_NAME))
val extras = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_EXTRAS))
val savedDir = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_SAVED_DIR))
val headers = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_HEADERS))
val mimeType = cursor.getString(cursor.getColumnIndexOrThrow(TaskEntry.COLUMN_NAME_MIME_TYPE))
Expand All @@ -250,6 +254,7 @@ class TaskDao(private val dbHelper: TaskDbHelper) {
progress,
url,
filename,
extras,
savedDir,
headers,
mimeType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class TaskDbHelper private constructor(context: Context) :
}

companion object {
const val DATABASE_VERSION = 3
const val DATABASE_VERSION = 4
const val DATABASE_NAME = "download_tasks.db"
private var instance: TaskDbHelper? = null
private const val SQL_CREATE_ENTRIES = (
Expand All @@ -36,6 +36,7 @@ class TaskDbHelper private constructor(context: Context) :
TaskEntry.COLUMN_NAME_STATUS + " INTEGER DEFAULT 0, " +
TaskEntry.COLUMN_NAME_PROGRESS + " INTEGER DEFAULT 0, " +
TaskEntry.COLUMN_NAME_FILE_NAME + " TEXT, " +
TaskEntry.COLUMN_NAME_EXTRAS + " TEXT, " +
TaskEntry.COLUMN_NAME_SAVED_DIR + " TEXT, " +
TaskEntry.COLUMN_NAME_HEADERS + " TEXT, " +
TaskEntry.COLUMN_NAME_MIME_TYPE + " VARCHAR(128), " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ object TaskEntry : BaseColumns {
const val COLUMN_NAME_URL = "url"
const val COLUMN_NAME_SAVED_DIR = "saved_dir"
const val COLUMN_NAME_FILE_NAME = "file_name"
const val COLUMN_NAME_EXTRAS = "extras"
const val COLUMN_NAME_MIME_TYPE = "mime_type"
const val COLUMN_NAME_RESUMABLE = "resumable"
const val COLUMN_NAME_HEADERS = "headers"
Expand Down
14 changes: 9 additions & 5 deletions ios/Classes/FlutterDownloaderPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#define KEY_URL @"url"
#define KEY_SAVED_DIR @"saved_dir"
#define KEY_FILE_NAME @"file_name"
#define KEY_EXTRAS @"extras"
#define KEY_PROGRESS @"progress"
#define KEY_ID @"id"
#define KEY_IDS @"ids"
Expand Down Expand Up @@ -159,7 +160,7 @@ - (NSURLSession*)currentSession {
return _session;
}

- (NSURLSessionDownloadTask*)downloadTaskWithURL: (NSURL*) url fileName: (NSString*) fileName andSavedDir: (NSString*) savedDir andHeaders: (NSString*) headers
- (NSURLSessionDownloadTask*)downloadTaskWithURL: (NSURL*) url fileName: (NSString*) fileName andExtras: (NSString*) extras andSavedDir: (NSString*) savedDir andHeaders: (NSString*) headers
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
if (headers != nil && [headers length] > 0) {
Expand Down Expand Up @@ -420,7 +421,7 @@ - (NSString*) escape:(NSString*) origin revert:(BOOL)revert
: [origin stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
}

- (void) addNewTask: (NSString*) taskId url: (NSString*) url status: (int) status progress: (int) progress filename: (NSString*) filename savedDir: (NSString*) savedDir headers: (NSString*) headers resumable: (BOOL) resumable showNotification: (BOOL) showNotification openFileFromNotification: (BOOL) openFileFromNotification
- (void) addNewTask: (NSString*) taskId url: (NSString*) url status: (int) status progress: (int) progress filename: (NSString*) filename extras: (NSString*) extras savedDir: (NSString*) savedDir headers: (NSString*) headers resumable: (BOOL) resumable showNotification: (BOOL) showNotification openFileFromNotification: (BOOL) openFileFromNotification
{
headers = [self escape:headers revert:false];
NSString *query = [NSString stringWithFormat:@"INSERT INTO task (task_id,url,status,progress,file_name,saved_dir,headers,resumable,show_notification,open_file_from_notification,time_created) VALUES (\"%@\",\"%@\",%d,%d,\"%@\",\"%@\",\"%@\",%d,%d,%d,%lld)", taskId, url, status, progress, filename, savedDir, headers, resumable ? 1 : 0, showNotification ? 1 : 0, openFileFromNotification ? 1 : 0, [self currentTimeInMilliseconds]];
Expand Down Expand Up @@ -575,6 +576,7 @@ - (NSDictionary*) taskDictFromRecordArray:(NSArray*)record
int progress = [[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"progress"]] intValue];
NSString *url = [record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"url"]];
NSString *filename = [record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"file_name"]];
NSString *extras = [record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"extras"]];
NSString *savedDir = [self absoluteSavedDirPath:[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"saved_dir"]]];
NSString *headers = @"";
// in certain cases, headers column might not be available and will cause NSRangeException
Expand All @@ -588,7 +590,7 @@ - (NSDictionary*) taskDictFromRecordArray:(NSArray*)record
int showNotification = [[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"show_notification"]] intValue];
int openFileFromNotification = [[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"open_file_from_notification"]] intValue];
long long timeCreated = [[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"time_created"]] longLongValue];
return [NSDictionary dictionaryWithObjectsAndKeys:taskId, KEY_TASK_ID, @(status), KEY_STATUS, @(progress), KEY_PROGRESS, url, KEY_URL, filename, KEY_FILE_NAME, headers, KEY_HEADERS, savedDir, KEY_SAVED_DIR, [NSNumber numberWithBool:(resumable == 1)], KEY_RESUMABLE, [NSNumber numberWithBool:(showNotification == 1)], KEY_SHOW_NOTIFICATION, [NSNumber numberWithBool:(openFileFromNotification == 1)], KEY_OPEN_FILE_FROM_NOTIFICATION, @(timeCreated), KEY_TIME_CREATED, nil];
return [NSDictionary dictionaryWithObjectsAndKeys:taskId, KEY_TASK_ID, @(status), KEY_STATUS, @(progress), KEY_PROGRESS, url, KEY_URL, filename, KEY_FILE_NAME, extras, KEY_EXTRAS, headers, KEY_HEADERS, savedDir, KEY_SAVED_DIR, [NSNumber numberWithBool:(resumable == 1)], KEY_RESUMABLE, [NSNumber numberWithBool:(showNotification == 1)], KEY_SHOW_NOTIFICATION, [NSNumber numberWithBool:(openFileFromNotification == 1)], KEY_OPEN_FILE_FROM_NOTIFICATION, @(timeCreated), KEY_TIME_CREATED, nil];
} @catch(NSException *exception) {
NSLog(@"invalid task data: %@", exception);
return [NSDictionary dictionary];
Expand Down Expand Up @@ -637,17 +639,19 @@ - (void)enqueueMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result
NSString *savedDir = call.arguments[KEY_SAVED_DIR];
NSString *shortSavedDir = [self shortenSavedDirPath:savedDir];
NSString *fileName = call.arguments[KEY_FILE_NAME];
NSString *extras = call.arguments[KEY_EXTRAS];
NSString *headers = call.arguments[KEY_HEADERS];
NSNumber *showNotification = call.arguments[KEY_SHOW_NOTIFICATION];
NSNumber *openFileFromNotification = call.arguments[KEY_OPEN_FILE_FROM_NOTIFICATION];

NSURLSessionDownloadTask *task = [self downloadTaskWithURL:[NSURL URLWithString:urlString] fileName:fileName andSavedDir:savedDir andHeaders:headers];
NSURLSessionDownloadTask *task = [self downloadTaskWithURL:[NSURL URLWithString:urlString] fileName:fileName andExtras:extras andSavedDir:savedDir andHeaders:headers];

NSString *taskId = [self identifierForTask:task];

[_runningTaskById setObject: [NSMutableDictionary dictionaryWithObjectsAndKeys:
urlString, KEY_URL,
fileName, KEY_FILE_NAME,
extras, KEY_EXTRAS,
savedDir, KEY_SAVED_DIR,
headers, KEY_HEADERS,
showNotification, KEY_SHOW_NOTIFICATION,
Expand All @@ -660,7 +664,7 @@ - (void)enqueueMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result
__typeof__(self) __weak weakSelf = self;

[self executeInDatabaseQueueForTask:^{
[weakSelf addNewTask:taskId url:urlString status:STATUS_ENQUEUED progress:0 filename:fileName savedDir:shortSavedDir headers:headers resumable:NO showNotification: [showNotification boolValue] openFileFromNotification: [openFileFromNotification boolValue]];
[weakSelf addNewTask:taskId url:urlString status:STATUS_ENQUEUED progress:0 filename:fileName extras:extras savedDir:shortSavedDir headers:headers resumable:NO showNotification: [showNotification boolValue] openFileFromNotification: [openFileFromNotification boolValue]];
}];
result(taskId);
[self sendUpdateProgressForTaskId:taskId inStatus:@(STATUS_ENQUEUED) andProgress:@0];
Expand Down
16 changes: 16 additions & 0 deletions lib/src/downloader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ class FlutterDownloader {
required String url,
required String savedDir,
String? fileName,
Map<String, String>? extras,
Map<String, String> headers = const {},
bool showNotification = true,
bool openFileFromNotification = true,
Expand All @@ -111,6 +112,7 @@ class FlutterDownloader {
'url': url,
'saved_dir': savedDir,
'file_name': fileName,
'extras': jsonEncode(extras),
'headers': jsonEncode(headers),
'show_notification': showNotification,
'open_file_from_notification': openFileFromNotification,
Expand Down Expand Up @@ -152,12 +154,19 @@ class FlutterDownloader {
(dynamic item) {
// item as Map<String, dynamic>; // throws

Map<String, String>? extras;

if ((item['extras'] as String?) != null) {
extras = Map.castFrom(jsonDecode(item['extras'] as String));
}

return DownloadTask(
taskId: item['task_id'] as String,
status: DownloadTaskStatus(item['status'] as int),
progress: item['progress'] as int,
url: item['url'] as String,
filename: item['file_name'] as String?,
extras: extras,
savedDir: item['saved_dir'] as String,
timeCreated: item['time_created'] as int,
);
Expand Down Expand Up @@ -209,12 +218,19 @@ class FlutterDownloader {
(dynamic item) {
// item as Map<String, dynamic>; // throws

Map<String, String>? extras;

if ((item['extras'] as String?) != null) {
extras = Map.castFrom(jsonDecode(item['extras'] as String));
}

return DownloadTask(
taskId: item['task_id'] as String,
status: DownloadTaskStatus(item['status'] as int),
progress: item['progress'] as int,
url: item['url'] as String,
filename: item['file_name'] as String?,
extras: extras,
savedDir: item['saved_dir'] as String,
timeCreated: item['time_created'] as int,
);
Expand Down
6 changes: 5 additions & 1 deletion lib/src/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class DownloadTask {
required this.progress,
required this.url,
required this.filename,
required this.extras,
required this.savedDir,
required this.timeCreated,
});
Expand All @@ -76,6 +77,9 @@ class DownloadTask {
/// Local file name of the downloaded file.
final String? filename;

/// Optional, extra string associated with this task
final Map<String, String>? extras;

/// Absolute path to the directory where the downloaded file will saved.
final String savedDir;

Expand All @@ -84,5 +88,5 @@ class DownloadTask {

@override
String toString() =>
'DownloadTask(taskId: $taskId, status: $status, progress: $progress, url: $url, filename: $filename, savedDir: $savedDir, timeCreated: $timeCreated)';
'DownloadTask(taskId: $taskId, status: $status, progress: $progress, url: $url, filename: $filename, extra: $extras, savedDir: $savedDir, timeCreated: $timeCreated)';
}