aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBananeweizen <Bananeweizen@gmx.de>2013-07-31 14:42:11 +0200
committerBananeweizen <Bananeweizen@gmx.de>2013-07-31 14:42:11 +0200
commit4a806d990a678e20a09c893f65c8cabff2aefbd5 (patch)
treee5532783ad75891bc96c6fad43b922d73c2f7e20
parent4cef30e041e27634f56be70d5694d83663bc1d68 (diff)
downloadcgeo-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.java7
-rw-r--r--main/src/cgeo/geocaching/cgData.java15
-rw-r--r--main/src/cgeo/geocaching/cgeoapplication.java33
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java46
-rw-r--r--main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java115
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());
+ }
+
+}