diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-11-10 22:42:35 +0200 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2022-11-10 22:42:35 +0200 |
commit | 98a5c511ea753edc9a28a5610d6e2234df049293 (patch) | |
tree | 91e0711a60106fbd57402df758e3800d414e6f5a | |
parent | 597c98851d85a5f1f03abfaaf8c91a33a963d9f0 (diff) | |
parent | 45ff6ea68b3d0d510a279f6512cd4b8fc352c729 (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.8' into tqtc/lts-5.15-opensourcev5.15.8-lts-lgpl
Change-Id: I538d4dd455b56a4d396f655a61f99c1d68893d9f
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); |