Skip to content

Commit

Permalink
Move all backup-related code to the new BackupManager class
Browse files Browse the repository at this point in the history
  • Loading branch information
rivaldi8 committed Jan 21, 2018
2 parents b657141 + 366f1a4 commit 96a5bab
Show file tree
Hide file tree
Showing 13 changed files with 264 additions and 156 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import org.gnucash.android.ui.account.AccountsListFragment;
import org.gnucash.android.ui.settings.BackupPreferenceFragment;
import org.gnucash.android.ui.transaction.TransactionsActivity;
import org.gnucash.android.util.BackupManager;

import java.io.File;
import java.io.FileInputStream;
Expand Down Expand Up @@ -453,7 +454,7 @@ private String stripPathPart(String fullPathName) {
*/
private void backupAndDeleteTransactions(){
Log.i(TAG, "Backup and deleting transactions after export");
GncXmlExporter.createBackup(); //create backup before deleting everything
BackupManager.backupActiveBook(); //create backup before deleting everything
List<Transaction> openingBalances = new ArrayList<>();
boolean preserveOpeningBalances = GnuCashApplication.shouldSaveOpeningBalances(false);

Expand Down
14 changes: 0 additions & 14 deletions app/src/main/java/org/gnucash/android/export/Exporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -237,20 +237,6 @@ public static String getExportFolderPath(String bookUID){
return path;
}

/**
* Returns the path to the backups folder for the book with GUID {@code bookUID}
* Each book has its own backup path
*
* @return Absolute path to backup folder for the book
*/
public static String getBackupFolderPath(String bookUID){
String path = BASE_FOLDER_PATH + "/" + bookUID + "/backups/";
File file = new File(path);
if (!file.exists())
file.mkdirs();
return path;
}


/**
* Returns the MIME type for this exporter.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -908,55 +908,4 @@ public String getExportMimeType(){
return "text/xml";
}

/**
* Creates a backup of current database contents to the directory {@link Exporter#getBackupFolderPath(String)}
* @return {@code true} if backup was successful, {@code false} otherwise
*/
public static boolean createBackup(){
return createBackup(BooksDbAdapter.getInstance().getActiveBookUID());
}

/**
* Create a backup of the book in the default backup location
* @param bookUID Unique ID of the book
* @return {@code true} if backup was successful, {@code false} otherwise
*/
public static boolean createBackup(String bookUID){
OutputStream outputStream;
try {
String backupFile = BookUtils.getBookBackupFileUri(bookUID);
if (backupFile != null){
outputStream = GnuCashApplication.getAppContext().getContentResolver().openOutputStream(Uri.parse(backupFile));
} else { //no Uri set by user, use default location on SD card
backupFile = getBackupFilePath(bookUID);
outputStream = new FileOutputStream(backupFile);
}

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(bufferedOutputStream);
OutputStreamWriter writer = new OutputStreamWriter(gzipOutputStream);

ExportParams params = new ExportParams(ExportFormat.XML);
new GncXmlExporter(params).generateExport(writer);
writer.close();
return true;
} catch (IOException | ExporterException e) {
Crashlytics.logException(e);
Log.e("GncXmlExporter", "Error creating XML backup", e);
return false;
}
}

/**
* Returns the full path of a file to make database backup of the specified book.
* Backups are done in XML format and are Gzipped (with ".gnca" extension).
* @param bookUID GUID of the book
* @return the file path for backups of the database.
* @see #getBackupFolderPath(String)
*/
private static String getBackupFilePath(String bookUID){
Book book = BooksDbAdapter.getInstance().getRecord(bookUID);
return Exporter.getBackupFolderPath(book.getUID())
+ buildExportFilename(ExportFormat.XML, book.getDisplayName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@

import android.app.IntentService;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.PowerManager;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
Expand All @@ -38,23 +36,17 @@
import org.gnucash.android.db.adapter.SplitsDbAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.export.ExportAsyncTask;
import org.gnucash.android.export.ExportFormat;
import org.gnucash.android.export.ExportParams;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.model.Book;
import org.gnucash.android.model.ScheduledAction;
import org.gnucash.android.model.Transaction;
import org.gnucash.android.util.BookUtils;
import org.gnucash.android.util.BackupManager;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.zip.GZIPOutputStream;

/**
* Service for running scheduled events.
Expand All @@ -79,7 +71,7 @@ protected void onHandleIntent(Intent intent) {
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG);
wakeLock.acquire();

autoBackup(); //First run automatic backup of all books before doing anything else
BackupManager.backupAllBooks(); //First run automatic backup of all books before doing anything else
try {
BooksDbAdapter booksDbAdapter = BooksDbAdapter.getInstance();
List<Book> books = booksDbAdapter.getAllRecords();
Expand Down Expand Up @@ -261,34 +253,4 @@ private static int executeTransactions(ScheduledAction scheduledAction, SQLiteDa
scheduledAction.setExecutionCount(previousExecutionCount);
return executionCount;
}

/**
* Perform an automatic backup of all books in the database.
* This method is run everytime the service is executed
*/
private static void autoBackup(){
BooksDbAdapter booksDbAdapter = BooksDbAdapter.getInstance();
List<String> bookUIDs = booksDbAdapter.getAllBookUIDs();
Context context = GnuCashApplication.getAppContext();

for (String bookUID : bookUIDs) {
String backupFile = BookUtils.getBookBackupFileUri(bookUID);
if (backupFile == null){
GncXmlExporter.createBackup(bookUID);
continue;
}

try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(context.getContentResolver().openOutputStream(Uri.parse(backupFile)))){
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(bufferedOutputStream);
OutputStreamWriter writer = new OutputStreamWriter(gzipOutputStream);
ExportParams params = new ExportParams(ExportFormat.XML);
new GncXmlExporter(params).generateExport(writer);
writer.close();
} catch (IOException ex) {
Log.e(LOG_TAG, "Auto backup failed for book " + bookUID);
ex.printStackTrace();
Crashlytics.logException(ex);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

package org.gnucash.android.ui.account;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
Expand All @@ -28,15 +26,12 @@
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
Expand All @@ -62,7 +57,6 @@
import org.gnucash.android.db.DatabaseSchema;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.importer.ImportAsyncTask;
import org.gnucash.android.ui.common.BaseDrawerActivity;
import org.gnucash.android.ui.common.FormActivity;
Expand All @@ -71,6 +65,7 @@
import org.gnucash.android.ui.transaction.TransactionsActivity;
import org.gnucash.android.ui.util.TaskDelegate;
import org.gnucash.android.ui.wizard.FirstRunWizardActivity;
import org.gnucash.android.util.BackupManager;

import butterknife.BindView;

Expand Down Expand Up @@ -292,7 +287,7 @@ private void handleOpenFileIntent(Intent intent) {
//when someone launches the app to view a (.gnucash or .gnca) file
Uri data = intent.getData();
if (data != null){
GncXmlExporter.createBackup();
BackupManager.backupActiveBook();
intent.setData(null);
new ImportAsyncTask(this).execute(data);
removeFirstRunFlag();
Expand Down Expand Up @@ -504,7 +499,7 @@ public static void startXmlFileChooser(Fragment fragment) {
* @param onFinishTask Task to be executed when import is complete
*/
public static void importXmlFileFromIntent(Activity context, Intent data, TaskDelegate onFinishTask) {
GncXmlExporter.createBackup();
BackupManager.backupActiveBook();
new ImportAsyncTask(context, onFinishTask).execute(data.getData());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,9 @@
import org.gnucash.android.app.GnuCashApplication;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.export.Exporter;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.importer.ImportAsyncTask;
import org.gnucash.android.ui.settings.dialog.OwnCloudDialogFragment;
import org.gnucash.android.util.BookUtils;
import org.gnucash.android.util.BackupManager;

import java.io.File;
import java.text.DateFormat;
Expand Down Expand Up @@ -151,7 +150,7 @@ public void onResume() {

pref = findPreference(getString(R.string.key_backup_location));
pref.setOnPreferenceClickListener(this);
String defaultBackupLocation = BookUtils.getBookBackupFileUri(BooksDbAdapter.getInstance().getActiveBookUID());
String defaultBackupLocation = BackupManager.getBookBackupFileUri(BooksDbAdapter.getInstance().getActiveBookUID());
if (defaultBackupLocation != null){
pref.setSummary(Uri.parse(defaultBackupLocation).getAuthority());
}
Expand Down Expand Up @@ -193,7 +192,7 @@ public boolean onPreferenceClick(Preference preference) {
}

if (key.equals(getString(R.string.key_create_backup))){
boolean result = GncXmlExporter.createBackup();
boolean result = BackupManager.backupActiveBook();
int msg = result ? R.string.toast_backup_successful : R.string.toast_backup_failed;
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
Expand Down Expand Up @@ -369,9 +368,9 @@ public void onConnectionFailed(ConnectionResult connectionResult) {
*/
private void restoreBackup() {
Log.i("Settings", "Opening GnuCash XML backups for restore");
String bookUID = BooksDbAdapter.getInstance().getActiveBookUID();
final String bookUID = BooksDbAdapter.getInstance().getActiveBookUID();

final String defaultBackupFile = BookUtils.getBookBackupFileUri(bookUID);
final String defaultBackupFile = BackupManager.getBookBackupFileUri(bookUID);
if (defaultBackupFile != null){
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(getActivity())
.setTitle(R.string.title_confirm_restore_backup)
Expand All @@ -393,8 +392,7 @@ public void onClick(DialogInterface dialogInterface, int i) {
}

//If no default location was set, look in the internal SD card location
File[] backupFiles = new File(Exporter.getBackupFolderPath(bookUID)).listFiles();
if (backupFiles == null || backupFiles.length == 0){
if (BackupManager.getBackupList(bookUID).isEmpty()){
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(getActivity())
.setTitle(R.string.title_no_backups_found)
.setMessage(R.string.msg_no_backups_to_restore_from)
Expand All @@ -408,14 +406,10 @@ public void onClick(DialogInterface dialog, int which) {
return;
}

Arrays.sort(backupFiles);
List<File> backupFilesList = Arrays.asList(backupFiles);
Collections.reverse(backupFilesList);
final File[] sortedBackupFiles = (File[]) backupFilesList.toArray();

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.select_dialog_singlechoice);
final DateFormat dateFormatter = SimpleDateFormat.getDateTimeInstance();
for (File backupFile : sortedBackupFiles) {
for (File backupFile : BackupManager.getBackupList(bookUID)) {
long time = Exporter.getExportTime(backupFile.getName());
if (time > 0)
arrayAdapter.add(dateFormatter.format(new Date(time)));
Expand All @@ -435,7 +429,7 @@ public void onClick(DialogInterface dialog, int which) {
restoreDialogBuilder.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
File backupFile = sortedBackupFiles[which];
File backupFile = BackupManager.getBackupList(bookUID).get(which);
new ImportAsyncTask(getActivity()).execute(Uri.fromFile(backupFile));
}
});
Expand Down Expand Up @@ -477,7 +471,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {

PreferenceActivity.getActiveBookSharedPreferences()
.edit()
.putString(BookUtils.KEY_BACKUP_FILE, backupFileUri.toString())
.putString(BackupManager.KEY_BACKUP_FILE, backupFileUri.toString())
.apply();

Preference pref = findPreference(getString(R.string.key_backup_location));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

import org.gnucash.android.R;
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.ui.homescreen.WidgetConfigurationActivity;
import org.gnucash.android.util.BackupManager;

/**
* Confirmation dialog for deleting all accounts from the system.
Expand All @@ -49,7 +49,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Context context = getDialog().getContext();
GncXmlExporter.createBackup();
BackupManager.backupActiveBook();
AccountsDbAdapter.getInstance().deleteAllRecords();
Toast.makeText(context, R.string.toast_all_accounts_deleted, Toast.LENGTH_SHORT).show();
WidgetConfigurationActivity.updateAllWidgets(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.DatabaseAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.model.Transaction;
import org.gnucash.android.ui.homescreen.WidgetConfigurationActivity;
import org.gnucash.android.util.BackupManager;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -57,7 +57,7 @@ public static DeleteAllTransactionsConfirmationDialog newInstance() {
.setPositiveButton(R.string.alert_dialog_ok_delete,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
GncXmlExporter.createBackup();
BackupManager.backupActiveBook();

Context context = getActivity();
AccountsDbAdapter accountsDbAdapter = AccountsDbAdapter.getInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
import org.gnucash.android.db.adapter.AccountsDbAdapter;
import org.gnucash.android.db.adapter.DatabaseAdapter;
import org.gnucash.android.db.adapter.TransactionsDbAdapter;
import org.gnucash.android.export.xml.GncXmlExporter;
import org.gnucash.android.model.Transaction;
import org.gnucash.android.ui.common.Refreshable;
import org.gnucash.android.ui.common.UxArgument;
import org.gnucash.android.ui.homescreen.WidgetConfigurationActivity;
import org.gnucash.android.util.BackupManager;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -65,7 +65,7 @@ public static TransactionsDeleteConfirmationDialogFragment newInstance(int title
public void onClick(DialogInterface dialog, int whichButton) {
TransactionsDbAdapter transactionsDbAdapter = TransactionsDbAdapter.getInstance();
if (rowId == 0) {
GncXmlExporter.createBackup(); //create backup before deleting everything
BackupManager.backupActiveBook(); //create backup before deleting everything
List<Transaction> openingBalances = new ArrayList<Transaction>();
boolean preserveOpeningBalances = GnuCashApplication.shouldSaveOpeningBalances(false);
if (preserveOpeningBalances) {
Expand Down
Loading

0 comments on commit 96a5bab

Please sign in to comment.