diff options
| -rw-r--r-- | main/src/cgeo/geocaching/CgeoApplication.java | 33 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/DataStore.java | 71 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/settings/SettingsActivity.java | 5 |
3 files changed, 50 insertions, 59 deletions
diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index bb74b52..ef224ff 100644 --- a/main/src/cgeo/geocaching/CgeoApplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -3,19 +3,13 @@ package cgeo.geocaching; import cgeo.geocaching.sensors.DirectionProvider; import cgeo.geocaching.sensors.GeoDataProvider; import cgeo.geocaching.sensors.IGeoData; -import cgeo.geocaching.ui.dialog.Dialogs; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.tuple.ImmutablePair; import rx.Observable; import rx.functions.Func2; -import android.app.Activity; import android.app.Application; -import android.app.ProgressDialog; -import android.content.res.Resources; - -import java.util.concurrent.atomic.AtomicBoolean; public class CgeoApplication extends Application { @@ -43,33 +37,6 @@ public class CgeoApplication extends Application { DataStore.removeAllFromCache(); } - /** - * Move the database to/from external cgdata in a new thread, - * showing a progress window - * - * @param fromActivity - */ - public void moveDatabase(final Activity fromActivity) { - final Resources res = this.getResources(); - final ProgressDialog dialog = ProgressDialog.show(fromActivity, res.getString(R.string.init_dbmove_dbmove), res.getString(R.string.init_dbmove_running), true, false); - final AtomicBoolean atomic = new AtomicBoolean(false); - new Thread() { - @Override - public void run() { - atomic.set(DataStore.moveDatabase()); - fromActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - dialog.dismiss(); - boolean success = atomic.get(); - String message = success ? res.getString(R.string.init_dbmove_success) : res.getString(R.string.init_dbmove_failed); - Dialogs.message(fromActivity, R.string.init_dbmove_dbmove, message); - } - }); - } - }.start(); - } - public synchronized Observable<ImmutablePair<IGeoData, Float>> geoDirObservable() { if (geoDir == null) { geoDir = Observable.combineLatest(GeoDataProvider.create(this), DirectionProvider.create(this), new Func2<IGeoData, Float, ImmutablePair<IGeoData, Float>>() { diff --git a/main/src/cgeo/geocaching/DataStore.java b/main/src/cgeo/geocaching/DataStore.java index e219e1b..0585923 100644 --- a/main/src/cgeo/geocaching/DataStore.java +++ b/main/src/cgeo/geocaching/DataStore.java @@ -17,6 +17,7 @@ import cgeo.geocaching.list.AbstractList; import cgeo.geocaching.list.PseudoList; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.ui.dialog.Dialogs; import cgeo.geocaching.utils.FileUtils; import cgeo.geocaching.utils.Log; @@ -24,8 +25,15 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; +import rx.android.observables.AndroidObservable; +import rx.functions.Action1; +import rx.functions.Func0; import rx.functions.Func1; +import rx.schedulers.Schedulers; +import rx.util.async.Async; +import android.app.Activity; +import android.app.ProgressDialog; import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; @@ -377,30 +385,47 @@ public class DataStore { return target.getPath(); } - public static boolean moveDatabase() { - if (!LocalStorage.isExternalStorageAvailable()) { - Log.w("Database was not moved: external memory not available"); - return false; - } - - closeDb(); - - final File source = databasePath(); - final File target = databaseAlternatePath(); - - if (!LocalStorage.copy(source, target)) { - Log.e("Database could not be moved to " + target); - init(); - return false; - } + /** + * Move the database to/from external cgdata in a new thread, + * showing a progress window + * + * @param fromActivity + */ + public static void moveDatabase(final Activity fromActivity) { + final ProgressDialog dialog = ProgressDialog.show(fromActivity, fromActivity.getString(R.string.init_dbmove_dbmove), fromActivity.getString(R.string.init_dbmove_running), true, false); + AndroidObservable.fromActivity(fromActivity, Async.fromFunc0(new Func0<Boolean>() { + @Override + public Boolean call() { + if (!LocalStorage.isExternalStorageAvailable()) { + Log.w("Database was not moved: external memory not available"); + return false; + } + closeDb(); + + final File source = databasePath(); + final File target = databaseAlternatePath(); + if (!LocalStorage.copy(source, target)) { + Log.e("Database could not be moved to " + target); + init(); + return false; + } + if (!FileUtils.delete(source)) { + Log.e("Original database could not be deleted during move"); + } + Settings.setDbOnSDCard(!Settings.isDbOnSDCard()); + Log.i("Database was moved to " + target); - if (!FileUtils.delete(source)) { - Log.e("Original database could not be deleted during move"); - } - Settings.setDbOnSDCard(!Settings.isDbOnSDCard()); - Log.i("Database was moved to " + target); - init(); - return true; + init(); + return true; + } + })).subscribeOn(Schedulers.io()).subscribe(new Action1<Boolean>() { + @Override + public void call(final Boolean success) { + dialog.dismiss(); + final String message = success ? fromActivity.getString(R.string.init_dbmove_success) : fromActivity.getString(R.string.init_dbmove_failed); + Dialogs.message(fromActivity, R.string.init_dbmove_dbmove, message); + } + }); } private static File databasePath(final boolean internal) { diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index bcf6715..76f48e2 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -351,9 +351,8 @@ public class SettingsActivity extends PreferenceActivity { p.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(final Preference preference) { - boolean oldValue = Settings.isDbOnSDCard(); - ((CgeoApplication) SettingsActivity.this.getApplication()) - .moveDatabase(SettingsActivity.this); + final boolean oldValue = Settings.isDbOnSDCard(); + DataStore.moveDatabase(SettingsActivity.this); return oldValue != Settings.isDbOnSDCard(); } }); |
