diff --git a/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java b/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java index 4e1c796ea..2ba025467 100644 --- a/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java +++ b/app/src/main/java/org/gnucash/android/export/qif/QifExporter.java @@ -19,12 +19,14 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; import org.gnucash.android.db.adapter.AccountsDbAdapter; import org.gnucash.android.db.adapter.TransactionsDbAdapter; import org.gnucash.android.export.ExportParams; import org.gnucash.android.export.Exporter; import org.gnucash.android.model.Commodity; +import org.gnucash.android.util.FileUtils; import org.gnucash.android.util.PreferencesHelper; import org.gnucash.android.util.TimestampHelper; @@ -38,6 +40,7 @@ import java.io.OutputStreamWriter; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; @@ -52,6 +55,8 @@ * @author Yongxin Wang */ public class QifExporter extends Exporter{ + private static final String TAG = "QifExporter"; + /** * Initialize the exporter * @param params Export options @@ -232,12 +237,20 @@ public List generateExport() throws ExporterException { /// export successful PreferencesHelper.setLastExportTime(TimestampHelper.getTimestampFromNow()); - return splitQIF(file); + List exportedFiles = splitQIF(file); + return zipQifs(exportedFiles); } catch (IOException e) { throw new ExporterException(mExportParams, e); } } + @NonNull + private List zipQifs(List exportedFiles) throws IOException { + String zipFileName = getExportCacheFilePath() + ".zip"; + FileUtils.zipFiles(exportedFiles, zipFileName); + return Collections.singletonList(zipFileName); + } + /** * Splits a Qif file into several ones for each currency. * diff --git a/app/src/main/java/org/gnucash/android/util/FileUtils.java b/app/src/main/java/org/gnucash/android/util/FileUtils.java new file mode 100644 index 000000000..de6f382ee --- /dev/null +++ b/app/src/main/java/org/gnucash/android/util/FileUtils.java @@ -0,0 +1,34 @@ +package org.gnucash.android.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * Misc methods for dealing with files. + */ +public final class FileUtils { + public static void zipFiles(List files, String zipFileName) throws IOException { + OutputStream outputStream = new FileOutputStream(zipFileName); + ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); + byte[] buffer = new byte[1024]; + for (String fileName : files) { + File file = new File(fileName); + FileInputStream fileInputStream = new FileInputStream(file); + zipOutputStream.putNextEntry(new ZipEntry(file.getName())); + + int length; + while ((length = fileInputStream.read(buffer)) > 0) { + zipOutputStream.write(buffer, 0, length); + } + zipOutputStream.closeEntry(); + fileInputStream.close(); + } + zipOutputStream.close(); + } +}