summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVyacheslav Koscheev <vok1980@gmail.com>2016-01-22 23:09:11 +0600
committerVyacheslav Koscheev <vok1980@gmail.com>2016-01-25 14:45:10 +0000
commit24e50e40caaa2f2e057180b8ed8179795e605e2a (patch)
treef2086ddd950bdb51b76b0e2541b0ae43dcfc29ca
parenta41bd80784a01050dfb6b888cd90505259471f4f (diff)
downloadqtlocation-24e50e40caaa2f2e057180b8ed8179795e605e2a.tar.gz
Fix endless location requesting
This patch fixes the problem of lost positioning listeners, which was registered in LocationManager, but does not persist in the `runningListeners` collection. We can't call LocationManager.removeUpdates() for those listeners, that are not in `runningListeners` and that's why LocationManager never ends to update location for them. Listener can be registered in LocationManager and not added to `runningListeners` collection at least in the following cases: 1. `startUpdates()` was called when location providers was disabled in system. 2. `startUpdates()` was called twice, without `stopUpdates()` Change-Id: If6777677cbb6f2ad9107fe2ac8496b7cdbb2d8d4 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
-rw-r--r--src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java102
1 files changed, 66 insertions, 36 deletions
diff --git a/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java b/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
index e67ffe12..44214f53 100644
--- a/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
+++ b/src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java
@@ -173,6 +173,58 @@ public class QtPositioning implements LocationListener
return false;
}
+
+ static private void addActiveListener(QtPositioning listener, String provider)
+ {
+ int androidClassKey = listener.nativeClassReference;
+ //start update thread
+ listener.setActiveLooper(true);
+
+ if (runningListeners.containsKey(androidClassKey) && runningListeners.get(androidClassKey) != listener) {
+ removeActiveListener(androidClassKey);
+ }
+
+ locationManager.requestSingleUpdate(provider,
+ listener,
+ listener.looper());
+
+ runningListeners.put(androidClassKey, listener);
+ }
+
+
+ static private void addActiveListener(QtPositioning listener, String provider, long minTime, float minDistance)
+ {
+ int androidClassKey = listener.nativeClassReference;
+ //start update thread
+ listener.setActiveLooper(true);
+
+ if (runningListeners.containsKey(androidClassKey) && runningListeners.get(androidClassKey) != listener) {
+ removeActiveListener(androidClassKey);
+ }
+
+ locationManager.requestLocationUpdates(provider,
+ minTime, minDistance,
+ listener,
+ listener.looper());
+
+ runningListeners.put(androidClassKey, listener);
+ }
+
+
+ static private void removeActiveListener(QtPositioning listener)
+ {
+ removeActiveListener(listener.nativeClassReference);
+ }
+
+
+ static private void removeActiveListener(int androidClassKey)
+ {
+ QtPositioning listener = runningListeners.remove(androidClassKey);
+ locationManager.removeUpdates(listener);
+ listener.setActiveLooper(false);
+ }
+
+
static public int startUpdates(int androidClassKey, int locationProvider, int updateInterval)
{
synchronized (m_syncObject) {
@@ -182,8 +234,6 @@ public class QtPositioning implements LocationListener
positioningListener.nativeClassReference = androidClassKey;
positioningListener.expectedProviders = locationProvider;
positioningListener.isSatelliteUpdate = false;
- //start update thread
- positioningListener.setActiveLooper(true);
if (updateInterval == 0)
updateInterval = 1000; //don't update more often than once per second
@@ -192,10 +242,9 @@ public class QtPositioning implements LocationListener
if ((locationProvider & QT_GPS_PROVIDER) > 0) {
Log.d(TAG, "Regular updates using GPS " + updateInterval);
try {
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
- updateInterval, 0,
- positioningListener,
- positioningListener.looper());
+ addActiveListener(positioningListener,
+ LocationManager.GPS_PROVIDER,
+ updateInterval, 0);
} catch (SecurityException se) {
se.printStackTrace();
exceptionOccurred = true;
@@ -205,18 +254,16 @@ public class QtPositioning implements LocationListener
if ((locationProvider & QT_NETWORK_PROVIDER) > 0) {
Log.d(TAG, "Regular updates using network " + updateInterval);
try {
- locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
- updateInterval, 0,
- positioningListener,
- positioningListener.looper());
+ addActiveListener(positioningListener,
+ LocationManager.NETWORK_PROVIDER,
+ updateInterval, 0);
} catch (SecurityException se) {
se.printStackTrace();
exceptionOccurred = true;
}
}
if (exceptionOccurred) {
- positioningListener.setActiveLooper(false);
- locationManager.removeUpdates(positioningListener);
+ removeActiveListener(positioningListener);
return QT_ACCESS_ERROR;
}
@@ -225,7 +272,6 @@ public class QtPositioning implements LocationListener
return QT_CLOSED_ERROR;
}
- runningListeners.put(androidClassKey, positioningListener);
} catch(Exception e) {
e.printStackTrace();
return QT_POSITION_UNKNOWN_SOURCE_ERROR;
@@ -240,9 +286,7 @@ public class QtPositioning implements LocationListener
synchronized (m_syncObject) {
try {
Log.d(TAG, "Stopping updates");
- QtPositioning listener = runningListeners.remove(androidClassKey);
- locationManager.removeUpdates(listener);
- listener.setActiveLooper(false);
+ removeActiveListener(androidClassKey);
} catch(Exception e) {
e.printStackTrace();
return;
@@ -260,15 +304,11 @@ public class QtPositioning implements LocationListener
positioningListener.isSingleUpdate = true;
positioningListener.expectedProviders = locationProvider;
positioningListener.isSatelliteUpdate = false;
- //start update thread
- positioningListener.setActiveLooper(true);
if ((locationProvider & QT_GPS_PROVIDER) > 0) {
Log.d(TAG, "Single update using GPS");
try {
- locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,
- positioningListener,
- positioningListener.looper());
+ addActiveListener(positioningListener, LocationManager.GPS_PROVIDER);
} catch (SecurityException se) {
se.printStackTrace();
exceptionOccurred = true;
@@ -278,17 +318,14 @@ public class QtPositioning implements LocationListener
if ((locationProvider & QT_NETWORK_PROVIDER) > 0) {
Log.d(TAG, "Single update using network");
try {
- locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,
- positioningListener,
- positioningListener.looper());
+ addActiveListener(positioningListener, LocationManager.NETWORK_PROVIDER);
} catch (SecurityException se) {
se.printStackTrace();
exceptionOccurred = true;
}
}
if (exceptionOccurred) {
- positioningListener.setActiveLooper(false);
- locationManager.removeUpdates(positioningListener);
+ removeActiveListener(positioningListener);
return QT_ACCESS_ERROR;
}
@@ -298,7 +335,6 @@ public class QtPositioning implements LocationListener
return QT_CLOSED_ERROR;
}
- runningListeners.put(androidClassKey, positioningListener);
} catch(Exception e) {
e.printStackTrace();
return QT_POSITION_UNKNOWN_SOURCE_ERROR;
@@ -318,8 +354,6 @@ public class QtPositioning implements LocationListener
positioningListener.nativeClassReference = androidClassKey;
positioningListener.expectedProviders = 1; //always satellite provider
positioningListener.isSingleUpdate = isSingleRequest;
- //start update thread
- positioningListener.setActiveLooper(true);
if (updateInterval == 0)
updateInterval = 1000; //don't update more often than once per second
@@ -329,18 +363,15 @@ public class QtPositioning implements LocationListener
else
Log.d(TAG, "Regular updates for Satellites " + updateInterval);
try {
- locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
- updateInterval, 0,
- positioningListener,
- positioningListener.looper());
+ addActiveListener(positioningListener, LocationManager.GPS_PROVIDER,
+ updateInterval, 0);
} catch (SecurityException se) {
se.printStackTrace();
exceptionOccurred = true;
}
if (exceptionOccurred) {
- positioningListener.setActiveLooper(false);
- locationManager.removeUpdates(positioningListener);
+ removeActiveListener(positioningListener);
return QT_ACCESS_ERROR;
}
@@ -350,7 +381,6 @@ public class QtPositioning implements LocationListener
return QT_CLOSED_ERROR;
}
- runningListeners.put(androidClassKey, positioningListener);
} catch(Exception e) {
e.printStackTrace();
return QT_SATELLITE_UNKNOWN_SOURCE_ERROR;