diff options
Diffstat (limited to 'main/src/cgeo/geocaching')
4 files changed, 81 insertions, 57 deletions
diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java index d735a60..e75d6b1 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -19,14 +19,17 @@ import cgeo.geocaching.ui.dialog.CoordinatesInputDialog; import cgeo.geocaching.ui.dialog.Dialogs; import cgeo.geocaching.utils.Formatter; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RxUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.Nullable; +import rx.functions.Action0; +import rx.schedulers.Schedulers; + import android.app.Activity; import android.content.Context; import android.content.res.Configuration; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.view.MenuItemCompat; import android.view.ContextMenu; @@ -385,22 +388,20 @@ public class NavigateAnyPointActivity extends AbstractActionBarActivity implemen if (!getHistoryOfSearchedLocations().contains(loc)) { getHistoryOfSearchedLocations().add(0, loc); - - new AsyncTask<Void, Void, Void>() { + RxUtils.andThenOnUi(Schedulers.io(), new Action0() { @Override - protected Void doInBackground(final Void... params) { + public void call() { // Save location DataStore.saveSearchedDestination(loc); - return null; } - + }, new Action0() { @Override - protected void onPostExecute(final Void v) { + public void call() { // Ensure to remove the footer historyListView.removeFooterView(getEmptyHistoryFooter()); destinationHistoryAdapter.notifyDataSetChanged(); } - }.execute(); + }); } } diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index 6354278..b6b681d 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -15,10 +15,14 @@ import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.utils.DatabaseBackupUtils; import cgeo.geocaching.utils.DebugUtils; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RxUtils; import org.apache.commons.lang3.StringUtils; import org.openintents.intents.FileManagerIntents; +import rx.functions.Action0; +import rx.schedulers.Schedulers; + import android.app.ProgressDialog; import android.app.backup.BackupManager; import android.content.ActivityNotFoundException; @@ -296,7 +300,7 @@ public class SettingsActivity extends PreferenceActivity { dirChooser.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, getString(android.R.string.ok)); startActivityForResult(dirChooser, dct.requestCode); - } catch (final android.content.ActivityNotFoundException ignored) { + } catch (final ActivityNotFoundException ignored) { // OI file manager not available final Intent dirChooser = new Intent(this, SimpleDirChooser.class); dirChooser.putExtra(Intents.EXTRA_START_DIR, startDirectory); @@ -353,22 +357,20 @@ public class SettingsActivity extends PreferenceActivity { final Resources res = getResources(); final SettingsActivity activity = SettingsActivity.this; final ProgressDialog dialog = ProgressDialog.show(activity, res.getString(R.string.init_maintenance), res.getString(R.string.init_maintenance_directories), true, false); - new Thread() { + RxUtils.andThenOnUi(Schedulers.io(), new Action0() { @Override - public void run() { + public void call() { DataStore.removeObsoleteCacheDirectories(); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - dialog.dismiss(); - } - }); } - }.start(); - + }, new Action0() { + @Override + public void call() { + dialog.dismiss(); + } + }); return true; - } - }); + } + }); final Preference memoryDumpPref = getPreference(R.string.pref_memory_dump); memoryDumpPref .setOnPreferenceClickListener(new OnPreferenceClickListener() { @@ -702,8 +704,6 @@ public class SettingsActivity extends PreferenceActivity { /** * auto-care for the summary of the preference of string type with this key - * - * @param key */ private void bindSummaryToStringValue(final int key) { diff --git a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java index d8aff74..e7e793f 100644 --- a/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java +++ b/main/src/cgeo/geocaching/utils/DatabaseBackupUtils.java @@ -7,6 +7,11 @@ import cgeo.geocaching.ui.dialog.Dialogs; import org.apache.commons.lang3.StringUtils; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.functions.Func0; +import rx.schedulers.Schedulers; + import android.app.Activity; import android.app.ProgressDialog; import android.content.res.Resources; @@ -30,24 +35,23 @@ public class DatabaseBackupUtils { 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); - new Thread() { + RxUtils.andThenOnUi(Schedulers.io(), new Action0() { @Override - public void run() { + public void call() { restoreSuccessful.set(DataStore.restoreDatabaseInternal()); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - dialog.dismiss(); - boolean restored = restoreSuccessful.get(); - String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); - Dialogs.message(activity, R.string.init_backup_restore, message); - if (activity instanceof MainActivity) { - ((MainActivity) activity).updateCacheCounter(); - } - } - }); } - }.start(); + }, new Action0() { + @Override + public void call() { + dialog.dismiss(); + boolean restored = restoreSuccessful.get(); + String message = restored ? res.getString(R.string.init_restore_success) : res.getString(R.string.init_restore_failed); + Dialogs.message(activity, R.string.init_backup_restore, message); + if (activity instanceof MainActivity) { + ((MainActivity) activity).updateCacheCounter(); + } + } + }); } public static boolean createBackup(final Activity activity, final Runnable runAfterwards) { @@ -61,27 +65,26 @@ public class DatabaseBackupUtils { final ProgressDialog dialog = ProgressDialog.show(activity, activity.getString(R.string.init_backup), activity.getString(R.string.init_backup_running), true, false); - new Thread() { + RxUtils.andThenOnUi(Schedulers.io(), new Func0<String>() { + @Override + public String call() { + return DataStore.backupDatabaseInternal(); + } + }, new Action1<String>() { @Override - public void run() { - final String backupFileName = DataStore.backupDatabaseInternal(); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - dialog.dismiss(); - Dialogs.message(activity, - R.string.init_backup_backup, - backupFileName != null - ? activity.getString(R.string.init_backup_success) - + "\n" + backupFileName - : activity.getString(R.string.init_backup_failed)); - if (runAfterwards != null) { - runAfterwards.run(); - } - } - }); + public void call(final String backupFileName) { + dialog.dismiss(); + Dialogs.message(activity, + R.string.init_backup_backup, + backupFileName != null + ? activity.getString(R.string.init_backup_success) + + "\n" + backupFileName + : activity.getString(R.string.init_backup_failed)); + if (runAfterwards != null) { + runAfterwards.run(); + } } - }.start(); + }); return true; } diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java index 72e7630..6710105 100644 --- a/main/src/cgeo/geocaching/utils/RxUtils.java +++ b/main/src/cgeo/geocaching/utils/RxUtils.java @@ -16,6 +16,7 @@ import rx.observers.Subscribers; import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; import rx.subscriptions.Subscriptions; +import rx.util.async.Async; import android.os.Handler; import android.os.HandlerThread; @@ -171,4 +172,23 @@ public class RxUtils { })).replay(1).refCount(); } + public static <T> void andThenOnUi(final Scheduler scheduler, final Func0<T> background, final Action1<T> foreground) { + Async.fromCallable(background, scheduler).observeOn(AndroidSchedulers.mainThread()).subscribe(foreground); + } + + public static void andThenOnUi(final Scheduler scheduler, final Action0 background, final Action0 foreground) { + andThenOnUi(scheduler, new Func0<Void>() { + @Override + public Void call() { + background.call(); + return null; + } + }, new Action1<Void>() { + @Override + public void call(final Void ignored) { + foreground.call(); + } + }); + } + } |