diff --git a/mobile/plugins/user-location.user.js b/mobile/plugins/user-location.user.js index 03cf5f7e..24a76147 100644 --- a/mobile/plugins/user-location.user.js +++ b/mobile/plugins/user-location.user.js @@ -94,13 +94,25 @@ window.plugin.userLocation.onLocationChange = function(lat, lng) { }; window.plugin.userLocation.onOrientationChange = function(direction) { - $(".container", window.plugin.userLocation.marker._icon) - .removeClass("circle") - .addClass("arrow") - .css({ - "transform": "rotate(" + direction + "deg)", - "webkitTransform": "rotate(" + direction + "deg)" - }); + var container = $(".container", window.plugin.userLocation.marker._icon); + + if(direction === null) { + container + .removeClass("arrow") + .addClass("circle") + .css({ + "transform": "", + "webkitTransform": "" + }); + } else { + container + .removeClass("circle") + .addClass("arrow") + .css({ + "transform": "rotate(" + direction + "deg)", + "webkitTransform": "rotate(" + direction + "deg)" + }); + } } var setup = window.plugin.userLocation.setup; diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml index e6fb797d..3b5c6a26 100644 --- a/mobile/res/values/strings.xml +++ b/mobile/res/values/strings.xml @@ -83,11 +83,7 @@ Tweaks IITC Plugins Available plugins - User location - Display user location - Show users position on map - Use sensor orientation - Experimental! Fancier but eats battery packs for breakfast + Display user location on map Show zoom control Shows +/- buttons even on multitouch capable devices. Hide in fullscreen mode @@ -128,6 +124,16 @@ 8 16 + + Don\'t show user position + Show user position on map + Show user position and orientation on map + + + 0 + 1 + 2 + Clear Cookies Search diff --git a/mobile/res/xml/preferences.xml b/mobile/res/xml/preferences.xml index 089dcebc..7e6d0a8d 100644 --- a/mobile/res/xml/preferences.xml +++ b/mobile/res/xml/preferences.xml @@ -14,33 +14,26 @@ - - - - + + + + android:title="@string/pref_fullscreen"/> + - + android:title="@string/pref_external_storage"/> + android:defaultValue="false" + android:key="pref_press_twice_to_exit" + android:summary="@string/pref_press_twice_to_exit_sum" + android:title="@string/pref_press_twice_to_exit"/> - + \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index 97293ed7..c6d8d07f 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -88,8 +88,7 @@ public class IITC_Mobile extends Activity implements OnSharedPreferenceChangeLis mIitcWebView.updateFullscreenStatus(); mUserLocation = new IITC_UserLocation(this); - mUserLocation.setLocationEnabled(mSharedPrefs.getBoolean("pref_user_loc", false)); - mUserLocation.setSensorEnabled(mSharedPrefs.getBoolean("pref_user_loc_sensor", true)); + mUserLocation.setLocationMode(Integer.parseInt(mSharedPrefs.getString("pref_user_location_mode", "0"))); // pass ActionBar to helper because we deprecated getActionBar mNavigationHelper = new IITC_NavigationHelper(this, super.getActionBar()); @@ -111,10 +110,11 @@ public class IITC_Mobile extends Activity implements OnSharedPreferenceChangeLis if (key.equals("pref_force_desktop")) { mDesktopMode = sharedPreferences.getBoolean("pref_force_desktop", false); mNavigationHelper.onPrefChanged(); - } else if (key.equals("pref_user_loc")) { - mUserLocation.setLocationEnabled(sharedPreferences.getBoolean("pref_user_loc", false)); - } else if (key.equals("pref_user_loc_sensor")) { - mUserLocation.setSensorEnabled(sharedPreferences.getBoolean("pref_user_loc_sensor", true)); + } else if (key.equals("pref_user_location_mode")) { + int mode = Integer.parseInt(mSharedPrefs.getString("pref_user_location_mode", "0")); + if (mUserLocation.setLocationMode(mode)) + mReloadNeeded = true; + return; } else if (key.equals("pref_fullscreen")) { mIitcWebView.updateFullscreenStatus(); mNavigationHelper.onPrefChanged(); @@ -247,43 +247,41 @@ public class IITC_Mobile extends Activity implements OnSharedPreferenceChangeLis protected void onStart() { super.onStart(); - // enough idle...let's do some work - Log.d("iitcm", "resuming...reset idleTimer"); - mUserLocation.onStart(); - if (mReloadNeeded) { Log.d("iitcm", "preference had changed...reload needed"); reloadIITC(); } else { // iitc is not fully booted...timer will be reset by the script itself if (findViewById(R.id.imageLoading).getVisibility() == View.GONE) { + // enough idle...let's do some work + Log.d("iitcm", "resuming...reset idleTimer"); mIitcWebView.loadUrl("javascript: window.idleReset();"); } } + + mUserLocation.onStart(); } @Override protected void onResume() { + super.onResume(); mIitcWebView.resumeTimers(); mIitcWebView.onResume(); - super.onResume(); } @Override protected void onPause() { + super.onPause(); mIitcWebView.pauseTimers(); mIitcWebView.onPause(); - super.onPause(); } @Override protected void onStop() { + super.onStop(); Log.d("iitcm", "stopping iitcm"); mIitcWebView.loadUrl("javascript: window.idleSet();"); - mUserLocation.onStop(); - - super.onStop(); } @Override diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_UserLocation.java b/mobile/src/com/cradle/iitc_mobile/IITC_UserLocation.java index de6834a8..dfa81c67 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_UserLocation.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_UserLocation.java @@ -12,15 +12,15 @@ import android.os.Bundle; import android.view.Surface; public class IITC_UserLocation implements LocationListener, SensorEventListener { - private static final double SENSOR_DELAY_USER = 100*1e6; - private boolean mLocationEnabled = false; - private boolean mSensorEnabled = true; + private static final double SENSOR_DELAY_USER = 100 * 1e6; // 100 milliseconds + private int mMode = 0; + private boolean mRunning = false; + private boolean mLocationRegistered = false; + private boolean mOrientationRegistered = false; private long mLastUpdate = 0; private IITC_Mobile mIitc; private Location mLastLocation = null; private LocationManager mLocationManager; - private boolean mRegistered = false; - private boolean mRunning = false; private Sensor mSensorAccelerometer, mSensorMagnetometer; private SensorManager mSensorManager = null; float[] mValuesGravity = null, mValuesGeomagnetic = null; @@ -35,51 +35,44 @@ public class IITC_UserLocation implements LocationListener, SensorEventListener mSensorMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } - private void registerListeners() { - if (mRegistered) return; - mRegistered = true; + private void updateListeners() { + boolean useLocation = mRunning && mMode != 0; + boolean useOrientation = mRunning && mMode == 2; - try { - mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); - } catch (IllegalArgumentException e) { - // if the given provider doesn't exist - e.printStackTrace(); + if (useLocation && !mLocationRegistered) { + try { + mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); + } catch (IllegalArgumentException e) { + // if the given provider doesn't exist + e.printStackTrace(); + } + try { + mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); + } catch (IllegalArgumentException e) { + // if the given provider doesn't exist + e.printStackTrace(); + } + mLocationRegistered = true; } - try { - mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); - } catch (IllegalArgumentException e) { - // if the given provider doesn't exist - e.printStackTrace(); + if (!useLocation && mLocationRegistered) { + mLocationManager.removeUpdates(this); + mLocationRegistered = false; } - if (mSensorAccelerometer != null && mSensorMagnetometer != null && mSensorEnabled) { + if (useOrientation && !mOrientationRegistered && mSensorAccelerometer != null && mSensorMagnetometer != null) { mSensorManager.registerListener(this, mSensorAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); mSensorManager.registerListener(this, mSensorMagnetometer, SensorManager.SENSOR_DELAY_NORMAL); + mOrientationRegistered = true; } - } - - private void unregisterListeners() { - if (!mRegistered) return; - mRegistered = false; - - mLocationManager.removeUpdates(this); - - if (mSensorAccelerometer != null && mSensorMagnetometer != null && mSensorEnabled) { + if (!useOrientation && mOrientationRegistered && mSensorAccelerometer != null && mSensorMagnetometer != null) { mSensorManager.unregisterListener(this, mSensorAccelerometer); mSensorManager.unregisterListener(this, mSensorMagnetometer); + mOrientationRegistered = false; } - - } - - private void updateListeners() { - if (mRunning && mLocationEnabled) - registerListeners(); - else - unregisterListeners(); } public boolean hasCurrentLocation() { - if (!mRegistered) return false; + if (!mLocationRegistered) return false; return mLastLocation != null; } @@ -98,6 +91,12 @@ public class IITC_UserLocation implements LocationListener, SensorEventListener public void onStart() { mRunning = true; updateListeners(); + + // in case we just switched from loc+sensor to loc-only, let javascript know + if (mMode == 1) { + mIitc.getWebView().loadJS("if(window.plugin && window.plugin.userLocation)" + + "window.plugin.userLocation.onOrientationChange(null);"); + } } public void onStop() { @@ -105,18 +104,19 @@ public class IITC_UserLocation implements LocationListener, SensorEventListener updateListeners(); } - public void setLocationEnabled(boolean enabled) { - if (enabled == mLocationEnabled) return; + /** + * set the location mode to use. Available modes: + * 0: don't show user's position + * 1: show user's position + * 2: show user's position and orientation + * + * @return whether a reload is needed to reflect the changes made to the preferences + */ + public boolean setLocationMode(int mode) { + boolean needsReload = (mode == 0 && mMode != 0) || (mode != 0 && mMode == 0); + mMode = mode; - mLocationEnabled = enabled; - updateListeners(); - } - - public void setSensorEnabled(boolean enabled) { - if (enabled == mSensorEnabled) return; - - mSensorEnabled = enabled; - updateListeners(); + return needsReload; } // ------------------------------------------------------------------------ @@ -140,12 +140,10 @@ public class IITC_UserLocation implements LocationListener, SensorEventListener @Override public void onProviderDisabled(String provider) { - } @Override public void onProviderEnabled(String provider) { - } @Override @@ -165,15 +163,15 @@ public class IITC_UserLocation implements LocationListener, SensorEventListener @Override public void onSensorChanged(SensorEvent event) { - // save some battery 10 updates per second should be enough - if ((event.timestamp - mLastUpdate) < SENSOR_DELAY_USER) return; - mLastUpdate = event.timestamp; - if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mValuesGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mValuesGeomagnetic = event.values; + // save some battery, 10 updates per second should be enough + if ((event.timestamp - mLastUpdate) < SENSOR_DELAY_USER) return; + mLastUpdate = event.timestamp; + // do not touch the javascript while iitc boots if (mIitc.isLoading()) return; diff --git a/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java b/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java index 77ccac2b..461e034b 100644 --- a/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java +++ b/mobile/src/com/cradle/iitc_mobile/fragments/MainSettings.java @@ -6,6 +6,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.EditTextPreference; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; @@ -54,6 +55,20 @@ public class MainSettings extends PreferenceFragment { // first init of summary String pref_iitc_source_sum = getString(R.string.pref_select_iitc_sum) + " " + pref_iitc_source.getText(); pref_iitc_source.setSummary(pref_iitc_source_sum); + + final ListPreference pref_user_location_mode = (ListPreference) findPreference("pref_user_location_mode"); + pref_user_location_mode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + int mode = Integer.parseInt((String) newValue); + preference.setSummary(getResources().getStringArray(R.array.pref_user_location_titles)[mode]); + return true; + } + }); + + String value = getPreferenceManager().getSharedPreferences().getString("pref_user_location_mode", "0"); + int mode = Integer.parseInt(value); + pref_user_location_mode.setSummary(getResources().getStringArray(R.array.pref_user_location_titles)[mode]); } // we want a home button + HomeAsUpEnabled in nested preferences @@ -63,8 +78,7 @@ public class MainSettings extends PreferenceFragment { @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference.getTitle().toString().equals(getString(R.string.pref_advanced_options)) - || preference.getTitle().toString().equals(getString(R.string.pref_about_title)) - || preference.getTitle().toString().equals(getString(R.string.pref_user_loc_screen))) { + || preference.getTitle().toString().equals(getString(R.string.pref_about_title))) { initializeActionBar((PreferenceScreen) preference); } return super.onPreferenceTreeClick(preferenceScreen, preference);