diff options
| author | Bananeweizen <Bananeweizen@gmx.de> | 2013-07-31 14:42:11 +0200 |
|---|---|---|
| committer | Bananeweizen <Bananeweizen@gmx.de> | 2013-07-31 14:42:11 +0200 |
| commit | 4a806d990a678e20a09c893f65c8cabff2aefbd5 (patch) | |
| tree | e5532783ad75891bc96c6fad43b922d73c2f7e20 | |
| parent | 4cef30e041e27634f56be70d5694d83663bc1d68 (diff) | |
| download | cgeo-4a806d990a678e20a09c893f65c8cabff2aefbd5.zip cgeo-4a806d990a678e20a09c893f65c8cabff2aefbd5.tar.gz cgeo-4a806d990a678e20a09c893f65c8cabff2aefbd5.tar.bz2 | |
refactoring: move DB backup into new utils class
| -rw-r--r-- | main/src/cgeo/geocaching/MainActivity.java | 7 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 15 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeoapplication.java | 33 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/settings/SettingsActivity.java | 46 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java | 115 |
5 files changed, 132 insertions, 84 deletions
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 2d488d6..a3daf97 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -14,6 +14,7 @@ import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.ui.Formatter; +import cgeo.geocaching.utils.DatabaseBackupUtils; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.ProcessUtils; @@ -462,12 +463,12 @@ public class MainActivity extends AbstractActivity { builder.create().show(); } - void updateCacheCounter() { + public void updateCacheCounter() { (new CountBubbleUpdateThread()).start(); } private void checkRestore() { - if (!cgData.isNewlyCreatedDatebase() || null == cgData.getRestoreFile()) { + if (!cgData.isNewlyCreatedDatebase() || null == DatabaseBackupUtils.getRestoreFile()) { return; } new AlertDialog.Builder(this) @@ -479,7 +480,7 @@ public class MainActivity extends AbstractActivity { public void onClick(final DialogInterface dialog, final int id) { dialog.dismiss(); cgData.resetNewlyCreatedDatabase(); - app.restoreDatabase(MainActivity.this); + DatabaseBackupUtils.restoreDatabase(MainActivity.this); } }) .setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() { diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 87710fb..785af20 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -310,17 +310,17 @@ public class cgData { database = null; } - private static File getBackupFile() { + public static File getBackupFileInternal() { return new File(LocalStorage.getStorage(), "cgeo.sqlite"); } - public static String backupDatabase() { + public static String backupDatabaseInternal() { if (!LocalStorage.isExternalStorageAvailable()) { Log.w("Database wasn't backed up: no external memory"); return null; } - final File target = getBackupFile(); + final File target = getBackupFileInternal(); closeDb(); final boolean backupDone = LocalStorage.copy(databasePath(), target); init(); @@ -370,18 +370,13 @@ public class cgData { return databasePath(Settings.isDbOnSDCard()); } - public static File getRestoreFile() { - final File fileSourceFile = getBackupFile(); - return fileSourceFile.exists() ? fileSourceFile : null; - } - - public static boolean restoreDatabase() { + public static boolean restoreDatabaseInternal() { if (!LocalStorage.isExternalStorageAvailable()) { Log.w("Database wasn't restored: no external memory"); return false; } - final File sourceFile = getBackupFile(); + final File sourceFile = getBackupFileInternal(); closeDb(); final boolean restoreDone = LocalStorage.copy(sourceFile, databasePath()); init(); diff --git a/main/src/cgeo/geocaching/cgeoapplication.java b/main/src/cgeo/geocaching/cgeoapplication.java index fd5f714..700dea8 100644 --- a/main/src/cgeo/geocaching/cgeoapplication.java +++ b/main/src/cgeo/geocaching/cgeoapplication.java @@ -86,39 +86,6 @@ public class cgeoapplication extends Application { } /** - * restore the database in a new thread, showing a progress window - * - * @param fromActivity - * calling activity - */ - public void restoreDatabase(final Activity fromActivity) { - final Resources res = this.getResources(); - final ProgressDialog dialog = ProgressDialog.show(fromActivity, res.getString(R.string.init_backup_restore), res.getString(R.string.init_restore_running), true, false); - final AtomicBoolean atomic = new AtomicBoolean(false); - Thread restoreThread = new Thread() { - final Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - dialog.dismiss(); - boolean restored = atomic.get(); - String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); - ActivityMixin.helpDialog(fromActivity, res.getString(R.string.init_backup_restore), message); - if (fromActivity instanceof MainActivity) { - ((MainActivity) fromActivity).updateCacheCounter(); - } - } - }; - - @Override - public void run() { - atomic.set(cgData.restoreDatabase()); - handler.sendMessage(handler.obtainMessage()); - } - }; - restoreThread.start(); - } - - /** * Register an observer to receive GeoData information. * <br/> * If there is a chance that no observers are registered before this diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index 4e1d4eb..e084d0e 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -3,7 +3,6 @@ package cgeo.geocaching.settings; import cgeo.geocaching.Intents; import cgeo.geocaching.R; import cgeo.geocaching.SelectMapfileActivity; -import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; @@ -13,7 +12,7 @@ import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.files.SimpleDirChooser; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.interfaces.MapSource; -import cgeo.geocaching.ui.Formatter; +import cgeo.geocaching.utils.DatabaseBackupUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.LogTemplateProvider; import cgeo.geocaching.utils.LogTemplateProvider.LogTemplate; @@ -21,7 +20,6 @@ import cgeo.geocaching.utils.LogTemplateProvider.LogTemplate; import org.apache.commons.lang3.StringUtils; import org.openintents.intents.FileManagerIntents; -import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -311,39 +309,13 @@ public class SettingsActivity extends PreferenceActivity { backup.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { - final Context context = preference.getContext(); - // avoid overwriting an existing backup with an empty database - // (can happen directly after reinstalling the app) - if (cgData.getAllCachesCount() == 0) { - ActivityMixin.helpDialog(SettingsActivity.this, - context.getString(R.string.init_backup), - context.getString(R.string.init_backup_unnecessary)); - return false; - } + return DatabaseBackupUtils.createBackup(SettingsActivity.this, new Runnable() { - final ProgressDialog dialog = ProgressDialog.show(context, - context.getString(R.string.init_backup), - context.getString(R.string.init_backup_running), true, false); - new Thread() { @Override public void run() { - final String backupFileName = cgData.backupDatabase(); - runOnUiThread(new Runnable() { - @Override - public void run() { - dialog.dismiss(); - ActivityMixin.helpDialog(SettingsActivity.this, - context.getString(R.string.init_backup_backup), - backupFileName != null - ? context.getString(R.string.init_backup_success) - + "\n" + backupFileName - : context.getString(R.string.init_backup_failed)); - VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), ""); - } - }); + VALUE_CHANGE_LISTENER.onPreferenceChange(SettingsActivity.this.getPreference(R.string.pref_fakekey_preference_backup_info), ""); } - }.start(); - return true; + }); } }); @@ -351,8 +323,7 @@ public class SettingsActivity extends PreferenceActivity { restore.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { - ((cgeoapplication) SettingsActivity.this.getApplication()) - .restoreDatabase(SettingsActivity.this); + DatabaseBackupUtils.restoreDatabase(SettingsActivity.this); return true; } }); @@ -496,11 +467,10 @@ public class SettingsActivity extends PreferenceActivity { ? listPreference.getEntries()[index] : null); } else if (getKey(R.string.pref_fakekey_preference_backup_info).equals(preference.getKey())) { - File lastBackupFile = cgData.getRestoreFile(); - String text; - if (lastBackupFile != null) { + final String text; + if (DatabaseBackupUtils.hasBackup()) { text = preference.getContext().getString(R.string.init_backup_last) + " " - + Formatter.formatShortDateTime(lastBackupFile.lastModified()); + + DatabaseBackupUtils.getBackupDateTime(); } else { text = preference.getContext().getString(R.string.init_backup_last_no); } diff --git a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java new file mode 100644 index 0000000..24f375d --- /dev/null +++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java @@ -0,0 +1,115 @@ +package cgeo.geocaching.utils; + +import cgeo.geocaching.MainActivity; +import cgeo.geocaching.R; +import cgeo.geocaching.cgData; +import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.ui.Formatter; + +import org.apache.commons.lang3.StringUtils; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.res.Resources; +import android.os.Handler; +import android.os.Message; + +import java.io.File; +import java.util.concurrent.atomic.AtomicBoolean; + +public class DatabaseBackupUtils { + + private DatabaseBackupUtils() { + // utility class + } + + /** + * restore the database in a new thread, showing a progress window + * + * @param activity + * calling activity + */ + public static void restoreDatabase(final Activity activity) { + final Resources res = activity.getResources(); + final ProgressDialog dialog = ProgressDialog.show(activity, res.getString(R.string.init_backup_restore), res.getString(R.string.init_restore_running), true, false); + final AtomicBoolean restoreSuccessful = new AtomicBoolean(false); + Thread restoreThread = new Thread() { + final Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + dialog.dismiss(); + boolean restored = restoreSuccessful.get(); + String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); + ActivityMixin.helpDialog(activity, res.getString(R.string.init_backup_restore), message); + if (activity instanceof MainActivity) { + ((MainActivity) activity).updateCacheCounter(); + } + } + }; + + @Override + public void run() { + restoreSuccessful.set(cgData.restoreDatabaseInternal()); + handler.sendMessage(handler.obtainMessage()); + } + }; + restoreThread.start(); + } + + public static boolean createBackup(final Activity activity, final Runnable runAfterwards) { + final Context context = activity; + // avoid overwriting an existing backup with an empty database + // (can happen directly after reinstalling the app) + if (cgData.getAllCachesCount() == 0) { + ActivityMixin.helpDialog(activity, + context.getString(R.string.init_backup), + context.getString(R.string.init_backup_unnecessary)); + return false; + } + + final ProgressDialog dialog = ProgressDialog.show(context, + context.getString(R.string.init_backup), + context.getString(R.string.init_backup_running), true, false); + new Thread() { + @Override + public void run() { + final String backupFileName = cgData.backupDatabaseInternal(); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + dialog.dismiss(); + ActivityMixin.helpDialog(activity, + context.getString(R.string.init_backup_backup), + backupFileName != null + ? context.getString(R.string.init_backup_success) + + "\n" + backupFileName + : context.getString(R.string.init_backup_failed)); + if (runAfterwards != null) { + runAfterwards.run(); + } + } + }); + } + }.start(); + return true; + } + + public static File getRestoreFile() { + final File fileSourceFile = cgData.getBackupFileInternal(); + return fileSourceFile.exists() ? fileSourceFile : null; + } + + public static boolean hasBackup() { + return getRestoreFile() != null; + } + + public static String getBackupDateTime() { + final File restoreFile = getRestoreFile(); + if (restoreFile == null) { + return StringUtils.EMPTY; + } + return Formatter.formatShortDateTime(restoreFile.lastModified()); + } + +} |
