From 04ce8e7f5b7476a08d4f85287e5afb9976ec2d8c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 19 Dec 2018 14:07:45 +0100 Subject: Fix QGeoPositionInfoSource::supportedPositioningMethods() on Android So far this method returned all existing positioning methods and not the available methods. Availability is defined by customer settings like turning location off or only enabling GPS based positioning. Task-number: QTBUG-66427 Change-Id: Id5b58ee4cc0274bae90ed2e363cb5cf2a287dc05 Reviewed-by: Oliver Wolff Reviewed-by: Timur Pocheptsov Reviewed-by: Paolo Angelelli --- .../jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1ea0c071..1a53512d 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 @@ -114,7 +114,7 @@ public class QtPositioning implements LocationListener Log.w(TAG, "No locationManager available in QtPositioning"); return new int[0]; } - List providers = locationManager.getAllProviders(); + List providers = locationManager.getProviders(true); int retList[] = new int[providers.size()]; for (int i = 0; i < providers.size(); i++) { if (providers.get(i).equals(LocationManager.GPS_PROVIDER)) { -- cgit v1.2.3 From 00db28fe2905c6f9b10da65cc777962c373333a6 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 19 Dec 2018 14:55:33 +0100 Subject: Improve QGeoPositionInfoSource::supportedPositioningMethods() docs In particular the differing levels of support on various platforms needed documentation. Task-number: QTBUG-66427 Change-Id: I4c390d14ad69e2f1630e883c8f0a34cbca028a03 Reviewed-by: BogDan Vatra Reviewed-by: Timur Pocheptsov --- src/positioning/qgeopositioninfosource.cpp | 42 +++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp index cafb4f8a..0230e4ca 100644 --- a/src/positioning/qgeopositioninfosource.cpp +++ b/src/positioning/qgeopositioninfosource.cpp @@ -355,9 +355,40 @@ QStringList QGeoPositionInfoSource::availableSources() /*! \fn virtual PositioningMethods QGeoPositionInfoSource::supportedPositioningMethods() const = 0; - Returns the positioning methods available to this source. - - \sa setPreferredPositioningMethods() + Returns the positioning methods available to this source. Availability is defined as being usable + at the time of calling this function. Therefore user settings like turned off location service or + limitations to Satellite-based position providers are reflected by this function. Runtime notifications + when the status changes can be obtained via \l supportedPositioningMethodsChanged(). + + Not all platforms distinguish the different positioning methods or communicate the current user + configuration of the device. The following table provides an overview of the current platform situation: + + \table + \header + \li Platform + \li Brief Description + \row + \li Android + \li Individual provider status and general Location service state are known and communicated + when location service is active. + \row + \li GeoClue + \li Hardcoced to always return AllPositioningMethods. + \row + \li GeoClue2 + \li Individual providers are not distinguishable but disabled Location services reflected. + \row + \li iOS/tvOS + \li Hardcoced to always return AllPositioningMethods. + \row + \li macOS + \li Hardcoced to always return AllPositioningMethods. + \row + \li Windows (UWP) + \li Individual providers are not distinguishable but disabled Location services reflected. + \endtable + + \sa supportedPositioningMethodsChanged(), setPreferredPositioningMethods() */ @@ -479,7 +510,10 @@ QStringList QGeoPositionInfoSource::availableSources() /*! \fn void QGeoPositionInfoSource::supportedPositioningMethodsChanged() - This signal is emitted after the supportedPositioningMethods change. + This signal is emitted when the supported positioning methods changed. The cause for a change could be + a user turning Location services on/off or restricting Location services to certain types (e.g. GPS only). + Note that changes to the supported positioning methods cannot be detected on all platforms. + \l supportedPositioningMethods() provides an overview of the current platform support. \since Qt 5.12 */ -- cgit v1.2.3 From 3c3be256cc1658b0d02047b158228fd55d04e2a0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 19 Dec 2018 15:59:46 +0100 Subject: Ensure QGeoPositionInfoSource::supportedPositioningMethodsChanged() on Android This signal was added in Qt 5.12 but never emitted on Android. Due to implementation issues this signal is emitted for each provider change (e.g. twice if network and gps provider were disabled when the entire location service is disabled) Task-number: QTBUG-66427 Change-Id: I820b3187bfd8b8ab4facb053e2019e4f5c9736d0 Reviewed-by: Oliver Wolff --- .../qtproject/qt5/android/positioning/QtPositioning.java | 5 +++-- src/plugins/position/android/src/jnipositioning.cpp | 15 ++++++++++++++- .../android/src/qgeopositioninfosource_android.cpp | 5 +++++ .../android/src/qgeopositioninfosource_android_p.h | 1 + 4 files changed, 23 insertions(+), 3 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 1a53512d..d819e627 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 @@ -521,10 +521,9 @@ public class QtPositioning implements LocationListener } } - - public static native void positionUpdated(Location update, int androidClassKey, boolean isSingleUpdate); public static native void locationProvidersDisabled(int androidClassKey); + public static native void locationProvidersChanged(int androidClassKey); public static native void satelliteUpdated(GpsSatellite[] update, int androidClassKey, boolean isSingleUpdate); @Override @@ -578,11 +577,13 @@ public class QtPositioning implements LocationListener @Override public void onProviderEnabled(String provider) { Log.d(TAG, "Enabled provider: " + provider); + locationProvidersChanged(nativeClassReference); } @Override public void onProviderDisabled(String provider) { Log.d(TAG, "Disabled provider: " + provider); + locationProvidersChanged(nativeClassReference); if (!expectedProvidersAvailable(expectedProviders)) locationProvidersDisabled(nativeClassReference); } diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp index 7d138ce4..0f358b42 100644 --- a/src/plugins/position/android/src/jnipositioning.cpp +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -528,6 +528,18 @@ static void locationProvidersDisabled(JNIEnv *env, jobject /*thiz*/, jint androi QMetaObject::invokeMethod(source, "locationProviderDisabled", Qt::AutoConnection); } +static void locationProvidersChanged(JNIEnv *env, jobject /*thiz*/, jint androidClassKey) +{ + Q_UNUSED(env); + QObject *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + if (!source) { + qWarning("locationProvidersChanged: source == 0"); + return; + } + + QMetaObject::invokeMethod(source, "locationProvidersChanged", Qt::AutoConnection); +} + static void satelliteUpdated(JNIEnv *env, jobject /*thiz*/, jobjectArray satellites, jint androidClassKey, jboolean isSingleUpdate) { QList inUse; @@ -564,7 +576,8 @@ if (!VAR) { \ static JNINativeMethod methods[] = { {"positionUpdated", "(Landroid/location/Location;IZ)V", (void *)positionUpdated}, {"locationProvidersDisabled", "(I)V", (void *) locationProvidersDisabled}, - {"satelliteUpdated", "([Landroid/location/GpsSatellite;IZ)V", (void *)satelliteUpdated} + {"satelliteUpdated", "([Landroid/location/GpsSatellite;IZ)V", (void *)satelliteUpdated}, + {"locationProvidersChanged", "(I)V", (void *) locationProvidersChanged} }; static bool registerNatives(JNIEnv *env) diff --git a/src/plugins/position/android/src/qgeopositioninfosource_android.cpp b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp index 59b8beab..38778ec4 100644 --- a/src/plugins/position/android/src/qgeopositioninfosource_android.cpp +++ b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp @@ -206,6 +206,11 @@ void QGeoPositionInfoSourceAndroid::locationProviderDisabled() setError(QGeoPositionInfoSource::ClosedError); } +void QGeoPositionInfoSourceAndroid::locationProvidersChanged() +{ + emit supportedPositioningMethodsChanged(); +} + void QGeoPositionInfoSourceAndroid::requestTimeout() { AndroidPositioning::stopUpdates(androidClassKeyForSingleRequest); diff --git a/src/plugins/position/android/src/qgeopositioninfosource_android_p.h b/src/plugins/position/android/src/qgeopositioninfosource_android_p.h index dbb27f83..61e107b1 100644 --- a/src/plugins/position/android/src/qgeopositioninfosource_android_p.h +++ b/src/plugins/position/android/src/qgeopositioninfosource_android_p.h @@ -79,6 +79,7 @@ public Q_SLOTS: void processSinglePositionUpdate(const QGeoPositionInfo& pInfo); void locationProviderDisabled(); + void locationProvidersChanged(); private Q_SLOTS: void requestTimeout(); -- cgit v1.2.3 From b14145e3fe1bda9af80b043a3b0642510435fc7f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 19 Dec 2018 16:18:34 +0100 Subject: Prevent potential blockage of setPreferredPositioningMethods() This is useful because on several platforms supportedPositioningMethods() returns NoPositioningMethods while the user has disabled the Location service. At the same time the platforms can only support dynamic supportedPositioningMethodsChanged() notifications after startUpdates() was called. Blocking changes to this property would have been counterproductive as startUpdates() would always fail and notification would not be possible. This affects at least WinRT and Android and Apple platforms need still further investigation. Task-number: QTBUG-66427 Change-Id: Ie03a3ef9c9476d7be3547661eaa87678fdb7b39c Reviewed-by: Oliver Wolff --- src/positioning/qgeopositioninfosource.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp index 0230e4ca..2e126175 100644 --- a/src/positioning/qgeopositioninfosource.cpp +++ b/src/positioning/qgeopositioninfosource.cpp @@ -241,8 +241,10 @@ int QGeoPositionInfoSource::updateInterval() const If \a methods includes a method that is not supported by the source, the unsupported method will be ignored. - If \a methods does not include any methods supported by the source, the - preferred methods will be set to the set of methods which the source supports. + If \a methods does not include a single method available/supported by the source, the + preferred methods will be set to the set of methods which the source has available. + If the source has no method availabe (e.g. because its Location service is turned off + or it does not offer a Location service), the passed \a methods are accepted as they are. \b {Note:} When reimplementing this method, subclasses must call the base method implementation to ensure preferredPositioningMethods() returns the correct value. @@ -251,9 +253,13 @@ int QGeoPositionInfoSource::updateInterval() const */ void QGeoPositionInfoSource::setPreferredPositioningMethods(PositioningMethods methods) { - d->methods = methods & supportedPositioningMethods(); - if (d->methods == 0) { - d->methods = supportedPositioningMethods(); + if (supportedPositioningMethods() != QGeoPositionInfoSource::NoPositioningMethods) { + d->methods = methods & supportedPositioningMethods(); + if (d->methods == 0) { + d->methods = supportedPositioningMethods(); + } + } else { // avoid that turned of Location service blocks any changes to d->methods + d->methods = methods; } } -- cgit v1.2.3 From 420128331deef9dd963c9455cab6ef47a8f20a5c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 20 Dec 2018 15:48:59 +0100 Subject: Enable testing of QGeoPositionSourceInfo::supportedPositioningMethodsChanged() This signal is new and is observable as part of the test application now. Task-number: QTBUG-66427 Change-Id: I3859381f4804112cbf44a365d0c9bb357d068119 Reviewed-by: Oliver Wolff --- tests/applications/positioning_backend/widget.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/applications/positioning_backend/widget.cpp b/tests/applications/positioning_backend/widget.cpp index ae39187d..efdaebdd 100644 --- a/tests/applications/positioning_backend/widget.cpp +++ b/tests/applications/positioning_backend/widget.cpp @@ -54,6 +54,15 @@ Widget::Widget(LogWidget *logWidget, QWidget *parent) : connect(m_posSource, SIGNAL(error(QGeoPositionInfoSource::Error)), this, SLOT(errorChanged(QGeoPositionInfoSource::Error))); + connect(m_posSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged, + this, [this]() { + auto methods = m_posSource->supportedPositioningMethods(); + const QString status = QStringLiteral("Satellite: %1 ").arg(bool(methods & QGeoPositionInfoSource::SatellitePositioningMethods)) + + QStringLiteral("Non-Satellite: %1").arg(bool(methods & QGeoPositionInfoSource::NonSatellitePositioningMethods)); + + qDebug() << "Available Positioning Methods Changed" << status; + log->appendLog(status); + }); } void Widget::positionUpdated(QGeoPositionInfo gpsPos) -- cgit v1.2.3 From 81a9c22e75f37c8878d41fa2df249ae20bc44adb Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 3 Jan 2019 10:45:00 +0100 Subject: winrt: Minor improvements in error handling - If more than 1 action is done inside runOnXamlThread any error should cause a "top level" error. - If every possible error inside runOnXamlThread gives a proper error message we do not need another error message outside of the block. Change-Id: I910f9e4bc7984e1c7e1f358eee975738ffa3bb2f Reviewed-by: Andre de la Rocha Reviewed-by: Alex Blasche --- src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp index 139a6b3d..b55d2ba3 100644 --- a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp +++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp @@ -179,7 +179,6 @@ int QGeoPositionInfoSourceWinRT::init() }); if (FAILED(hr)) { setError(QGeoPositionInfoSource::UnknownSourceError); - qErrnoWarning(hr, "Could not register status changed callback"); return -1; } @@ -342,15 +341,17 @@ bool QGeoPositionInfoSourceWinRT::startHandler() // registered. That could have helped in the single update case ComPtr> op; hr = d->locator->GetGeopositionAsync(&op); + RETURN_HR_IF_FAILED("Could not start position operation"); hr = d->locator->add_PositionChanged(Callback(this, &QGeoPositionInfoSourceWinRT::onPositionChanged).Get(), &d->positionToken); + RETURN_HR_IF_FAILED("Could not add position handler"); + return hr; }); if (FAILED(hr)) { setError(QGeoPositionInfoSource::UnknownSourceError); - qErrnoWarning(hr, "Could not add position handler"); return false; } -- cgit v1.2.3 From b1fe421e9a64d57a6135a95453caf847ab6e6e78 Mon Sep 17 00:00:00 2001 From: Kari Oikarinen Date: Mon, 7 Jan 2019 09:29:29 +0200 Subject: Bump version Change-Id: Ifc3f75ab0164e3a973e263b68659a7e7dd40d74e --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 0815e3b5..3dc70a37 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,7 +1,7 @@ load(qt_build_config) CONFIG += warning_clean -MODULE_VERSION = 5.12.0 +MODULE_VERSION = 5.12.1 # Adds a way to debug location. The define is needed for multiple subprojects as they # include the essential headers. -- cgit v1.2.3 From 1688c44d223145abfdca19a7b31faecbafb0d315 Mon Sep 17 00:00:00 2001 From: Paolo Angelelli Date: Sun, 6 Jan 2019 11:36:08 +0100 Subject: Fix MapItemView attempting to instantiate items with map not set This case was not a problem when the only incubation mode was Asynchronous, because the test for m_map was done in createdItem. Now that Synchronous is supported too, this check has to be done earlier or else instantiated items will never be added to the map. Change-Id: Ifaa033fb0b64cabe74df395fcb387d162cd02b80 Reviewed-by: BogDan Vatra --- src/location/declarativemaps/qdeclarativegeomapitemview.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/location/declarativemaps/qdeclarativegeomapitemview.cpp b/src/location/declarativemaps/qdeclarativegeomapitemview.cpp index 41ab3453..d404fd47 100644 --- a/src/location/declarativemaps/qdeclarativegeomapitemview.cpp +++ b/src/location/declarativemaps/qdeclarativegeomapitemview.cpp @@ -175,6 +175,9 @@ void QDeclarativeGeoMapItemView::createdItem(int index, QObject */*object*/) void QDeclarativeGeoMapItemView::modelUpdated(const QQmlChangeSet &changeSet, bool reset) { + if (!m_map) // everything will be done in instantiateAllItems. Removal is done by declarativegeomap. + return; + // move changes are expressed as one remove + one insert, with the same moveId. // For simplicity, they will be treated as remove + insert. // Changes will be also ignored, as they represent only data changes, not layout changes -- cgit v1.2.3