diff --git a/android/.project b/android/.project new file mode 100644 index 00000000..3964dd3f --- /dev/null +++ b/android/.project @@ -0,0 +1,17 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/android/.settings/org.eclipse.buildship.core.prefs b/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..a4717e18 --- /dev/null +++ b/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.0-20191016123526+0000)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/usr/lib/jvm/java-11-openjdk-amd64 +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadTask.java b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadTask.java index 84b3ae3f..5d11ce00 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadTask.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadTask.java @@ -7,6 +7,7 @@ public class DownloadTask { int progress; String url; String filename; + String additionalinfo; String savedDir; String headers; String mimeType; @@ -15,7 +16,7 @@ public class DownloadTask { boolean openFileFromNotification; long timeCreated; - DownloadTask(int primaryId, String taskId, int status, int progress, String url, String filename, String savedDir, + DownloadTask(int primaryId, String taskId, int status, int progress, String url, String filename, String additionalinfo, String savedDir, String headers, String mimeType, boolean resumable, boolean showNotification, boolean openFileFromNotification, long timeCreated) { this.primaryId = primaryId; this.taskId = taskId; @@ -23,6 +24,7 @@ public class DownloadTask { this.progress = progress; this.url = url; this.filename = filename; + this.additionalinfo = additionalinfo; this.savedDir = savedDir; this.headers = headers; this.mimeType = mimeType; @@ -34,6 +36,6 @@ public class DownloadTask { @Override public String toString() { - return "DownloadTask{taskId=" + taskId + ",status=" + status + ",progress=" + progress + ",url=" + url + ",filename=" + filename + ",savedDir=" + savedDir + ",headers=" + headers + "}"; + return "DownloadTask{taskId=" + taskId + ",status=" + status + ",progress=" + progress + ",url=" + url + ",filename=" + filename + ",additionalinfo=" + additionalinfo + ",savedDir=" + savedDir + ",headers=" + headers + "}"; } } diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java index 07b4581e..c499f9c6 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java @@ -59,6 +59,7 @@ public class DownloadWorker extends Worker implements MethodChannel.MethodCallHandler { public static final String ARG_URL = "url"; public static final String ARG_FILE_NAME = "file_name"; + public static final String ARG_ADDITIONAL_INFO = "additional_info"; public static final String ARG_SAVED_DIR = "saved_file"; public static final String ARG_HEADERS = "headers"; public static final String ARG_IS_RESUME = "is_resume"; @@ -159,6 +160,7 @@ public Result doWork() { String url = getInputData().getString(ARG_URL); String filename = getInputData().getString(ARG_FILE_NAME); + String additionalinfo = getInputData().getString(ARG_ADDITIONAL_INFO); String savedDir = getInputData().getString(ARG_SAVED_DIR); String headers = getInputData().getString(ARG_HEADERS); boolean isResume = getInputData().getBoolean(ARG_IS_RESUME, false); @@ -171,7 +173,7 @@ public Result doWork() { msgPaused = res.getString(R.string.flutter_downloader_notification_paused); msgComplete = res.getString(R.string.flutter_downloader_notification_complete); - Log.d(TAG, "DownloadWorker{url=" + url + ",filename=" + filename + ",savedDir=" + savedDir + ",header=" + headers + ",isResume=" + isResume); + Log.d(TAG, "DownloadWorker{url=" + url + ",filename=" + filename + ",additionalinfo=" + additionalinfo + ",savedDir=" + savedDir + ",header=" + headers + ",isResume=" + isResume); showNotification = getInputData().getBoolean(ARG_SHOW_NOTIFICATION, false); clickToOpenDownloadedFile = getInputData().getBoolean(ARG_OPEN_FILE_FROM_NOTIFICATION, false); diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java index eee3d2b5..49f96ccc 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java @@ -109,7 +109,7 @@ public void onDetachedFromEngine(FlutterPluginBinding binding) { flutterChannel = null; } - private WorkRequest buildRequest(String url, String savedDir, String filename, String headers, boolean showNotification, boolean openFileFromNotification, boolean isResume, boolean requiresStorageNotLow) { + private WorkRequest buildRequest(String url, String savedDir, String filename, String additionalinfo, String headers, boolean showNotification, boolean openFileFromNotification, boolean isResume, boolean requiresStorageNotLow) { WorkRequest request = new OneTimeWorkRequest.Builder(DownloadWorker.class) .setConstraints(new Constraints.Builder() .setRequiresStorageNotLow(requiresStorageNotLow) @@ -121,6 +121,7 @@ private WorkRequest buildRequest(String url, String savedDir, String filename, S .putString(DownloadWorker.ARG_URL, url) .putString(DownloadWorker.ARG_SAVED_DIR, savedDir) .putString(DownloadWorker.ARG_FILE_NAME, filename) + .putString(DownloadWorker.ARG_ADDITIONAL_INFO, additionalinfo) .putString(DownloadWorker.ARG_HEADERS, headers) .putBoolean(DownloadWorker.ARG_SHOW_NOTIFICATION, showNotification) .putBoolean(DownloadWorker.ARG_OPEN_FILE_FROM_NOTIFICATION, openFileFromNotification) @@ -160,16 +161,17 @@ private void enqueue(MethodCall call, MethodChannel.Result result) { String url = call.argument("url"); String savedDir = call.argument("saved_dir"); String filename = call.argument("file_name"); + String additionalinfo = call.argument("additional_info"); String headers = call.argument("headers"); boolean showNotification = call.argument("show_notification"); boolean openFileFromNotification = call.argument("open_file_from_notification"); boolean requiresStorageNotLow = call.argument("requires_storage_not_low"); - WorkRequest request = buildRequest(url, savedDir, filename, headers, showNotification, openFileFromNotification, false, requiresStorageNotLow); + WorkRequest request = buildRequest(url, savedDir, filename, additionalinfo, headers, showNotification, openFileFromNotification, false, requiresStorageNotLow); WorkManager.getInstance(context).enqueue(request); String taskId = request.getId().toString(); result.success(taskId); sendUpdateProgress(taskId, DownloadStatus.ENQUEUED, 0); - taskDao.insertOrUpdateNewTask(taskId, url, DownloadStatus.ENQUEUED, 0, filename, savedDir, headers, showNotification, openFileFromNotification); + taskDao.insertOrUpdateNewTask(taskId, url, DownloadStatus.ENQUEUED, 0, filename, additionalinfo, savedDir, headers, showNotification, openFileFromNotification); } private void loadTasks(MethodCall call, MethodChannel.Result result) { @@ -182,6 +184,7 @@ private void loadTasks(MethodCall call, MethodChannel.Result result) { item.put("progress", task.progress); item.put("url", task.url); item.put("file_name", task.filename); + item.put("additional_info", task.additionalinfo); item.put("saved_dir", task.savedDir); item.put("time_created", task.timeCreated); array.add(item); @@ -200,6 +203,7 @@ private void loadTasksWithRawQuery(MethodCall call, MethodChannel.Result result) item.put("progress", task.progress); item.put("url", task.url); item.put("file_name", task.filename); + item.put("additional_info", task.additionalinfo); item.put("saved_dir", task.savedDir); item.put("time_created", task.timeCreated); array.add(item); @@ -238,7 +242,7 @@ private void resume(MethodCall call, MethodChannel.Result result) { String partialFilePath = task.savedDir + File.separator + filename; File partialFile = new File(partialFilePath); if (partialFile.exists()) { - WorkRequest request = buildRequest(task.url, task.savedDir, task.filename, task.headers, task.showNotification, task.openFileFromNotification, true, requiresStorageNotLow); + WorkRequest request = buildRequest(task.url, task.savedDir, task.filename, task.additionalinfo, task.headers, task.showNotification, task.openFileFromNotification, true, requiresStorageNotLow); String newTaskId = request.getId().toString(); result.success(newTaskId); sendUpdateProgress(newTaskId, DownloadStatus.RUNNING, task.progress); @@ -261,7 +265,7 @@ private void retry(MethodCall call, MethodChannel.Result result) { boolean requiresStorageNotLow = call.argument("requires_storage_not_low"); if (task != null) { if (task.status == DownloadStatus.FAILED || task.status == DownloadStatus.CANCELED) { - WorkRequest request = buildRequest(task.url, task.savedDir, task.filename, task.headers, task.showNotification, task.openFileFromNotification, false, requiresStorageNotLow); + WorkRequest request = buildRequest(task.url, task.savedDir, task.filename, task.additionalinfo, task.headers, task.showNotification, task.openFileFromNotification, false, requiresStorageNotLow); String newTaskId = request.getId().toString(); result.success(newTaskId); sendUpdateProgress(newTaskId, DownloadStatus.ENQUEUED, task.progress); diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/TaskContract.java b/android/src/main/java/vn/hunghd/flutterdownloader/TaskContract.java index 425d1277..a3e09ee1 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/TaskContract.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/TaskContract.java @@ -14,6 +14,7 @@ public static class TaskEntry implements BaseColumns { public static final String COLUMN_NAME_URL = "url"; public static final String COLUMN_NAME_SAVED_DIR = "saved_dir"; public static final String COLUMN_NAME_FILE_NAME = "file_name"; + public static final String COLUMN_NAME_ADDITIONAL_INFO = "additional_info"; public static final String COLUMN_NAME_MIME_TYPE = "mime_type"; public static final String COLUMN_NAME_RESUMABLE = "resumable"; public static final String COLUMN_NAME_HEADERS = "headers"; diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/TaskDao.java b/android/src/main/java/vn/hunghd/flutterdownloader/TaskDao.java index 2c074dbb..8a5f3499 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/TaskDao.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/TaskDao.java @@ -18,6 +18,7 @@ public class TaskDao { TaskContract.TaskEntry.COLUMN_NAME_STATUS, TaskContract.TaskEntry.COLUMN_NAME_URL, TaskContract.TaskEntry.COLUMN_NAME_FILE_NAME, + TaskContract.TaskEntry.COLUMN_NAME_ADDITIONAL_INFO, TaskContract.TaskEntry.COLUMN_NAME_SAVED_DIR, TaskContract.TaskEntry.COLUMN_NAME_HEADERS, TaskContract.TaskEntry.COLUMN_NAME_MIME_TYPE, @@ -31,7 +32,7 @@ public TaskDao(TaskDbHelper helper) { dbHelper = helper; } - public void insertOrUpdateNewTask(String taskId, String url, int status, int progress, String fileName, + public void insertOrUpdateNewTask(String taskId, String url, int status, int progress, String fileName, String additionalinfo, String savedDir, String headers, boolean showNotification, boolean openFileFromNotification) { SQLiteDatabase db = dbHelper.getWritableDatabase(); @@ -41,6 +42,7 @@ public void insertOrUpdateNewTask(String taskId, String url, int status, int pro values.put(TaskContract.TaskEntry.COLUMN_NAME_STATUS, status); values.put(TaskContract.TaskEntry.COLUMN_NAME_PROGRESS, progress); values.put(TaskContract.TaskEntry.COLUMN_NAME_FILE_NAME, fileName); + values.put(TaskContract.TaskEntry.COLUMN_NAME_ADDITIONAL_INFO, additionalinfo); values.put(TaskContract.TaskEntry.COLUMN_NAME_SAVED_DIR, savedDir); values.put(TaskContract.TaskEntry.COLUMN_NAME_HEADERS, headers); values.put(TaskContract.TaskEntry.COLUMN_NAME_MIME_TYPE, "unknown"); @@ -216,6 +218,7 @@ private DownloadTask parseCursor(Cursor cursor) { int progress = cursor.getInt(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_PROGRESS)); String url = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_URL)); String filename = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_FILE_NAME)); + String additionalinfo = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_ADDITIONAL_INFO)); String savedDir = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_SAVED_DIR)); String headers = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_HEADERS)); String mimeType = cursor.getString(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_MIME_TYPE)); @@ -223,7 +226,7 @@ private DownloadTask parseCursor(Cursor cursor) { int showNotification = cursor.getShort(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_SHOW_NOTIFICATION)); int clickToOpenDownloadedFile = cursor.getShort(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_OPEN_FILE_FROM_NOTIFICATION)); long timeCreated = cursor.getLong(cursor.getColumnIndexOrThrow(TaskContract.TaskEntry.COLUMN_NAME_TIME_CREATED)); - return new DownloadTask(primaryId, taskId, status, progress, url, filename, savedDir, headers, + return new DownloadTask(primaryId, taskId, status, progress, url, filename, additionalinfo, savedDir, headers, mimeType, resumable == 1, showNotification == 1, clickToOpenDownloadedFile == 1, timeCreated); } diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/TaskDbHelper.java b/android/src/main/java/vn/hunghd/flutterdownloader/TaskDbHelper.java index d6ddfafd..6017dd4f 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/TaskDbHelper.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/TaskDbHelper.java @@ -20,6 +20,7 @@ public class TaskDbHelper extends SQLiteOpenHelper { TaskEntry.COLUMN_NAME_STATUS + " INTEGER DEFAULT 0, " + TaskEntry.COLUMN_NAME_PROGRESS + " INTEGER DEFAULT 0, " + TaskEntry.COLUMN_NAME_FILE_NAME + " TEXT, " + + TaskEntry.COLUMN_NAME_ADDITIONAL_INFO + " TEXT, " + TaskEntry.COLUMN_NAME_SAVED_DIR + " TEXT, " + TaskEntry.COLUMN_NAME_HEADERS + " TEXT, " + TaskEntry.COLUMN_NAME_MIME_TYPE + " VARCHAR(128), " + diff --git a/example/.vscode/launch.json b/example/.vscode/launch.json new file mode 100644 index 00000000..3287bb67 --- /dev/null +++ b/example/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Flutter", + "request": "launch", + "type": "dart" + } + ] +} \ No newline at end of file diff --git a/example/android/.project b/example/android/.project new file mode 100644 index 00000000..3964dd3f --- /dev/null +++ b/example/android/.project @@ -0,0 +1,17 @@ + + + android + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/example/android/.settings/org.eclipse.buildship.core.prefs b/example/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..e8895216 --- /dev/null +++ b/example/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/example/android/app/.classpath b/example/android/app/.classpath new file mode 100644 index 00000000..4a04201c --- /dev/null +++ b/example/android/app/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/example/android/app/.project b/example/android/app/.project new file mode 100644 index 00000000..ac485d7c --- /dev/null +++ b/example/android/app/.project @@ -0,0 +1,23 @@ + + + app + Project app created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/example/android/app/.settings/org.eclipse.buildship.core.prefs b/example/android/app/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 00000000..b1886adb --- /dev/null +++ b/example/android/app/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh index 8ff74aba..3e5e307b 100755 --- a/example/ios/Flutter/flutter_export_environment.sh +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -1,5 +1,6 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. + export "FLUTTER_ROOT=/Users/hunghd/Documents/Workspace/flutter" export "FLUTTER_APPLICATION_PATH=/Users/hunghd/Documents/Workspace/flutter_packages/flutter_downloader/example" export "FLUTTER_TARGET=lib/main.dart" diff --git a/example/lib/main.dart b/example/lib/main.dart index cf1ecf7b..bfed67d4 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -393,6 +393,7 @@ class _MyHomePageState extends State { void _requestDownload(_TaskInfo task) async { task.taskId = await FlutterDownloader.enqueue( url: task.link, + additionalInfo: 'this is additional info of ${task.link}', headers: {"auth": "test_for_sql_encoding"}, savedDir: _localPath, showNotification: true, diff --git a/ios/Classes/FlutterDownloaderPlugin.m b/ios/Classes/FlutterDownloaderPlugin.m index 31cdbc60..51e38a3c 100644 --- a/ios/Classes/FlutterDownloaderPlugin.m +++ b/ios/Classes/FlutterDownloaderPlugin.m @@ -12,6 +12,7 @@ #define KEY_URL @"url" #define KEY_SAVED_DIR @"saved_dir" #define KEY_FILE_NAME @"file_name" +#define KEY_ADDITIONAL_INFO @"additional_info" #define KEY_PROGRESS @"progress" #define KEY_ID @"id" #define KEY_IDS @"ids" @@ -132,7 +133,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 andAdditionalInfo: (NSString*) additionalInfo andSavedDir: (NSString*) savedDir andHeaders: (NSString*) headers { NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; if (headers != nil && [headers length] > 0) { @@ -347,7 +348,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 additionalinfo: (NSString*) additionalinfo 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,%ld)", taskId, url, status, progress, filename, savedDir, headers, resumable ? 1 : 0, showNotification ? 1 : 0, openFileFromNotification ? 1 : 0, [self currentTimeInMilliseconds]]; @@ -474,6 +475,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 *additionalinfo = [record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"additional_info"]]; NSString *savedDir = [self absoluteSavedDirPath:[record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"saved_dir"]]]; NSString *headers = [record objectAtIndex:[_dbManager.arrColumnNames indexOfObject:@"headers"]]; headers = [self escape:headers revert:true]; @@ -481,7 +483,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, additionalinfo, KEY_ADDITIONAL_INFO, 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]; } # pragma mark - FlutterDownloader @@ -516,17 +518,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 *additionalInfo = call.arguments[KEY_ADDITIONAL_INFO]; 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 andAdditionalInfo:andAdditionalInfo andSavedDir:savedDir andHeaders:headers]; NSString *taskId = [self identifierForTask:task]; [_runningTaskById setObject: [NSMutableDictionary dictionaryWithObjectsAndKeys: urlString, KEY_URL, fileName, KEY_FILE_NAME, + andAdditionalInfo, KEY_ADDITIONAL_INFO, savedDir, KEY_SAVED_DIR, headers, KEY_HEADERS, showNotification, KEY_SHOW_NOTIFICATION, @@ -538,7 +542,7 @@ - (void)enqueueMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result __typeof__(self) __weak weakSelf = self; dispatch_sync(databaseQueue, ^{ - [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 additionalinfo:additionalInfo savedDir:shortSavedDir headers:headers resumable:NO showNotification: [showNotification boolValue] openFileFromNotification: [openFileFromNotification boolValue]]; }); result(taskId); [self sendUpdateProgressForTaskId:taskId inStatus:@(STATUS_ENQUEUED) andProgress:@0]; diff --git a/lib/src/downloader.dart b/lib/src/downloader.dart index 8fef7add..55de3c31 100644 --- a/lib/src/downloader.dart +++ b/lib/src/downloader.dart @@ -48,6 +48,7 @@ class FlutterDownloader { /// * `savedDir`: absolute path of the directory where downloaded file is saved /// * `fileName`: name of downloaded file. If this parameter is not set, the /// plugin will try to extract a file name from HTTP headers response or `url` + /// * `additionalInfo`:name of Additional information of a downloaded file /// * `headers`: HTTP headers /// * `showNotification`: sets `true` to show a notification displaying the /// download progress (only Android), otherwise, `false` value will disable @@ -66,6 +67,7 @@ class FlutterDownloader { {@required String url, @required String savedDir, String fileName, + String additionalInfo, Map headers, bool showNotification = true, bool openFileFromNotification = true, @@ -87,6 +89,7 @@ class FlutterDownloader { 'url': url, 'saved_dir': savedDir, 'file_name': fileName, + 'additional_info': additionalInfo, 'headers': headerBuilder.toString(), 'show_notification': showNotification, 'open_file_from_notification': openFileFromNotification, @@ -114,12 +117,14 @@ class FlutterDownloader { List result = await _channel.invokeMethod('loadTasks'); return result .map((item) => new DownloadTask( - taskId: item['task_id'], - status: DownloadTaskStatus(item['status']), - progress: item['progress'], - url: item['url'], - filename: item['file_name'], - savedDir: item['saved_dir'])) + taskId: item['task_id'], + status: DownloadTaskStatus(item['status']), + progress: item['progress'], + url: item['url'], + filename: item['file_name'], + additionalInfo: item['additional_info'], + savedDir: item['saved_dir']),) + .toList(); } on PlatformException catch (e) { print(e.message); @@ -157,12 +162,14 @@ class FlutterDownloader { print('Loaded tasks: $result'); return result .map((item) => new DownloadTask( - taskId: item['task_id'], - status: DownloadTaskStatus(item['status']), - progress: item['progress'], - url: item['url'], - filename: item['file_name'], - savedDir: item['saved_dir'])) + taskId: item['task_id'], + status: DownloadTaskStatus(item['status']), + progress: item['progress'], + url: item['url'], + filename: item['file_name'], + additionalInfo: item['additional_info'], + savedDir: item['saved_dir'])) + .toList(); } on PlatformException catch (e) { print(e.message); diff --git a/lib/src/models.dart b/lib/src/models.dart index 11474758..f2c09511 100644 --- a/lib/src/models.dart +++ b/lib/src/models.dart @@ -34,6 +34,7 @@ class DownloadTaskStatus { /// * [progress] the latest progress value of a download task /// * [url] the download link /// * [filename] the local file name of a downloaded file +/// * [additionalInfo] Additional information of a downloaded file /// * [savedDir] the absolute path of the directory where the downloaded file is saved /// class DownloadTask { @@ -42,17 +43,21 @@ class DownloadTask { final int progress; final String url; final String filename; + final String additionalInfo; final String savedDir; - DownloadTask( - {this.taskId, - this.status, - this.progress, - this.url, - this.filename, - this.savedDir}); + DownloadTask({ + this.taskId, + this.status, + this.progress, + this.url, + this.filename, + this.additionalInfo, + this.savedDir, + }); @override String toString() => - "DownloadTask(taskId: $taskId, status: $status, progress: $progress, url: $url, filename: $filename, savedDir: $savedDir)"; + "DownloadTask(taskId: $taskId, status: $status, progress: $progress, url: $url, filename: $filename, additionalInfo: $additionalInfo, savedDir: $savedDir)"; + }