diff --git a/android/jni/Android.mk b/android/jni/Android.mk index ac3d7eb6924fa..968f95c59bc63 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -32,6 +32,7 @@ LOCAL_SRC_FILES := \ com/mapswithme/maps/MWMActivity.cpp \ com/mapswithme/maps/MWMApplication.cpp \ com/mapswithme/maps/Lifecycle.cpp \ + com/mapswithme/maps/LocationState.cpp \ com/mapswithme/maps/MapStorage.cpp \ com/mapswithme/maps/DownloadResourcesActivity.cpp \ com/mapswithme/maps/SearchActivity.cpp \ diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index c5ce48af905e0..a98446f6e8f48 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -60,9 +60,9 @@ namespace android delete m_videoTimer; } - void Framework::OnLocationStatusChanged(int newStatus) + void Framework::OnLocationError(int errorCode) { - m_work.OnLocationStatusChanged(static_cast(newStatus)); + m_work.OnLocationError(static_cast(errorCode)); } void Framework::OnLocationUpdated(uint64_t time, double lat, double lon, float accuracy) @@ -72,7 +72,7 @@ namespace android info.m_latitude = lat; info.m_longitude = lon; info.m_horizontalAccuracy = accuracy; - m_work.OnGpsUpdate(info); + m_work.OnLocationUpdate(info); } void Framework::OnCompassUpdated(uint64_t timestamp, double magneticNorth, double trueNorth, double accuracy) @@ -180,7 +180,6 @@ namespace android m_doLoadState = false; - m_work.SkipLocationCentering(); m_work.ShowRect(r); } @@ -408,7 +407,11 @@ namespace android { m_doLoadState = false; - m_work.SkipLocationCentering(); + shared_ptr ls = m_work.GetInformationDisplay().locationState(); + + ls->StopCompassFollowing(); + ls->SetLocationProcessMode(location::ELocationDoNothing); + m_work.ShowSearchResult(r); } diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 41bf79273e264..03047e2e95204 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -62,7 +62,7 @@ namespace android storage::TStatus GetCountryStatus(storage::TIndex const & idx) const; void DeleteCountry(storage::TIndex const & idx); - void OnLocationStatusChanged(int/* == location::TLocationStatus*/ newStatus); + void OnLocationError(int/* == location::TLocationStatus*/ newStatus); void OnLocationUpdated(uint64_t time, double lat, double lon, float accuracy); void OnCompassUpdated(uint64_t time, double magneticNorth, double trueNorth, double accuracy); void UpdateCompassSensor(int ind, float * arr); diff --git a/android/jni/com/mapswithme/maps/LocationState.cpp b/android/jni/com/mapswithme/maps/LocationState.cpp new file mode 100644 index 0000000000000..b76929accb6e3 --- /dev/null +++ b/android/jni/com/mapswithme/maps/LocationState.cpp @@ -0,0 +1,104 @@ +#include "Framework.hpp" + +#include "../core/jni_helper.hpp" + +extern "C" +{ + JNIEXPORT jint JNICALL + Java_com_mapswithme_maps_LocationState_getCompassProcessMode(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->CompassProcessMode(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_setCompassProcessMode(JNIEnv * env, jobject thiz, jint mode) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + ls->SetCompassProcessMode((location::ECompassProcessMode)mode); + } + + JNIEXPORT jint JNICALL + Java_com_mapswithme_maps_LocationState_getLocationProcessMode(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->LocationProcessMode(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_setLocationProcessMode(JNIEnv * env, jobject thiz, jint mode) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->SetLocationProcessMode((location::ELocationProcessMode)mode); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_startCompassFollowing(JNIEnv * env, + jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + if (!ls->IsCentered()) + ls->AnimateToPositionAndEnqueueFollowing(); + else + ls->StartCompassFollowing(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_stopCompassFollowing(JNIEnv * env, + jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + ls->StopCompassFollowing(); + } + + void CompassStatusChanged(int mode, shared_ptr const & obj) + { + JNIEnv * env = jni::GetEnv(); + jmethodID methodID = jni::GetJavaMethodID(env, *obj.get(), "OnCompassStatusChanged", "(I)V"); + jint val = static_cast(mode); + env->CallVoidMethod(*obj.get(), methodID, val); + } + + JNIEXPORT jint JNICALL + Java_com_mapswithme_maps_LocationState_addCompassStatusListener(JNIEnv * env, jobject thiz, jobject obj) + { + location::State::TCompassStatusListener fn = bind(&CompassStatusChanged, _1, jni::make_global_ref(obj)); + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->AddCompassStatusListener(fn); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_removeCompassStatusListener(JNIEnv * env, jobject thiz, jint slotID) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + ls->RemoveCompassStatusListener(slotID); + } + + JNIEXPORT jboolean JNICALL + Java_com_mapswithme_maps_LocationState_hasPosition(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->HasPosition(); + } + + JNIEXPORT jboolean JNICALL + Java_com_mapswithme_maps_LocationState_hasCompass(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->HasCompass(); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_LocationState_turnOff(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->TurnOff(); + } + + JNIEXPORT jboolean JNICALL + Java_com_mapswithme_maps_LocationState_isVisible(JNIEnv * env, jobject thiz) + { + shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); + return ls->isVisible(); + } +} diff --git a/android/jni/com/mapswithme/maps/MWMActivity.cpp b/android/jni/com/mapswithme/maps/MWMActivity.cpp index 148a7103b881c..c63f9df87e2c5 100644 --- a/android/jni/com/mapswithme/maps/MWMActivity.cpp +++ b/android/jni/com/mapswithme/maps/MWMActivity.cpp @@ -15,10 +15,10 @@ extern "C" { JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MWMActivity_nativeLocationStatusChanged(JNIEnv * env, jobject thiz, - int status) + Java_com_mapswithme_maps_MWMActivity_nativeOnLocationError(JNIEnv * env, jobject thiz, + int errorCode) { - g_framework->OnLocationStatusChanged(status); + g_framework->OnLocationError(errorCode); } JNIEXPORT void JNICALL @@ -218,11 +218,4 @@ extern "C" return false; } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MWMActivity_nativeSkipLocationCentering(JNIEnv * env, jobject thiz) - { - g_framework->NativeFramework()->SkipLocationCentering(); - } - } // extern "C" diff --git a/android/jni/com/mapswithme/maps/MWMApplication.cpp b/android/jni/com/mapswithme/maps/MWMApplication.cpp index a8badd73f4ba9..bb06bb1de55f0 100644 --- a/android/jni/com/mapswithme/maps/MWMApplication.cpp +++ b/android/jni/com/mapswithme/maps/MWMApplication.cpp @@ -78,53 +78,4 @@ extern "C" bool flag = val; (void)Settings::Set(jni::ToNativeString(env, name), flag); } - - JNIEXPORT jboolean JNICALL - Java_com_mapswithme_maps_MWMApplication_nativeIsFollowingCompass(JNIEnv * env, - jobject thiz) - { - location::ECompassProcessMode compassMode = g_framework->NativeFramework()->GetInformationDisplay().locationState()->CompassProcessMode(); - return compassMode == location::ECompassFollow; - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MWMApplication_nativeStartCompassFollowing(JNIEnv * env, - jobject thiz) - { - shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); - if (!ls->IsCentered()) - ls->AnimateToPositionAndEnqueueFollowing(); - else - ls->StartCompassFollowing(); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MWMApplication_nativeStopCompassFollowing(JNIEnv * env, - jobject thiz) - { - g_framework->NativeFramework()->GetInformationDisplay().locationState()->StopCompassFollowing(); - } - - void CompassStatusChanged(int mode, shared_ptr const & obj) - { - JNIEnv * env = jni::GetEnv(); - jmethodID methodID = jni::GetJavaMethodID(env, *obj.get(), "OnCompassStatusChanged", "(I)V"); - jint val = static_cast(mode); - env->CallVoidMethod(*obj.get(), methodID, val); - } - - JNIEXPORT jint JNICALL - Java_com_mapswithme_maps_MWMApplication_nativeAddCompassStatusListener(JNIEnv * env, jobject thiz, jobject obj) - { - location::State::TCompassStatusListener fn = bind(&CompassStatusChanged, _1, jni::make_global_ref(obj)); - shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); - return ls->AddCompassStatusListener(fn); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_MWMApplication_nativeRemoveCompassStatusListener(JNIEnv * env, jobject thiz, jint slotID) - { - shared_ptr ls = g_framework->NativeFramework()->GetInformationDisplay().locationState(); - ls->RemoveCompassStatusListener(slotID); - } } diff --git a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java index cbecbef4fdd78..e54e4c54ece90 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java @@ -401,7 +401,7 @@ public void onCompassUpdated(long time, double magneticNorth, double trueNorth, } @Override - public void onLocationStatusChanged(int status) + public void onLocationError(int errorCode) { } diff --git a/android/src/com/mapswithme/maps/LocationState.java b/android/src/com/mapswithme/maps/LocationState.java new file mode 100644 index 0000000000000..c5f3af4accd3b --- /dev/null +++ b/android/src/com/mapswithme/maps/LocationState.java @@ -0,0 +1,33 @@ +package com.mapswithme.maps; + +public class LocationState +{ + /// These values should correspond to values of + /// location::ELocationProcessMode defined in map/location_state.hpp + public static final int LOCATION_DO_NOTHING = 0; + public static final int LOCATION_CENTER_AND_SCALE = 1; + public static final int LOCATION_CENTER_ONLY = 2; + + /// These values should correspond to values of + /// location::ECompassProcessMode defined in map/location_state.hpp + public static final int COMPASS_DO_NOTHING = 0; + public static final int COMPASS_FOLLOW = 1; + + public native int getCompassProcessMode(); + public native void setCompassProcessMode(int mode); + + public native int getLocationProcessMode(); + public native void setLocationProcessMode(int mode); + + public native void startCompassFollowing(); + public native void stopCompassFollowing(); + + public native int addCompassStatusListener(Object l); + public native void removeCompassStatusListener(int slotID); + + public native boolean hasPosition(); + public native boolean hasCompass(); + + public native void turnOff(); + public native boolean isVisible(); +} diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index 0466cb7a6b9a4..f0a36f2445421 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -37,12 +37,8 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService private MWMApplication mApplication = null; private BroadcastReceiver m_externalStorageReceiver = null; private AlertDialog m_storageDisconnectedDialog = null; - private boolean m_shouldStartLocationService = false; - private boolean m_hasLocation = false; - private boolean m_hasCompass = false; - private boolean m_isLocationActive = false; - private boolean m_locationWasActiveBeforePause = false; - private boolean m_suggestAutoFollowMode = false; + private boolean m_locationWasActive = false; + private boolean m_isFirstLocation = false; private LocationService getLocationService() { @@ -54,30 +50,69 @@ private MapStorage getMapStorage() return mApplication.getMapStorage(); } + private LocationState getLocationState() + { + return mApplication.getLocationState(); + } + private void startLocation() { - m_isLocationActive = true; - getLocationService().startUpdate(this); - // Do not turn off the screen while displaying position - Utils.automaticIdleScreen(false, getWindow()); + getLocationState().setLocationProcessMode(LocationState.LOCATION_CENTER_AND_SCALE); + getLocationState().setCompassProcessMode(LocationState.COMPASS_DO_NOTHING); + m_isFirstLocation = true; + resumeLocation(); } private void stopLocation() { - m_hasLocation = false; - m_hasCompass = false; - m_isLocationActive = false; + getLocationState().setLocationProcessMode(LocationState.LOCATION_DO_NOTHING); + getLocationState().setCompassProcessMode(LocationState.COMPASS_DO_NOTHING); + getLocationState().turnOff(); + pauseLocation(); + } + + private void pauseLocation() + { getLocationService().stopUpdate(this); // Enable automatic turning screen off while app is idle Utils.automaticIdleScreen(true, getWindow()); } - public void checkShouldStartLocationService() + private void resumeLocation() + { + getLocationService().startUpdate(this); + // Do not turn off the screen while displaying position + Utils.automaticIdleScreen(false, getWindow()); + } + + public void checkShouldResumeLocationService() { - if (m_shouldStartLocationService) + final View v = findViewById(R.id.map_button_myposition); + + LocationState locationState = getLocationState(); + + if (v != null) { - startLocation(); - m_shouldStartLocationService = false; + if (m_locationWasActive) + { + resumeLocation(); + + if (locationState.getCompassProcessMode() == LocationState.COMPASS_FOLLOW) + { + locationState.startCompassFollowing(); + v.setBackgroundResource(R.drawable.myposition_button_follow); + v.setSelected(true); + } + else + { + if (locationState.hasPosition()) + v.setBackgroundResource(R.drawable.myposition_button_found); + else + v.setBackgroundResource(R.drawable.myposition_button_normal); + + v.setSelected(true); + } + } } } @@ -102,7 +137,7 @@ public void OnRenderingInitialized() public void run() { // Run all checks in main thread after rendering is initialized. - checkShouldStartLocationService(); + checkShouldResumeLocationService(); checkMeasurementSystem(); checkProVersionAvailable(); checkUpdateMaps(); @@ -212,7 +247,9 @@ public void onMinusClicked(View v) public void onMyPositionClicked(View v) { - if (!m_isLocationActive) + LocationState locationState = mApplication.getLocationState(); + + if (!locationState.hasPosition()) { /// first set the button state to "searching" v.setBackgroundResource(R.drawable.myposition_button_normal); @@ -223,7 +260,7 @@ public void onMyPositionClicked(View v) } else { - if (!m_hasCompass) + if (!locationState.hasCompass()) { stopLocation(); v.setBackgroundResource(R.drawable.myposition_button_normal); @@ -231,15 +268,15 @@ public void onMyPositionClicked(View v) } else { - if(!mApplication.nativeIsFollowingCompass()) + if(locationState.getCompassProcessMode() != LocationState.COMPASS_FOLLOW) { - mApplication.nativeStartCompassFollowing(); + locationState.startCompassFollowing(); v.setBackgroundResource(R.drawable.myposition_button_follow); v.setSelected(true); } else { - mApplication.nativeStopCompassFollowing(); + locationState.stopCompassFollowing(); v.setBackgroundResource(R.drawable.myposition_button_normal); v.setSelected(false); stopLocation(); @@ -249,7 +286,7 @@ public void onMyPositionClicked(View v) // Store active state of My Position SharedPreferences.Editor prefsEdit = getSharedPreferences(mApplication.getPackageName(), MODE_PRIVATE).edit(); - prefsEdit.putBoolean(PREFERENCES_MYPOSITION, !m_isLocationActive); + prefsEdit.putBoolean(PREFERENCES_MYPOSITION, getLocationState().hasPosition()); prefsEdit.commit(); } @@ -540,23 +577,15 @@ private void alignZoomButtons() /// @name From Location interface //@{ @Override - public void onLocationStatusChanged(int newStatus) + public void onLocationError(int errorCode) { - if (newStatus == LocationService.FIRST_EVENT) - { - final View v = findViewById(R.id.map_button_myposition); - - v.setBackgroundResource(R.drawable.myposition_button_found); - v.setSelected(true); - - m_hasLocation = true; - } - - nativeLocationStatusChanged(newStatus); + nativeOnLocationError(errorCode); // Notify user about turned off location services - if (newStatus == LocationService.DISABLED_BY_USER) + if (errorCode == LocationService.ERROR_DENIED) { + getLocationState().turnOff(); + // Do not show this dialog on Kindle Fire - it doesn't have location services // and even wifi settings can't be opened programmatically if (!Utils.isKindleFire()) @@ -608,13 +637,16 @@ public void onCompassStatusChanged(int newStatus) } else { - if (m_hasLocation) + if (getLocationState().hasPosition()) { v.setBackgroundResource(R.drawable.myposition_button_found); v.setSelected(true); } else + { v.setBackgroundResource(R.drawable.myposition_button_normal); + v.setSelected(false); + } } } @@ -634,6 +666,16 @@ public void run() @Override public void onLocationUpdated(long time, double lat, double lon, float accuracy) { + if (m_isFirstLocation) + { + final View v = findViewById(R.id.map_button_myposition); + + v.setBackgroundResource(R.drawable.myposition_button_found); + v.setSelected(true); + + m_isFirstLocation = false; + } + nativeLocationUpdated(time, lat, lon, accuracy); } @@ -647,8 +689,6 @@ public void onCompassUpdated(long time, double magneticNorth, double trueNorth, magneticNorth = LocationService.correctAngle(magneticNorth, correction); trueNorth = LocationService.correctAngle(trueNorth, correction); - m_hasCompass = true; - nativeCompassUpdated(time, magneticNorth, trueNorth, accuracy); } //@} @@ -668,20 +708,20 @@ protected void onStart() private void startWatchingCompassStatusUpdate() { - m_compassStatusListenerID = mApplication.nativeAddCompassStatusListener(this); + m_compassStatusListenerID = mApplication.getLocationState().addCompassStatusListener(this); } private void stopWatchingCompassStatusUpdate() { - mApplication.nativeRemoveCompassStatusListener(m_compassStatusListenerID); + mApplication.getLocationState().removeCompassStatusListener(m_compassStatusListenerID); } @Override protected void onPause() { - m_locationWasActiveBeforePause = m_isLocationActive; + m_locationWasActive = getLocationState().isVisible(); - stopLocation(); + pauseLocation(); stopWatchingExternalStorage(); @@ -693,22 +733,6 @@ protected void onPause() @Override protected void onResume() { - final View v = findViewById(R.id.map_button_myposition); - - if (v != null && m_locationWasActiveBeforePause) - { - m_locationWasActiveBeforePause = false; - - // change button appearance to "looking for position" - v.setBackgroundResource(R.drawable.myposition_button_normal); - - // do not move map's viewport to a location when this activity is resumed - nativeSkipLocationCentering(); - - // and remember to start locationService updates in OnRenderingInitialized - m_shouldStartLocationService = true; - } - startWatchingCompassStatusUpdate(); startWatchingExternalStorage(); @@ -852,7 +876,7 @@ private void stopWatchingExternalStorage() private native void nativeDestroy(); - private native void nativeLocationStatusChanged(int newStatus); + private native void nativeOnLocationError(int errorCode); private native void nativeLocationUpdated(long time, double lat, double lon, float accuracy); private native void nativeCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy); @@ -860,5 +884,4 @@ private void stopWatchingExternalStorage() private native void nativeCheckForProVersion(String serverURL); private native boolean nativeIsInChina(double lat, double lon); - private native void nativeSkipLocationCentering(); } diff --git a/android/src/com/mapswithme/maps/MWMApplication.java b/android/src/com/mapswithme/maps/MWMApplication.java index 2e47781a8954f..20435dc5e5308 100644 --- a/android/src/com/mapswithme/maps/MWMApplication.java +++ b/android/src/com/mapswithme/maps/MWMApplication.java @@ -23,6 +23,7 @@ public class MWMApplication extends android.app.Application implements MapStorag private final static String TAG = "MWMApplication"; private LocationService m_location = null; + private LocationState m_locationState = null; private MapStorage m_storage = null; private int m_slotID = 0; @@ -106,6 +107,14 @@ public LocationService getLocationService() return m_location; } + public LocationState getLocationState() + { + if (m_locationState == null) + m_locationState = new LocationState(); + + return m_locationState; + } + public MapStorage getMapStorage() { if (m_storage == null) @@ -183,11 +192,4 @@ private native void nativeInit(String apkPath, /// Dealing with Settings public native boolean nativeGetBoolean(String name, boolean defaultVal); public native void nativeSetBoolean(String name, boolean val); - - public native boolean nativeIsFollowingCompass(); - public native void nativeStartCompassFollowing(); - public native void nativeStopCompassFollowing(); - - public native int nativeAddCompassStatusListener(Object l); - public native void nativeRemoveCompassStatusListener(int slotID); } diff --git a/android/src/com/mapswithme/maps/SearchActivity.java b/android/src/com/mapswithme/maps/SearchActivity.java index 9a90858522aab..e6368ef8972ce 100644 --- a/android/src/com/mapswithme/maps/SearchActivity.java +++ b/android/src/com/mapswithme/maps/SearchActivity.java @@ -373,7 +373,7 @@ public void onCompassUpdated(long time, double magneticNorth, double trueNorth, } @Override - public void onLocationStatusChanged(int status) + public void onLocationError(int errorCode) { } diff --git a/android/src/com/mapswithme/maps/location/LocationService.java b/android/src/com/mapswithme/maps/location/LocationService.java index 1b971f62e01e2..e292e1c420fc2 100644 --- a/android/src/com/mapswithme/maps/location/LocationService.java +++ b/android/src/com/mapswithme/maps/location/LocationService.java @@ -27,17 +27,13 @@ public class LocationService implements LocationListener, SensorEventListener, W private static final String TAG = "LocationService"; /// These constants should correspond to values defined in platform/location.hpp - public static final int STOPPED = 0; - public static final int STARTED = 1; - public static final int FIRST_EVENT = 2; - public static final int NOT_SUPPORTED = 3; - public static final int DISABLED_BY_USER = 4; + public static final int ERROR_DENIED = 0; public interface Listener { public void onLocationUpdated(long time, double lat, double lon, float accuracy); public void onCompassUpdated(long time, double magneticNorth, double trueNorth, double accuracy); - public void onLocationStatusChanged(int status); + public void onLocationError(int errorCode); }; private HashSet m_observers = new HashSet(10); @@ -78,11 +74,11 @@ public LocationService(MWMApplication application) public Location getLastKnown() { return m_lastLocation; } - private void notifyStatusChanged(int newStatus) + private void notifyOnError(int errorCode) { Iterator it = m_observers.iterator(); while (it.hasNext()) - it.next().onLocationStatusChanged(newStatus); + it.next().onLocationError(errorCode); } private void notifyLocationUpdated(long time, double lat, double lon, float accuracy) @@ -136,21 +132,17 @@ public void startUpdate(Listener observer) if (ConnectionState.isConnected(m_application) && ((WifiManager) m_application.getSystemService(Context.WIFI_SERVICE)).isWifiEnabled()) { - observer.onLocationStatusChanged(STARTED); - if (m_wifiScanner == null) m_wifiScanner = new WifiLocation(); m_wifiScanner.StartScan(m_application, this); } else - observer.onLocationStatusChanged(DISABLED_BY_USER); + observer.onLocationError(ERROR_DENIED); } else { m_isActive = true; - observer.onLocationStatusChanged(STARTED); - Location lastKnown = null; for (String provider : enabledProviders) @@ -186,8 +178,6 @@ public void startUpdate(Listener observer) } } } - else - observer.onLocationStatusChanged(STARTED); } public void stopUpdate(Listener observer) @@ -206,8 +196,6 @@ public void stopUpdate(Listener observer) m_isActive = false; } - - observer.onLocationStatusChanged(STOPPED); } private static final int ONE_MINUTE = 1000 * 60 * 1; @@ -295,9 +283,7 @@ public void onLocationChanged(Location l) final long currTime = getBetterLocationTime(l); if (currTime != 0) { - if (m_lastLocation == null) - notifyStatusChanged(FIRST_EVENT); - else + if (m_lastLocation != null) calcDirection(l, currTime); // Used for more precise compass updates diff --git a/map/framework.cpp b/map/framework.cpp index 9310af1bf3c0f..5a9f755ef13cf 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -78,17 +78,10 @@ void Framework::RemoveMap(string const & datFile) m_model.RemoveMap(datFile); } -void Framework::SkipLocationCentering() -{ - m_informationDisplay.locationState()->SkipLocationCentering(); -} - -void Framework::OnLocationStatusChanged(location::TLocationStatus newStatus) -{ - m_informationDisplay.locationState()->OnLocationStatusChanged(newStatus); -} +void Framework::OnLocationError(location::TLocationError error) +{} -void Framework::OnGpsUpdate(location::GpsInfo const & info) +void Framework::OnLocationUpdate(location::GpsInfo const & info) { #ifdef FIXED_LOCATION location::GpsInfo rInfo(info); @@ -98,7 +91,7 @@ void Framework::OnGpsUpdate(location::GpsInfo const & info) location::GpsInfo const & rInfo = info; #endif - m_informationDisplay.locationState()->OnGpsUpdate(rInfo); + m_informationDisplay.locationState()->OnLocationUpdate(rInfo); } void Framework::OnCompassUpdate(location::CompassInfo const & info) diff --git a/map/framework.hpp b/map/framework.hpp index b03b5856091ec..cf0c6d2520cc4 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -206,9 +206,8 @@ class Framework /// @name GPS location updates routine. //@{ - void SkipLocationCentering(); - void OnLocationStatusChanged(location::TLocationStatus newStatus); - void OnGpsUpdate(location::GpsInfo const & info); + void OnLocationError(location::TLocationError error); + void OnLocationUpdate(location::GpsInfo const & info); void OnCompassUpdate(location::CompassInfo const & info); //@} diff --git a/map/location_state.cpp b/map/location_state.cpp index a58d15ddf8ca9..afc378e4bd507 100644 --- a/map/location_state.cpp +++ b/map/location_state.cpp @@ -85,11 +85,6 @@ namespace location setIsVisible(false); } - void State::SkipLocationCentering() - { - m_locationProcessMode = ELocationSkipCentering; - } - ELocationProcessMode State::LocationProcessMode() const { return m_locationProcessMode; @@ -115,38 +110,11 @@ namespace location CallCompassStatusListeners(mode); } - void State::OnLocationStatusChanged(location::TLocationStatus newStatus) + void State::OnLocationUpdate(location::GpsInfo const & info) { - switch (newStatus) - { - case location::EStarted: - - if (m_locationProcessMode != ELocationSkipCentering) - m_locationProcessMode = ELocationCenterAndScale; - break; - - case location::EFirstEvent: - - if (m_locationProcessMode != ELocationSkipCentering) - { - // set centering mode for the first location - m_locationProcessMode = ELocationCenterAndScale; - SetCompassProcessMode(ECompassDoNothing); - } - break; - - default: - m_locationProcessMode = ELocationDoNothing; - TurnOff(); - } - - m_framework->Invalidate(); - } - - void State::OnGpsUpdate(location::GpsInfo const & info) - { - m2::RectD rect = MercatorBounds::MetresToXY( - info.m_longitude, info.m_latitude, info.m_horizontalAccuracy); + m2::RectD rect = MercatorBounds::MetresToXY(info.m_longitude, + info.m_latitude, + info.m_horizontalAccuracy); m2::PointD const center = rect.Center(); m_hasPosition = true; @@ -187,6 +155,7 @@ namespace location } case ELocationCenterOnly: + m_framework->SetViewportCenter(center); SetIsCentered(true); @@ -195,11 +164,6 @@ namespace location break; - case ELocationSkipCentering: - SetIsCentered(false); - m_locationProcessMode = ELocationDoNothing; - break; - case ELocationDoNothing: break; } @@ -319,7 +283,7 @@ namespace location void State::update() { - if (isVisible()) + if (isVisible() && m_hasPosition) { m2::PointD const pxPosition = m_framework->GetNavigator().GtoP(Position()); @@ -561,6 +525,7 @@ namespace location void State::StartCompassFollowing() { SetCompassProcessMode(ECompassFollow); + SetLocationProcessMode(ELocationCenterOnly); CheckCompassRotation(); CheckCompassFollowing(); setState(EPressed); diff --git a/map/location_state.hpp b/map/location_state.hpp index 3a36fad18d3b0..38977e7fe69af 100644 --- a/map/location_state.hpp +++ b/map/location_state.hpp @@ -33,15 +33,14 @@ namespace location enum ELocationProcessMode { - ELocationDoNothing, + ELocationDoNothing = 0, ELocationCenterAndScale, - ELocationCenterOnly, - ELocationSkipCentering + ELocationCenterOnly }; enum ECompassProcessMode { - ECompassDoNothing, + ECompassDoNothing = 0, ECompassFollow }; @@ -159,9 +158,7 @@ namespace location /// @name GPS location updates routine. //@{ - void SkipLocationCentering(); - void OnLocationStatusChanged(location::TLocationStatus newStatus); - void OnGpsUpdate(location::GpsInfo const & info); + void OnLocationUpdate(location::GpsInfo const & info); void OnCompassUpdate(location::CompassInfo const & info); //@} diff --git a/platform/apple_location_service.mm b/platform/apple_location_service.mm index f8a2d4b4591ae..d8486aaf07daa 100644 --- a/platform/apple_location_service.mm +++ b/platform/apple_location_service.mm @@ -41,12 +41,12 @@ - (id)initWithService:(AppleLocationService *) service; void OnLocationUpdate(GpsInfo const & info) { - m_observer.OnGpsUpdated(info); + m_observer.OnLocationUpdated(info); } void OnDeniedError() { - m_observer.OnLocationStatusChanged(location::EDisabledByUser); + m_observer.OnLocationError(location::EDenied); } virtual void Start() @@ -59,14 +59,12 @@ virtual void Start() else { [m_locationManager startUpdatingLocation]; - m_observer.OnLocationStatusChanged(location::EStarted); } } virtual void Stop() { [m_locationManager stopUpdatingLocation]; - m_observer.OnLocationStatusChanged(location::EStopped); } }; diff --git a/platform/location.hpp b/platform/location.hpp index af7ce211896a1..b6df73b4e774c 100644 --- a/platform/location.hpp +++ b/platform/location.hpp @@ -9,13 +9,9 @@ namespace location /// after this period we cont position as "too old" static double const POSITION_TIMEOUT_SECONDS = 300.0; - enum TLocationStatus + enum TLocationError { - EStopped = 0, - EStarted, - EFirstEvent, //!< Sent when first valid coorinate is received - ENotSupported, - EDisabledByUser + EDenied }; enum TLocationSource diff --git a/platform/location_service.cpp b/platform/location_service.cpp index 96dee69fb134e..1159599b1bf94 100644 --- a/platform/location_service.cpp +++ b/platform/location_service.cpp @@ -60,20 +60,15 @@ namespace location PositionFilter m_filter; bool m_reportFirstEvent; - virtual void OnLocationStatusChanged(location::TLocationStatus newStatus) + virtual void OnLocationError(location::TLocationError errorCode) { - m_observer.OnLocationStatusChanged(newStatus); + m_observer.OnLocationError(errorCode); } - virtual void OnGpsUpdated(GpsInfo const & info) + virtual void OnLocationUpdated(GpsInfo const & info) { - if (m_reportFirstEvent) - { - m_observer.OnLocationStatusChanged(location::EFirstEvent); - m_reportFirstEvent = false; - } if (m_filter.Passes(info)) - m_observer.OnGpsUpdated(info); + m_observer.OnLocationUpdated(info); } public: diff --git a/platform/location_service.hpp b/platform/location_service.hpp index ae66d3d5d3b78..a2986b1583ff2 100644 --- a/platform/location_service.hpp +++ b/platform/location_service.hpp @@ -8,8 +8,8 @@ namespace location class LocationObserver { public: - virtual void OnLocationStatusChanged(TLocationStatus newStatus) = 0; - virtual void OnGpsUpdated(GpsInfo const & info) = 0; + virtual void OnLocationError(TLocationError errorCode) = 0; + virtual void OnLocationUpdated(GpsInfo const & info) = 0; }; class LocationService diff --git a/platform/wifi_location_service.cpp b/platform/wifi_location_service.cpp index dfd6beecf97e6..6954a8aee54e4 100644 --- a/platform/wifi_location_service.cpp +++ b/platform/wifi_location_service.cpp @@ -48,7 +48,7 @@ namespace location // @TODO introduce flags to mark valid values info.m_timestamp = static_cast(time(NULL)); info.m_source = location::EGoogle; - m_observer.OnGpsUpdated(info); + m_observer.OnLocationUpdated(info); success = true; } } diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index 9f888a0f856b3..e0ee73b8ec2a8 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -40,6 +40,7 @@ namespace qt MainWindow::MainWindow() { m_pDrawWidget = new DrawWidget(this); + m_isFirstLocation = true; m_locationService.reset(CreateDesktopLocationService(*this)); CreateNavigationBar(); @@ -301,27 +302,27 @@ void MainWindow::OnAbout() dlg.exec(); } -void MainWindow::OnLocationStatusChanged(location::TLocationStatus newStatus) +void MainWindow::OnLocationError(location::TLocationError errorCode) { - switch (newStatus) + switch (errorCode) { - case location::EFirstEvent: - m_pMyPositionAction->setIcon(QIcon(":/navig64/location.png")); - m_pMyPositionAction->setToolTip(tr("My Position")); - break; - case location::EDisabledByUser: - case location::ENotSupported: + case location::EDenied: m_pMyPositionAction->setChecked(false); break; - default: - break; } - m_pDrawWidget->GetFramework().OnLocationStatusChanged(newStatus); + m_pDrawWidget->GetFramework().OnLocationError(errorCode); } -void MainWindow::OnGpsUpdated(location::GpsInfo const & info) +void MainWindow::OnLocationUpdated(location::GpsInfo const & info) { - m_pDrawWidget->GetFramework().OnGpsUpdate(info); + if (m_isFirstLocation) + { + m_pMyPositionAction->setIcon(QIcon(":/navig64/location.png")); + m_pMyPositionAction->setToolTip(tr("My Position")); + m_isFirstLocation = false; + } + + m_pDrawWidget->GetFramework().OnLocationUpdate(info); } void MainWindow::OnMyPosition() @@ -330,6 +331,7 @@ void MainWindow::OnMyPosition() { m_pMyPositionAction->setIcon(QIcon(":/navig64/location-search.png")); m_pMyPositionAction->setToolTip(tr("Looking for position...")); + m_isFirstLocation = true; m_locationService->Start(); } else diff --git a/qt/mainwindow.hpp b/qt/mainwindow.hpp index 9ff7d6504831e..abcb0589be3d4 100644 --- a/qt/mainwindow.hpp +++ b/qt/mainwindow.hpp @@ -23,6 +23,7 @@ namespace qt QDockWidget * m_Docks[3]; + bool m_isFirstLocation; scoped_ptr m_locationService; Q_OBJECT @@ -31,8 +32,8 @@ namespace qt MainWindow(); virtual ~MainWindow(); - virtual void OnLocationStatusChanged(location::TLocationStatus newStatus); - virtual void OnGpsUpdated(location::GpsInfo const & info); + virtual void OnLocationError(location::TLocationError errorCode); + virtual void OnLocationUpdated(location::GpsInfo const & info); protected: string GetIniFile();