From 93221cd5225b247466a1016398d0ced5064d5cbf Mon Sep 17 00:00:00 2001 From: Mark Turner Date: Tue, 30 Mar 2021 12:46:35 +1100 Subject: [PATCH 1/2] Make download progress step size configurable, not just every 10%. --- .../java/vn/hunghd/flutterdownloader/DownloadWorker.java | 6 ++++-- .../hunghd/flutterdownloader/FlutterDownloaderPlugin.java | 3 +++ ios/Classes/FlutterDownloaderPlugin.m | 6 +++--- lib/src/downloader.dart | 5 +++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java index cfa3d123..7bd1916e 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java @@ -67,11 +67,11 @@ public class DownloadWorker extends Worker implements MethodChannel.MethodCallHa public static final String ARG_OPEN_FILE_FROM_NOTIFICATION = "open_file_from_notification"; public static final String ARG_CALLBACK_HANDLE = "callback_handle"; public static final String ARG_DEBUG = "debug"; + public static final String ARG_STEP_UPDATE = "step_update"; private static final String TAG = DownloadWorker.class.getSimpleName(); private static final int BUFFER_SIZE = 4096; private static final String CHANNEL_ID = "FLUTTER_DOWNLOADER_NOTIFICATION"; - private static final int STEP_UPDATE = 5; private static final AtomicBoolean isolateStarted = new AtomicBoolean(false); private static final ArrayDeque isolateQueue = new ArrayDeque<>(); @@ -89,6 +89,7 @@ public class DownloadWorker extends Worker implements MethodChannel.MethodCallHa private int primaryId; private String msgStarted, msgInProgress, msgCanceled, msgFailed, msgPaused, msgComplete; private long lastCallUpdateNotification = 0; + private int stepUpdate; public DownloadWorker(@NonNull final Context context, @NonNull WorkerParameters params) { @@ -167,6 +168,7 @@ public Result doWork() { String headers = getInputData().getString(ARG_HEADERS); boolean isResume = getInputData().getBoolean(ARG_IS_RESUME, false); debug = getInputData().getBoolean(ARG_DEBUG, false); + stepUpdate = getInputData().getInt(ARG_STEP_UPDATE, 10); Resources res = getApplicationContext().getResources(); msgStarted = res.getString(R.string.flutter_downloader_notification_started); @@ -346,7 +348,7 @@ private void downloadFile(Context context, String fileURL, String savedDir, Stri int progress = (int) ((count * 100) / (contentLength + downloadedBytes)); outputStream.write(buffer, 0, bytesRead); - if ((lastProgress == 0 || progress > lastProgress + STEP_UPDATE || progress == 100) + if ((lastProgress == 0 || progress > (lastProgress + stepUpdate) || progress == 100) && progress != lastProgress) { lastProgress = progress; updateNotification(context, filename, DownloadStatus.RUNNING, progress, null, false); diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java index e3cc7a90..79562595 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java @@ -48,6 +48,7 @@ public class FlutterDownloaderPlugin implements MethodCallHandler, FlutterPlugin private TaskDao taskDao; private Context context; private long callbackHandle; + private int stepUpdate; private int debugMode; private final Object initializationLock = new Object(); @@ -134,6 +135,7 @@ private WorkRequest buildRequest(String url, String savedDir, String filename, S .putBoolean(DownloadWorker.ARG_OPEN_FILE_FROM_NOTIFICATION, openFileFromNotification) .putBoolean(DownloadWorker.ARG_IS_RESUME, isResume) .putLong(DownloadWorker.ARG_CALLBACK_HANDLE, callbackHandle) + .putInt(DownloadWorker.ARG_STEP_UPDATE, stepUpdate) .putBoolean(DownloadWorker.ARG_DEBUG, debugMode == 1) .build() ) @@ -163,6 +165,7 @@ private void initialize(MethodCall call, MethodChannel.Result result) { private void registerCallback(MethodCall call, MethodChannel.Result result) { List args = (List) call.arguments; callbackHandle = Long.parseLong(args.get(0).toString()); + stepUpdate = Integer.parseInt(args.get(1).toString()); result.success(null); } diff --git a/ios/Classes/FlutterDownloaderPlugin.m b/ios/Classes/FlutterDownloaderPlugin.m index e1740d89..b9d58274 100644 --- a/ios/Classes/FlutterDownloaderPlugin.m +++ b/ios/Classes/FlutterDownloaderPlugin.m @@ -29,8 +29,6 @@ #define ERROR_NOT_INITIALIZED [FlutterError errorWithCode:@"not_initialized" message:@"initialize() must called first" details:nil] #define ERROR_INVALID_TASK_ID [FlutterError errorWithCode:@"invalid_task_id" message:@"not found task corresponding to given task id" details:nil] -#define STEP_UPDATE 5 - @interface FlutterDownloaderPlugin() { FlutterEngine *_headlessRunner; @@ -43,6 +41,7 @@ @interface FlutterDownloaderPlugin() [lastProgress intValue] + STEP_UPDATE) || progress == 100) && progress != [lastProgress intValue]) { + if (([lastProgress intValue] == 0 || (progress > ([lastProgress intValue] + _stepUpdate)) || progress == 100) && progress != [lastProgress intValue]) { [self sendUpdateProgressForTaskId:taskId inStatus:@(STATUS_RUNNING) andProgress:@(progress)]; __typeof__(self) __weak weakSelf = self; dispatch_sync(databaseQueue, ^{ diff --git a/lib/src/downloader.dart b/lib/src/downloader.dart index 267cd295..6b1f26d2 100644 --- a/lib/src/downloader.dart +++ b/lib/src/downloader.dart @@ -383,13 +383,14 @@ class FlutterDownloader { /// /// {@end-tool} /// - static registerCallback(DownloadCallback callback) { + static registerCallback(DownloadCallback callback, int stepSize) { assert(_initialized, 'FlutterDownloader.initialize() must be called first'); final callbackHandle = PluginUtilities.getCallbackHandle(callback); assert(callbackHandle != null, 'callback must be a top-level or a static function'); + assert(stepSize >= 0 && stepSize <= 100, 'Step size should be between 0-100'); _channel.invokeMethod( - 'registerCallback', [callbackHandle.toRawHandle()]); + 'registerCallback', [callbackHandle.toRawHandle(), stepSize]); } } From 79a56244c3f1e12358246e38402532484f539ff2 Mon Sep 17 00:00:00 2001 From: David Butler Date: Sun, 23 Aug 2020 10:19:59 +0100 Subject: [PATCH 2/2] The second parameter stepSize is now optional --- lib/src/downloader.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/downloader.dart b/lib/src/downloader.dart index 6b1f26d2..101d4773 100644 --- a/lib/src/downloader.dart +++ b/lib/src/downloader.dart @@ -383,7 +383,7 @@ class FlutterDownloader { /// /// {@end-tool} /// - static registerCallback(DownloadCallback callback, int stepSize) { + static registerCallback(DownloadCallback callback, {int stepSize = 10}) { assert(_initialized, 'FlutterDownloader.initialize() must be called first'); final callbackHandle = PluginUtilities.getCallbackHandle(callback);