diff options
| -rw-r--r-- | main/res/values/preference_keys.xml | 1 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 3 | ||||
| -rw-r--r-- | main/res/xml/preferences.xml | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CgeoApplication.java | 22 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/settings/Settings.java | 6 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/settings/SettingsActivity.java | 25 |
6 files changed, 38 insertions, 24 deletions
diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml index 47eae46..e8840f5 100644 --- a/main/res/values/preference_keys.xml +++ b/main/res/values/preference_keys.xml @@ -107,6 +107,7 @@ <string name="pref_gccustomdate">gccustomdate</string> <string name="pref_cookiestore">cookiestore</string> <string name="pref_googleplayservices">googleplayservices</string> + <string name="pref_lowpowermode">lowpowerlocation</string> <string name="pref_lastdetailspage">lastdetailspage</string> <string name="pref_livemapstrategy">livemapstrategy</string> <string name="pref_livemaphintshowcount">livemaphintshowcount</string> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index ec01a10..e3f7825 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -529,8 +529,9 @@ <string name="init_maintenance_directories_note">c:geo stores images, log images and other files related to a cache in a separate directory. In some cases (like importing/exporting the database) this directory may contain outdated files, which can be deleted here.</string> <string name="init_maintenance_directories">Delete orphaned files</string> <string name="init_location">Geolocation</string> - <string name="init_location_note">On devices equipped with Google Play Services, c:geo can automatically use a better geolocation provider. However, this prevents the use of an external BlueTooth GPS receiver.</string> + <string name="init_location_note">On devices equipped with Google Play Services, c:geo can automatically use a better geolocation provider. However, this prevents the use of an external BlueTooth GPS receiver. Also, a low-power mode can prevent the use of the GPS when a highly accurate location is not strictly necessary.</string> <string name="init_location_googleplayservices">Use Google Play Services</string> + <string name="init_location_lowpower">Low-power mode</string> <string name="init_create_memory_dump">Create memory dump</string> <string name="init_memory_dump">Memory dump</string> <string name="init_memory_dumped">Memory dumped to %s</string> diff --git a/main/res/xml/preferences.xml b/main/res/xml/preferences.xml index 6d7f546..54b3353 100644 --- a/main/res/xml/preferences.xml +++ b/main/res/xml/preferences.xml @@ -749,10 +749,15 @@ <cgeo.geocaching.settings.TextPreference android:layout="@layout/text_preference" android:text="@string/init_location_note" /> + <CheckBoxPreference android:defaultValue="true" android:key="@string/pref_googleplayservices" android:title="@string/init_location_googleplayservices" /> + <CheckBoxPreference + android:defaultValue="false" + android:key="@string/pref_lowpowermode" + android:title="@string/init_location_lowpower" /> </PreferenceCategory> <PreferenceCategory android:title="@string/init_debug_title" > <cgeo.geocaching.settings.TextPreference diff --git a/main/src/cgeo/geocaching/CgeoApplication.java b/main/src/cgeo/geocaching/CgeoApplication.java index b461ec8..4688266 100644 --- a/main/src/cgeo/geocaching/CgeoApplication.java +++ b/main/src/cgeo/geocaching/CgeoApplication.java @@ -85,7 +85,7 @@ public class CgeoApplication extends Application { isGooglePlayServicesAvailable = true; } Log.i("Google Play services are " + (isGooglePlayServicesAvailable ? "" : "not ") + "available"); - setupGeoDataObservables(Settings.useGooglePlayServices()); + setupGeoDataObservables(Settings.useGooglePlayServices(), Settings.useLowPowerMode()); geoDataObservableLowPower.subscribeOn(RxUtils.looperCallbacksScheduler).first().subscribe(REMEMBER_GEODATA); directionObservable = DirectionProvider.create(this).replay(1).refCount().doOnNext(new Action1<Float>() { @Override @@ -96,21 +96,17 @@ public class CgeoApplication extends Application { gpsStatusObservable = GpsStatusProvider.create(this).share(); } - public void setupGeoDataObservables(final boolean useGooglePlayServices) { - final Action1<IGeoData> rememberGeoData = new Action1<IGeoData>() { - @Override - public void call(final IGeoData geoData) { - currentGeo = geoData; + public void setupGeoDataObservables(final boolean useGooglePlayServices, final boolean useLowPowerLocation) { + if (useGooglePlayServices) { + geoDataObservable = LocationProvider.getMostPrecise(this, true).replay(1).refCount().doOnNext(REMEMBER_GEODATA); + if (useLowPowerLocation) { + geoDataObservableLowPower = LocationProvider.getLowPower(this, true).replay(1).refCount().doOnNext(REMEMBER_GEODATA); + } else { + geoDataObservableLowPower = geoDataObservable; } - }; - if (isGooglePlayServicesAvailable) { - geoDataObservable = LocationProvider.getMostPrecise(this, true).replay(1).refCount().doOnNext(rememberGeoData); - geoDataObservableLowPower = LocationProvider.getLowPower(this, true).replay(1).refCount().doOnNext(rememberGeoData); - LocationProvider.getInitialLocation(this, false).subscribeOn(RxUtils.looperCallbacksScheduler).subscribe(rememberGeoData); } else { - geoDataObservable = GeoDataProvider.create(this).replay(1).refCount().doOnNext(rememberGeoData); + geoDataObservable = GeoDataProvider.create(this).replay(1).refCount().doOnNext(REMEMBER_GEODATA); geoDataObservableLowPower = geoDataObservable; - geoDataObservable.first().subscribeOn(RxUtils.looperCallbacksScheduler).subscribe(rememberGeoData); } } diff --git a/main/src/cgeo/geocaching/settings/Settings.java b/main/src/cgeo/geocaching/settings/Settings.java index c434d9f..6b9cbd5 100644 --- a/main/src/cgeo/geocaching/settings/Settings.java +++ b/main/src/cgeo/geocaching/settings/Settings.java @@ -394,11 +394,11 @@ public class Settings { } public static boolean useGooglePlayServices() { - return getBoolean(R.string.pref_googleplayservices, true); + return CgeoApplication.getInstance().isGooglePlayServicesAvailable() && getBoolean(R.string.pref_googleplayservices, true); } - public static boolean setUseGooglePlayServices(final boolean useGooglePlayServices) { - return putBoolean(R.string.pref_googleplayservices, useGooglePlayServices); + public static boolean useLowPowerMode() { + return useGooglePlayServices() && getBoolean(R.string.pref_lowpowermode, false); } /** diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index 9001aeb..5297857 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -365,12 +365,13 @@ public class SettingsActivity extends PreferenceActivity { final Preference memoryDumpPref = getPreference(R.string.pref_memory_dump); memoryDumpPref .setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override public boolean onPreferenceClick( - final Preference preference) { - DebugUtils.createMemoryDump(SettingsActivity.this); - return true; - } - }); + @Override + public boolean onPreferenceClick( + final Preference preference) { + DebugUtils.createMemoryDump(SettingsActivity.this); + return true; + } + }); } private void initDbLocationPreference() { @@ -401,15 +402,25 @@ public class SettingsActivity extends PreferenceActivity { private void initGeolocationPreference() { final Preference p = getPreference(R.string.pref_googleplayservices); + final Preference p2 = getPreference(R.string.pref_lowpowermode); p.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(final Preference preference, final Object newValue) { final boolean useGooglePlayServices = (Boolean) newValue; - CgeoApplication.getInstance().setupGeoDataObservables(useGooglePlayServices); + p2.setEnabled(useGooglePlayServices); + CgeoApplication.getInstance().setupGeoDataObservables(useGooglePlayServices, Settings.useLowPowerMode()); + return true; + } + }); + p2.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(final Preference preference, final Object newValue) { + CgeoApplication.getInstance().setupGeoDataObservables(Settings.useGooglePlayServices(), (Boolean) newValue); return true; } }); p.setEnabled(CgeoApplication.getInstance().isGooglePlayServicesAvailable()); + p2.setEnabled(Settings.useGooglePlayServices()); } void initBasicMemberPreferences() { |
