Skip to content

Commit c4f6a26

Browse files
committed
Always Zip files when exporting to QIF
When having transactions with multiple commodities, a QIF file for each commodity is created. With Android's Storage Access Framework we are limited to one file, so now we always pack QIFs into a single ZIP file. Fixes #696
1 parent 07a1470 commit c4f6a26

2 files changed

Lines changed: 48 additions & 1 deletion

File tree

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

Lines changed: 14 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,20 @@ 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+
return zipQifs(exportedFiles);
236242
} catch (IOException e) {
237243
throw new ExporterException(mExportParams, e);
238244
}
239245
}
240246

247+
@NonNull
248+
private List<String> zipQifs(List<String> exportedFiles) throws IOException {
249+
String zipFileName = getExportCacheFilePath() + ".zip";
250+
FileUtils.zipFiles(exportedFiles, zipFileName);
251+
return Collections.singletonList(zipFileName);
252+
}
253+
241254
/**
242255
* Splits a Qif file into several ones for each currency.
243256
*
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)