diff options
author | Vyacheslav Koscheev <vok1980@gmail.com> | 2016-01-22 23:09:11 +0600 |
---|---|---|
committer | Vyacheslav Koscheev <vok1980@gmail.com> | 2016-01-25 14:45:10 +0000 |
commit | 24e50e40caaa2f2e057180b8ed8179795e605e2a (patch) | |
tree | f2086ddd950bdb51b76b0e2541b0ae43dcfc29ca | |
parent | a41bd80784a01050dfb6b888cd90505259471f4f (diff) | |
download | qtlocation-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.java | 102 |
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; |