summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/location/declarativemaps/qdeclarativegeomapitemview.cpp3
-rw-r--r--src/plugins/position/android/jar/src/org/qtproject/qt5/android/positioning/QtPositioning.java7
-rw-r--r--src/plugins/position/android/src/jnipositioning.cpp15
-rw-r--r--src/plugins/position/android/src/qgeopositioninfosource_android.cpp5
-rw-r--r--src/plugins/position/android/src/qgeopositioninfosource_android_p.h1
-rw-r--r--src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp5
-rw-r--r--src/positioning/qgeopositioninfosource.cpp58
-rw-r--r--tests/applications/positioning_backend/widget.cpp9
8 files changed, 88 insertions, 15 deletions
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
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..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
@@ -114,7 +114,7 @@ public class QtPositioning implements LocationListener
Log.w(TAG, "No locationManager available in QtPositioning");
return new int[0];
}
- List<String> providers = locationManager.getAllProviders();
+ List<String> 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)) {
@@ -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<QGeoSatelliteInfo> 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();
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<IAsyncOperation<Geoposition*>> op;
hr = d->locator->GetGeopositionAsync(&op);
+ RETURN_HR_IF_FAILED("Could not start position operation");
hr = d->locator->add_PositionChanged(Callback<GeoLocatorPositionHandler>(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;
}
diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp
index cafb4f8a..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;
}
}
@@ -355,9 +361,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 +516,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
*/
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)