diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 9c4f130f94..a2c09fdf98 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -33,7 +33,6 @@ LOCAL_SRC_FILES := \ com/mapswithme/core/jni_string.cpp \ com/mapswithme/core/logging.cpp \ com/mapswithme/core/render_context.cpp \ - com/mapswithme/location/LocationService.cpp \ com/mapswithme/maps/DownloadUI.cpp \ com/mapswithme/maps/Framework.cpp \ com/mapswithme/maps/VideoTimer.cpp \ diff --git a/android/jni/com/mapswithme/location/LocationService.cpp b/android/jni/com/mapswithme/location/LocationService.cpp deleted file mode 100644 index 1da2ff8cf6..0000000000 --- a/android/jni/com/mapswithme/location/LocationService.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * LocationService.cpp - * - * Created on: Oct 13, 2011 - * Author: siarheirachytski - */ - -#include -#include "../jni/jni_thread.hpp" -#include "../maps/Framework.hpp" -#include "LocationService.hpp" - -android::LocationService * g_locationService = 0; - -namespace android -{ - LocationService::LocationService(location::LocationObserver & observer, - jobject javaObserver) - : m_observer(observer), - m_javaObserver(javaObserver) - { - jclass k = jni::GetCurrentThreadJNIEnv()->GetObjectClass(m_javaObserver); - m_onLocationChanged.reset(new jni::Method(k, "onLocationChanged", "(JDDF)V")); - m_onStatusChanged.reset(new jni::Method(k, "onStatusChanged", "(I)V")); - } - - void LocationService::Start(bool doChangeStatus) - { - if (doChangeStatus) - { - m_observer.OnLocationStatusChanged(location::EStarted); - m_onStatusChanged->CallVoid(m_javaObserver, location::EStarted); - } - } - - void LocationService::Stop(bool doChangeStatus) - { - if (doChangeStatus) - { - m_observer.OnLocationStatusChanged(location::EStopped); - m_onStatusChanged->CallVoid(m_javaObserver, location::EStopped); - } - } - - void LocationService::Disable() - { - m_observer.OnLocationStatusChanged(location::EDisabledByUser); - m_onStatusChanged->CallVoid(m_javaObserver, location::EDisabledByUser); - } - - void LocationService::OnLocationUpdate(location::GpsInfo const & info) - { - m_observer.OnGpsUpdated(info); - m_onLocationChanged->CallVoid(m_javaObserver, info.m_timestamp, info.m_latitude, info.m_longitude, info.m_horizontalAccuracy); - } - - void LocationService::OnLocationStatusChanged(int status) - { - m_observer.OnLocationStatusChanged((location::TLocationStatus)status); - m_onStatusChanged->CallVoid(m_javaObserver, status); - } -} - -/////////////////////////////////////////////////////////////////////////////////// -// LocationService -/////////////////////////////////////////////////////////////////////////////////// - - -extern "C" -{ - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeStartUpdate(JNIEnv * env, jobject thiz, jobject observer, jboolean changeStatus) - { - g_locationService = new android::LocationService(*g_framework, observer); - g_locationService->Start(changeStatus); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeStopUpdate(JNIEnv * env, jobject thiz, jboolean changeStatus) - { - g_locationService->Stop(changeStatus); - delete g_locationService; - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeLocationStatusChanged(JNIEnv * env, jobject thiz, int status) - { - g_locationService->OnLocationStatusChanged(status); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeLocationChanged(JNIEnv * env, jobject thiz, - jlong time, jdouble lat, jdouble lon, jfloat accuracy) - { - location::GpsInfo info; - - info.m_horizontalAccuracy = static_cast(accuracy); - info.m_latitude = lat; - info.m_longitude = lon; - info.m_timestamp = time; - info.m_source = location::EAndroidNative; - - g_locationService->OnLocationUpdate(info); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeDisable(JNIEnv * env, jobject thiz) - { - g_locationService->Disable(); - } - - JNIEXPORT void JNICALL - Java_com_mapswithme_maps_location_LocationService_nativeCompassChanged(JNIEnv * env, jobject thiz, - jlong time, jdouble magneticNorth, jdouble trueNorth, jfloat accuracy) - { - g_framework->UpdateCompass(time, magneticNorth, trueNorth, accuracy); - } -} diff --git a/android/jni/com/mapswithme/location/LocationService.hpp b/android/jni/com/mapswithme/location/LocationService.hpp deleted file mode 100644 index 653594fd7d..0000000000 --- a/android/jni/com/mapswithme/location/LocationService.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - -#include "../../../../../platform/location_service.hpp" -#include "../../../../../std/scoped_ptr.hpp" -#include "../jni/jni_method.hpp" - -namespace android -{ - class LocationService - { - private: - - jobject m_javaObserver; - location::LocationObserver & m_observer; - - scoped_ptr m_onLocationChanged; - scoped_ptr m_onStatusChanged; - - public: - - LocationService(location::LocationObserver & locationObserver, - jobject observer); - - void Start(bool doChangeStatus); - void Stop(bool doChangeStatus); - void Disable(); - void OnLocationUpdate(location::GpsInfo const & info); - void OnLocationStatusChanged(int status); - }; -} - -extern android::LocationService * g_locationService; diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 93dc72efe0..1e11c7a25f 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -1,10 +1,3 @@ -/* - * Framework.cpp - * - * Created on: Oct 13, 2011 - * Author: siarheirachytski - */ - #include "Framework.hpp" #include "VideoTimer.hpp" @@ -24,6 +17,8 @@ #include "../../../../../yg/internal/opengl.hpp" #include "../../../../../platform/platform.hpp" +#include "../../../../../platform/location.hpp" + #include "../../../../../base/logging.hpp" #include "../../../../../base/math.hpp" @@ -57,16 +52,31 @@ namespace android delete m_videoTimer; } - void Framework::OnLocationStatusChanged(location::TLocationStatus newStatus) + void Framework::OnLocationStatusChanged(int newStatus) { - m_work.OnLocationStatusChanged(newStatus); + m_work.OnLocationStatusChanged(static_cast(newStatus)); } - void Framework::OnGpsUpdated(location::GpsInfo const & info) + void Framework::OnLocationUpdated(uint64_t time, double lat, double lon, float accuracy) { + location::GpsInfo info; + info.m_timestamp = static_cast(time); + info.m_latitude = lat; + info.m_longitude = lon; + info.m_horizontalAccuracy = accuracy; m_work.OnGpsUpdate(info); } + void Framework::OnCompassUpdated(uint64_t timestamp, double magneticNorth, double trueNorth, float accuracy) + { + location::CompassInfo info; + info.m_timestamp = static_cast(timestamp); + info.m_magneticHeading = magneticNorth; + info.m_trueHeading = trueNorth; + info.m_accuracy = accuracy; + m_work.OnCompassUpdate(info); + } + void Framework::DeleteRenderPolicy() { LOG(LINFO, ("clearing current render policy.")); @@ -252,16 +262,6 @@ namespace android } - void Framework::UpdateCompass(uint64_t timestamp, double magneticNorth, double trueNorth, float accuracy) - { - location::CompassInfo info; - info.m_timestamp = static_cast(timestamp); - info.m_magneticHeading = magneticNorth; - info.m_trueHeading = trueNorth; - info.m_accuracy = accuracy; - m_work.OnCompassUpdate(info); - } - void Framework::LoadState() { if (!m_work.LoadState()) diff --git a/android/jni/com/mapswithme/maps/Framework.hpp b/android/jni/com/mapswithme/maps/Framework.hpp index 63db73e079..0831821bb0 100644 --- a/android/jni/com/mapswithme/maps/Framework.hpp +++ b/android/jni/com/mapswithme/maps/Framework.hpp @@ -1,9 +1,3 @@ -/* - * Framework.hpp - * - * Created on: Oct 13, 2011 - * Author: siarheirachytski - */ #pragma once #include @@ -13,11 +7,10 @@ #include "../../../../../map/window_handle.hpp" #include "../../../../../map/feature_vec_model.hpp" #include "../../../nv_event/nv_event.hpp" -#include "../../../../../platform/location_service.hpp" namespace android { - class Framework : public location::LocationObserver + class Framework { private: ::Framework m_work; @@ -48,8 +41,9 @@ namespace android storage::Storage & Storage(); - void OnLocationStatusChanged(location::TLocationStatus newStatus); - void OnGpsUpdated(location::GpsInfo const & info); + void OnLocationStatusChanged(int/* == location::TLocationStatus*/ newStatus); + void OnLocationUpdated(uint64_t time, double lat, double lon, float accuracy); + void OnCompassUpdated(uint64_t time, double magneticNorth, double trueNorth, float accuracy); void Invalidate(); @@ -66,10 +60,6 @@ namespace android void LoadState(); void SaveState(); - - void EnableLocation(bool enable); - void UpdateLocation(uint64_t timestamp, double lat, double lon, float accuracy); - void UpdateCompass(uint64_t timestamp, double magneticNorth, double trueNorth, float accuracy); }; } diff --git a/android/jni/com/mapswithme/maps/MWMActivity.cpp b/android/jni/com/mapswithme/maps/MWMActivity.cpp index 734a7238c8..325f7c620d 100644 --- a/android/jni/com/mapswithme/maps/MWMActivity.cpp +++ b/android/jni/com/mapswithme/maps/MWMActivity.cpp @@ -50,8 +50,27 @@ extern "C" g_framework = new android::Framework(g_jvm); } } + +//////////////////////////////////////////////////////////////////////////////////////////// + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MWMActivity_nativeLocationStatusChanged(JNIEnv * env, jobject thiz, + int status) + { + g_framework->OnLocationStatusChanged(status); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MWMActivity_nativeLocationUpdated(JNIEnv * env, jobject thiz, + jlong time, jdouble lat, jdouble lon, jfloat accuracy) + { + g_framework->OnLocationUpdated(time, lat, lon, accuracy); + } + + JNIEXPORT void JNICALL + Java_com_mapswithme_maps_MWMActivity_nativeCompassUpdated(JNIEnv * env, jobject thiz, + jlong time, jdouble magneticNorth, jdouble trueNorth, jfloat accuracy) + { + g_framework->OnCompassUpdated(time, magneticNorth, trueNorth, accuracy); + } } // extern "C" - - - - diff --git a/android/src/com/mapswithme/maps/MWMActivity.java b/android/src/com/mapswithme/maps/MWMActivity.java index 7d355bec1a..f288d8edf4 100644 --- a/android/src/com/mapswithme/maps/MWMActivity.java +++ b/android/src/com/mapswithme/maps/MWMActivity.java @@ -17,16 +17,15 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.util.Log; -public class MWMActivity extends NvEventQueueActivity implements LocationService.Observer +public class MWMActivity extends NvEventQueueActivity implements LocationService.Listener { VideoTimer m_timer; private static String TAG = "MWMActivity"; private final static String PACKAGE_NAME = "com.mapswithme.maps"; - private int m_locationStatus; private int m_locationIconRes; - private boolean m_isLocationServicePaused = false; +// private boolean m_isLocationServicePaused = false; private LocationService m_locationService = null; @@ -63,54 +62,48 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService } m_timer = new VideoTimer(); - m_locationStatus = (int)LocationService.STOPPED; m_locationIconRes = R.drawable.ic_menu_location; m_locationService = new LocationService(this); - m_isLocationServicePaused = false; +// m_isLocationServicePaused = false; } - public void onStatusChanged(int status) + public void onLocationStatusChanged(int newStatus) { - m_locationStatus = status; - - switch (status) + switch (newStatus) { case LocationService.FIRST_EVENT: m_locationIconRes = R.drawable.ic_menu_location_found; break; - case LocationService.STOPPED: - m_locationIconRes = R.drawable.ic_menu_location; - break; - case LocationService.DISABLED_BY_USER: - m_locationIconRes = R.drawable.ic_menu_location; - break; case LocationService.STARTED: m_locationIconRes = R.drawable.ic_menu_location_search; break; default: m_locationIconRes = R.drawable.ic_menu_location; } - - Log.d(TAG, "StatusChanged: " + status); + nativeLocationStatusChanged(newStatus); } - public void onLocationChanged(long time, double latitude, double longitude, float accuracy) + @Override + public void onLocationUpdated(long time, double lat, double lon, float accuracy) { + nativeLocationUpdated(time, lat, lon, accuracy); } - - public void onLocationNotAvailable() + + @Override + public void onCompassUpdated(long time, double magneticNorth, double trueNorth, float accuracy) { - Log.d(TAG, "location services is disabled or not available"); + nativeCompassUpdated(time, magneticNorth, trueNorth, accuracy); } @Override protected void onPause() { - if (m_locationService.isActive()) - { - m_locationService.enterBackground(); - m_isLocationServicePaused = true; - } + // @TODO +// if (m_locationService.isActive()) +// { +// m_locationService.enterBackground(); +// m_isLocationServicePaused = true; +// } super.onPause(); } @@ -118,11 +111,12 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService @Override protected void onResume() { - if (m_isLocationServicePaused) - { - m_locationService.enterForeground(); - m_isLocationServicePaused = false; - } + // @TODO +// if (m_isLocationServicePaused) +// { +// m_locationService.enterForeground(); +// m_isLocationServicePaused = false; +// } super.onResume(); } @@ -146,22 +140,20 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService @Override public boolean onOptionsItemSelected(MenuItem item) { - // Handle item selection - switch (item.getItemId()) { case R.id.my_position: - - if (m_locationService.isActive()) - m_locationService.stopUpdate(true); + if (m_locationService.isSubscribed(this)) + m_locationService.stopUpdate(this); else - m_locationService.startUpdate(this, true); - + m_locationService.startUpdate(this); return true; + case R.id.download_maps: Intent intent = new Intent(this, DownloadUI.class); startActivity(intent); return true; + default: return super.onOptionsItemSelected(item); } @@ -173,4 +165,7 @@ public class MWMActivity extends NvEventQueueActivity implements LocationService } private native void nativeInit(String apkPath, String storagePath); + private native void nativeLocationStatusChanged(int newStatus); + private native void nativeLocationUpdated(long time, double lat, double lon, float accuracy); + private native void nativeCompassUpdated(long time, double magneticNorth, double trueNorth, float accuracy); } diff --git a/android/src/com/mapswithme/maps/location/LocationService.java b/android/src/com/mapswithme/maps/location/LocationService.java index 2340631601..66ca9e1eda 100644 --- a/android/src/com/mapswithme/maps/location/LocationService.java +++ b/android/src/com/mapswithme/maps/location/LocationService.java @@ -1,5 +1,9 @@ package com.mapswithme.maps.location; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + import android.content.Context; import android.hardware.GeomagneticField; import android.hardware.Sensor; @@ -11,239 +15,165 @@ import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; -import android.view.Display; -import android.view.WindowManager; -import android.text.format.Time; public class LocationService implements LocationListener, SensorEventListener { - private static String TAG = "Location"; + private static final String TAG = "LocationService"; - /// This constants should correspond to values defined in platform/location.hpp - /// @{ + /// 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 interface Observer + public interface Listener { - public void onLocationChanged(long time, double lat, double lon, float accuracy); - public void onStatusChanged(int status); - public void onLocationNotAvailable(); + public void onLocationUpdated(long time, double lat, double lon, float accuracy); + public void onCompassUpdated(long time, double magneticNorth, double trueNorth, float accuracy); + public void onLocationStatusChanged(int status); }; - Observer m_observer; + private HashSet m_observers = new HashSet(2); - private boolean m_isActive = false; - private Location m_location = null; + private Location m_lastLocation = null; private LocationManager m_locationManager; private SensorManager m_sensorManager; private Sensor m_compassSensor; // To calculate true north for compass - private GeomagneticField m_field; - private boolean m_hasRealProviders; - private boolean m_reportFirstUpdate; - private long m_lastTimeStamp; - + private GeomagneticField m_magneticField = null; + private boolean m_isActive = false; + // @TODO Refactor to deliver separate first update notification to each provider, + // or do not use it at all in the location service logic + private boolean m_reportFirstUpdate = true; + public LocationService(Context c) { // Acquire a reference to the system Location Manager m_locationManager = (LocationManager) c.getSystemService(Context.LOCATION_SERVICE); m_sensorManager = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE); - m_compassSensor = m_sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); - m_field = null; + if (m_sensorManager != null) + m_compassSensor = m_sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); } - public boolean isActive() + private void notifyStatusChanged(int newStatus) { - return m_isActive; + Iterator it = m_observers.iterator(); + while (it.hasNext()) + it.next().onLocationStatusChanged(newStatus); } - public void startUpdate(Observer observer, boolean doChangeState) + private void notifyLocationUpdated(long time, double lat, double lon, float accuracy) { - m_observer = observer; - m_isActive = false; - m_hasRealProviders = false; - m_reportFirstUpdate = true; - - Time t = new Time(); - m_lastTimeStamp = t.gmtoff; - - if (m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) - { - m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); - m_hasRealProviders = true; - m_isActive = true; - } - - if (m_locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) - { - m_locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); - m_hasRealProviders = true; - m_isActive = true; - } - - if (m_hasRealProviders) - { - if (m_locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) - m_locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, this); - } - - if (m_isActive) - { - m_sensorManager.registerListener(this, m_compassSensor, SensorManager.SENSOR_DELAY_NORMAL); - nativeStartUpdate(m_observer, doChangeState); - } - else - { - Log.d(TAG, "no locationProviders are found"); - m_observer.onLocationNotAvailable(); - // TODO : callback into gui to show the "providers are not enabled" messagebox - } + Iterator it = m_observers.iterator(); + while (it.hasNext()) + it.next().onLocationUpdated(time, lat, lon, accuracy); } - public void stopUpdate(boolean doChangeState) + private void notifyCompassUpdated(long time, double magneticNorth, double trueNorth, float accuracy) { - m_locationManager.removeUpdates(this); - m_sensorManager.unregisterListener(this); - m_isActive = false; - nativeStopUpdate(doChangeState); + Iterator it = m_observers.iterator(); + while (it.hasNext()) + it.next().onCompassUpdated(time, magneticNorth, trueNorth, accuracy); } - public void enterBackground() + public boolean isSubscribed(Listener observer) { - stopUpdate(false); - - /// requesting location updates from the low-power location provider - if (m_locationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) - { - m_locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, this); - nativeStartUpdate(m_observer, false); - } + return m_observers.contains(observer); } - public void enterForeground() + public void startUpdate(Listener observer) { - boolean doChangeState = false; - - if (m_location != null) + m_observers.add(observer); + + if (!m_isActive) { - Time t = new Time(); - if ((t.gmtoff - m_lastTimeStamp) > 300 * 1000) + // @TODO Add WiFi provider + final List enabledProviders = m_locationManager.getProviders(true); + if (enabledProviders.size() == 0) { - Log.d(TAG, "last position is too old"); - doChangeState = true; - m_lastTimeStamp = t.gmtoff; + observer.onLocationStatusChanged(DISABLED_BY_USER); + } + else + { + for (String provider : enabledProviders) + { + // @TODO change frequency and accuracy to save battery + if (m_locationManager.isProviderEnabled(provider)) + m_locationManager.requestLocationUpdates(provider, 0, 0, this); + } + if (m_sensorManager != null) + m_sensorManager.registerListener(this, m_compassSensor, SensorManager.SENSOR_DELAY_NORMAL); + m_isActive = true; + observer.onLocationStatusChanged(STARTED); } } - - nativeStopUpdate(doChangeState); - - m_isActive = false; - m_hasRealProviders = false; - - if (m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) - { - m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); - m_hasRealProviders = true; - m_isActive = true; - } - - if (m_locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) - { - m_locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); - m_hasRealProviders = true; - m_isActive = true; - } - - nativeStartUpdate(m_observer, doChangeState); - - m_sensorManager.registerListener(this, m_compassSensor, SensorManager.SENSOR_DELAY_NORMAL); - - if ((m_location != null) && (!doChangeState)) - nativeLocationChanged(m_location.getTime(), - m_location.getLatitude(), - m_location.getLongitude(), - m_location.getAccuracy()); + else + observer.onLocationStatusChanged(STARTED); } - + + public void stopUpdate(Listener observer) + { + m_observers.remove(observer); + // Stop only if no more observers are subscribed + if (m_observers.size() == 0) + { + m_locationManager.removeUpdates(this); + if (m_sensorManager != null) + m_sensorManager.unregisterListener(this); + m_isActive = false; + m_reportFirstUpdate = true; + m_magneticField = null; + } + observer.onLocationStatusChanged(STOPPED); + } + //@Override public void onLocationChanged(Location l) { if (m_reportFirstUpdate) { - nativeLocationStatusChanged(FIRST_EVENT); - m_reportFirstUpdate = false; + m_reportFirstUpdate = false; + notifyStatusChanged(FIRST_EVENT); } - // used for compass updates - if (m_field == null) - m_field = new GeomagneticField((float)l.getLatitude(), (float)l.getLongitude(), (float)l.getAltitude(), l.getTime()); - { - if (m_lastTimeStamp < l.getTime()) - { - m_location = l; - m_lastTimeStamp = l.getTime(); - nativeLocationChanged(l.getTime(), l.getLatitude(), l.getLongitude(), l.getAccuracy()); - } - } - Log.d(TAG, l.toString()); - } - - //@Override - public void onProviderDisabled(String provider) - { - Log.d(TAG, "onProviderDisabled " + provider); - if (m_isActive) - { - m_isActive = m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) - || m_locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); - if (!m_isActive) - { - Log.d(TAG, "to receive a location data please enable some of the location providers"); - nativeDisable(); - stopUpdate(true); - } - } - } - - //@Override - public void onProviderEnabled(String provider) - { - Log.d(TAG, "onProviderEnabled " + provider); - if (m_isActive) - m_locationManager.requestLocationUpdates(provider, 0, 0, this); - } - - //@Override - public void onStatusChanged(String provider, int status, Bundle extras) - { - Log.d(TAG, "onStatusChanged " + provider + " " + status + " " + extras); - } - - //@Override - public void onAccuracyChanged(Sensor sensor, int accuracy) - { - Log.d(TAG, "onAccuracyChanged " + sensor + " " + accuracy); + // used for more precise compass updates + if (m_sensorManager != null && m_magneticField == null) + m_magneticField = new GeomagneticField((float)l.getLatitude(), (float)l.getLongitude(), (float)l.getAltitude(), l.getTime()); + // @TODO insert filtering from different providers + notifyLocationUpdated(l.getTime(), l.getLatitude(), l.getLongitude(), l.getAccuracy()); } //@Override public void onSensorChanged(SensorEvent event) { - //Log.d(TAG, "onSensorChanged azimuth:" + event.values[0] + " acc:" + event.accuracy + " time:" + event.timestamp); - if (m_field == null) - nativeCompassChanged(event.timestamp, event.values[0], 0.0, 1.0f); + if (m_magneticField == null) + notifyCompassUpdated(event.timestamp, event.values[0], 0.0, 1.0f); else - nativeCompassChanged(event.timestamp, event.values[0], event.values[0] + m_field.getDeclination(), m_field.getDeclination()); + notifyCompassUpdated(event.timestamp, event.values[0], event.values[0] + m_magneticField.getDeclination(), m_magneticField.getDeclination()); } - private native void nativeStartUpdate(Observer observer, boolean changeState); - private native void nativeStopUpdate(boolean changeState); - private native void nativeDisable(); - private native void nativeLocationChanged(long time, double lat, double lon, float accuracy); - private native void nativeLocationStatusChanged(int status); - private native void nativeCompassChanged(long time, double magneticNorth, double trueNorth, float accuracy); + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) + { + Log.d(TAG, "Compass accuracy changed to " + String.valueOf(accuracy)); + } + + @Override + public void onProviderDisabled(String provider) + { + Log.d(TAG, "Disabled location provider: " + provider); + } + + @Override + public void onProviderEnabled(String provider) + { + Log.d(TAG, "Enabled location provider: " + provider); + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) + { + Log.d(TAG, String.format("Status changed for location provider: %s to %d", provider, status)); + } }