diff options
| author | koem <koem@petoria.de> | 2013-06-21 18:57:50 -0600 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2013-07-09 21:49:26 +0200 |
| commit | ece37925442507a71f12a2a2f531ea213c48cad5 (patch) | |
| tree | d901c0f18e9e8c1af65c15f0de25ad3abc04a14f /main/src/cgeo/geocaching | |
| parent | 3abe2f0eb20b351bb8d7b8d5283dcbd102241d27 (diff) | |
| download | cgeo-ece37925442507a71f12a2a2f531ea213c48cad5.zip cgeo-ece37925442507a71f12a2a2f531ea213c48cad5.tar.gz cgeo-ece37925442507a71f12a2a2f531ea213c48cad5.tar.bz2 | |
Implements #750, use preference activity
Diffstat (limited to 'main/src/cgeo/geocaching')
83 files changed, 1862 insertions, 756 deletions
diff --git a/main/src/cgeo/geocaching/AbstractLoggingActivity.java b/main/src/cgeo/geocaching/AbstractLoggingActivity.java index 1524834..c3ba7d2 100644 --- a/main/src/cgeo/geocaching/AbstractLoggingActivity.java +++ b/main/src/cgeo/geocaching/AbstractLoggingActivity.java @@ -1,11 +1,13 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.gc.GCSmiliesProvider; import cgeo.geocaching.connector.gc.GCSmiliesProvider.Smiley; import cgeo.geocaching.connector.trackable.TravelBugConnector; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.LogTemplateProvider; import cgeo.geocaching.utils.LogTemplateProvider.LogContext; import cgeo.geocaching.utils.LogTemplateProvider.LogTemplate; @@ -84,6 +86,6 @@ public abstract class AbstractLoggingActivity extends AbstractActivity { protected void insertIntoLog(String newText, final boolean moveCursor) { final EditText log = (EditText) findViewById(R.id.log); - insertAtPosition(log, newText, moveCursor); + ActivityMixin.insertAtPosition(log, newText, moveCursor); } } diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 64e5539..1cf0353 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -9,6 +9,7 @@ import cgeo.geocaching.gcvote.GCVote; import cgeo.geocaching.gcvote.GCVoteRating; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.ui.LoggingUI; import cgeo.geocaching.utils.GeoDirHandler; diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 5ac348c..1b31463 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -20,6 +20,7 @@ import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.AbstractCachingPageViewCreator; import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod; import cgeo.geocaching.ui.CacheDetailsCreator; diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java index 39a896a..873801e 100644 --- a/main/src/cgeo/geocaching/CachePopup.java +++ b/main/src/cgeo/geocaching/CachePopup.java @@ -4,6 +4,7 @@ import cgeo.geocaching.activity.Progress; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.network.Network; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 059f664..8626173 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -7,6 +7,7 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.speech.SpeechService; import cgeo.geocaching.ui.CompassView; import cgeo.geocaching.utils.GeoDirHandler; diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index 483920a..56ee959 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -10,6 +10,7 @@ import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.dialog.CoordinatesInputDialog; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; @@ -233,7 +234,7 @@ public class EditWaypointActivity extends AbstractActivity { private void initializeDistanceUnitSelector() { distanceUnits = new ArrayList<String>(Arrays.asList(res.getStringArray(R.array.distance_units))); if (initViews) { - distanceUnitSelector.setSelection(Settings.isUseMetricUnits() ? 0 : 2); //0:m, 2:ft + distanceUnitSelector.setSelection(Settings.isUseImperialUnits() ? 2 : 0); //0:m, 2:ft } } @@ -344,7 +345,8 @@ public class EditWaypointActivity extends AbstractActivity { double distance; try { - distance = DistanceParser.parseDistance(distanceText, Settings.isUseMetricUnits()); + distance = DistanceParser.parseDistance(distanceText, + !Settings.isUseImperialUnits()); } catch (NumberFormatException e) { showToast(res.getString(R.string.err_parse_dist)); return; diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index 9a7d013..1f1bd3b 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -23,6 +23,7 @@ import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.files.GPXParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.network.HtmlImage; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.LazyInitializedList; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/GpxFileListActivity.java b/main/src/cgeo/geocaching/GpxFileListActivity.java index de0be21..8b10d5b 100644 --- a/main/src/cgeo/geocaching/GpxFileListActivity.java +++ b/main/src/cgeo/geocaching/GpxFileListActivity.java @@ -4,6 +4,7 @@ import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.files.AbstractFileListActivity;
import cgeo.geocaching.files.GPXImporter;
+import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.GPXListAdapter;
import org.apache.commons.lang3.StringUtils;
diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java index 39824a9..2d57f61 100644 --- a/main/src/cgeo/geocaching/ImageSelectActivity.java +++ b/main/src/cgeo/geocaching/ImageSelectActivity.java @@ -5,6 +5,7 @@ import butterknife.Views; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.compatibility.Compatibility; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.ImageUtils; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/ImagesActivity.java b/main/src/cgeo/geocaching/ImagesActivity.java index 030b3f7..0b80d53 100644 --- a/main/src/cgeo/geocaching/ImagesActivity.java +++ b/main/src/cgeo/geocaching/ImagesActivity.java @@ -1,6 +1,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.ImagesList; import cgeo.geocaching.ui.ImagesList.ImageType; @@ -57,7 +58,8 @@ public class ImagesActivity extends AbstractActivity { return; } - offline = cgData.isOffline(geocode, null) && (imgType == ImageType.SpoilerImages || Settings.isStoreLogImages()); + offline = cgData.isOffline(geocode, null) && (imgType == ImageType.SpoilerImages + || Settings.isStoreLogImages()); } @Override diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java index 1045a9d..e11af0f 100644 --- a/main/src/cgeo/geocaching/LogCacheActivity.java +++ b/main/src/cgeo/geocaching/LogCacheActivity.java @@ -8,6 +8,7 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.LogTypeTrackable; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.gcvote.GCVote; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.twitter.Twitter; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.ui.dialog.DateDialog; @@ -489,7 +490,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia } private void updateTweetBox(LogType type) { - if (type == LogType.FOUND_IT && Settings.isUseTwitter()) { + if (type == LogType.FOUND_IT && Settings.isUseTwitter() && Settings.isTwitterLoginValid()) { tweetBox.setVisibility(View.VISIBLE); } else { tweetBox.setVisibility(View.GONE); diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java index df1038f..790becd 100644 --- a/main/src/cgeo/geocaching/LogEntry.java +++ b/main/src/cgeo/geocaching/LogEntry.java @@ -1,6 +1,7 @@ package cgeo.geocaching; import cgeo.geocaching.enumerations.LogType; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.DateUtils; import cgeo.geocaching.utils.MatcherWrapper; diff --git a/main/src/cgeo/geocaching/LogTrackableActivity.java b/main/src/cgeo/geocaching/LogTrackableActivity.java index 1f6feb7..f0dd7f9 100644 --- a/main/src/cgeo/geocaching/LogTrackableActivity.java +++ b/main/src/cgeo/geocaching/LogTrackableActivity.java @@ -9,6 +9,7 @@ import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.twitter.Twitter; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.ui.dialog.DateDialog; @@ -223,7 +224,7 @@ public class LogTrackableActivity extends AbstractLoggingActivity implements Dat typeSelected = type; typeButton.setText(typeSelected.getL10n()); - if (Settings.isUseTwitter()) { + if (Settings.isUseTwitter() && Settings.isTwitterLoginValid()) { tweetBox.setVisibility(View.VISIBLE); } else { tweetBox.setVisibility(View.GONE); diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 5898cba..24dd2c8 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -11,6 +11,9 @@ import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.maps.CGeoMap; +import cgeo.geocaching.settings.NewSettingsActivity; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; @@ -289,9 +292,12 @@ public class MainActivity extends AbstractActivity { case R.id.menu_helpers: startActivity(new Intent(this, UsefulAppsActivity.class)); return true; - case R.id.menu_settings: + case R.id.menu_oldsettings: startActivity(new Intent(this, SettingsActivity.class)); return true; + case R.id.menu_settings: + startActivity(new Intent(this, NewSettingsActivity.class)); + return true; case R.id.menu_history: cgeocaches.startActivityHistory(this); return true; @@ -346,7 +352,7 @@ public class MainActivity extends AbstractActivity { initialized = true; Settings.setLanguage(Settings.isUseEnglish()); - Settings.getLogin(); + Settings.getGcLogin(); if (app.firstRun) { (new FirstLoginThread()).start(); diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java index 6f94944..e7ffc3b 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -8,6 +8,7 @@ import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.AbstractViewHolder; import cgeo.geocaching.ui.Formatter; import cgeo.geocaching.ui.dialog.CoordinatesInputDialog; @@ -259,12 +260,12 @@ public class NavigateAnyPointActivity extends AbstractActivity { private void initializeDistanceUnitSelector() { if (StringUtils.isBlank(distanceUnit)) { - if (Settings.isUseMetricUnits()) { - distanceUnitSelector.setSelection(0); // m - distanceUnit = res.getStringArray(R.array.distance_units)[0]; - } else { + if (Settings.isUseImperialUnits()) { distanceUnitSelector.setSelection(2); // ft distanceUnit = res.getStringArray(R.array.distance_units)[2]; + } else { + distanceUnitSelector.setSelection(0); // m + distanceUnit = res.getStringArray(R.array.distance_units)[0]; } } @@ -519,7 +520,8 @@ public class NavigateAnyPointActivity extends AbstractActivity { double distance; try { - distance = DistanceParser.parseDistance(distanceText, Settings.isUseMetricUnits()); + distance = DistanceParser.parseDistance(distanceText, + !Settings.isUseImperialUnits()); } catch (NumberFormatException e) { showToast(res.getString(R.string.err_parse_dist)); return null; diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index c2a7b6d..b1a58a4 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -10,6 +10,7 @@ import cgeo.geocaching.connector.capability.ISearchByGeocode; import cgeo.geocaching.connector.trackable.TrackableConnector; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.dialog.CoordinatesInputDialog; import cgeo.geocaching.utils.EditUtils; import cgeo.geocaching.utils.GeoDirHandler; @@ -150,7 +151,7 @@ public class SearchActivity extends AbstractActivity { } private void init() { - Settings.getLogin(); + Settings.getGcLogin(); buttonLatitude.setOnClickListener(new FindByCoordsAction()); buttonLongitude.setOnClickListener(new FindByCoordsAction()); diff --git a/main/src/cgeo/geocaching/SelectMapfileActivity.java b/main/src/cgeo/geocaching/SelectMapfileActivity.java index 95b6e46..8f82288 100644 --- a/main/src/cgeo/geocaching/SelectMapfileActivity.java +++ b/main/src/cgeo/geocaching/SelectMapfileActivity.java @@ -3,6 +3,7 @@ package cgeo.geocaching; import cgeo.geocaching.files.AbstractFileListActivity; import cgeo.geocaching.files.IFileSelectionView; import cgeo.geocaching.files.LocalStorage; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.FileSelectionListAdapter; import android.content.Context; diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index 9a4c00b..041e703 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -6,6 +6,7 @@ import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.geopoint.GeopointFormatter.Format; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.HttpResponse; diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index 964ef96..9aca35e 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -2,7 +2,7 @@ package cgeo.geocaching.activity; import butterknife.Views; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.network.Cookies; @@ -83,33 +83,6 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst ActivityMixin.invalidateOptionsMenu(this); } - /** - * insert text into the EditText at the current cursor position - * - * @param editText - * @param insertText - * @param moveCursor - * place the cursor after the inserted text - */ - public static void insertAtPosition(final EditText editText, final String insertText, final boolean moveCursor) { - int selectionStart = editText.getSelectionStart(); - int selectionEnd = editText.getSelectionEnd(); - int start = Math.min(selectionStart, selectionEnd); - int end = Math.max(selectionStart, selectionEnd); - - final String content = editText.getText().toString(); - String completeText; - if (start > 0 && !Character.isWhitespace(content.charAt(start - 1))) { - completeText = " " + insertText; - } else { - completeText = insertText; - } - - editText.getText().replace(start, end, completeText); - int newCursor = moveCursor ? start + completeText.length() : start; - editText.setSelection(newCursor, newCursor); - } - protected void onCreate(final Bundle savedInstanceState, final int resourceLayoutID) { super.onCreate(savedInstanceState); diff --git a/main/src/cgeo/geocaching/activity/ActivityMixin.java b/main/src/cgeo/geocaching/activity/ActivityMixin.java index 12ab0be..699d5ab 100644 --- a/main/src/cgeo/geocaching/activity/ActivityMixin.java +++ b/main/src/cgeo/geocaching/activity/ActivityMixin.java @@ -2,7 +2,7 @@ package cgeo.geocaching.activity; import cgeo.geocaching.MainActivity; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.compatibility.Compatibility; import org.apache.commons.lang3.StringUtils; @@ -16,6 +16,7 @@ import android.os.Build; import android.view.Gravity; import android.view.View; import android.view.WindowManager; +import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; @@ -79,6 +80,10 @@ public final class ActivityMixin { return R.style.popup_dark; } + public static void showToast(final Activity activity, final int resId) { + ActivityMixin.showToast(activity, activity.getString(resId)); + } + public static void showToast(final Activity activity, final String text) { if (StringUtils.isNotBlank(text)) { Toast toast = Toast.makeText(activity, text, Toast.LENGTH_LONG); @@ -130,4 +135,31 @@ public final class ActivityMixin { public static void invalidateOptionsMenu(Activity activity) { Compatibility.invalidateOptionsMenu(activity); } + + /** + * insert text into the EditText at the current cursor position + * + * @param editText + * @param insertText + * @param moveCursor + * place the cursor after the inserted text + */ + public static void insertAtPosition(final EditText editText, final String insertText, final boolean moveCursor) { + int selectionStart = editText.getSelectionStart(); + int selectionEnd = editText.getSelectionEnd(); + int start = Math.min(selectionStart, selectionEnd); + int end = Math.max(selectionStart, selectionEnd); + + final String content = editText.getText().toString(); + String completeText; + if (start > 0 && !Character.isWhitespace(content.charAt(start - 1))) { + completeText = " " + insertText; + } else { + completeText = insertText; + } + + editText.getText().replace(start, end, completeText); + int newCursor = moveCursor ? start + completeText.length() : start; + editText.setSelection(newCursor, newCursor); + } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java index 7316d4c..4db889d 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java @@ -1,8 +1,8 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.Geocache; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; import cgeo.geocaching.Waypoint; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 2911a9a..c00e434 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -13,6 +13,7 @@ import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.utils.Log; import org.apache.commons.collections.CollectionUtils; diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 8b2398f..e388078 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -31,6 +31,7 @@ import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.network.Cookies; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.sorting.CacheComparator; import cgeo.geocaching.sorting.ComparatorUserInterface; import cgeo.geocaching.ui.CacheListAdapter; diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index 5ef2e7b..354bc9e 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -4,8 +4,6 @@ import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; -import cgeo.geocaching.SettingsActivity; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.AbstractConnector; @@ -17,6 +15,8 @@ import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.settings.SettingsActivity; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java index dd150de..2aa5c75 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java @@ -3,7 +3,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ILoggingManager; diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java index 13b663b..dbe8ced 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCMap.java +++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java @@ -2,7 +2,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheSize; diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index cebb3ca..ea15633 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -5,7 +5,7 @@ import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.Trackable; import cgeo.geocaching.TrackableLog; import cgeo.geocaching.Waypoint; @@ -178,7 +178,8 @@ public abstract class GCParser { // cache distance - estimated distance for basic members final String distance = TextUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION_DISTANCE, false, 2, null, false); if (distance != null) { - cache.setDistance(DistanceParser.parseDistance(distance, Settings.isUseMetricUnits())); + cache.setDistance(DistanceParser.parseDistance(distance, + !Settings.isUseImperialUnits())); } // difficulty/terrain @@ -880,7 +881,7 @@ public abstract class GCParser { } private static boolean isSearchForMyCaches(final String userName) { - if (userName.equalsIgnoreCase(Settings.getLogin().left)) { + if (userName.equalsIgnoreCase(Settings.getGcLogin().left)) { Log.i("Overriding users choice because of self search, downloading all caches."); return true; } @@ -1441,7 +1442,8 @@ public abstract class GCParser { final String distance = TextUtils.getMatch(page, GCConstants.PATTERN_TRACKABLE_DISTANCE, false, null); if (null != distance) { try { - trackable.setDistance(DistanceParser.parseDistance(distance, Settings.isUseMetricUnits())); + trackable.setDistance(DistanceParser.parseDistance(distance, + !Settings.isUseImperialUnits())); } catch (final NumberFormatException e) { Log.e("GCParser.parseTrackable: Failed to parse distance", e); } diff --git a/main/src/cgeo/geocaching/connector/gc/IconDecoder.java b/main/src/cgeo/geocaching/connector/gc/IconDecoder.java index 588cf01..ed44392 100644 --- a/main/src/cgeo/geocaching/connector/gc/IconDecoder.java +++ b/main/src/cgeo/geocaching/connector/gc/IconDecoder.java @@ -1,7 +1,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.enumerations.CacheType; import android.graphics.Bitmap; diff --git a/main/src/cgeo/geocaching/connector/gc/Login.java b/main/src/cgeo/geocaching/connector/gc/Login.java index 1f5714e..4b4c93f 100644 --- a/main/src/cgeo/geocaching/connector/gc/Login.java +++ b/main/src/cgeo/geocaching/connector/gc/Login.java @@ -1,7 +1,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.network.Cookies; @@ -66,7 +66,7 @@ public abstract class Login { } private static StatusCode login(boolean retry) { - final ImmutablePair<String, String> login = Settings.getLogin(); + final ImmutablePair<String, String> login = Settings.getGcLogin(); if (login == null || StringUtils.isEmpty(login.left) || StringUtils.isEmpty(login.right)) { Login.setActualStatus(cgeoapplication.getInstance().getString(R.string.err_login)); diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 5f30934..5ca2d28 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -2,7 +2,7 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ILoggingManager; diff --git a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java index 779c1c5..ed544be 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/connector/oc/OCAuthorizationActivity.java @@ -1,7 +1,7 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.network.OAuthAuthorizationActivity; diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index 7f77d9d..2bc34c6 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -4,7 +4,7 @@ import cgeo.geocaching.Geocache; import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.Waypoint; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; diff --git a/main/src/cgeo/geocaching/connector/ox/OXConnector.java b/main/src/cgeo/geocaching/connector/ox/OXConnector.java index eec07e3..af33bb6 100644 --- a/main/src/cgeo/geocaching/connector/ox/OXConnector.java +++ b/main/src/cgeo/geocaching/connector/ox/OXConnector.java @@ -3,7 +3,7 @@ package cgeo.geocaching.connector.ox; import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.AbstractConnector; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByGeocode; diff --git a/main/src/cgeo/geocaching/export/GpxExport.java b/main/src/cgeo/geocaching/export/GpxExport.java index ab2e281..61be3c5 100644 --- a/main/src/cgeo/geocaching/export/GpxExport.java +++ b/main/src/cgeo/geocaching/export/GpxExport.java @@ -1,8 +1,8 @@ package cgeo.geocaching.export; import cgeo.geocaching.Geocache; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.utils.AsyncTaskWithProgress; diff --git a/main/src/cgeo/geocaching/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java index 0b2e49f..a1c04d7 100644 --- a/main/src/cgeo/geocaching/files/GPXImporter.java +++ b/main/src/cgeo/geocaching/files/GPXImporter.java @@ -3,7 +3,7 @@ package cgeo.geocaching.files; import cgeo.geocaching.Geocache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.StaticMapsProvider; import cgeo.geocaching.cgData; import cgeo.geocaching.activity.IAbstractActivity; diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java index a1d42cc..6c9c045 100644 --- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -1,7 +1,7 @@ package cgeo.geocaching.filter; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/gcvote/GCVote.java b/main/src/cgeo/geocaching/gcvote/GCVote.java index f6cfb84..bbfddf1 100644 --- a/main/src/cgeo/geocaching/gcvote/GCVote.java +++ b/main/src/cgeo/geocaching/gcvote/GCVote.java @@ -1,7 +1,7 @@ package cgeo.geocaching.gcvote; import cgeo.geocaching.Geocache; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.LeastRecentlyUsedMap; diff --git a/main/src/cgeo/geocaching/geopoint/DistanceParser.java b/main/src/cgeo/geocaching/geopoint/DistanceParser.java index 5a840a8..e3a7482 100644 --- a/main/src/cgeo/geocaching/geopoint/DistanceParser.java +++ b/main/src/cgeo/geocaching/geopoint/DistanceParser.java @@ -22,7 +22,8 @@ public final class DistanceParser { * @throws NumberFormatException * if the given number is invalid */ - public static float parseDistance(String distanceText, final boolean metricUnit) throws NumberFormatException { + public static float parseDistance(String distanceText, final boolean metricUnit) + throws NumberFormatException { final MatcherWrapper matcher = new MatcherWrapper(pattern, distanceText); if (!matcher.find()) { diff --git a/main/src/cgeo/geocaching/geopoint/Units.java b/main/src/cgeo/geocaching/geopoint/Units.java index 3da3ad9..75d71d0 100644 --- a/main/src/cgeo/geocaching/geopoint/Units.java +++ b/main/src/cgeo/geocaching/geopoint/Units.java @@ -1,6 +1,6 @@ package cgeo.geocaching.geopoint; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -9,15 +9,7 @@ public class Units { public static ImmutablePair<Double, String> scaleDistance(final double distanceKilometers) { double distance; String units; - if (Settings.isUseMetricUnits()) { - if (distanceKilometers >= 1) { - distance = distanceKilometers; - units = "km"; - } else { - distance = distanceKilometers * 1000; - units = "m"; - } - } else { + if (Settings.isUseImperialUnits()) { distance = distanceKilometers / IConversion.MILES_TO_KILOMETER; if (distance >= 0.1) { units = "mi"; @@ -25,6 +17,14 @@ public class Units { distance *= 5280; units = "ft"; } + } else { + if (distanceKilometers >= 1) { + distance = distanceKilometers; + units = "km"; + } else { + distance = distanceKilometers * 1000; + units = "m"; + } } return new ImmutablePair<Double, String>(distance, units); } @@ -68,6 +68,6 @@ public class Units { if (speed.endsWith("mi")) { return speed.substring(0, speed.length() - 2) + "mph"; } - return speed + (Settings.isUseMetricUnits() ? "/h" : "ph"); + return speed + (!Settings.isUseImperialUnits() ? "/h" : "ph"); } } diff --git a/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java index efaaabc..dd7c7a6 100644 --- a/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.gc.GCParser; import android.content.Context; diff --git a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java index 928aaea..34b3a61 100644 --- a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.gc.GCParser; diff --git a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java index 90e22d1..722f9f5 100644 --- a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Geopoint; diff --git a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java index 36b62d6..adfc423 100644 --- a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.gc.GCParser; import android.content.Context; diff --git a/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java index faae9de..1104f83 100644 --- a/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.gc.GCParser; import android.content.Context; diff --git a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java index 0081aa1..ab8ba6a 100644 --- a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.geopoint.Geopoint; diff --git a/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java index 3bed3f4..ea9b8ad 100644 --- a/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.gc.GCParser; import android.content.Context; diff --git a/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java index 63b4620..2229afe 100644 --- a/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java +++ b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.geopoint.Geopoint; diff --git a/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java index 5af0fe3..f8849d5 100644 --- a/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java +++ b/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java @@ -1,7 +1,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.connector.gc.GCParser; import android.content.Context; diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index a2b70c7..007f707 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -5,7 +5,6 @@ import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; -import cgeo.geocaching.Settings; import cgeo.geocaching.StoredList; import cgeo.geocaching.Waypoint; import cgeo.geocaching.cgData; @@ -31,6 +30,7 @@ import cgeo.geocaching.maps.interfaces.MapProvider; import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.maps.interfaces.MapViewImpl; import cgeo.geocaching.maps.interfaces.OnMapDragListener; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.dialog.LiveMapInfoDialogBuilder; import cgeo.geocaching.utils.AngleUtils; import cgeo.geocaching.utils.CancellableHandler; diff --git a/main/src/cgeo/geocaching/maps/CachesOverlay.java b/main/src/cgeo/geocaching/maps/CachesOverlay.java index f1dd9b3..8e117eb 100644 --- a/main/src/cgeo/geocaching/maps/CachesOverlay.java +++ b/main/src/cgeo/geocaching/maps/CachesOverlay.java @@ -4,7 +4,7 @@ import cgeo.geocaching.CachePopup; import cgeo.geocaching.Geocache; import cgeo.geocaching.IWaypoint; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.WaypointPopup; import cgeo.geocaching.cgData; import cgeo.geocaching.activity.Progress; diff --git a/main/src/cgeo/geocaching/maps/MapProviderFactory.java b/main/src/cgeo/geocaching/maps/MapProviderFactory.java index 5ce8ab6..95ea265 100644 --- a/main/src/cgeo/geocaching/maps/MapProviderFactory.java +++ b/main/src/cgeo/geocaching/maps/MapProviderFactory.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.MapProvider; import cgeo.geocaching.maps.interfaces.MapSource; diff --git a/main/src/cgeo/geocaching/maps/PositionOverlay.java b/main/src/cgeo/geocaching/maps/PositionOverlay.java index 08acd2f..c3a0834 100644 --- a/main/src/cgeo/geocaching/maps/PositionOverlay.java +++ b/main/src/cgeo/geocaching/maps/PositionOverlay.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.interfaces.GeneralOverlay; import cgeo.geocaching.maps.interfaces.GeoPointImpl; diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java index 154c3f3..6e5406e 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapView.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapView.java @@ -2,7 +2,7 @@ package cgeo.geocaching.maps.google; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.maps.CachesOverlay; import cgeo.geocaching.maps.PositionOverlay; diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java index 7cf18fb..7c6865d 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps.mapsforge; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.maps.AbstractMapProvider; import cgeo.geocaching.maps.MapProviderFactory; diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java index 083e5bb..2b0c1f7 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps.mapsforge; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.maps.CachesOverlay; import cgeo.geocaching.maps.PositionOverlay; diff --git a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java index cc8bc66..8e3a4d8 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/v024/MapsforgeMapView024.java @@ -1,7 +1,7 @@ package cgeo.geocaching.maps.mapsforge.v024; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.maps.CachesOverlay; import cgeo.geocaching.maps.PositionOverlay; diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java index 57196c5..14a9513 100644 --- a/main/src/cgeo/geocaching/network/Network.java +++ b/main/src/cgeo/geocaching/network/Network.java @@ -1,6 +1,6 @@ package cgeo.geocaching.network; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.utils.TextUtils; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java new file mode 100644 index 0000000..4edfd49 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/AuthorizeOcDePreference.java @@ -0,0 +1,41 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.connector.oc.OCAuthorizationActivity; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class AuthorizeOcDePreference extends Preference { + + public AuthorizeOcDePreference(Context context) { + super(context); + } + + public AuthorizeOcDePreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AuthorizeOcDePreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected View onCreateView(ViewGroup parent) { + setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent authIntent = new Intent(preference.getContext(), + OCAuthorizationActivity.class); + ((Activity) preference.getContext()).startActivity(authIntent); + + return false; // no shared preference has to be changed + } + }); + return super.onCreateView(parent); + } +} diff --git a/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java new file mode 100644 index 0000000..9476e37 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/AuthorizeTwitterPreference.java @@ -0,0 +1,41 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.twitter.TwitterAuthorizationActivity; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class AuthorizeTwitterPreference extends Preference { + + public AuthorizeTwitterPreference(Context context) { + super(context); + } + + public AuthorizeTwitterPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AuthorizeTwitterPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected View onCreateView(ViewGroup parent) { + setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent authIntent = new Intent(preference.getContext(), + TwitterAuthorizationActivity.class); + ((Activity) preference.getContext()).startActivity(authIntent); + + return false; // no shared preference has to be changed + } + }); + return super.onCreateView(parent); + } +} diff --git a/main/src/cgeo/geocaching/settings/CheckBoxWithPopupPreference.java b/main/src/cgeo/geocaching/settings/CheckBoxWithPopupPreference.java new file mode 100644 index 0000000..4e64b9a --- /dev/null +++ b/main/src/cgeo/geocaching/settings/CheckBoxWithPopupPreference.java @@ -0,0 +1,93 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.TypedArray; +import android.net.Uri; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class CheckBoxWithPopupPreference extends CheckBoxPreference { + + // strings for the popup dialog + private String title; + private String text; + private String url; + private String urlButton; + + public CheckBoxWithPopupPreference(Context context) { + super(context); + } + + public CheckBoxWithPopupPreference(Context context, AttributeSet attrs) { + super(context, attrs); + processAttributes(context, attrs, 0); + } + + public CheckBoxWithPopupPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + processAttributes(context, attrs, defStyle); + } + + private void processAttributes(Context context, AttributeSet attrs, int defStyle) { + if (attrs == null) { + return; // coward's retreat + } + + TypedArray types = context.obtainStyledAttributes(attrs, new int[] { + R.attr.title, R.attr.text, R.attr.url, R.attr.urlButton }, + defStyle, 0); + + title = types.getString(0); + text = types.getString(1); + url = types.getString(2); + urlButton = types.getString(3); + + types.recycle(); + } + + @Override + protected View onCreateView(ViewGroup parent) { + + // show dialog when checkbox enabled + setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(final Preference preference, Object newValue) { + if (!(Boolean) newValue) { + return true; + } + AlertDialog.Builder builder = new AlertDialog.Builder( + preference.getContext()); + builder.setMessage(text) + .setIcon(android.R.drawable.ic_dialog_info) + .setTitle(title) + .setPositiveButton(R.string.err_none, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }) + .setNegativeButton(urlButton, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + preference.getContext().startActivity(i); + } + }); + builder.create().show(); + return true; + } + }); + + return super.onCreateView(parent); + } + +} diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java new file mode 100644 index 0000000..877a6c7 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java @@ -0,0 +1,123 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.R; +import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.connector.gc.Login; +import cgeo.geocaching.enumerations.StatusCode; +import cgeo.geocaching.network.Cookies; +import cgeo.geocaching.utils.Log; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.os.Message; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class CheckGcCredentialsPreference extends Preference { + + public CheckGcCredentialsPreference(Context context) { + super(context); + } + + public CheckGcCredentialsPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CheckGcCredentialsPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected View onCreateView(ViewGroup parent) { + setOnPreferenceClickListener(GC_LOGIN_CHECK); + return super.onCreateView(parent); + } + + private final GcLoginCheck GC_LOGIN_CHECK = new GcLoginCheck(); + + private class GcLoginCheck implements OnPreferenceClickListener { + private Resources res; + private Activity activity; + + private ProgressDialog loginDialog; + @SuppressLint("HandlerLeak") + private Handler logInHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + try { + if (loginDialog != null && loginDialog.isShowing()) { + loginDialog.dismiss(); + } + + if (msg.obj == null || (msg.obj instanceof Drawable)) { + ActivityMixin.helpDialog(activity, + res.getString(R.string.init_login_popup), + res.getString(R.string.init_login_popup_ok), + (Drawable) msg.obj); + } else { + ActivityMixin.helpDialog(activity, + res.getString(R.string.init_login_popup), + res.getString(R.string.init_login_popup_failed_reason) + + " " + + ((StatusCode) msg.obj).getErrorString(res) + + "."); + } + } catch (Exception e) { + ActivityMixin.showToast(activity, R.string.err_login_failed); + Log.e("SettingsActivity.logInHandler", e); + } + + if (loginDialog != null && loginDialog.isShowing()) { + loginDialog.dismiss(); + } + } + }; + + @Override + public boolean onPreferenceClick(Preference preference) { + this.activity = (Activity) CheckGcCredentialsPreference.this.getContext(); + this.res = activity.getResources(); + + ImmutablePair<String, String> credentials = Settings.getGcLogin(); + + // check credentials for validity + if (credentials == null || StringUtils.isBlank(credentials.getLeft()) + || StringUtils.isBlank(credentials.getRight())) { + ActivityMixin.showToast(activity, R.string.err_missing_auth); + return false; + } + + loginDialog = ProgressDialog.show(activity, + res.getString(R.string.init_login_popup), + res.getString(R.string.init_login_popup_working), true); + loginDialog.setCancelable(false); + Cookies.clearCookies(); + + (new Thread() { + @Override + public void run() { + final StatusCode loginResult = Login.login(); + Object payload = loginResult; + if (loginResult == StatusCode.NO_ERROR) { + Login.detectGcCustomDate(); + payload = Login.downloadAvatarAndGetMemberStatus(); + } + logInHandler.obtainMessage(0, payload).sendToTarget(); + } + }).start(); + + return false; // no shared preference has to be changed + } + } +} diff --git a/main/src/cgeo/geocaching/settings/EditPasswordPreference.java b/main/src/cgeo/geocaching/settings/EditPasswordPreference.java new file mode 100644 index 0000000..c2fac6a --- /dev/null +++ b/main/src/cgeo/geocaching/settings/EditPasswordPreference.java @@ -0,0 +1,29 @@ +package cgeo.geocaching.settings; + +import android.content.Context; +import android.preference.EditTextPreference; +import android.util.AttributeSet; + +/** + * This is just a dummy preference, to be able check for the type. + * <p> + * Use it exactly as an EditTextPreference + * + * @see NewSettingsActivity - search for EditPasswordPreference + * @author koem + */ +public class EditPasswordPreference extends EditTextPreference { + + public EditPasswordPreference(Context context) { + super(context); + } + + public EditPasswordPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public EditPasswordPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + +} diff --git a/main/src/cgeo/geocaching/settings/InfoPreference.java b/main/src/cgeo/geocaching/settings/InfoPreference.java new file mode 100644 index 0000000..465cf12 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/InfoPreference.java @@ -0,0 +1,91 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.TypedArray; +import android.net.Uri; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class InfoPreference extends Preference { + + // strings for the popup dialog + private String text; + private String url; + private String urlButton; + + public InfoPreference(Context context) { + super(context); + init(context, null, 0); + } + + public InfoPreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public InfoPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs, defStyle); + } + + private void init(Context context, AttributeSet attrs, int defStyle) { + setPersistent(false); + + if (attrs == null) { + return; // coward's retreat + } + + TypedArray types = context.obtainStyledAttributes(attrs, new int[] { + android.R.attr.text, R.attr.url, R.attr.urlButton }, + defStyle, 0); + + text = types.getString(0); + url = types.getString(1); + urlButton = types.getString(2); + + types.recycle(); + } + + @Override + protected View onCreateView(ViewGroup parent) { + + // show popup when clicked + setOnPreferenceClickListener(new OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(final Preference preference) { + AlertDialog.Builder builder = new AlertDialog.Builder( + preference.getContext()); + builder.setMessage(text) + .setIcon(android.R.drawable.ic_dialog_info) + .setTitle(preference.getTitle()) + .setPositiveButton(R.string.err_none, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }) + .setNegativeButton(urlButton, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + preference.getContext().startActivity(i); + } + }); + builder.create().show(); + return false; + } + }); + + return super.onCreateView(parent); + } + +} diff --git a/main/src/cgeo/geocaching/settings/LogSignaturePreference.java b/main/src/cgeo/geocaching/settings/LogSignaturePreference.java new file mode 100644 index 0000000..2fdd5ac --- /dev/null +++ b/main/src/cgeo/geocaching/settings/LogSignaturePreference.java @@ -0,0 +1,60 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; + +import android.content.Context; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +public class LogSignaturePreference extends DialogPreference { + + private NewSettingsActivity settingsActivity; + private EditText editText; + + public LogSignaturePreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public LogSignaturePreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + setDialogLayoutResource(R.layout.log_signature_preference_dialog); + } + + @Override + protected void onBindDialogView(View view) { + settingsActivity = (NewSettingsActivity) this.getContext(); + + editText = (EditText) view.findViewById(R.id.signature_dialog_text); + editText.setText(getPersistedString("")); + settingsActivity.setSignatureTextView(editText); + + Button templates = (Button) view.findViewById(R.id.signature_templates); + settingsActivity.registerForContextMenu(templates); + templates.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View templates) { + settingsActivity.openContextMenu(templates); + } + }); + + super.onBindDialogView(view); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + if (positiveResult) { + String text = editText.getText().toString(); + persistString(text); + callChangeListener(text); + } + super.onDialogClosed(positiveResult); + } +} diff --git a/main/src/cgeo/geocaching/settings/NewSettingsActivity.java b/main/src/cgeo/geocaching/settings/NewSettingsActivity.java new file mode 100644 index 0000000..bf4ad01 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/NewSettingsActivity.java @@ -0,0 +1,524 @@ +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; +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; +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.Log; +import cgeo.geocaching.utils.LogTemplateProvider; +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; +import android.os.Bundle; +import android.os.Environment; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.View; +import android.widget.EditText; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * A {@link PreferenceActivity} that presents a set of application settings. On + * handset devices, settings are presented as a single list. On tablets, + * settings are split by category, with category headers shown to the left of + * the list of settings. + * <p> + * See <a href="http://developer.android.com/design/patterns/settings.html"> Android Design: Settings</a> for design + * guidelines and the <a href="http://developer.android.com/guide/topics/ui/settings.html">Settings API Guide</a> for + * more information on developing a Settings UI. + * + * @author koem (initial author) + */ +public class NewSettingsActivity extends PreferenceActivity { + + private static final String INTENT_GOTO = "GOTO"; + private static final int INTENT_GOTO_SERVICES = 1; + private static final String FAKEKEY_MAIN_SCREEN = "fakekey_main_screen"; + private static final String FAKEKEY_SERVICES_SCREEN = "fakekey_services_screen"; + + private EditText signatureText; + + /** + * Enum for dir choosers. This is how we can retrieve information about the + * directory and preference key in onActivityResult() easily just by knowing + * the result code. + */ + private enum DirChooserType { + GPX_IMPORT_DIR(1, Settings.KEY_GPX_IMPORT_DIR, + Environment.getExternalStorageDirectory().getPath() + "/gpx"), + GPX_EXPORT_DIR(2, Settings.KEY_GPX_EXPORT_DIR, + Environment.getExternalStorageDirectory().getPath() + "/gpx"), + THEMES_DIR(3, Settings.KEY_RENDER_THEME_BASE_FOLDER, ""); + public final int requestCode; + public final String key; + public final String defaultValue; + + private DirChooserType(int requestCode, String key, String defaultValue) { + this.requestCode = requestCode; + this.key = key; + this.defaultValue = defaultValue; + } + } + + private final static int DIR_CHOOSER_MAPS_DIRECTORY_REQUEST = 4; + + @SuppressWarnings("deprecation") + @Override + protected void onCreate(Bundle savedInstanceState) { + + if (Settings.isLightSkin()) { + setTheme(R.style.settings_light); + } else { + setTheme(R.style.settings); + } + + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preferences); + + initPreferences(); + + Intent intent = getIntent(); + int gotoPage = intent.getIntExtra(INTENT_GOTO, 0); + if (gotoPage == INTENT_GOTO_SERVICES) { + // start with services screen + PreferenceScreen main = (PreferenceScreen) findPreference(FAKEKEY_MAIN_SCREEN); + int index = findPreference(FAKEKEY_SERVICES_SCREEN).getOrder(); + main.onItemClick(null, null, index, 0); + } + } + + private void initPreferences() { + initMapSourcePreference(); + initDirChoosers(); + initDefaultNavigationPreferences(); + initBackupButtons(); + initDbLocationPreference(); + initDebugPreference(); + initBasicMemberPreferences(); + initSend2CgeoPreferences(); + + for (String k : new String[] { Settings.KEY_USERNAME, Settings.KEY_PASSWORD, + Settings.KEY_GCVOTE_PASSWORD, Settings.KEY_SIGNATURE, + Settings.KEY_MAP_SOURCE, Settings.KEY_RENDER_THEME_BASE_FOLDER, + Settings.KEY_GPX_EXPORT_DIR, Settings.KEY_GPX_IMPORT_DIR, + Settings.KEY_MAP_DIRECTORY, Settings.KEY_DEFAULT_NAVIGATION_TOOL, + Settings.KEY_DEFAULT_NAVIGATION_TOOL_2, Settings.KEY_WEBDEVICE_NAME, + Settings.FAKEKEY_PREFERENCE_BACKUP_INFO, }) { + bindSummaryToStringValue(k); + } + bindSummaryToIntValue(Settings.KEY_ALTITUDE_CORRECTION); + } + + // workaround, because OnContextItemSelected nor onMenuItemSelected is never called + OnMenuItemClickListener TEMPLATE_CLICK = new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + LogTemplate template = LogTemplateProvider.getTemplate(item.getItemId()); + if (template != null) { + insertSignatureTemplate(template); + return true; + } + return false; + } + }; + + // workaround, because OnContextItemSelected nor onMenuItemSelected is never called + void setSignatureTextView(EditText view) { + this.signatureText = view; + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + // context menu for signature templates + if (v.getId() == R.id.signature_templates) { + menu.setHeaderTitle(R.string.init_signature_template_button); + ArrayList<LogTemplate> templates = LogTemplateProvider.getTemplates(); + for (int i = 0; i < templates.size(); ++i) { + menu.add(0, templates.get(i).getItemId(), 0, templates.get(i).getResourceId()); + menu.getItem(i).setOnMenuItemClickListener(TEMPLATE_CLICK); + } + } + super.onCreateContextMenu(menu, v, menuInfo); + } + + private void insertSignatureTemplate(final LogTemplate template) { + String insertText = "[" + template.getTemplateString() + "]"; + ActivityMixin.insertAtPosition(signatureText, insertText, true); + } + + /** + * fill the choice list for map sources + */ + @SuppressWarnings("deprecation") + private void initMapSourcePreference() { + ListPreference pref = (ListPreference) findPreference(Settings.KEY_MAP_SOURCE); + + List<MapSource> mapSources = MapProviderFactory.getMapSources(); + CharSequence[] entries = new CharSequence[mapSources.size()]; + CharSequence[] values = new CharSequence[mapSources.size()]; + for (int i = 0; i < mapSources.size(); ++i) { + entries[i] = mapSources.get(i).getName(); + values[i] = String.valueOf(mapSources.get(i).getNumericalId()); + } + pref.setEntries(entries); + pref.setEntryValues(values); + } + + /** + * fill the choice list for default navigation tools + */ + @SuppressWarnings("deprecation") + private void initDefaultNavigationPreferences() { + + final List<NavigationAppsEnum> apps = NavigationAppFactory.getInstalledDefaultNavigationApps(); + + CharSequence[] entries = new CharSequence[apps.size()]; + CharSequence[] values = new CharSequence[apps.size()]; + for (int i = 0; i < apps.size(); ++i) { + entries[i] = apps.get(i).toString(); + values[i] = String.valueOf(apps.get(i).id); + } + + ListPreference pref = (ListPreference) findPreference(Settings.KEY_DEFAULT_NAVIGATION_TOOL); + pref.setEntries(entries); + pref.setEntryValues(values); + pref = (ListPreference) findPreference(Settings.KEY_DEFAULT_NAVIGATION_TOOL_2); + pref.setEntries(entries); + pref.setEntryValues(values); + } + + /** + * fire up a dir chooser on click on the preference + * + * @see #onActivityResult() for processing of the selected directory + * + * @param key + * key of the preference + * @param defaultValue + * default directory - in case the preference has never been + * set yet + */ + @SuppressWarnings("deprecation") + private void initDirChoosers() { + for (final DirChooserType dct : DirChooserType.values()) { + final String dir = Settings.getString(dct.key, dct.defaultValue); + + findPreference(dct.key).setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startDirChooser(dct, dir); + return false; + } + }); + } + + findPreference(Settings.KEY_MAP_DIRECTORY).setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent i = new Intent(NewSettingsActivity.this, + SelectMapfileActivity.class); + startActivityForResult(i, DIR_CHOOSER_MAPS_DIRECTORY_REQUEST); + return false; + } + }); + } + + private void startDirChooser(DirChooserType dct, String startDirectory) { + try { + final Intent dirChooser = new Intent(FileManagerIntents.ACTION_PICK_DIRECTORY); + if (StringUtils.isNotBlank(startDirectory)) { + dirChooser.setData(Uri.fromFile(new File(startDirectory))); + } + dirChooser.putExtra(FileManagerIntents.EXTRA_TITLE, + getString(R.string.simple_dir_chooser_title)); + dirChooser.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT, + getString(android.R.string.ok)); + startActivityForResult(dirChooser, dct.requestCode); + } catch (android.content.ActivityNotFoundException ex) { + // OI file manager not available + final Intent dirChooser = new Intent(this, SimpleDirChooser.class); + dirChooser.putExtra(Intents.EXTRA_START_DIR, startDirectory); + startActivityForResult(dirChooser, dct.requestCode); + } + } + + @SuppressWarnings("deprecation") + private void setChosenDirectory(DirChooserType dct, Intent data) { + final String directory = new File(data.getData().getPath()).getAbsolutePath(); + if (StringUtils.isNotBlank(directory)) { + Preference p = findPreference(dct.key); + if (p == null) { + return; + } + Settings.putString(dct.key, directory); + p.setSummary(directory); + } + } + + @SuppressWarnings("deprecation") + public void initBackupButtons() { + Preference backup = findPreference(Settings.FAKEKEY_PREFERENCE_BACKUP); + 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(NewSettingsActivity.this, + 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.backupDatabase(); + runOnUiThread(new Runnable() { + @Override + public void run() { + dialog.dismiss(); + ActivityMixin.helpDialog(NewSettingsActivity.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(findPreference( + Settings.FAKEKEY_PREFERENCE_BACKUP_INFO), ""); + } + }); + } + }.start(); + return true; + } + }); + + Preference restore = findPreference(Settings.FAKEKEY_PREFERENCE_RESTORE); + restore.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(final Preference preference) { + ((cgeoapplication) NewSettingsActivity.this.getApplication()) + .restoreDatabase(NewSettingsActivity.this); + return true; + } + }); + } + + @SuppressWarnings("deprecation") + private void initDbLocationPreference() { + Preference p = findPreference(Settings.KEY_DB_ON_SDCARD); + p.setPersistent(false); + p.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + boolean oldValue = Settings.isDbOnSDCard(); + ((cgeoapplication) NewSettingsActivity.this.getApplication()) + .moveDatabase(NewSettingsActivity.this); + return oldValue != Settings.isDbOnSDCard(); + } + }); + } + + @SuppressWarnings("deprecation") + private void initDebugPreference() { + Preference p = findPreference(Settings.KEY_DEBUG); + p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + Log.setDebug((Boolean) newValue); + return true; + } + }); + } + + @SuppressWarnings("deprecation") + private void initBasicMemberPreferences() { + findPreference(Settings.KEY_LOAD_DIRECTION_IMG).setEnabled( + !Settings.isPremiumMember()); + findPreference(Settings.KEY_SHOW_CAPTCHA).setEnabled( + !Settings.isPremiumMember()); + } + + private static void initSend2CgeoPreferences() { + Settings.putString(Settings.KEY_WEBDEVICE_NAME, Settings.getWebDeviceName()); + } + + public static void startWithServicesPage(Context fromActivity) { + final Intent intent = new Intent(fromActivity, NewSettingsActivity.class); + intent.putExtra(INTENT_GOTO, INTENT_GOTO_SERVICES); + fromActivity.startActivity(intent); + } + + @SuppressWarnings("deprecation") + @Override + protected void onActivityResult(int requestCode, int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != RESULT_OK) { + return; + } + + for (DirChooserType dct : DirChooserType.values()) { + if (requestCode == dct.requestCode) { + setChosenDirectory(dct, data); + return; + } + } + + switch (requestCode) { + case DIR_CHOOSER_MAPS_DIRECTORY_REQUEST: + if (data.hasExtra(Intents.EXTRA_MAP_FILE)) { + final String mapFile = data.getStringExtra(Intents.EXTRA_MAP_FILE); + Settings.setMapFile(mapFile); + if (!Settings.isValidMapFile(Settings.getMapFile())) { + ActivityMixin.showToast(this, R.string.warn_invalid_mapfile); + } + } + initMapSourcePreference(); + findPreference(Settings.KEY_MAP_DIRECTORY).setSummary( + Settings.getMapFileDirectory()); + break; + default: + throw new IllegalArgumentException(); + } + } + + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private static Preference.OnPreferenceChangeListener VALUE_CHANGE_LISTENER = new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + String stringValue = value.toString(); + + if (preference instanceof EditPasswordPreference) { + if (StringUtils.isBlank((String) value)) { + preference.setSummary(""); + } else { + preference.setSummary("\u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022 \u2022"); + } + } else if (preference instanceof ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + ListPreference listPreference = (ListPreference) preference; + int index = listPreference.findIndexOfValue(stringValue); + + // Set the summary to reflect the new value. + preference.setSummary( + index >= 0 + ? listPreference.getEntries()[index] + : null); + } else if (Settings.FAKEKEY_PREFERENCE_BACKUP_INFO.equals(preference.getKey())) { + File lastBackupFile = cgData.getRestoreFile(); + String text; + if (lastBackupFile != null) { + text = preference.getContext().getString(R.string.init_backup_last) + " " + + Formatter.formatTime(lastBackupFile.lastModified()) + + ", " + Formatter.formatDate(lastBackupFile.lastModified()); + } else { + text = preference.getContext().getString(R.string.init_backup_last_no); + } + preference.setSummary(text); + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.setSummary(stringValue); + } + return true; + } + }; + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + * + * @see #VALUE_CHANGE_LISTENER + */ + private static void bindSummaryToValue(Preference preference, Object value) { + // Set the listener to watch for value changes. + if (preference == null) { + return; + } + preference.setOnPreferenceChangeListener(VALUE_CHANGE_LISTENER); + + // Trigger the listener immediately with the preference's + // current value. + VALUE_CHANGE_LISTENER.onPreferenceChange(preference, value); + } + + /** + * auto-care for the summary of the preference of string type with this key + * + * @param key + */ + @SuppressWarnings("deprecation") + private void bindSummaryToStringValue(String key) { + Preference p = findPreference(key); + if (p == null) { + return; + } + + String value = PreferenceManager + .getDefaultSharedPreferences(p.getContext()) + .getString(p.getKey(), ""); + + bindSummaryToValue(p, value); + } + + /** + * auto-care for the summary of the preference of int type with this key + * + * @param key + */ + @SuppressWarnings("deprecation") + private void bindSummaryToIntValue(String key) { + Preference p = findPreference(key); + if (p == null) { + return; + } + + int value = PreferenceManager + .getDefaultSharedPreferences(p.getContext()) + .getInt(p.getKey(), 0); + + bindSummaryToValue(p, value); + } +} diff --git a/main/src/cgeo/geocaching/settings/NumberPickerPreference.java b/main/src/cgeo/geocaching/settings/NumberPickerPreference.java new file mode 100644 index 0000000..273b7d3 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/NumberPickerPreference.java @@ -0,0 +1,93 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; + +import org.apache.commons.lang3.StringUtils; + +import android.content.Context; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +public class NumberPickerPreference extends DialogPreference { + + private EditText editText; + + public NumberPickerPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NumberPickerPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onBindDialogView(View view) { + String msg = (String) this.getDialogMessage(); + if (StringUtils.isNotBlank(msg)) { + TextView tv = (TextView) view.findViewById(R.id.number_picker_message); + tv.setText(msg); + } + + editText = (EditText) view.findViewById(R.id.number_picker_input); + setValue(getPersistedInt(0)); + + Button minus = (Button) view.findViewById(R.id.number_picker_minus); + Button plus = (Button) view.findViewById(R.id.number_picker_plus); + + minus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View button) { + Integer value = getValue(); + if (value != null) { + setValue(--value); + } + } + }); + + plus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View button) { + Integer value = getValue(); + if (value != null) { + setValue(++value); + } + } + }); + + super.onBindDialogView(view); + } + + private Integer getValue() { + try { + return Integer.parseInt(editText.getText().toString()); + } catch (NumberFormatException e) { + return null; + } + } + + private void setValue(final int value) { + int v = value; + if (v <= 0) { + v = 0; + } else if (v > Integer.MAX_VALUE) { + v = Integer.MAX_VALUE; + } + editText.setText(String.valueOf(v)); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + if (positiveResult) { + Integer value = getValue(); + if (value != null) { + persistInt(value); + callChangeListener(value); + } + } + super.onDialogClosed(positiveResult); + } +} diff --git a/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java new file mode 100644 index 0000000..70c2c44 --- /dev/null +++ b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java @@ -0,0 +1,122 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; +import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.network.Network; +import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.utils.Log; + +import ch.boye.httpclientandroidlib.HttpResponse; + +import org.apache.commons.lang3.StringUtils; + +import android.app.ProgressDialog; +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +public class RegisterSend2CgeoPreference extends Preference { + + ProgressDialog progressDialog; + NewSettingsActivity activity; + + public RegisterSend2CgeoPreference(Context context) { + super(context); + } + + public RegisterSend2CgeoPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public RegisterSend2CgeoPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + private Handler webAuthHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + try { + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + + if (msg.what > 0) { + ActivityMixin.helpDialog(activity, + activity.getString(R.string.init_sendToCgeo), + activity.getString(R.string.init_sendToCgeo_register_ok) + .replace("####", String.valueOf(msg.what))); + } else { + ActivityMixin.helpDialog(activity, + activity.getString(R.string.init_sendToCgeo), + activity.getString(R.string.init_sendToCgeo_register_fail)); + } + } catch (Exception e) { + ActivityMixin.showToast(activity, R.string.init_sendToCgeo_register_fail); + Log.e("SettingsActivity.webHandler", e); + } + + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + }; + + @Override + protected View onCreateView(ViewGroup parent) { + activity = (NewSettingsActivity) getContext(); + + setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + final String deviceName = Settings.getWebDeviceName(); + final String deviceCode = Settings.getWebDeviceCode(); + + if (StringUtils.isBlank(deviceName)) { + ActivityMixin.showToast(activity, R.string.err_missing_device_name); + return false; + } + + progressDialog = ProgressDialog.show(activity, + activity.getString(R.string.init_sendToCgeo), + activity.getString(R.string.init_sendToCgeo_registering), true); + progressDialog.setCancelable(false); + + (new Thread() { + + @Override + public void run() { + int pin = 0; + + final String nam = StringUtils.defaultString(deviceName); + final String cod = StringUtils.defaultString(deviceCode); + + final Parameters params = new Parameters("name", nam, "code", cod); + HttpResponse response = Network.getRequest("http://send2.cgeo.org/auth.html", params); + + if (response != null && response.getStatusLine().getStatusCode() == 200) { + //response was OK + String[] strings = Network.getResponseData(response).split(","); + try { + pin = Integer.parseInt(strings[1].trim()); + } catch (Exception e) { + Log.e("webDialog", e); + } + String code = strings[0]; + Settings.setWebNameCode(nam, code); + } + + webAuthHandler.sendEmptyMessage(pin); + } + }).start(); + + return true; + } + }); + return super.onCreateView(parent); + } + +} diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java index 7a5db12..2215d25 100644 --- a/main/src/cgeo/geocaching/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -1,5 +1,7 @@ -package cgeo.geocaching; +package cgeo.geocaching.settings; +import cgeo.geocaching.StoredList; +import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; import cgeo.geocaching.connector.gc.GCConstants; import cgeo.geocaching.connector.gc.Login; @@ -48,18 +50,18 @@ public final class Settings { private static final String KEY_USE_OFFLINEMAPS = "offlinemaps"; private static final String KEY_USE_OFFLINEWPMAPS = "offlinewpmaps"; private static final String KEY_WEB_DEVICE_CODE = "webDeviceCode"; - private static final String KEY_WEBDEVICE_NAME = "webDeviceName"; + static final String KEY_WEBDEVICE_NAME = "webDeviceName"; private static final String KEY_MAP_LIVE = "maplive"; - private static final String KEY_MAP_SOURCE = "mapsource"; + static final String KEY_MAP_SOURCE = "mapsource"; private static final String KEY_USE_TWITTER = "twitter"; private static final String KEY_SHOW_ADDRESS = "showaddress"; - private static final String KEY_SHOW_CAPTCHA = "showcaptcha"; + static final String KEY_SHOW_CAPTCHA = "showcaptcha"; private static final String KEY_MAP_TRAIL = "maptrail"; private static final String KEY_LAST_MAP_ZOOM = "mapzoom"; private static final String KEY_LAST_MAP_LAT = "maplat"; private static final String KEY_LAST_MAP_LON = "maplon"; private static final String KEY_LIVE_LIST = "livelist"; - private static final String KEY_METRIC_UNITS = "units"; + private static final String KEY_IMPERIAL_UNITS = "units"; private static final String KEY_SKIN = "skin"; private static final String KEY_LAST_USED_LIST = "lastlist"; private static final String KEY_CACHE_TYPE = "cachetype"; @@ -70,46 +72,46 @@ public final class Settings { private static final String KEY_RATING_WANTED = "ratingwanted"; private static final String KEY_ELEVATION_WANTED = "elevationwanted"; private static final String KEY_FRIENDLOGS_WANTED = "friendlogswanted"; - private static final String KEY_USE_ENGLISH = "useenglish"; + static final String KEY_USE_ENGLISH = "useenglish"; private static final String KEY_USE_COMPASS = "usecompass"; private static final String KEY_AUTO_VISIT_TRACKABLES = "trackautovisit"; private static final String KEY_AUTO_INSERT_SIGNATURE = "sigautoinsert"; - private static final String KEY_ALTITUDE_CORRECTION = "altcorrection"; + static final String KEY_ALTITUDE_CORRECTION = "altcorrection"; private static final String KEY_STORE_LOG_IMAGES = "logimages"; private static final String KEY_EXCLUDE_DISABLED = "excludedisabled"; private static final String KEY_EXCLUDE_OWN = "excludemine"; private static final String KEY_MAPFILE = "mfmapfile"; - private static final String KEY_SIGNATURE = "signature"; - private static final String KEY_GCVOTE_PASSWORD = "pass-vote"; - private static final String KEY_PASSWORD = "password"; - private static final String KEY_USERNAME = "username"; + static final String KEY_SIGNATURE = "signature"; + static final String KEY_GCVOTE_PASSWORD = "pass-vote"; + static final String KEY_PASSWORD = "password"; + static final String KEY_USERNAME = "username"; private static final String KEY_MEMBER_STATUS = "memberstatus"; private static final String KEY_COORD_INPUT_FORMAT = "coordinputformat"; private static final String KEY_LOG_OFFLINE = "log_offline"; private static final String KEY_CHOOSE_LIST = "choose_list"; - private static final String KEY_LOAD_DIRECTION_IMG = "loaddirectionimg"; + static final String KEY_LOAD_DIRECTION_IMG = "loaddirectionimg"; private static final String KEY_GC_CUSTOM_DATE = "gccustomdate"; private static final String KEY_SHOW_WAYPOINTS_THRESHOLD = "gcshowwaypointsthreshold"; private static final String KEY_COOKIE_STORE = "cookiestore"; private static final String KEY_OPEN_LAST_DETAILS_PAGE = "opendetailslastpage"; private static final String KEY_LAST_DETAILS_PAGE = "lastdetailspage"; - private static final String KEY_DEFAULT_NAVIGATION_TOOL = "defaultNavigationTool"; - private static final String KEY_DEFAULT_NAVIGATION_TOOL_2 = "defaultNavigationTool2"; + static final String KEY_DEFAULT_NAVIGATION_TOOL = "defaultNavigationTool"; + static final String KEY_DEFAULT_NAVIGATION_TOOL_2 = "defaultNavigationTool2"; private static final String KEY_LIVE_MAP_STRATEGY = "livemapstrategy"; - private static final String KEY_DEBUG = "debug"; + static final String KEY_DEBUG = "debug"; private static final String KEY_HIDE_LIVE_MAP_HINT = "hidelivemaphint"; private static final String KEY_LIVE_MAP_HINT_SHOW_COUNT = "livemaphintshowcount"; private static final String KEY_SETTINGS_VERSION = "settingsversion"; - private static final String KEY_DB_ON_SDCARD = "dbonsdcard"; + static final String KEY_DB_ON_SDCARD = "dbonsdcard"; private static final String KEY_LAST_TRACKABLE_ACTION = "trackableaction"; private static final String KEY_SHARE_AFTER_EXPORT = "shareafterexport"; - private static final String KEY_GPX_EXPORT_DIR = "gpxExportDir"; - private static final String KEY_RENDER_THEME_BASE_FOLDER = "renderthemepath"; - private static final String KEY_RENDER_THEME_FILE_PATH = "renderthemefile"; - private static final String KEY_GPX_IMPORT_DIR = "gpxImportDir"; + public static final String KEY_RENDER_THEME_BASE_FOLDER = "renderthemepath"; + static final String KEY_RENDER_THEME_FILE_PATH = "renderthemefile"; + public static final String KEY_GPX_EXPORT_DIR = "gpxExportDir"; + public static final String KEY_GPX_IMPORT_DIR = "gpxImportDir"; private static final String KEY_PLAIN_LOGS = "plainLogs"; private static final String KEY_NATIVE_UA = "nativeUa"; - private static final String KEY_MAP_DIRECTORY = "mapDirectory"; + static final String KEY_MAP_DIRECTORY = "mapDirectory"; private static final String KEY_CONNECTOR_GC_ACTIVE = "connectorGCActive"; private static final String KEY_CONNECTOR_OC_ACTIVE = "connectorOCActive"; private static final String KEY_LOG_IMAGE_SCALE = "logImageScale"; @@ -118,6 +120,17 @@ public final class Settings { private static final String KEY_TEMP_OCDE_TOKEN_SECRET = "ocde-temp-token-secret"; private static final String KEY_TEMP_OCDE_TOKEN_PUBLIC = "ocde-temp-token-public"; + /* + * fake keys are for finding preference objects only, because preferences + * don't have an id. + */ + static final String FAKEKEY_PREFERENCE_BACKUP_INFO = "fakekey_preference_backup_info"; + static final String FAKEKEY_PREFERENCE_BACKUP = "fakekey_preference_backup"; + static final String FAKEKEY_PREFERENCE_RESTORE = "fakekey_preference_restore"; + + public static final int SHOW_WP_THRESHOLD_DEFAULT = 5; + public static final int SHOW_WP_THRESHOLD_MAX = 50; + private static final int MAP_SOURCE_DEFAULT = GoogleMapProvider.GOOGLE_MAP_ID.hashCode(); private final static int unitsMetric = 1; @@ -125,10 +138,6 @@ public final class Settings { private final static String keyConsumerPublic = CryptUtils.rot13("ESnsCvAv3kEupF1GCR3jGj"); private final static String keyConsumerSecret = CryptUtils.rot13("7vQWceACV9umEjJucmlpFe9FCMZSeqIqfkQ2BnhV9x"); - private interface PrefRunnable { - void edit(final Editor edit); - } - public enum coordInputFormatEnum { Plain, Deg, @@ -147,10 +156,11 @@ public final class Settings { private static String username = null; private static String password = null; - private static final SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(cgeoapplication.getInstance().getBaseContext()); + private static final SharedPreferences sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(cgeoapplication.getInstance().getBaseContext()); static { migrateSettings(); - Log.setDebugUnsaved(sharedPrefs.getBoolean(KEY_DEBUG, false)); + Log.setDebug(sharedPrefs.getBoolean(KEY_DEBUG, false)); } // maps @@ -163,7 +173,8 @@ public final class Settings { private static void migrateSettings() { // migrate from non standard file location and integer based boolean types - if (sharedPrefs.getInt(KEY_SETTINGS_VERSION, 0) < 1) { + int oldVersion = sharedPrefs.getInt(KEY_SETTINGS_VERSION, 0); + if (oldVersion < 1) { final String oldPreferencesName = "cgeo.pref"; final SharedPreferences old = cgeoapplication.getInstance().getSharedPreferences(oldPreferencesName, Context.MODE_PRIVATE); final Editor e = sharedPrefs.edit(); @@ -178,14 +189,14 @@ public final class Settings { e.putString(KEY_WEB_DEVICE_CODE, old.getString(KEY_WEB_DEVICE_CODE, null)); e.putString(KEY_WEBDEVICE_NAME, old.getString(KEY_WEBDEVICE_NAME, null)); e.putBoolean(KEY_MAP_LIVE, old.getInt(KEY_MAP_LIVE, 1) != 0); - e.putInt(KEY_MAP_SOURCE, old.getInt(KEY_MAP_SOURCE, 0)); + e.putInt(KEY_MAP_SOURCE, old.getInt(KEY_MAP_SOURCE, MAP_SOURCE_DEFAULT)); e.putBoolean(KEY_USE_TWITTER, 0 != old.getInt(KEY_USE_TWITTER, 0)); e.putBoolean(KEY_SHOW_ADDRESS, 0 != old.getInt(KEY_SHOW_ADDRESS, 1)); e.putBoolean(KEY_SHOW_CAPTCHA, old.getBoolean(KEY_SHOW_CAPTCHA, false)); e.putBoolean(KEY_MAP_TRAIL, old.getInt(KEY_MAP_TRAIL, 1) != 0); e.putInt(KEY_LAST_MAP_ZOOM, old.getInt(KEY_LAST_MAP_ZOOM, 14)); e.putBoolean(KEY_LIVE_LIST, 0 != old.getInt(KEY_LIVE_LIST, 1)); - e.putBoolean(KEY_METRIC_UNITS, old.getInt(KEY_METRIC_UNITS, unitsMetric) == unitsMetric); + e.putBoolean(KEY_IMPERIAL_UNITS, old.getInt(KEY_IMPERIAL_UNITS, unitsMetric) == unitsMetric); e.putBoolean(KEY_SKIN, old.getInt(KEY_SKIN, 0) != 0); e.putInt(KEY_LAST_USED_LIST, old.getInt(KEY_LAST_USED_LIST, StoredList.STANDARD_LIST_ID)); e.putString(KEY_CACHE_TYPE, old.getString(KEY_CACHE_TYPE, CacheType.ALL.id)); @@ -229,11 +240,81 @@ public final class Settings { e.putInt(KEY_SETTINGS_VERSION, 1); // mark migrated e.commit(); } + + // changes for new settings dialog + if (oldVersion < 2) { + final Editor e = sharedPrefs.edit(); + + e.putBoolean(KEY_IMPERIAL_UNITS, !isUseImperialUnits()); + + // show waypoints threshold now as a slider + int wpThreshold = getWayPointsThreshold(); + if (wpThreshold < 0) { + wpThreshold = 0; + } else if (wpThreshold > SHOW_WP_THRESHOLD_MAX) { + wpThreshold = SHOW_WP_THRESHOLD_MAX; + } + e.putInt(KEY_SHOW_WAYPOINTS_THRESHOLD, wpThreshold); + + // KEY_MAP_SOURCE must be string, because it is the key for a ListPreference now + int ms = sharedPrefs.getInt(KEY_MAP_SOURCE, MAP_SOURCE_DEFAULT); + e.remove(KEY_MAP_SOURCE); + e.putString(KEY_MAP_SOURCE, String.valueOf(ms)); + + // navigation tool ids must be string, because ListPreference uses strings as keys + int dnt1 = sharedPrefs.getInt(KEY_DEFAULT_NAVIGATION_TOOL, NavigationAppsEnum.COMPASS.id); + int dnt2 = sharedPrefs.getInt(KEY_DEFAULT_NAVIGATION_TOOL_2, NavigationAppsEnum.INTERNAL_MAP.id); + e.remove(KEY_DEFAULT_NAVIGATION_TOOL); + e.remove(KEY_DEFAULT_NAVIGATION_TOOL_2); + e.putString(KEY_DEFAULT_NAVIGATION_TOOL, String.valueOf(dnt1)); + e.putString(KEY_DEFAULT_NAVIGATION_TOOL_2, String.valueOf(dnt2)); + + // defaults for gpx directories + e.putString(KEY_GPX_IMPORT_DIR, getGpxImportDir()); + e.putString(KEY_GPX_EXPORT_DIR, getGpxExportDir()); + + e.putInt(KEY_SETTINGS_VERSION, 2); // mark migrated + e.commit(); + } + } + + static String getString(final String key, final String defaultValue) { + return sharedPrefs.getString(key, defaultValue); + } + + static boolean putString(final String key, final String value) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.putString(key, value); + return edit.commit(); + } + + static boolean putBoolean(final String key, final boolean value) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.putBoolean(key, value); + return edit.commit(); + } + + static boolean putInt(final String key, final int value) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.putInt(key, value); + return edit.commit(); + } + + static boolean putFloat(final String key, final float value) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.putFloat(key, value); + return edit.commit(); + } + + static boolean remove(final String key) { + final SharedPreferences.Editor edit = sharedPrefs.edit(); + edit.remove(key); + return edit.commit(); } public static void setLanguage(boolean useEnglish) { final Configuration config = new Configuration(); - config.locale = useEnglish ? new Locale("en") : Locale.getDefault(); + config.locale = useEnglish ? Locale.ENGLISH : Locale.getDefault(); final Resources resources = cgeoapplication.getInstance().getResources(); resources.updateConfiguration(config, resources.getDisplayMetrics()); } @@ -250,12 +331,12 @@ public final class Settings { * * @return a pair (login, password) or null if no valid information is stored */ - public static ImmutablePair<String, String> getLogin() { - if (username == null || password == null) { + public static ImmutablePair<String, String> getGcLogin() { + if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { final String preUsername = sharedPrefs.getString(KEY_USERNAME, null); final String prePassword = sharedPrefs.getString(KEY_PASSWORD, null); - if (preUsername == null || prePassword == null) { + if (StringUtils.isBlank(preUsername) || StringUtils.isBlank(prePassword)) { return null; } @@ -269,38 +350,29 @@ public final class Settings { return username != null ? username : sharedPrefs.getString(KEY_USERNAME, null); } + // TODO: remove with SettingsActivity public static boolean setLogin(final String username, final String password) { Settings.username = username; Settings.password = password; - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { - // erase username and password - edit.remove(KEY_USERNAME); - edit.remove(KEY_PASSWORD); - } else { - // save username and password - edit.putString(KEY_USERNAME, username); - edit.putString(KEY_PASSWORD, password); - } - } - }); + if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { + // erase username and password + boolean a = remove(KEY_USERNAME); + boolean b = remove(KEY_PASSWORD); + return a && b; + } + // save username and password + boolean a = putString(KEY_USERNAME, username); + boolean b = putString(KEY_PASSWORD, password); + return a && b; } public static boolean isGCConnectorActive() { return sharedPrefs.getBoolean(KEY_CONNECTOR_GC_ACTIVE, true); } + // TODO: remove with SettingsActivity public static boolean setGCConnectorActive(final boolean isActive) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_CONNECTOR_GC_ACTIVE, isActive); - } - }); + return putBoolean(KEY_CONNECTOR_GC_ACTIVE, isActive); } public static boolean isPremiumMember() { @@ -317,17 +389,10 @@ public final class Settings { } public static boolean setMemberStatus(final String memberStatus) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - if (StringUtils.isBlank(memberStatus)) { - edit.remove(KEY_MEMBER_STATUS); - } else { - edit.putString(KEY_MEMBER_STATUS, memberStatus); - } - } - }); + if (StringUtils.isBlank(memberStatus)) { + return remove(KEY_MEMBER_STATUS); + } + return putString(KEY_MEMBER_STATUS, memberStatus); } public static boolean isOCConnectorActive() { @@ -335,13 +400,7 @@ public final class Settings { } public static boolean setOCConnectorActive(final boolean isActive) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_CONNECTOR_OC_ACTIVE, isActive); - } - }); + return putBoolean(KEY_CONNECTOR_OC_ACTIVE, isActive); } public static String getOCDETokenPublic() { @@ -352,30 +411,20 @@ public final class Settings { return sharedPrefs.getString(KEY_OCDE_TOKEN_SECRET, ""); } - public static void setOCDETokens(final String tokenPublic, final String tokenSecret, boolean enableOcDe) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putString(KEY_OCDE_TOKEN_PUBLIC, tokenPublic); - edit.putString(KEY_OCDE_TOKEN_SECRET, tokenSecret); - if (tokenPublic != null) { - edit.remove(KEY_TEMP_OCDE_TOKEN_PUBLIC); - edit.remove(KEY_TEMP_OCDE_TOKEN_SECRET); - } - } - }); + public static void setOCDETokens(final String tokenPublic, + final String tokenSecret, boolean enableOcDe) { + putString(KEY_OCDE_TOKEN_PUBLIC, tokenPublic); + putString(KEY_OCDE_TOKEN_SECRET, tokenSecret); + if (tokenPublic != null) { + remove(KEY_TEMP_OCDE_TOKEN_PUBLIC); + remove(KEY_TEMP_OCDE_TOKEN_SECRET); + } setOCConnectorActive(enableOcDe); } public static void setOCDETempTokens(final String tokenPublic, final String tokenSecret) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_TEMP_OCDE_TOKEN_PUBLIC, tokenPublic); - edit.putString(KEY_TEMP_OCDE_TOKEN_SECRET, tokenSecret); - } - }); + putString(KEY_TEMP_OCDE_TOKEN_PUBLIC, tokenPublic); + putString(KEY_TEMP_OCDE_TOKEN_SECRET, tokenSecret); } public static ImmutablePair<String, String> getTempOCDEToken() { @@ -391,20 +440,14 @@ public final class Settings { return !StringUtils.isBlank(preUsername) && !StringUtils.isBlank(prePassword); } + // TODO: remove with SettingsActivity public static boolean setGCvoteLogin(final String password) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - if (StringUtils.isBlank(password)) { - // erase password - edit.remove(KEY_GCVOTE_PASSWORD); - } else { - // save password - edit.putString(KEY_GCVOTE_PASSWORD, password); - } - } - }); + if (StringUtils.isBlank(password)) { + // erase password + return remove(KEY_GCVOTE_PASSWORD); + } + // save password + return putString(KEY_GCVOTE_PASSWORD, password); } public static ImmutablePair<String, String> getGCvoteLogin() { @@ -418,20 +461,14 @@ public final class Settings { return new ImmutablePair<String, String>(username, password); } + // TODO: remove with SettingsActivity public static boolean setSignature(final String signature) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - if (StringUtils.isBlank(signature)) { - // erase signature - edit.remove(KEY_SIGNATURE); - } else { - // save signature - edit.putString(KEY_SIGNATURE, signature); - } - } - }); + if (StringUtils.isBlank(signature)) { + // erase signature + return remove(KEY_SIGNATURE); + } + // save signature + return putString(KEY_SIGNATURE, signature); } public static String getSignature() { @@ -439,19 +476,12 @@ public final class Settings { } public static boolean setCookieStore(final String cookies) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(final Editor edit) { - if (StringUtils.isBlank(cookies)) { - // erase cookies - edit.remove(KEY_COOKIE_STORE); - } else { - // save cookies - edit.putString(KEY_COOKIE_STORE, cookies); - } - } - }); + if (StringUtils.isBlank(cookies)) { + // erase cookies + return remove(KEY_COOKIE_STORE); + } + // save cookies + return putString(KEY_COOKIE_STORE, cookies); } public static String getCookieStore() { @@ -463,26 +493,11 @@ public final class Settings { * The cache type used for future filtering */ public static void setCacheType(final CacheType cacheType) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - if (cacheType == null) { - edit.remove(KEY_CACHE_TYPE); - } else { - edit.putString(KEY_CACHE_TYPE, cacheType.id); - } - } - }); - } - - public static void setLiveMap(final boolean live) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_MAP_LIVE, live); - } - }); + if (cacheType == null) { + remove(KEY_CACHE_TYPE); + } else { + putString(KEY_CACHE_TYPE, cacheType.id); + } } public static int getLastList() { @@ -490,25 +505,12 @@ public final class Settings { } public static void saveLastList(final int listId) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LAST_USED_LIST, listId); - } - }); + putInt(KEY_LAST_USED_LIST, listId); } public static void setWebNameCode(final String name, final String code) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - - edit.putString(KEY_WEBDEVICE_NAME, name); - edit.putString(KEY_WEB_DEVICE_CODE, code); - } - }); + putString(KEY_WEBDEVICE_NAME, name); + putString(KEY_WEB_DEVICE_CODE, code); } public static MapProvider getMapProvider() { @@ -523,12 +525,7 @@ public final class Settings { } public static boolean setMapFile(final String mapFile) { - boolean result = editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_MAPFILE, mapFile); - } - }); + boolean result = putString(KEY_MAPFILE, mapFile); if (mapFile != null) { setMapFileDirectory(new File(mapFile).getParent()); } @@ -548,13 +545,9 @@ public final class Settings { } public static boolean setMapFileDirectory(final String mapFileDirectory) { - return editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_MAP_DIRECTORY, mapFileDirectory); - MapsforgeMapProvider.getInstance().updateOfflineMaps(); - } - }); + boolean result = putString(KEY_MAP_DIRECTORY, mapFileDirectory); + MapsforgeMapProvider.getInstance().updateOfflineMaps(); + return result; } public static boolean isValidMapFile() { @@ -570,51 +563,29 @@ public final class Settings { } public static void setCoordInputFormat(final coordInputFormatEnum format) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_COORD_INPUT_FORMAT, format.ordinal()); - } - }); + putInt(KEY_COORD_INPUT_FORMAT, format.ordinal()); } static void setLogOffline(final boolean offline) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_LOG_OFFLINE, offline); - } - }); + putBoolean(KEY_LOG_OFFLINE, offline); } public static boolean getLogOffline() { return sharedPrefs.getBoolean(KEY_LOG_OFFLINE, false); } + // TODO: remove with SettingsActivity static void setChooseList(final boolean choose) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_CHOOSE_LIST, choose); - } - }); + putBoolean(KEY_CHOOSE_LIST, choose); } public static boolean getChooseList() { return sharedPrefs.getBoolean(KEY_CHOOSE_LIST, false); } + // TODO: remove with SettingsActivity static void setLoadDirImg(final boolean value) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_LOAD_DIRECTION_IMG, value); - } - }); + putBoolean(KEY_LOAD_DIRECTION_IMG, value); } public static boolean getLoadDirImg() { @@ -622,13 +593,7 @@ public final class Settings { } public static void setGcCustomDate(final String format) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putString(KEY_GC_CUSTOM_DATE, format); - } - }); + putString(KEY_GC_CUSTOM_DATE, format); } /** @@ -643,36 +608,14 @@ public final class Settings { return sharedPrefs.getBoolean(KEY_EXCLUDE_OWN, false); } - /** - * edit some settings without knowing how to get the settings editor or how to commit - * - * @param runnable - * @return - */ - private static boolean editSharedSettings(final PrefRunnable runnable) { - final SharedPreferences.Editor prefsEdit = sharedPrefs.edit(); - runnable.edit(prefsEdit); - return prefsEdit.commit(); - } - + // TODO: remove with SettingsActivity public static void setExcludeMine(final boolean exclude) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_EXCLUDE_OWN, exclude); - } - }); + putBoolean(KEY_EXCLUDE_OWN, exclude); } public static void setUseEnglish(final boolean english) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_USE_ENGLISH, english); - setLanguage(english); - } - }); + putBoolean(KEY_USE_ENGLISH, english); + setLanguage(english); } public static boolean isUseEnglish() { @@ -683,126 +626,81 @@ public final class Settings { return sharedPrefs.getBoolean(KEY_SHOW_ADDRESS, true); } + // TODO: remove with SettingsActivity public static void setShowAddress(final boolean showAddress) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_SHOW_ADDRESS, showAddress); - } - }); + putBoolean(KEY_SHOW_ADDRESS, showAddress); } public static boolean isShowCaptcha() { return !isPremiumMember() && sharedPrefs.getBoolean(KEY_SHOW_CAPTCHA, false); } + // TODO: remove with SettingsActivity public static void setShowCaptcha(final boolean showCaptcha) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_SHOW_CAPTCHA, showCaptcha); - } - }); + putBoolean(KEY_SHOW_CAPTCHA, showCaptcha); } public static boolean isExcludeDisabledCaches() { return sharedPrefs.getBoolean(KEY_EXCLUDE_DISABLED, false); } + // TODO: remove with SettingsActivity public static void setExcludeDisabledCaches(final boolean exclude) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_EXCLUDE_DISABLED, exclude); - } - }); + putBoolean(KEY_EXCLUDE_DISABLED, exclude); } public static boolean isStoreOfflineMaps() { return sharedPrefs.getBoolean(KEY_USE_OFFLINEMAPS, true); } + // TODO: remove with SettingsActivity public static void setStoreOfflineMaps(final boolean offlineMaps) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_USE_OFFLINEMAPS, offlineMaps); - } - }); + putBoolean(KEY_USE_OFFLINEMAPS, offlineMaps); } public static boolean isStoreOfflineWpMaps() { return sharedPrefs.getBoolean(KEY_USE_OFFLINEWPMAPS, false); } + // TODO: remove with SettingsActivity public static void setStoreOfflineWpMaps(final boolean offlineMaps) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_USE_OFFLINEWPMAPS, offlineMaps); - } - }); + putBoolean(KEY_USE_OFFLINEWPMAPS, offlineMaps); } public static boolean isStoreLogImages() { return sharedPrefs.getBoolean(KEY_STORE_LOG_IMAGES, false); } + // TODO: remove with SettingsActivity public static void setStoreLogImages(final boolean storeLogImages) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_STORE_LOG_IMAGES, storeLogImages); - } - }); + putBoolean(KEY_STORE_LOG_IMAGES, storeLogImages); } public static boolean isAutoLoadDescription() { return sharedPrefs.getBoolean(KEY_LOAD_DESCRIPTION, true); } + // TODO: remove with SettingsActivity public static void setAutoLoadDesc(final boolean autoLoad) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_LOAD_DESCRIPTION, autoLoad); - } - }); + putBoolean(KEY_LOAD_DESCRIPTION, autoLoad); } public static boolean isRatingWanted() { return sharedPrefs.getBoolean(KEY_RATING_WANTED, true); } + // TODO: remove with SettingsActivity public static void setRatingWanted(final boolean ratingWanted) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_RATING_WANTED, ratingWanted); - } - }); + putBoolean(KEY_RATING_WANTED, ratingWanted); } public static boolean isElevationWanted() { return sharedPrefs.getBoolean(KEY_ELEVATION_WANTED, false); } + // TODO: remove with SettingsActivity public static void setElevationWanted(final boolean elevationWanted) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_ELEVATION_WANTED, elevationWanted); - } - }); + putBoolean(KEY_ELEVATION_WANTED, elevationWanted); } public static boolean isFriendLogsWanted() { @@ -813,88 +711,61 @@ public final class Settings { return sharedPrefs.getBoolean(KEY_FRIENDLOGS_WANTED, true); } + // TODO: remove with SettingsActivity public static void setFriendLogsWanted(final boolean friendLogsWanted) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_FRIENDLOGS_WANTED, friendLogsWanted); - } - }); + putBoolean(KEY_FRIENDLOGS_WANTED, friendLogsWanted); } public static boolean isLiveList() { return sharedPrefs.getBoolean(KEY_LIVE_LIST, true); } + // TODO: remove with SettingsActivity public static void setLiveList(final boolean liveList) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_LIVE_LIST, liveList); - } - }); + putBoolean(KEY_LIVE_LIST, liveList); } public static boolean isTrackableAutoVisit() { return sharedPrefs.getBoolean(KEY_AUTO_VISIT_TRACKABLES, false); } + // TODO: remove with SettingsActivity public static void setTrackableAutoVisit(final boolean autoVisit) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_AUTO_VISIT_TRACKABLES, autoVisit); - } - }); + putBoolean(KEY_AUTO_VISIT_TRACKABLES, autoVisit); } public static boolean isAutoInsertSignature() { return sharedPrefs.getBoolean(KEY_AUTO_INSERT_SIGNATURE, false); } + // TODO: remove with SettingsActivity public static void setAutoInsertSignature(final boolean autoInsert) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_AUTO_INSERT_SIGNATURE, autoInsert); - } - }); + putBoolean(KEY_AUTO_INSERT_SIGNATURE, autoInsert); } - public static boolean isUseMetricUnits() { - return sharedPrefs.getBoolean(KEY_METRIC_UNITS, true); + public static boolean isUseImperialUnits() { + return sharedPrefs.getBoolean(KEY_IMPERIAL_UNITS, false); } - public static void setUseMetricUnits(final boolean metric) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_METRIC_UNITS, metric); - } - }); + // TODO: remove with SettingsActivity + public static void setUseImperialUnits(final boolean imperial) { + putBoolean(KEY_IMPERIAL_UNITS, imperial); } public static boolean isLiveMap() { return sharedPrefs.getBoolean(KEY_MAP_LIVE, true); } + public static void setLiveMap(final boolean live) { + putBoolean(KEY_MAP_LIVE, live); + } + public static boolean isMapTrail() { return sharedPrefs.getBoolean(KEY_MAP_TRAIL, true); } public static void setMapTrail(final boolean showTrail) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_MAP_TRAIL, showTrail); - } - }); + putBoolean(KEY_MAP_TRAIL, showTrail); } public static int getMapZoom() { @@ -902,13 +773,7 @@ public final class Settings { } public static void setMapZoom(final int mapZoomLevel) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LAST_MAP_ZOOM, mapZoomLevel); - } - }); + putInt(KEY_LAST_MAP_ZOOM, mapZoomLevel); } public static GeoPointImpl getMapCenter() { @@ -918,14 +783,8 @@ public final class Settings { } public static void setMapCenter(final GeoPointImpl mapViewCenter) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LAST_MAP_LAT, mapViewCenter.getLatitudeE6()); - edit.putInt(KEY_LAST_MAP_LON, mapViewCenter.getLongitudeE6()); - } - }); + putInt(KEY_LAST_MAP_LAT, mapViewCenter.getLatitudeE6()); + putInt(KEY_LAST_MAP_LON, mapViewCenter.getLongitudeE6()); } public static MapSource getMapSource() { @@ -956,7 +815,10 @@ public final class Settings { * @return */ private static int getConvertedMapId() { - final int id = sharedPrefs.getInt(KEY_MAP_SOURCE, 0); + // what the heck is happening here?? hashCodes of Strings? + // why not strings? + final int id = Integer.parseInt(sharedPrefs.getString(KEY_MAP_SOURCE, + String.valueOf(MAP_SOURCE_DEFAULT))); switch (id) { case GOOGLEMAP_BASEID + MAP: return GoogleMapProvider.GOOGLE_MAP_ID.hashCode(); @@ -983,33 +845,20 @@ public final class Settings { if (!MapProviderFactory.isSameActivity(getMapSource(), newMapSource)) { mapProvider = null; } - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_MAP_SOURCE, newMapSource.getNumericalId()); - } - }); + putString(KEY_MAP_SOURCE, String.valueOf(newMapSource.getNumericalId())); if (newMapSource instanceof OfflineMapSource) { setMapFile(((OfflineMapSource) newMapSource).getFileName()); } } public static void setAnyCoordinates(final Geopoint coords) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - if (null != coords) { - edit.putFloat(KEY_ANYLATITUDE, (float) coords.getLatitude()); - edit.putFloat(KEY_ANYLONGITUDE, (float) coords.getLongitude()); - } else { - edit.remove(KEY_ANYLATITUDE); - edit.remove(KEY_ANYLONGITUDE); - } - } - }); - + if (null != coords) { + putFloat(KEY_ANYLATITUDE, (float) coords.getLatitude()); + putFloat(KEY_ANYLONGITUDE, (float) coords.getLongitude()); + } else { + remove(KEY_ANYLATITUDE); + remove(KEY_ANYLONGITUDE); + } } public static Geopoint getAnyCoordinates() { @@ -1026,41 +875,16 @@ public final class Settings { } public static void setUseCompass(final boolean useCompass) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_USE_COMPASS, useCompass); - } - }); - } - - public static boolean isHelpShown() { - return sharedPrefs.getBoolean(KEY_HELP_SHOWN, false); - } - - public static void setHelpShown() { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_HELP_SHOWN, true); - } - }); + putBoolean(KEY_USE_COMPASS, useCompass); } public static boolean isLightSkin() { return sharedPrefs.getBoolean(KEY_SKIN, false); } + // TODO: remove with SettingsActivity public static void setLightSkin(final boolean lightSkin) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_SKIN, lightSkin); - } - }); + putBoolean(KEY_SKIN, lightSkin); } public static String getKeyConsumerPublic() { @@ -1071,18 +895,13 @@ public final class Settings { return keyConsumerSecret; } - public static int getAltCorrection() { + public static int getAltitudeCorrection() { return sharedPrefs.getInt(KEY_ALTITUDE_CORRECTION, 0); } - public static boolean setAltCorrection(final int altitude) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_ALTITUDE_CORRECTION, altitude); - } - }); + // TODO: remove with SettingsActivity + public static boolean setAltitudeCorrection(final int altitude) { + return putInt(KEY_ALTITUDE_CORRECTION, altitude); } public static String getWebDeviceCode() { @@ -1090,11 +909,12 @@ public final class Settings { } public static String getWebDeviceName() { - return sharedPrefs.getString(KEY_WEBDEVICE_NAME, null); + return sharedPrefs.getString(KEY_WEBDEVICE_NAME, android.os.Build.MODEL); } /** - * @return The cache type used for filtering or ALL if no filter is active. Returns never null + * @return The cache type used for filtering or ALL if no filter is active. + * Returns never null */ public static CacheType getCacheType() { return CacheType.getById(sharedPrefs.getString(KEY_CACHE_TYPE, CacheType.ALL.id)); @@ -1102,22 +922,14 @@ public final class Settings { /** * The Threshold for the showing of child waypoints - * - * @return */ - public static int getWayPointsThreshold() { - return sharedPrefs.getInt(KEY_SHOW_WAYPOINTS_THRESHOLD, 0); + return sharedPrefs.getInt(KEY_SHOW_WAYPOINTS_THRESHOLD, SHOW_WP_THRESHOLD_DEFAULT); } + // TODO: remove with SettingsActivity public static void setShowWaypointsThreshold(final int threshold) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_SHOW_WAYPOINTS_THRESHOLD, threshold); - } - }); + putInt(KEY_SHOW_WAYPOINTS_THRESHOLD, threshold); } public static boolean isUseTwitter() { @@ -1125,17 +937,12 @@ public final class Settings { } public static void setUseTwitter(final boolean useTwitter) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_USE_TWITTER, useTwitter); - } - }); + putBoolean(KEY_USE_TWITTER, useTwitter); } public static boolean isTwitterLoginValid() { - return !StringUtils.isBlank(getTokenPublic()) && !StringUtils.isBlank(getTokenSecret()); + return !StringUtils.isBlank(getTokenPublic()) + && !StringUtils.isBlank(getTokenSecret()); } public static String getTokenPublic() { @@ -1147,34 +954,21 @@ public final class Settings { } - public static int getVersion() { - return sharedPrefs.getInt(KEY_VERSION, 0); - } - - public static void setTwitterTokens(final String tokenPublic, final String tokenSecret, boolean enableTwitter) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putString(KEY_TWITTER_TOKEN_PUBLIC, tokenPublic); - edit.putString(KEY_TWITTER_TOKEN_SECRET, tokenSecret); - if (tokenPublic != null) { - edit.remove(KEY_TEMP_TWITTER_TOKEN_PUBLIC); - edit.remove(KEY_TEMP_TWITTER_TOKEN_SECRET); - } - } - }); + public static void setTwitterTokens(final String tokenPublic, + final String tokenSecret, boolean enableTwitter) { + putString(KEY_TWITTER_TOKEN_PUBLIC, tokenPublic); + putString(KEY_TWITTER_TOKEN_SECRET, tokenSecret); + if (tokenPublic != null) { + remove(KEY_TEMP_TWITTER_TOKEN_PUBLIC); + remove(KEY_TEMP_TWITTER_TOKEN_SECRET); + } setUseTwitter(enableTwitter); } - public static void setTwitterTempTokens(final String tokenPublic, final String tokenSecret) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_TEMP_TWITTER_TOKEN_PUBLIC, tokenPublic); - edit.putString(KEY_TEMP_TWITTER_TOKEN_SECRET, tokenSecret); - } - }); + public static void setTwitterTempTokens(final String tokenPublic, + final String tokenSecret) { + putString(KEY_TEMP_TWITTER_TOKEN_PUBLIC, tokenPublic); + putString(KEY_TEMP_TWITTER_TOKEN_SECRET, tokenSecret); } public static ImmutablePair<String, String> getTempToken() { @@ -1183,28 +977,21 @@ public final class Settings { return new ImmutablePair<String, String>(tokenPublic, tokenSecret); } - public static void setVersion(final int version) { - editSharedSettings(new PrefRunnable() { + public static int getVersion() { + return sharedPrefs.getInt(KEY_VERSION, 0); + } - @Override - public void edit(Editor edit) { - edit.putInt(KEY_VERSION, version); - } - }); + public static void setVersion(final int version) { + putInt(KEY_VERSION, version); } public static boolean isOpenLastDetailsPage() { return sharedPrefs.getBoolean(KEY_OPEN_LAST_DETAILS_PAGE, false); } + // TODO: remove with SettingsActivity public static void setOpenLastDetailsPage(final boolean openLastPage) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_OPEN_LAST_DETAILS_PAGE, openLastPage); - } - }); + putBoolean(KEY_OPEN_LAST_DETAILS_PAGE, openLastPage); } public static int getLastDetailsPage() { @@ -1212,41 +999,29 @@ public final class Settings { } public static void setLastDetailsPage(final int index) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LAST_DETAILS_PAGE, index); - } - }); + putInt(KEY_LAST_DETAILS_PAGE, index); } public static int getDefaultNavigationTool() { - return sharedPrefs.getInt(KEY_DEFAULT_NAVIGATION_TOOL, NavigationAppsEnum.COMPASS.id); + return Integer.parseInt(sharedPrefs.getString( + KEY_DEFAULT_NAVIGATION_TOOL, + String.valueOf(NavigationAppsEnum.COMPASS.id))); } public static void setDefaultNavigationTool(final int defaultNavigationTool) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_DEFAULT_NAVIGATION_TOOL, defaultNavigationTool); - } - }); + putString(KEY_DEFAULT_NAVIGATION_TOOL, + String.valueOf(defaultNavigationTool)); } public static int getDefaultNavigationTool2() { - return sharedPrefs.getInt(KEY_DEFAULT_NAVIGATION_TOOL_2, NavigationAppsEnum.INTERNAL_MAP.id); + return Integer.parseInt(sharedPrefs.getString( + KEY_DEFAULT_NAVIGATION_TOOL_2, + String.valueOf(NavigationAppsEnum.INTERNAL_MAP.id))); } public static void setDefaultNavigationTool2(final int defaultNavigationTool) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_DEFAULT_NAVIGATION_TOOL_2, defaultNavigationTool); - } - }); + putString(KEY_DEFAULT_NAVIGATION_TOOL_2, + String.valueOf(defaultNavigationTool)); } public static Strategy getLiveMapStrategy() { @@ -1254,28 +1029,17 @@ public final class Settings { } public static void setLiveMapStrategy(final Strategy strategy) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LIVE_MAP_STRATEGY, strategy.id); - } - }); + putInt(KEY_LIVE_MAP_STRATEGY, strategy.id); } public static boolean isDebug() { return Log.isDebug(); } + // TODO: remove with SettingsActivity public static void setDebug(final boolean debug) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_DEBUG, debug); - } - }); - Log.setDebugUnsaved(debug); + putBoolean(KEY_DEBUG, debug); + Log.setDebug(debug); } public static boolean getHideLiveMapHint() { @@ -1283,13 +1047,7 @@ public final class Settings { } public static void setHideLiveHint(final boolean hide) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_HIDE_LIVE_MAP_HINT, hide); - } - }); + putBoolean(KEY_HIDE_LIVE_MAP_HINT, hide); } public static int getLiveMapHintShowCount() { @@ -1297,13 +1055,7 @@ public final class Settings { } public static void setLiveMapHintShowCount(final int showCount) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LIVE_MAP_HINT_SHOW_COUNT, showCount); - } - }); + putInt(KEY_LIVE_MAP_HINT_SHOW_COUNT, showCount); } public static boolean isDbOnSDCard() { @@ -1311,38 +1063,27 @@ public final class Settings { } public static void setDbOnSDCard(final boolean dbOnSDCard) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_DB_ON_SDCARD, dbOnSDCard); - } - }); + putBoolean(KEY_DB_ON_SDCARD, dbOnSDCard); } public static String getGpxExportDir() { - return sharedPrefs.getString(KEY_GPX_EXPORT_DIR, Environment.getExternalStorageDirectory().getPath() + "/gpx"); + return sharedPrefs.getString(KEY_GPX_EXPORT_DIR, + Environment.getExternalStorageDirectory().getPath() + "/gpx"); } + // TODO: remove with SettingsActivity public static void setGpxExportDir(final String gpxExportDir) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_GPX_EXPORT_DIR, gpxExportDir); - } - }); + putString(KEY_GPX_EXPORT_DIR, gpxExportDir); } public static String getGpxImportDir() { - return sharedPrefs.getString(KEY_GPX_IMPORT_DIR, Environment.getExternalStorageDirectory().getPath() + "/gpx"); + return sharedPrefs.getString(KEY_GPX_IMPORT_DIR, + Environment.getExternalStorageDirectory().getPath() + "/gpx"); } + // TODO: remove with SettingsActivity public static void setGpxImportDir(final String gpxImportDir) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putString(KEY_GPX_IMPORT_DIR, gpxImportDir); - } - }); + putString(KEY_GPX_IMPORT_DIR, gpxImportDir); } public static boolean getShareAfterExport() { @@ -1350,12 +1091,7 @@ public final class Settings { } public static void setShareAfterExport(final boolean shareAfterExport) { - editSharedSettings(new PrefRunnable() { - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_SHARE_AFTER_EXPORT, shareAfterExport); - } - }); + putBoolean(KEY_SHARE_AFTER_EXPORT, shareAfterExport); } public static int getTrackableAction() { @@ -1363,27 +1099,16 @@ public final class Settings { } public static void setTrackableAction(final int trackableAction) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LAST_TRACKABLE_ACTION, trackableAction); - } - }); + putInt(KEY_LAST_TRACKABLE_ACTION, trackableAction); } public static String getCustomRenderThemeBaseFolder() { return sharedPrefs.getString(KEY_RENDER_THEME_BASE_FOLDER, ""); } - public static boolean setCustomRenderThemeBaseFolder(final String customRenderThemeBaseFolder) { - return editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putString(KEY_RENDER_THEME_BASE_FOLDER, customRenderThemeBaseFolder); - } - }); + // TODO: remove with SettingsActivity + public static boolean setCustomRenderThemeBaseFolder(final String folder) { + return putString(KEY_RENDER_THEME_BASE_FOLDER, folder); } public static String getCustomRenderThemeFilePath() { @@ -1391,34 +1116,22 @@ public final class Settings { } public static void setCustomRenderThemeFile(final String customRenderThemeFile) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putString(KEY_RENDER_THEME_FILE_PATH, customRenderThemeFile); - } - }); + putString(KEY_RENDER_THEME_FILE_PATH, customRenderThemeFile); } public static File[] getMapThemeFiles() { - File directory = new File(Settings.getCustomRenderThemeBaseFolder()); - List<File> result = new ArrayList<File>(); - FileUtils.listDir(result, directory, new ExtensionsBasedFileSelector(new String[] { "xml" }), null); return result.toArray(new File[result.size()]); } private static class ExtensionsBasedFileSelector extends FileSelector { - private final String[] extensions; - public ExtensionsBasedFileSelector(String[] extensions) { this.extensions = extensions; } - @Override public boolean isSelected(File file) { String filename = file.getName(); @@ -1429,7 +1142,6 @@ public final class Settings { } return false; } - @Override public boolean shouldEnd() { return false; @@ -1440,28 +1152,18 @@ public final class Settings { return sharedPrefs.getBoolean(KEY_PLAIN_LOGS, false); } + // TODO: remove with SettingsActivity public static void setPlainLogs(final boolean plainLogs) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_PLAIN_LOGS, plainLogs); - } - }); + putBoolean(KEY_PLAIN_LOGS, plainLogs); } public static boolean getUseNativeUa() { return sharedPrefs.getBoolean(KEY_NATIVE_UA, false); } + // TODO: remove with SettingsActivity public static void setUseNativeUa(final boolean useNativeUa) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putBoolean(KEY_NATIVE_UA, useNativeUa); - } - }); + putBoolean(KEY_NATIVE_UA, useNativeUa); } public static String getCacheTwitterMessage() { @@ -1474,21 +1176,11 @@ public final class Settings { return "I touched [NAME] ([URL])!"; } - public static void setCacheTwitterMessage(final String message) { - cacheTwitterMessage = message; - } - public static int getLogImageScale() { return sharedPrefs.getInt(KEY_LOG_IMAGE_SCALE, -1); } public static void setLogImageScale(final int scale) { - editSharedSettings(new PrefRunnable() { - - @Override - public void edit(Editor edit) { - edit.putInt(KEY_LOG_IMAGE_SCALE, scale); - } - }); + putInt(KEY_LOG_IMAGE_SCALE, scale); } } diff --git a/main/src/cgeo/geocaching/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index 872d5ee..e8ce1ff 100644 --- a/main/src/cgeo/geocaching/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -1,6 +1,11 @@ -package cgeo.geocaching; +package cgeo.geocaching.settings; +import cgeo.geocaching.Intents; +import cgeo.geocaching.R; +import cgeo.geocaching.SelectMapfileActivity; +import cgeo.geocaching.cgData; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; import cgeo.geocaching.compatibility.Compatibility; @@ -206,7 +211,7 @@ public class SettingsActivity extends AbstractActivity { private boolean insertSignatureTemplate(final LogTemplate template) { EditText sig = (EditText) findViewById(R.id.signature); String insertText = "[" + template.getTemplateString() + "]"; - insertAtPosition(sig, insertText, true); + ActivityMixin.insertAtPosition(sig, insertText, true); return true; } @@ -222,7 +227,7 @@ public class SettingsActivity extends AbstractActivity { Settings.setGCConnectorActive(gcCheck.isChecked()); } }); - final ImmutablePair<String, String> login = Settings.getLogin(); + final ImmutablePair<String, String> login = Settings.getGcLogin(); if (login != null) { ((EditText) findViewById(R.id.username)).setText(login.left); ((EditText) findViewById(R.id.password)).setText(login.right); @@ -499,12 +504,12 @@ public class SettingsActivity extends AbstractActivity { }); final CheckBox unitsButton = (CheckBox) findViewById(R.id.units); - unitsButton.setChecked(!Settings.isUseMetricUnits()); + unitsButton.setChecked(Settings.isUseImperialUnits()); unitsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Settings.setUseMetricUnits(!unitsButton.isChecked()); + Settings.setUseImperialUnits(unitsButton.isChecked()); } }); @@ -555,17 +560,12 @@ public class SettingsActivity extends AbstractActivity { // Altitude settings EditText altitudeEdit = (EditText) findViewById(R.id.altitude); - altitudeEdit.setText(String.valueOf(Settings.getAltCorrection())); + altitudeEdit.setText(String.valueOf(Settings.getAltitudeCorrection())); //Send2cgeo settings String webDeviceName = Settings.getWebDeviceName(); - if (StringUtils.isNotBlank(webDeviceName)) { - ((EditText) findViewById(R.id.webDeviceName)).setText(webDeviceName); - } else { - String s = android.os.Build.MODEL; - ((EditText) findViewById(R.id.webDeviceName)).setText(s); - } + ((EditText) findViewById(R.id.webDeviceName)).setText(webDeviceName); Button webAuth = (Button) findViewById(R.id.sendToCgeo_register); webAuth.setOnClickListener(new WebAuthListener()); @@ -751,7 +751,9 @@ public class SettingsActivity extends AbstractActivity { mapSourceNames.add(mapSource.getName()); } Spinner mapSourceSelector = (Spinner) findViewById(R.id.mapsource); - ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, mapSourceNames.toArray(new String[mapSourceNames.size()])); + ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, + android.R.layout.simple_spinner_item, + mapSourceNames.toArray(new String[mapSourceNames.size()])); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mapSourceSelector.setAdapter(adapter); final int index = MapProviderFactory.getMapSources().indexOf(Settings.getMapSource()); @@ -842,15 +844,15 @@ public class SettingsActivity extends AbstractActivity { int altitudeNewInt = parseNumber(altitudeNew, 0); TextView field = (TextView) findViewById(R.id.showwaypointsthreshold); - final int waypointThreshold = parseNumber(field.getText().toString(), 5); + Settings.setShowWaypointsThreshold(parseNumber(field.getText().toString(), + Settings.SHOW_WP_THRESHOLD_DEFAULT)); final boolean status1 = Settings.setLogin(usernameNew, passwordNew); final boolean status2 = Settings.setGCvoteLogin(passvoteNew); final boolean status3 = Settings.setSignature(signatureNew); - final boolean status4 = Settings.setAltCorrection(altitudeNewInt); + final boolean status4 = Settings.setAltitudeCorrection(altitudeNewInt); final boolean status5 = Settings.setMapFileDirectory(mapDirectoryNew); final boolean status6 = Settings.setCustomRenderThemeBaseFolder(themesDirectoryNew); - Settings.setShowWaypointsThreshold(waypointThreshold); String importNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.gpx_importdir)).getText().toString()); String exportNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.gpx_exportdir)).getText().toString()); @@ -904,7 +906,9 @@ public class SettingsActivity extends AbstractActivity { return; } - loginDialog = ProgressDialog.show(SettingsActivity.this, res.getString(R.string.init_login_popup), res.getString(R.string.init_login_popup_working), true); + loginDialog = ProgressDialog.show(SettingsActivity.this, + res.getString(R.string.init_login_popup), + res.getString(R.string.init_login_popup_working), true); loginDialog.setCancelable(false); Settings.setLogin(username, password); diff --git a/main/src/cgeo/geocaching/settings/TextPreference.java b/main/src/cgeo/geocaching/settings/TextPreference.java new file mode 100644 index 0000000..bcd03ff --- /dev/null +++ b/main/src/cgeo/geocaching/settings/TextPreference.java @@ -0,0 +1,86 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +/** + * Preference to simply show a text message. + * <p> + * Links are not shown - I tried everything (koem) + * <p> + * example: <cgeo.geocaching.settings.TextPreference android:text="@string/legal_note" + * android:layout="@string/text_preference_default_layout" /> + */ +public class TextPreference extends Preference { + + private String text; + private TextView summaryView; + private CharSequence summaryText; + + public TextPreference(Context context) { + super(context); + } + + public TextPreference(Context context, AttributeSet attrs) { + super(context, attrs); + processAttributes(context, attrs, 0); + } + + public TextPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + processAttributes(context, attrs, defStyle); + } + + private void processAttributes(Context context, AttributeSet attrs, int defStyle) { + if (attrs == null) { + return; + } + + TypedArray types = context.obtainStyledAttributes(attrs, new int[] { + android.R.attr.text }, defStyle, 0); + this.text = types.getString(0); + types.recycle(); + } + + @Override + protected View onCreateView(ViewGroup parent) { + this.setSelectable(false); + + View v = super.onCreateView(parent); + + TextView text = (TextView) v.findViewById(R.id.textPreferenceText); + text.setText(this.text); + + summaryView = (TextView) v.findViewById(R.id.textPreferenceSummary); + setSummary(null); // show saved summary text + + return v; + } + + @Override + public void setSummary(CharSequence summaryText) { + // the layout hasn't been inflated yet, save the summaryText for later use + if (this.summaryView == null) { + this.summaryText = summaryText; + return; + } + + // if summaryText is null, take it from the previous saved summary + if (summaryText == null) { + if (this.summaryText == null) { + return; + } + this.summaryView.setText(this.summaryText); + } else { + this.summaryView.setText(summaryText); + } + this.summaryView.setVisibility(View.VISIBLE); + } +} diff --git a/main/src/cgeo/geocaching/settings/WpThresholdPreference.java b/main/src/cgeo/geocaching/settings/WpThresholdPreference.java new file mode 100644 index 0000000..867714f --- /dev/null +++ b/main/src/cgeo/geocaching/settings/WpThresholdPreference.java @@ -0,0 +1,73 @@ +package cgeo.geocaching.settings; + +import cgeo.geocaching.R; +import cgeo.geocaching.settings.Settings; + +import android.content.Context; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; +import android.widget.TextView; + +public class WpThresholdPreference extends Preference { + + TextView valueView; + + public WpThresholdPreference(Context context) { + super(context); + init(); + } + + public WpThresholdPreference(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public WpThresholdPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + setPersistent(false); + } + + @Override + protected View onCreateView(ViewGroup parent) { + View v = super.onCreateView(parent); + + // get views + SeekBar seekBar = (SeekBar) v.findViewById(R.id.wp_threshold_seekbar); + valueView = (TextView) v.findViewById(R.id.wp_threshold_value_view); + + // init seekbar + seekBar.setMax(Settings.SHOW_WP_THRESHOLD_MAX); + + // set initial value + int threshold = Settings.getWayPointsThreshold(); + valueView.setText(String.valueOf(threshold)); + seekBar.setProgress(threshold); + + seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + valueView.setText(String.valueOf(progress)); + } + } + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + Settings.setShowWaypointsThreshold(seekBar.getProgress()); + } + }); + + return v; + } + +} diff --git a/main/src/cgeo/geocaching/speech/SpeechService.java b/main/src/cgeo/geocaching/speech/SpeechService.java index 7bc948d..eac44ff 100644 --- a/main/src/cgeo/geocaching/speech/SpeechService.java +++ b/main/src/cgeo/geocaching/speech/SpeechService.java @@ -1,7 +1,7 @@ package cgeo.geocaching.speech; import cgeo.geocaching.DirectionProvider; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; diff --git a/main/src/cgeo/geocaching/speech/TextFactory.java b/main/src/cgeo/geocaching/speech/TextFactory.java index e367bb1..81a74fb 100644 --- a/main/src/cgeo/geocaching/speech/TextFactory.java +++ b/main/src/cgeo/geocaching/speech/TextFactory.java @@ -1,7 +1,7 @@ package cgeo.geocaching.speech; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.IConversion; @@ -24,17 +24,17 @@ public class TextFactory { private static String getDistance(Geopoint position, Geopoint target) { final float kilometers = position.distanceTo(target); - if (Settings.isUseMetricUnits()) { - return getDistance(kilometers, (int) (kilometers * 1000.0), - 5.0f, 1.0f, 50, - R.plurals.tts_kilometers, R.string.tts_one_kilometer, - R.plurals.tts_meters, R.string.tts_one_meter); + if (Settings.isUseImperialUnits()) { + return getDistance(kilometers / IConversion.MILES_TO_KILOMETER, + (int) (kilometers * 1000.0 * IConversion.METERS_TO_FEET), + 3.0f, 0.2f, 300, + R.plurals.tts_miles, R.string.tts_one_mile, + R.plurals.tts_feet, R.string.tts_one_foot); } - return getDistance(kilometers / IConversion.MILES_TO_KILOMETER, - (int) (kilometers * 1000.0 * IConversion.METERS_TO_FEET), - 3.0f, 0.2f, 300, - R.plurals.tts_miles, R.string.tts_one_mile, - R.plurals.tts_feet, R.string.tts_one_foot); + return getDistance(kilometers, (int) (kilometers * 1000.0), + 5.0f, 1.0f, 50, + R.plurals.tts_kilometers, R.string.tts_one_kilometer, + R.plurals.tts_meters, R.string.tts_one_meter); } private static String getDistance(float farDistance, int nearDistance, diff --git a/main/src/cgeo/geocaching/twitter/Twitter.java b/main/src/cgeo/geocaching/twitter/Twitter.java index 3f1f749..a6ce7d2 100644 --- a/main/src/cgeo/geocaching/twitter/Twitter.java +++ b/main/src/cgeo/geocaching/twitter/Twitter.java @@ -1,7 +1,7 @@ package cgeo.geocaching.twitter; import cgeo.geocaching.Geocache; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.Trackable; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; @@ -60,10 +60,7 @@ public final class Twitter { } public static void postTweetCache(String geocode) { - if (!Settings.isUseTwitter()) { - return; - } - if (!Settings.isTwitterLoginValid()) { + if (!Settings.isUseTwitter() || !Settings.isTwitterLoginValid()) { return; } final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); diff --git a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java index 7146a62..6b185267 100644 --- a/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/twitter/TwitterAuthorizationActivity.java @@ -1,7 +1,7 @@ package cgeo.geocaching.twitter; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.network.OAuthAuthorizationActivity; import org.apache.commons.lang3.tuple.ImmutablePair; diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 1ef4561..3179857 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -6,7 +6,7 @@ import cgeo.geocaching.CacheDetailActivity; import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheListType; import cgeo.geocaching.enumerations.CacheType; diff --git a/main/src/cgeo/geocaching/ui/CompassMiniView.java b/main/src/cgeo/geocaching/ui/CompassMiniView.java index da8f69e..92280dc 100644 --- a/main/src/cgeo/geocaching/ui/CompassMiniView.java +++ b/main/src/cgeo/geocaching/ui/CompassMiniView.java @@ -1,7 +1,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.utils.AngleUtils; diff --git a/main/src/cgeo/geocaching/ui/LoggingUI.java b/main/src/cgeo/geocaching/ui/LoggingUI.java index ac74dd3..0ee724a 100644 --- a/main/src/cgeo/geocaching/ui/LoggingUI.java +++ b/main/src/cgeo/geocaching/ui/LoggingUI.java @@ -3,7 +3,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.Geocache; import cgeo.geocaching.LogEntry; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.activity.IAbstractActivity; import cgeo.geocaching.enumerations.LogType; diff --git a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java index 60116f9..959cb14 100644 --- a/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java +++ b/main/src/cgeo/geocaching/ui/dialog/CoordinatesInputDialog.java @@ -3,8 +3,8 @@ package cgeo.geocaching.ui.dialog; import cgeo.geocaching.Geocache; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; -import cgeo.geocaching.Settings.coordInputFormatEnum; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.settings.Settings.coordInputFormatEnum; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.compatibility.Compatibility; diff --git a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java index 862b1a0..2c4f38d 100644 --- a/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java +++ b/main/src/cgeo/geocaching/ui/dialog/LiveMapInfoDialogBuilder.java @@ -1,7 +1,7 @@ package cgeo.geocaching.ui.dialog; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import android.app.Activity; diff --git a/main/src/cgeo/geocaching/utils/GeoDirHandler.java b/main/src/cgeo/geocaching/utils/GeoDirHandler.java index 78455c4..98a2287 100644 --- a/main/src/cgeo/geocaching/utils/GeoDirHandler.java +++ b/main/src/cgeo/geocaching/utils/GeoDirHandler.java @@ -1,7 +1,7 @@ package cgeo.geocaching.utils; import cgeo.geocaching.IGeoData; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.cgeoapplication; import android.os.Handler; diff --git a/main/src/cgeo/geocaching/utils/Log.java b/main/src/cgeo/geocaching/utils/Log.java index f912ddd..f7f33d9 100644 --- a/main/src/cgeo/geocaching/utils/Log.java +++ b/main/src/cgeo/geocaching/utils/Log.java @@ -23,11 +23,11 @@ final public class Log { } /** - * make a non persisted copy of the debug flag from the settings for performance reasons - * + * save a copy of the debug flag from the settings for performance reasons + * * @param isDebug */ - public static void setDebugUnsaved(boolean isDebug) { + public static void setDebug(boolean isDebug) { Log.isDebug = isDebug; } diff --git a/main/src/cgeo/geocaching/utils/LogTemplateProvider.java b/main/src/cgeo/geocaching/utils/LogTemplateProvider.java index 2576e64..6d5f130 100644 --- a/main/src/cgeo/geocaching/utils/LogTemplateProvider.java +++ b/main/src/cgeo/geocaching/utils/LogTemplateProvider.java @@ -1,7 +1,7 @@ package cgeo.geocaching.utils; import cgeo.geocaching.R; -import cgeo.geocaching.Settings; +import cgeo.geocaching.settings.Settings; import cgeo.geocaching.Trackable; import cgeo.geocaching.Geocache; import cgeo.geocaching.connector.gc.GCConstants; |
