Skip to content

Commit 011440c

Browse files
authored
Merge pull request #714 from rivaldi8/bug-696-zip-qif
Zip multiple exported QIF files into one for all export destinations - fixes #696
2 parents 07a1470 + fad4aaa commit 011440c

3 files changed

Lines changed: 54 additions & 19 deletions

File tree

app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -283,25 +283,10 @@ private void moveExportToUri() throws Exporter.ExporterException {
283283
if (mExportedFiles.size() > 0){
284284
try {
285285
OutputStream outputStream = mContext.getContentResolver().openOutputStream(exportUri);
286-
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
287-
byte[] buffer = new byte[1024];
288-
for (String exportedFile : mExportedFiles) {
289-
File file = new File(exportedFile);
290-
FileInputStream fileInputStream = new FileInputStream(file);
291-
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
292-
293-
int length;
294-
while ((length = fileInputStream.read(buffer)) > 0) {
295-
zipOutputStream.write(buffer, 0, length);
296-
}
297-
zipOutputStream.closeEntry();
298-
fileInputStream.close();
299-
}
300-
zipOutputStream.close();
286+
// Now we always get just one file exported (QIFs are zipped)
287+
moveFile(mExportedFiles.get(0), outputStream);
301288
} catch (IOException ex) {
302-
Log.e(TAG, "Error when zipping QIF files for export");
303-
ex.printStackTrace();
304-
Crashlytics.logException(ex);
289+
throw new Exporter.ExporterException(mExportParams, "Error when moving file to URI");
305290
}
306291
}
307292
}

app/src/main/java/org/gnucash/android/export/qif/QifExporter.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import android.content.ContentValues;
2020
import android.database.Cursor;
2121
import android.database.sqlite.SQLiteDatabase;
22+
import android.support.annotation.NonNull;
2223

2324
import org.gnucash.android.db.adapter.AccountsDbAdapter;
2425
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
2526
import org.gnucash.android.export.ExportParams;
2627
import org.gnucash.android.export.Exporter;
2728
import org.gnucash.android.model.Commodity;
29+
import org.gnucash.android.util.FileUtils;
2830
import org.gnucash.android.util.PreferencesHelper;
2931
import org.gnucash.android.util.TimestampHelper;
3032

@@ -38,6 +40,7 @@
3840
import java.io.OutputStreamWriter;
3941
import java.math.BigDecimal;
4042
import java.util.ArrayList;
43+
import java.util.Collections;
4144
import java.util.List;
4245
import java.util.Locale;
4346

@@ -52,6 +55,8 @@
5255
* @author Yongxin Wang <fefe.wyx@gmail.com>
5356
*/
5457
public class QifExporter extends Exporter{
58+
private static final String TAG = "QifExporter";
59+
5560
/**
5661
* Initialize the exporter
5762
* @param params Export options
@@ -232,12 +237,23 @@ public List<String> generateExport() throws ExporterException {
232237

233238
/// export successful
234239
PreferencesHelper.setLastExportTime(TimestampHelper.getTimestampFromNow());
235-
return splitQIF(file);
240+
List<String> exportedFiles = splitQIF(file);
241+
if (exportedFiles.isEmpty())
242+
return Collections.emptyList();
243+
else
244+
return zipQifs(exportedFiles);
236245
} catch (IOException e) {
237246
throw new ExporterException(mExportParams, e);
238247
}
239248
}
240249

250+
@NonNull
251+
private List<String> zipQifs(List<String> exportedFiles) throws IOException {
252+
String zipFileName = getExportCacheFilePath() + ".zip";
253+
FileUtils.zipFiles(exportedFiles, zipFileName);
254+
return Collections.singletonList(zipFileName);
255+
}
256+
241257
/**
242258
* Splits a Qif file into several ones for each currency.
243259
*
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.gnucash.android.util;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileOutputStream;
6+
import java.io.IOException;
7+
import java.io.OutputStream;
8+
import java.util.List;
9+
import java.util.zip.ZipEntry;
10+
import java.util.zip.ZipOutputStream;
11+
12+
/**
13+
* Misc methods for dealing with files.
14+
*/
15+
public final class FileUtils {
16+
public static void zipFiles(List<String> files, String zipFileName) throws IOException {
17+
OutputStream outputStream = new FileOutputStream(zipFileName);
18+
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
19+
byte[] buffer = new byte[1024];
20+
for (String fileName : files) {
21+
File file = new File(fileName);
22+
FileInputStream fileInputStream = new FileInputStream(file);
23+
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
24+
25+
int length;
26+
while ((length = fileInputStream.read(buffer)) > 0) {
27+
zipOutputStream.write(buffer, 0, length);
28+
}
29+
zipOutputStream.closeEntry();
30+
fileInputStream.close();
31+
}
32+
zipOutputStream.close();
33+
}
34+
}

0 commit comments

Comments
 (0)