1010import com .facebook .react .bridge .ReactContextBaseJavaModule ;
1111import com .facebook .react .bridge .ReactMethod ;
1212import com .facebook .react .bridge .WritableMap ;
13+ import com .facebook .react .bridge .ReadableArray ;
1314import com .facebook .react .modules .core .DeviceEventManagerModule ;
1415
1516import java .io .BufferedInputStream ;
@@ -324,23 +325,33 @@ public void onCopyProgress(long bytesRead) {
324325 }
325326
326327 @ ReactMethod
327- public void zip (String fileOrDirectory , String destDirectory , Promise promise ) {
328- try {
329-
330- ZipParameters parameters = new ZipParameters ();
331- parameters .setCompressionMethod (Zip4jConstants .COMP_DEFLATE );
332- parameters .setCompressionLevel (Zip4jConstants .DEFLATE_LEVEL_NORMAL );
328+ public void zipFiles (final ReadableArray files , final String destDirectory , final Promise promise ) {
329+ zip (files .toArrayList (), destDirectory , promise );
330+ }
333331
334- processZip (fileOrDirectory , destDirectory , parameters , promise );
332+ @ ReactMethod
333+ public void zipFolder (final String folder , final String destFile , final Promise promise ) {
334+ ArrayList <Object > folderAsArrayList = new ArrayList <>();
335+ folderAsArrayList .add (folder );
336+ zip (folderAsArrayList , destFile , promise );
337+ }
335338
336- } catch ( Exception ex ) {
337- promise . reject ( null , ex . getMessage ());
338- return ;
339- }
339+ @ ReactMethod
340+ public void zipFilesWithPassword ( final ReadableArray files , final String destFile , final String password ,
341+ String encryptionMethod , Promise promise ) {
342+ zipWithPassword ( files . toArrayList (), destFile , password , encryptionMethod , promise );
340343 }
341344
345+
342346 @ ReactMethod
343- public void zipWithPassword (String fileOrDirectory , String destDirectory , String password ,
347+ public void zipFolderWithPassword (final String folder , final String destFile , final String password ,
348+ String encryptionMethod , Promise promise ) {
349+ ArrayList <Object > folderAsArrayList = new ArrayList <>();
350+ folderAsArrayList .add (folder );
351+ zipWithPassword (folderAsArrayList , destFile , password , encryptionMethod , promise );
352+ }
353+
354+ private void zipWithPassword (final ArrayList <Object > filesOrDirectory , final String destFile , final String password ,
344355 String encryptionMethod , Promise promise ) {
345356 try {
346357
@@ -373,7 +384,7 @@ public void zipWithPassword(String fileOrDirectory, String destDirectory, String
373384 promise .reject (null , "Password is empty" );
374385 }
375386
376- processZip (fileOrDirectory , destDirectory , parameters , promise );
387+ processZip (filesOrDirectory , destFile , parameters , promise );
377388
378389 } catch (Exception ex ) {
379390 promise .reject (null , ex .getMessage ());
@@ -382,51 +393,67 @@ public void zipWithPassword(String fileOrDirectory, String destDirectory, String
382393
383394 }
384395
385- private void processZip (final String fileOrDirectory , final String destDirectory , final ZipParameters parameters , final Promise promise ) {
396+ private void zip (final ArrayList <Object > filesOrDirectory , final String destFile , final Promise promise ) {
397+ try {
398+
399+ ZipParameters parameters = new ZipParameters ();
400+ parameters .setCompressionMethod (Zip4jConstants .COMP_DEFLATE );
401+ parameters .setCompressionLevel (Zip4jConstants .DEFLATE_LEVEL_NORMAL );
402+
403+ processZip (filesOrDirectory , destFile , parameters , promise );
404+
405+ } catch (Exception ex ) {
406+ promise .reject (null , ex .getMessage ());
407+ return ;
408+ }
409+ }
410+
411+ private void processZip (final ArrayList <Object > entries , final String destFile , final ZipParameters parameters , final Promise promise ) {
386412 new Thread (new Runnable () {
387413 @ Override
388414 public void run () {
389415 try {
390- net .lingala .zip4j .core .ZipFile zipFile = new net .lingala .zip4j .core .ZipFile (destDirectory );
391-
392- updateProgress (0 , 100 , destDirectory );
416+ net .lingala .zip4j .core .ZipFile zipFile = new net .lingala .zip4j .core .ZipFile (destFile );
393417
394- File f = new File ( fileOrDirectory );
418+ updateProgress ( 0 , 100 , destFile );
395419
396420 int totalFiles = 0 ;
397421 int fileCounter = 0 ;
398422
399- if ( f . exists () ) {
400- if ( f . isDirectory ()) {
423+ for ( int i = 0 ; i < entries . size (); i ++ ) {
424+ File f = new File ( entries . get ( i ). toString ());
401425
402- List <File > files = Arrays .asList (f .listFiles ());
426+ if (f .exists ()) {
427+ if (f .isDirectory ()) {
403428
404- totalFiles = files .size ();
405- for (int i = 0 ; i < files .size (); i ++) {
406- if (files .get (i ).isDirectory ()) {
407- zipFile .addFolder (files .get (i ).getAbsolutePath (), parameters );
408- }
409- else {
410- zipFile .addFile (files .get (i ), parameters );
429+ List <File > files = Arrays .asList (f .listFiles ());
430+
431+ totalFiles += files .size ();
432+ for (int j = 0 ; j < files .size (); j ++) {
433+ if (files .get (j ).isDirectory ()) {
434+ zipFile .addFolder (files .get (j ).getAbsolutePath (), parameters );
435+ }
436+ else {
437+ zipFile .addFile (files .get (j ), parameters );
438+ }
439+ fileCounter += 1 ;
440+ updateProgress (fileCounter , totalFiles , destFile );
411441 }
442+
443+ } else {
444+ totalFiles += 1 ;
445+ zipFile .addFile (f , parameters );
412446 fileCounter += 1 ;
413- updateProgress (fileCounter , totalFiles , destDirectory );
447+ updateProgress (fileCounter , totalFiles , destFile );
414448 }
415-
416- } else {
417- totalFiles = 1 ;
418- zipFile .addFile (f , parameters );
419- fileCounter += 1 ;
420- updateProgress (fileCounter , totalFiles , destDirectory );
421449 }
422- }
423- else {
424- promise .reject (null , "File or folder does not exist" );
425- }
426-
427- updateProgress (1 , 1 , destDirectory ); // force 100%
428- promise .resolve (destDirectory );
450+ else {
451+ promise .reject (null , "File or folder does not exist" );
452+ }
429453
454+ updateProgress (1 , 1 , destFile ); // force 100%
455+ promise .resolve (destFile );
456+ }
430457 } catch (Exception ex ) {
431458 promise .reject (null , ex .getMessage ());
432459 return ;
0 commit comments