summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarja Sundqvist <tarja.sundqvist@qt.io>2022-11-10 22:42:35 +0200
committerTarja Sundqvist <tarja.sundqvist@qt.io>2022-11-10 22:42:35 +0200
commit98a5c511ea753edc9a28a5610d6e2234df049293 (patch)
tree91e0711a60106fbd57402df758e3800d414e6f5a
parent597c98851d85a5f1f03abfaaf8c91a33a963d9f0 (diff)
parent45ff6ea68b3d0d510a279f6512cd4b8fc352c729 (diff)
Merge remote-tracking branch 'origin/tqtc/lts-5.15.8' into tqtc/lts-5.15-opensourcev5.15.8-lts-lgpl
-rw-r--r--.qmake.conf2
-rw-r--r--src/plugins/position/corelocation/qgeopositioninfosource_cl.mm94
-rw-r--r--src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h21
-rw-r--r--src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp9
4 files changed, 60 insertions, 66 deletions
diff --git a/.qmake.conf b/.qmake.conf
index ed89f696..739075aa 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -3,7 +3,7 @@ CONFIG += warning_clean
DEFINES += QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST
-MODULE_VERSION = 5.15.7
+MODULE_VERSION = 5.15.8
# Adds a way to debug location. The define is needed for multiple subprojects as they
# include the essential headers.
diff --git a/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
index 2d412138..c5e5c333 100644
--- a/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
+++ b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm
@@ -63,9 +63,8 @@
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
- Q_UNUSED(manager)
- if (status == kCLAuthorizationStatusNotDetermined)
- m_positionInfoSource->requestUpdate(MINIMUM_UPDATE_INTERVAL);
+ Q_UNUSED(manager);
+ m_positionInfoSource->changeAuthorizationStatus(status);
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
@@ -112,12 +111,12 @@
QT_BEGIN_NAMESPACE
QGeoPositionInfoSourceCL::QGeoPositionInfoSourceCL(QObject *parent)
- : QGeoPositionInfoSource(parent)
- , m_locationManager(0)
- , m_started(false)
- , m_updateTimer(0)
- , m_updateTimeout(0)
- , m_positionError(QGeoPositionInfoSource::NoError)
+ : QGeoPositionInfoSource(parent),
+ m_locationManager(0),
+ m_updatesWanted(false),
+ m_updateTimer(0),
+ m_updateTimeout(0),
+ m_positionError(QGeoPositionInfoSource::NoError)
{
}
@@ -138,45 +137,14 @@ void QGeoPositionInfoSourceCL::setUpdateInterval(int msec)
// Must timeout if update takes longer than specified interval
m_updateTimeout = msec;
- if (m_started) setTimeoutInterval(m_updateTimeout);
+ if (m_updatesWanted)
+ setTimeoutInterval(m_updateTimeout);
}
bool QGeoPositionInfoSourceCL::enableLocationManager()
{
if (!m_locationManager) {
- if ([CLLocationManager locationServicesEnabled]) {
- // Location Services Are Enabled
- switch ([CLLocationManager authorizationStatus]) {
- case kCLAuthorizationStatusNotDetermined:
- // User has not yet made a choice with regards to this application
- break;
- case kCLAuthorizationStatusRestricted:
- // This application is not authorized to use location services. Due
- // to active restrictions on location services, the user cannot change
- // this status, and may not have personally denied authorization
- return false;
- case kCLAuthorizationStatusDenied:
- // User has explicitly denied authorization for this application, or
- // location services are disabled in Settings
- return false;
- case kCLAuthorizationStatusAuthorizedAlways:
- // This app is authorized to start location services at any time.
- break;
-#ifndef Q_OS_MACOS
- case kCLAuthorizationStatusAuthorizedWhenInUse:
- // This app is authorized to start most location services while running in the foreground.
- break;
-#endif
- default:
- // By default, try to enable it
- break;
- }
- } else {
- // Location Services Disabled
- return false;
- }
-
- m_locationManager = [[CLLocationManager alloc] init];
+ m_locationManager = [[CLLocationManager alloc] init];
#if defined(Q_OS_IOS) || defined(Q_OS_WATCHOS)
if (__builtin_available(watchOS 4.0, *)) {
@@ -232,32 +200,37 @@ void QGeoPositionInfoSourceCL::setTimeoutInterval(int msec)
void QGeoPositionInfoSourceCL::startUpdates()
{
+ m_positionError = QGeoPositionInfoSource::NoError;
+ m_updatesWanted = true;
if (enableLocationManager()) {
#ifdef Q_OS_TVOS
[m_locationManager requestLocation]; // service will run long enough for one location update
#else
[m_locationManager startUpdatingLocation];
#endif
- m_started = true;
-
setTimeoutInterval(m_updateTimeout);
- } else setError(QGeoPositionInfoSource::AccessError);
+ } else {
+ setError(QGeoPositionInfoSource::AccessError);
+ }
}
void QGeoPositionInfoSourceCL::stopUpdates()
{
if (m_locationManager) {
[m_locationManager stopUpdatingLocation];
- m_started = false;
+ m_updatesWanted = false;
// Stop timeout timer
setTimeoutInterval(0);
- } else setError(QGeoPositionInfoSource::AccessError);
+ } else {
+ setError(QGeoPositionInfoSource::AccessError);
+ }
}
void QGeoPositionInfoSourceCL::requestUpdate(int timeout)
{
// Get a single update within timeframe
+ m_positionError = QGeoPositionInfoSource::NoError;
if (timeout < minimumUpdateInterval() && timeout != 0)
emit updateTimeout();
else if (enableLocationManager()) {
@@ -270,7 +243,21 @@ void QGeoPositionInfoSourceCL::requestUpdate(int timeout)
#endif
setTimeoutInterval(timeout);
- } else setError(QGeoPositionInfoSource::AccessError);
+ } else {
+ setError(QGeoPositionInfoSource::AccessError);
+ }
+}
+
+void QGeoPositionInfoSourceCL::changeAuthorizationStatus(CLAuthorizationStatus status)
+{
+ if (status == kCLAuthorizationStatusAuthorizedAlways
+#ifndef Q_OS_MACOS
+ || status == kCLAuthorizationStatusAuthorizedWhenInUse
+#endif
+ ) {
+ if (m_updatesWanted)
+ startUpdates();
+ }
}
void QGeoPositionInfoSourceCL::timerEvent( QTimerEvent * event )
@@ -283,7 +270,8 @@ void QGeoPositionInfoSourceCL::timerEvent( QTimerEvent * event )
setTimeoutInterval(0);
// Started for single update?
- if (!m_started) stopUpdates();
+ if (!m_updatesWanted)
+ stopUpdates();
}
}
@@ -305,7 +293,8 @@ void QGeoPositionInfoSourceCL::locationDataAvailable(QGeoPositionInfo location)
emit positionUpdated(location);
// Started for single update?
- if (!m_started) stopUpdates();
+ if (!m_updatesWanted)
+ stopUpdates();
// ...otherwise restart timeout timer
else setTimeoutInterval(m_updateTimeout);
}
@@ -325,7 +314,8 @@ QGeoPositionInfoSource::Error QGeoPositionInfoSourceCL::error() const
void QGeoPositionInfoSourceCL::setError(QGeoPositionInfoSource::Error positionError)
{
m_positionError = positionError;
- emit QGeoPositionInfoSource::error(positionError);
+ if (m_positionError != QGeoPositionInfoSource::NoError)
+ emit QGeoPositionInfoSource::error(positionError);
}
QT_END_NAMESPACE
diff --git a/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h b/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h
index 5ede8bf6..e064529e 100644
--- a/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h
+++ b/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h
@@ -65,33 +65,34 @@ public:
QGeoPositionInfoSourceCL(QObject *parent = 0);
~QGeoPositionInfoSourceCL();
- QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const;
- PositioningMethods supportedPositioningMethods() const;
+ QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override;
+ PositioningMethods supportedPositioningMethods() const override;
- void setUpdateInterval(int msec);
- int minimumUpdateInterval() const;
- Error error() const;
+ void setUpdateInterval(int msec) override;
+ int minimumUpdateInterval() const override;
+ Error error() const override;
void locationDataAvailable(QGeoPositionInfo location);
void setError(QGeoPositionInfoSource::Error positionError);
+ void changeAuthorizationStatus(CLAuthorizationStatus status);
private:
bool enableLocationManager();
void setTimeoutInterval(int msec);
public Q_SLOTS:
- void startUpdates();
- void stopUpdates();
+ void startUpdates() override;
+ void stopUpdates() override;
- void requestUpdate(int timeout = 0);
+ void requestUpdate(int timeout = 0) override;
protected:
- virtual void timerEvent(QTimerEvent *event);
+ void timerEvent(QTimerEvent *event) override;
private:
Q_DISABLE_COPY(QGeoPositionInfoSourceCL);
CLLocationManager *m_locationManager;
- bool m_started;
+ bool m_updatesWanted;
QGeoPositionInfo m_lastUpdate;
diff --git a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
index 10484e3b..f157a03a 100644
--- a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
+++ b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp
@@ -410,7 +410,8 @@ void QGeoPositionInfoSourceGeoclue2::handleNewLocation(const QDBusObjectPath &ol
} else {
QGeoCoordinate coordinate(location.latitude(),
location.longitude());
- if (const auto altitude = location.altitude() > std::numeric_limits<double>::min())
+ const auto altitude = location.altitude();
+ if (altitude > std::numeric_limits<double>::lowest())
coordinate.setAltitude(altitude);
const Timestamp ts = location.timestamp();
@@ -428,9 +429,11 @@ void QGeoPositionInfoSourceGeoclue2::handleNewLocation(const QDBusObjectPath &ol
m_lastPositionFromSatellite = qFuzzyCompare(accuracy, 0.0);
m_lastPosition.setAttribute(QGeoPositionInfo::HorizontalAccuracy, accuracy);
- if (const auto speed = location.speed() >= 0.0)
+ const auto speed = location.speed();
+ if (speed >= 0.0)
m_lastPosition.setAttribute(QGeoPositionInfo::GroundSpeed, speed);
- if (const auto heading = location.heading() >= 0.0)
+ const auto heading = location.heading();
+ if (heading >= 0.0)
m_lastPosition.setAttribute(QGeoPositionInfo::Direction, heading);
emit positionUpdated(m_lastPosition);