diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java index 69e08064..0a49f853 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/DownloadWorker.java @@ -81,13 +81,13 @@ 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"; public static final String ARG_SAVE_IN_PUBLIC_STORAGE = "save_in_public_storage"; public static final String ARG_IGNORESSL = "ignoreSsl"; 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<>(); @@ -108,6 +108,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; private boolean saveInPublicStorage; public DownloadWorker(@NonNull final Context context, @@ -188,6 +189,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); ignoreSsl = getInputData().getBoolean(ARG_IGNORESSL, false); Resources res = getApplicationContext().getResources(); @@ -416,7 +418,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; diff --git a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java index fd9e61a1..dedfcd3b 100644 --- a/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java +++ b/android/src/main/java/vn/hunghd/flutterdownloader/FlutterDownloaderPlugin.java @@ -44,6 +44,7 @@ public class FlutterDownloaderPlugin implements MethodCallHandler, FlutterPlugin private TaskDao taskDao; private Context context; private long callbackHandle; + private int stepUpdate; private int debugMode; private int ignoreSsl; @@ -126,6 +127,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) .putBoolean(DownloadWorker.ARG_IGNORESSL, ignoreSsl == 1) .putBoolean(DownloadWorker.ARG_SAVE_IN_PUBLIC_STORAGE, saveInPublicStorage) @@ -158,6 +160,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 94dad983..9a2dcec5 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 a72d2eae..dd306b6c 100644 --- a/lib/src/downloader.dart +++ b/lib/src/downloader.dart @@ -360,13 +360,16 @@ class FlutterDownloader { ///``` /// /// {@end-tool} - static registerCallback(DownloadCallback callback) { + static registerCallback(DownloadCallback callback, {int stepSize = 10}) { assert(_initialized, 'plugin flutter_downloader is not initialized'); final callbackHandle = PluginUtilities.getCallbackHandle(callback)!; + assert(callbackHandle != null, 'callback must be a top-level or static function'); + assert(stepSize >= 0 && stepSize <= 100, 'Step size should be between 0-100'); + _channel.invokeMethod( 'registerCallback', - [callbackHandle.toRawHandle()], + [callbackHandle.toRawHandle(), stepSize], ); }