/******************************************************************************* * Copyright (c) 2010 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Denis Solonenko - initial API and implementation ******************************************************************************/ package ru.orangesoftware.financisto2.export; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Environment; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.zip.GZIPOutputStream; import ru.orangesoftware.financisto2.R; import ru.orangesoftware.financisto2.export.drive.GoogleDriveClient; import ru.orangesoftware.financisto2.export.dropbox.Dropbox; import ru.orangesoftware.financisto2.utils.MyPreferences; public abstract class Export { public static final File DEFAULT_EXPORT_PATH = new File(Environment.getExternalStorageDirectory(), "financisto"); public static final String BACKUP_MIME_TYPE = "application/x-gzip"; private final Context context; private final boolean useGzip; protected Export(Context context, boolean useGzip) { this.context = context; this.useGzip = useGzip; } public String export() throws Exception { File path = getBackupFolder(context); String fileName = generateFilename(); File file = new File(path, fileName); FileOutputStream outputStream = new FileOutputStream(file); try { if (useGzip) { export(new GZIPOutputStream(outputStream)); } else { export(outputStream); } } finally { outputStream.flush(); outputStream.close(); } return fileName; } public void export(OutputStream outputStream) throws Exception { generateBackup(outputStream); } public String generateFilename() { SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'_'HHmmss'_'SSS"); return df.format(new Date())+getExtension(); } public byte[] generateBackupBytes() throws Exception { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); OutputStream out = new BufferedOutputStream(new GZIPOutputStream(outputStream)); generateBackup(out); return outputStream.toByteArray(); } private void generateBackup(OutputStream outputStream) throws Exception { OutputStreamWriter osw = new OutputStreamWriter(outputStream, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw, 65536); try { writeHeader(bw); writeBody(bw); writeFooter(bw); } finally { bw.close(); } } protected abstract void writeHeader(BufferedWriter bw) throws IOException, NameNotFoundException; protected abstract void writeBody(BufferedWriter bw) throws IOException; protected abstract void writeFooter(BufferedWriter bw) throws IOException; protected abstract String getExtension(); public static File getBackupFolder(Context context) { String path = MyPreferences.getDatabaseBackupFolder(context); File file = new File(path); file.mkdirs(); if (file.isDirectory() && file.canWrite()) { return file; } file = Export.DEFAULT_EXPORT_PATH; file.mkdirs(); return file; } public static File getBackupFile(Context context, String backupFileName) { File path = getBackupFolder(context); return new File(path, backupFileName); } public static void uploadBackupFileToDropbox(Context context, String backupFileName) throws Exception { File file = getBackupFile(context, backupFileName); Dropbox dropbox = new Dropbox(context); dropbox.uploadFile(file); } }