@kesha-antonov/react-native-background-downloader 3.1.0 → 3.1.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,23 +3,21 @@
3
3
  [![npm version](https://badge.fury.io/js/@kesha-antonov%2Freact-native-background-downloader.svg)](https://badge.fury.io/js/@kesha-antonov%2Freact-native-background-downloader)
4
4
 
5
5
  # @kesha-antonov/react-native-background-downloader
6
- ## *Note - This is fork of https://github.com/EkoLabs/react-native-background-downloader maintained by https://github.com/kesha-antonov * ##
7
6
 
8
7
  A library for React-Native to help you download large files on iOS and Android both in the foreground and most importantly in the background.
9
8
 
10
9
  ### Why?
10
+
11
11
  On iOS, if you want to download big files no matter the state of your app, wether it's in the background or terminated by the OS, you have to use a system API called `NSURLSession`.
12
12
 
13
13
  This API handles your downloads separately from your app and only keeps it informed using delegates (Read: [Downloading Files in the Background](https://developer.apple.com/documentation/foundation/url_loading_system/downloading_files_in_the_background)).
14
14
 
15
- On Android we are simulating this process with [DownloadManager](https://developer.android.com/reference/android/app/DownloadManager)
15
+ On Android we are using similar process with [DownloadManager](https://developer.android.com/reference/android/app/DownloadManager)
16
16
 
17
17
  The real challenge of using this method is making sure the app's UI is always up-to-date with the downloads that are happening in another process because your app might startup from scratch while the downloads are still running.
18
18
 
19
19
  `@kesha-antonov/react-native-background-downloader` gives you an easy API to both downloading large files and re-attaching to those downloads once your app launches again.
20
20
 
21
- > **Please Note** - This library was created to better facilitate background downloading on iOS. If you're not aiming to to use the download-in-background functionality, there are better solutions like [RNFS.downloadFile()](https://github.com/itinance/react-native-fs#downloadfileoptions-downloadfileoptions--jobid-number-promise-promisedownloadresult-) which will results in a more stable download experience for your app.
22
-
23
21
  ## ToC
24
22
 
25
23
  - [Usage](#usage)
@@ -332,11 +330,17 @@ Stops the download for good and removes the file that was written so far
332
330
 
333
331
  An absolute path to the app's documents directory. It is recommended that you use this path as the target of downloaded files.
334
332
 
333
+ ## TODO
334
+
335
+ - [ ] Write better examples - current kinda old and shallow
336
+ - [ ] Write better API for downloads - current kinda boilerplate
337
+ - [ ] Add more tests
338
+
335
339
  ## Authors
336
340
 
337
- Developed by [Elad Gil](https://github.com/ptelad) of [Eko](http://www.helloeko.com)
341
+ Re-written & maintained by [Kesha Antonov](https://github.com/kesha-antonov)
338
342
 
339
- Maintained by [Kesha Antonov](https://github.com/kesha-antonov)
343
+ Originally developed by [Elad Gil](https://github.com/ptelad) of [Eko](https://github.com/ekolabs/react-native-background-downloader)
340
344
 
341
345
  ## License
342
346
  Apache 2
@@ -1,4 +1,6 @@
1
1
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
2
  package="com.eko">
3
3
 
4
+ <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
5
+
4
6
  </manifest>
@@ -2,6 +2,7 @@ package com.eko;
2
2
 
3
3
  import android.app.DownloadManager;
4
4
  import android.content.Context;
5
+ import android.content.Intent;
5
6
  import android.database.Cursor;
6
7
  import android.net.Uri;
7
8
  import android.os.Environment;
@@ -13,6 +14,9 @@ import com.facebook.react.bridge.WritableMap;
13
14
  import com.facebook.react.bridge.WritableNativeMap;
14
15
 
15
16
  import java.util.HashMap;
17
+ import java.util.HashSet;
18
+ import java.util.Set;
19
+
16
20
  import android.util.Log;
17
21
 
18
22
  import static android.content.Context.DOWNLOAD_SERVICE;
@@ -22,6 +26,8 @@ public class Downloader {
22
26
  public DownloadManager downloadManager;
23
27
  private Context context;
24
28
 
29
+ private HashSet<String> alreadySentIntentDownloadIds = new HashSet<>();
30
+
25
31
  public Downloader(Context ctx) {
26
32
  context = ctx;
27
33
  downloadManager = (DownloadManager) ctx.getSystemService(DOWNLOAD_SERVICE);
@@ -138,6 +144,20 @@ public class Downloader {
138
144
  reasonText = "UNKNOWN";
139
145
  }
140
146
  break;
147
+
148
+ case DownloadManager.STATUS_SUCCESSFUL:
149
+ if(!alreadySentIntentDownloadIds.contains(downloadId)) {
150
+ alreadySentIntentDownloadIds.add(downloadId);
151
+
152
+ // broadcast the download complete to handle the case where the app was closed when the download was done
153
+ Intent intent = new Intent(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
154
+
155
+ // You can add extras to the intent if needed
156
+ intent.putExtra(DownloadManager.EXTRA_DOWNLOAD_ID, Long.parseLong(downloadId));
157
+ context.sendBroadcast(intent);
158
+ }
159
+
160
+ break;
141
161
  }
142
162
 
143
163
  WritableMap result = Arguments.createMap();
@@ -147,8 +167,8 @@ public class Downloader {
147
167
  result.putInt("reason", reason);
148
168
  result.putString("reasonText", reasonText);
149
169
 
150
- result.putInt("bytesDownloaded", Integer.parseInt(bytesDownloadedSoFar));
151
- result.putInt("bytesTotal", Integer.parseInt(totalSizeBytes));
170
+ result.putDouble("bytesDownloaded", Long.parseLong(bytesDownloadedSoFar));
171
+ result.putDouble("bytesTotal", Long.parseLong(totalSizeBytes));
152
172
  result.putString("localUri", localUri);
153
173
 
154
174
  return result;
@@ -37,11 +37,11 @@ public class OnBegin extends Thread {
37
37
  con.getInputStream().close();
38
38
 
39
39
  WritableMap params = Arguments.createMap();
40
- int contentLength = Integer.valueOf(headersMap.getString("Content-Length"));
40
+ long contentLength = Long.valueOf(headersMap.getString("Content-Length"));
41
41
 
42
42
  params.putString("id", config.id);
43
43
  params.putMap("headers", headersMap);
44
- params.putInt("expectedBytes", contentLength);
44
+ params.putDouble("expectedBytes", contentLength);
45
45
 
46
46
  ee.emit("downloadBegin", params);
47
47
  } catch (Exception e) {
@@ -17,8 +17,8 @@ public class OnProgress extends Thread {
17
17
  private final DownloadManager.Query query;
18
18
  private final Downloader downloader;
19
19
  private Cursor cursor;
20
- private int lastBytesDownloaded;
21
- private int bytesTotal;
20
+ private long lastBytesDownloaded;
21
+ private long bytesTotal;
22
22
  private ProgressCallback callback;
23
23
 
24
24
  private RNBGDTaskConfig config;
@@ -72,10 +72,10 @@ public class OnProgress extends Thread {
72
72
 
73
73
  // get total bytes of the file
74
74
  if (bytesTotal <= 0) {
75
- bytesTotal = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
75
+ bytesTotal = (long)(cursor.getDouble(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)));
76
76
  }
77
77
 
78
- int bytesDownloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
78
+ long bytesDownloaded = (long)(cursor.getDouble(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)));
79
79
 
80
80
  if (bytesTotal > 0 && bytesDownloaded == bytesTotal) {
81
81
  this.handleInterrupt();
@@ -1,5 +1,5 @@
1
1
  package com.eko;
2
2
 
3
3
  public interface ProgressCallback {
4
- void onProgress(String configId, int bytesDownloaded, int bytesTotal);
4
+ void onProgress(String configId, long bytesDownloaded, long bytesTotal);
5
5
  }
@@ -83,11 +83,12 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
83
83
 
84
84
  private static Object sharedLock = new Object();
85
85
 
86
- private static void copyFile(File src, File dst) throws IOException {
86
+ private static void moveFile(File src, File dst) throws IOException {
87
87
  FileChannel inChannel = new FileInputStream(src).getChannel();
88
88
  FileChannel outChannel = new FileOutputStream(dst).getChannel();
89
89
  try {
90
90
  inChannel.transferTo(0, inChannel.size(), outChannel);
91
+ src.delete();
91
92
  } finally {
92
93
  if (inChannel != null)
93
94
  inChannel.close();
@@ -120,20 +121,23 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
120
121
  File file = new File(localUri);
121
122
  File dest = new File(config.destination);
122
123
 
123
- // REMOVE DEST FILE IF EXISTS
124
- if (dest.exists()) {
125
- dest.delete();
126
- }
124
+ // only move if source file exists (to handle case if this intent is double called)
125
+ if(file.exists()) {
126
+ // REMOVE DEST FILE IF EXISTS
127
+ if (dest.exists()) {
128
+ dest.delete();
129
+ }
127
130
 
128
- // CREATE DESTINATION DIR IF NOT EXISTS
129
- File destDir = new File(dest.getParent());
130
- if (!destDir.exists()) {
131
- destDir.mkdirs();
132
- }
131
+ // CREATE DESTINATION DIR IF NOT EXISTS
132
+ File destDir = new File(dest.getParent());
133
+ if (!destDir.exists()) {
134
+ destDir.mkdirs();
135
+ }
133
136
 
134
- // MOVE FILE
135
- copyFile(file, dest);
136
- file.delete();
137
+ // MOVE FILE
138
+ moveFile(file, dest);
139
+ file.delete();
140
+ }
137
141
 
138
142
  WritableMap params = Arguments.createMap();
139
143
  params.putString("id", config.id);
@@ -414,14 +418,14 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
414
418
  downloader,
415
419
  new ProgressCallback() {
416
420
  @Override
417
- public void onProgress(String configId, int bytesDownloaded, int bytesTotal) {
418
- double prevPercent = configIdToPercent.get(configId);
421
+ public void onProgress(String configId, long bytesDownloaded, long bytesTotal) {
422
+ double prevPercent = configIdToPercent.getOrDefault(configId, 0.0);
419
423
  double percent = (double) bytesDownloaded / bytesTotal;
420
424
  if (percent - prevPercent > 0.01) {
421
425
  WritableMap params = Arguments.createMap();
422
426
  params.putString("id", configId);
423
- params.putInt("bytesDownloaded", bytesDownloaded);
424
- params.putInt("bytesTotal", bytesTotal);
427
+ params.putDouble("bytesDownloaded", bytesDownloaded);
428
+ params.putDouble("bytesTotal", bytesTotal);
425
429
 
426
430
  progressReports.put(configId, params);
427
431
  configIdToPercent.put(configId, percent);
@@ -521,11 +525,11 @@ public class RNBackgroundDownloaderModule extends ReactContextBaseJavaModule {
521
525
  params.putString("metadata", config.metadata);
522
526
  params.putInt("state", stateMap.get(downloadStatus.getInt("status")));
523
527
 
524
- int bytesDownloaded = downloadStatus.getInt("bytesDownloaded");
525
- params.putInt("bytesDownloaded", bytesDownloaded);
528
+ double bytesDownloaded = downloadStatus.getDouble("bytesDownloaded");
529
+ params.putDouble("bytesDownloaded", bytesDownloaded);
526
530
 
527
- int bytesTotal = downloadStatus.getInt("bytesTotal");
528
- params.putInt("bytesTotal", bytesTotal);
531
+ double bytesTotal = downloadStatus.getDouble("bytesTotal");
532
+ params.putDouble("bytesTotal", bytesTotal);
529
533
 
530
534
  foundIds.pushMap(params);
531
535
 
@@ -0,0 +1,351 @@
1
+ #! /bin/sh
2
+ # Wrapper for compilers which do not understand '-c -o'.
3
+
4
+ scriptversion=2018-03-27.18; # UTC
5
+
6
+ # Copyright (C) 1999-2018 Free Software Foundation, Inc.
7
+ # Written by Tom Tromey <tromey@cygnus.com>.
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify
10
+ # it under the terms of the GNU General Public License as published by
11
+ # the Free Software Foundation; either version 2, or (at your option)
12
+ # any later version.
13
+ #
14
+ # This program is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # GNU General Public License for more details.
18
+ #
19
+ # You should have received a copy of the GNU General Public License
20
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
21
+
22
+ # As a special exception to the GNU General Public License, if you
23
+ # distribute this file as part of a program that contains a
24
+ # configuration script generated by Autoconf, you may include it under
25
+ # the same distribution terms that you use for the rest of that program.
26
+
27
+ # This file is maintained in Automake, please report
28
+ # bugs to <bug-automake@gnu.org> or send patches to
29
+ # <automake-patches@gnu.org>.
30
+
31
+ nl='
32
+ '
33
+
34
+ # We need space, tab and new line, in precisely that order. Quoting is
35
+ # there to prevent tools from complaining about whitespace usage.
36
+ IFS=" "" $nl"
37
+
38
+ file_conv=
39
+
40
+ # func_file_conv build_file lazy
41
+ # Convert a $build file to $host form and store it in $file
42
+ # Currently only supports Windows hosts. If the determined conversion
43
+ # type is listed in (the comma separated) LAZY, no conversion will
44
+ # take place.
45
+ func_file_conv ()
46
+ {
47
+ file=$1
48
+ case $file in
49
+ / | /[!/]*) # absolute file, and not a UNC file
50
+ if test -z "$file_conv"; then
51
+ # lazily determine how to convert abs files
52
+ case `uname -s` in
53
+ MINGW*)
54
+ file_conv=mingw
55
+ ;;
56
+ CYGWIN*)
57
+ file_conv=cygwin
58
+ ;;
59
+ *)
60
+ file_conv=wine
61
+ ;;
62
+ esac
63
+ fi
64
+ case $file_conv/,$2, in
65
+ *,$file_conv,*)
66
+ ;;
67
+ mingw/*)
68
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
69
+ ;;
70
+ cygwin/*)
71
+ file=`cygpath -m "$file" || echo "$file"`
72
+ ;;
73
+ wine/*)
74
+ file=`winepath -w "$file" || echo "$file"`
75
+ ;;
76
+ esac
77
+ ;;
78
+ esac
79
+ }
80
+
81
+ # func_cl_dashL linkdir
82
+ # Make cl look for libraries in LINKDIR
83
+ func_cl_dashL ()
84
+ {
85
+ func_file_conv "$1"
86
+ if test -z "$lib_path"; then
87
+ lib_path=$file
88
+ else
89
+ lib_path="$lib_path;$file"
90
+ fi
91
+ linker_opts="$linker_opts -LIBPATH:$file"
92
+ }
93
+
94
+ # func_cl_dashl library
95
+ # Do a library search-path lookup for cl
96
+ func_cl_dashl ()
97
+ {
98
+ lib=$1
99
+ found=no
100
+ save_IFS=$IFS
101
+ IFS=';'
102
+ for dir in $lib_path $LIB
103
+ do
104
+ IFS=$save_IFS
105
+ if $shared && test -f "$dir/$lib.dll.lib"; then
106
+ found=yes
107
+ lib=$dir/$lib.dll.lib
108
+ break
109
+ fi
110
+ if test -f "$dir/$lib.lib"; then
111
+ found=yes
112
+ lib=$dir/$lib.lib
113
+ break
114
+ fi
115
+ if test -f "$dir/lib$lib.a"; then
116
+ found=yes
117
+ lib=$dir/lib$lib.a
118
+ break
119
+ fi
120
+ done
121
+ IFS=$save_IFS
122
+
123
+ if test "$found" != yes; then
124
+ lib=$lib.lib
125
+ fi
126
+ }
127
+
128
+ # func_cl_wrapper cl arg...
129
+ # Adjust compile command to suit cl
130
+ func_cl_wrapper ()
131
+ {
132
+ # Assume a capable shell
133
+ lib_path=
134
+ shared=:
135
+ linker_opts=
136
+ for arg
137
+ do
138
+ if test -n "$eat"; then
139
+ eat=
140
+ else
141
+ case $1 in
142
+ -o)
143
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
144
+ eat=1
145
+ case $2 in
146
+ *.o | *.[oO][bB][jJ])
147
+ func_file_conv "$2"
148
+ set x "$@" -Fo"$file"
149
+ shift
150
+ ;;
151
+ *)
152
+ func_file_conv "$2"
153
+ set x "$@" -Fe"$file"
154
+ shift
155
+ ;;
156
+ esac
157
+ ;;
158
+ -I)
159
+ eat=1
160
+ func_file_conv "$2" mingw
161
+ set x "$@" -I"$file"
162
+ shift
163
+ ;;
164
+ -I*)
165
+ func_file_conv "${1#-I}" mingw
166
+ set x "$@" -I"$file"
167
+ shift
168
+ ;;
169
+ -l)
170
+ eat=1
171
+ func_cl_dashl "$2"
172
+ set x "$@" "$lib"
173
+ shift
174
+ ;;
175
+ -l*)
176
+ func_cl_dashl "${1#-l}"
177
+ set x "$@" "$lib"
178
+ shift
179
+ ;;
180
+ -L)
181
+ eat=1
182
+ func_cl_dashL "$2"
183
+ ;;
184
+ -L*)
185
+ func_cl_dashL "${1#-L}"
186
+ ;;
187
+ -static)
188
+ shared=false
189
+ ;;
190
+ -warn)
191
+ eat=1
192
+ ;;
193
+ -Wl,*)
194
+ arg=${1#-Wl,}
195
+ save_ifs="$IFS"; IFS=','
196
+ for flag in $arg; do
197
+ IFS="$save_ifs"
198
+ linker_opts="$linker_opts $flag"
199
+ done
200
+ IFS="$save_ifs"
201
+ ;;
202
+ -Xlinker)
203
+ eat=1
204
+ linker_opts="$linker_opts $2"
205
+ ;;
206
+ -*)
207
+ set x "$@" "$1"
208
+ shift
209
+ ;;
210
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
211
+ func_file_conv "$1"
212
+ set x "$@" -Tp"$file"
213
+ shift
214
+ ;;
215
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
216
+ func_file_conv "$1" mingw
217
+ set x "$@" "$file"
218
+ shift
219
+ ;;
220
+ *)
221
+ set x "$@" "$1"
222
+ shift
223
+ ;;
224
+ esac
225
+ fi
226
+ shift
227
+ done
228
+ if test -n "$linker_opts"; then
229
+ linker_opts="-link$linker_opts"
230
+ fi
231
+ exec "$@" $linker_opts
232
+ exit 1
233
+ }
234
+
235
+ eat=
236
+
237
+ case $1 in
238
+ '')
239
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
240
+ exit 1;
241
+ ;;
242
+ -h | --h*)
243
+ cat <<\EOF
244
+ Usage: compile [--help] [--version] PROGRAM [ARGS]
245
+
246
+ Wrapper for compilers which do not understand '-c -o'.
247
+ Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
248
+ arguments, and rename the output as expected.
249
+
250
+ If you are trying to build a whole package this is not the
251
+ right script to run: please start by reading the file 'INSTALL'.
252
+
253
+ Report bugs to <bug-automake@gnu.org>.
254
+ EOF
255
+ exit $?
256
+ ;;
257
+ -v | --v*)
258
+ echo "compile $scriptversion"
259
+ exit $?
260
+ ;;
261
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
262
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
263
+ func_cl_wrapper "$@" # Doesn't return...
264
+ ;;
265
+ esac
266
+
267
+ ofile=
268
+ cfile=
269
+
270
+ for arg
271
+ do
272
+ if test -n "$eat"; then
273
+ eat=
274
+ else
275
+ case $1 in
276
+ -o)
277
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
278
+ # So we strip '-o arg' only if arg is an object.
279
+ eat=1
280
+ case $2 in
281
+ *.o | *.obj)
282
+ ofile=$2
283
+ ;;
284
+ *)
285
+ set x "$@" -o "$2"
286
+ shift
287
+ ;;
288
+ esac
289
+ ;;
290
+ *.c)
291
+ cfile=$1
292
+ set x "$@" "$1"
293
+ shift
294
+ ;;
295
+ *)
296
+ set x "$@" "$1"
297
+ shift
298
+ ;;
299
+ esac
300
+ fi
301
+ shift
302
+ done
303
+
304
+ if test -z "$ofile" || test -z "$cfile"; then
305
+ # If no '-o' option was seen then we might have been invoked from a
306
+ # pattern rule where we don't need one. That is ok -- this is a
307
+ # normal compilation that the losing compiler can handle. If no
308
+ # '.c' file was seen then we are probably linking. That is also
309
+ # ok.
310
+ exec "$@"
311
+ fi
312
+
313
+ # Name of file we expect compiler to create.
314
+ cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
315
+
316
+ # Create the lock directory.
317
+ # Note: use '[/\\:.-]' here to ensure that we don't use the same name
318
+ # that we are using for the .o file. Also, base the name on the expected
319
+ # object file name, since that is what matters with a parallel build.
320
+ lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
321
+ while true; do
322
+ if mkdir "$lockdir" >/dev/null 2>&1; then
323
+ break
324
+ fi
325
+ sleep 1
326
+ done
327
+ # FIXME: race condition here if user kills between mkdir and trap.
328
+ trap "rmdir '$lockdir'; exit 1" 1 2 15
329
+
330
+ # Run the compile.
331
+ "$@"
332
+ ret=$?
333
+
334
+ if test -f "$cofile"; then
335
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
336
+ elif test -f "${cofile}bj"; then
337
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
338
+ fi
339
+
340
+ rmdir "$lockdir"
341
+ exit $ret
342
+
343
+ # Local Variables:
344
+ # mode: shell-script
345
+ # sh-indentation: 2
346
+ # eval: (add-hook 'before-save-hook 'time-stamp)
347
+ # time-stamp-start: "scriptversion="
348
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
349
+ # time-stamp-time-zone: "UTC0"
350
+ # time-stamp-end: "; # UTC"
351
+ # End:
@@ -0,0 +1,28 @@
1
+ CC = gcc
2
+ CFLAGS = -O2 -Wall
3
+ prefix =
4
+ includedir = $(prefix)/include
5
+ libdir = $(prefix)/lib
6
+ CPPFLAGS = -I$(includedir)
7
+ LDFLAGS = -L$(libdir) -Wl,-rpath,$(libdir)
8
+
9
+ all: check-call check-callback
10
+
11
+ test-call: test-call.c testcases.c
12
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-call test-call.c -lffi
13
+
14
+ test-callback: test-callback.c testcases.c
15
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-callback test-callback.c -lffi
16
+
17
+ check-call: test-call
18
+ ./test-call > test-call.out
19
+ LC_ALL=C uniq -u < test-call.out > failed-call
20
+ test '!' -s failed-call
21
+
22
+ check-callback: test-callback
23
+ ./test-callback > test-callback.out
24
+ LC_ALL=C uniq -u < test-callback.out > failed-callback
25
+ test '!' -s failed-callback
26
+
27
+ clean:
28
+ rm -f test-call test-callback test-call.out test-callback.out failed-call failed-callback
package/index.d.ts CHANGED
@@ -66,6 +66,7 @@ export interface TaskInfoObject {
66
66
  export type TaskInfo = TaskInfoObject;
67
67
 
68
68
  export type DownloadTaskState =
69
+ | 'PENDING'
69
70
  | 'DOWNLOADING'
70
71
  | 'PAUSED'
71
72
  | 'DONE'
package/index.ts CHANGED
@@ -13,7 +13,7 @@ const config = {
13
13
  isLogsEnabled: false,
14
14
  }
15
15
 
16
- function log(...args) {
16
+ function log (...args) {
17
17
  if (config.isLogsEnabled)
18
18
  console.log('[RNBackgroundDownloader]', ...args)
19
19
  }
@@ -50,7 +50,7 @@ RNBackgroundDownloaderEmitter.addListener('downloadFailed', ({ id, ...rest }) =>
50
50
  tasksMap.delete(id)
51
51
  })
52
52
 
53
- export function setConfig({ headers, progressInterval, isLogsEnabled }) {
53
+ export function setConfig ({ headers, progressInterval, isLogsEnabled }) {
54
54
  if (typeof headers === 'object') config.headers = headers
55
55
 
56
56
  if (progressInterval != null)
@@ -62,7 +62,7 @@ export function setConfig({ headers, progressInterval, isLogsEnabled }) {
62
62
  if (typeof isLogsEnabled === 'boolean') config.isLogsEnabled = isLogsEnabled
63
63
  }
64
64
 
65
- export function checkForExistingDownloads() {
65
+ export function checkForExistingDownloads () {
66
66
  log('[RNBackgroundDownloader] checkForExistingDownloads-1')
67
67
  return RNBackgroundDownloader.checkForExistingDownloads()
68
68
  .then(foundTasks => {
@@ -92,7 +92,7 @@ export function checkForExistingDownloads() {
92
92
  })
93
93
  }
94
94
 
95
- export function ensureDownloadsAreRunning() {
95
+ export function ensureDownloadsAreRunning () {
96
96
  log('[RNBackgroundDownloader] ensureDownloadsAreRunning')
97
97
  return checkForExistingDownloads()
98
98
  .then(tasks => {
@@ -104,7 +104,7 @@ export function ensureDownloadsAreRunning() {
104
104
  })
105
105
  }
106
106
 
107
- export function completeHandler(jobId: string) {
107
+ export function completeHandler (jobId: string) {
108
108
  if (jobId == null) {
109
109
  console.warn('[RNBackgroundDownloader] completeHandler: jobId is empty')
110
110
  return
@@ -124,7 +124,7 @@ type DownloadOptions = {
124
124
  isNotificationVisible?: boolean;
125
125
  }
126
126
 
127
- export function download(options: DownloadOptions) {
127
+ export function download (options: DownloadOptions) {
128
128
  log('[RNBackgroundDownloader] download', options)
129
129
  if (!options.id || !options.url || !options.destination)
130
130
  throw new Error('[RNBackgroundDownloader] id, url and destination are required')
@@ -1,19 +1,5 @@
1
- //
2
- // RNFileBackgroundDownload.h
3
- // EkoApp
4
- //
5
- // Created by Elad Gil on 20/11/2017.
6
- // Copyright © 2017 Eko. All rights reserved.
7
- //
8
- //
9
- #import <Foundation/Foundation.h>
10
- #if __has_include(<React/RCTBridgeModule.h>)
11
1
  #import <React/RCTBridgeModule.h>
12
2
  #import <React/RCTEventEmitter.h>
13
- #elif __has_include("RCTBridgeModule.h")
14
- #import "RCTBridgeModule.h"
15
- #import "RCTEventEmitter.h"
16
- #endif
17
3
 
18
4
  typedef void (^CompletionHandler)();
19
5
 
@@ -1,11 +1,3 @@
1
- //
2
- // RNFileBackgroundDownload.m
3
- // EkoApp
4
- //
5
- // Created by Elad Gil on 20/11/2017.
6
- // Copyright © 2017 Eko. All rights reserved.
7
- //
8
- //
9
1
  #import "RNBackgroundDownloader.h"
10
2
  #import "RNBGDTaskConfig.h"
11
3
  #import <MMKV/MMKV.h>
@@ -125,7 +125,7 @@
125
125
  isa = XCBuildConfiguration;
126
126
  buildSettings = {
127
127
  ALWAYS_SEARCH_USER_PATHS = NO;
128
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
128
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
129
129
  CLANG_CXX_LIBRARY = "libc++";
130
130
  CLANG_ENABLE_MODULES = YES;
131
131
  CLANG_ENABLE_OBJC_ARC = YES;
@@ -154,7 +154,7 @@
154
154
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
155
155
  GCC_WARN_UNUSED_FUNCTION = YES;
156
156
  GCC_WARN_UNUSED_VARIABLE = YES;
157
- IPHONEOS_DEPLOYMENT_TARGET = 7.0;
157
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
158
158
  MTL_ENABLE_DEBUG_INFO = YES;
159
159
  ONLY_ACTIVE_ARCH = YES;
160
160
  SDKROOT = iphoneos;
@@ -165,7 +165,7 @@
165
165
  isa = XCBuildConfiguration;
166
166
  buildSettings = {
167
167
  ALWAYS_SEARCH_USER_PATHS = NO;
168
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
168
+ CLANG_CXX_LANGUAGE_STANDARD = "c++20";
169
169
  CLANG_CXX_LIBRARY = "libc++";
170
170
  CLANG_ENABLE_MODULES = YES;
171
171
  CLANG_ENABLE_OBJC_ARC = YES;
@@ -188,7 +188,7 @@
188
188
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
189
189
  GCC_WARN_UNUSED_FUNCTION = YES;
190
190
  GCC_WARN_UNUSED_VARIABLE = YES;
191
- IPHONEOS_DEPLOYMENT_TARGET = 7.0;
191
+ IPHONEOS_DEPLOYMENT_TARGET = 13.4;
192
192
  MTL_ENABLE_DEBUG_INFO = NO;
193
193
  SDKROOT = iphoneos;
194
194
  VALIDATE_PRODUCT = YES;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kesha-antonov/react-native-background-downloader",
3
- "version": "3.1.0",
3
+ "version": "3.1.2-alpha.0",
4
4
  "description": "A library for React-Native to help you download large files on iOS and Android both in the foreground and most importantly in the background.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -15,7 +15,7 @@
15
15
  "homepage": "https://github.com/kesha-antonov/react-native-background-downloader",
16
16
  "license": "Apache-2.0",
17
17
  "author": {
18
- "name": "Eko labs, Kesha Antonov",
18
+ "name": "Kesha Antonov, Eko labs",
19
19
  "email": "innokenty.longway@gmail.com"
20
20
  },
21
21
  "contributors": [
@@ -40,7 +40,7 @@
40
40
  "scripts": {
41
41
  "bump": "npm version patch",
42
42
  "lint": "eslint .",
43
- "_prepublishOnly": "jest && npm run lint",
43
+ "prepublishOnly": "jest && npm run lint",
44
44
  "publish": "npm publish",
45
45
  "test": "jest"
46
46
  },
@@ -52,6 +52,9 @@
52
52
  "setupFiles": [
53
53
  "./__mocks__/RNBackgroundDownloader.js",
54
54
  "./node_modules/react-native/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js"
55
+ ],
56
+ "roots": [
57
+ "./__tests__"
55
58
  ]
56
59
  },
57
60
  "devDependencies": {
@@ -8,7 +8,7 @@ Pod::Spec.new do |s|
8
8
  s.author = package['author']
9
9
  s.homepage = package['repository']['url']
10
10
  s.license = package['license']
11
- s.platform = :ios, '12.4'
11
+ s.platform = :ios, '13.4'
12
12
  s.source = { git: 'https://github.com/kesha-antonov/react-native-background-downloader.git', tag: 'master' }
13
13
  s.source_files = 'ios/**/*.{h,m}'
14
14
  s.requires_arc = true