diff options
author | Paolo Angelelli <paolo.angelelli@qt.io> | 2019-05-02 18:53:35 +0200 |
---|---|---|
committer | paolo <paolo.angelelli@qt.io> | 2019-07-24 16:25:44 +0200 |
commit | f8694e1f3430b7851fc90e26c6d778a86219379a (patch) | |
tree | fbe92684c4458431bf29d8b68d8cddea7b8e496a | |
parent | 17e3f08377c34d301401fbd3c40b525790fcd9a5 (diff) | |
download | qtlocation-f8694e1f3430b7851fc90e26c6d778a86219379a.tar.gz |
Allow setting backend properties of positioning plugins
This change adds a pair of setter/getter to specify positioning backend
properties at runtime, both in QGeoPositionInfoSource and
QDeclarativePositionSource.
Task-number: QTBUG-66304
Change-Id: Iea9421fb708879bee5c62c4afaf45cbda57f50bb
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r-- | src/positioning/qgeopositioninfosource.cpp | 54 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosource.h | 6 | ||||
-rw-r--r-- | src/positioning/qgeopositioninfosource_p.h | 6 | ||||
-rw-r--r-- | src/positioningquick/qdeclarativepositionsource.cpp | 38 | ||||
-rw-r--r-- | src/positioningquick/qdeclarativepositionsource_p.h | 3 | ||||
-rw-r--r-- | tests/auto/declarative_core/tst_positionsource.qml | 8 | ||||
-rw-r--r-- | tests/auto/positionplugin/plugin.cpp | 29 | ||||
-rw-r--r-- | tests/auto/positionplugin/positionplugin.pro | 2 |
8 files changed, 139 insertions, 7 deletions
diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp index 29a0d019..69fcdef0 100644 --- a/src/positioning/qgeopositioninfosource.cpp +++ b/src/positioning/qgeopositioninfosource.cpp @@ -108,6 +108,11 @@ QGeoPositionInfoSourcePrivate *QGeoPositionInfoSourcePrivate::get(const QGeoPosi return source.d; } +QGeoPositionInfoSourcePrivate::~QGeoPositionInfoSourcePrivate() +{ + +} + void QGeoPositionInfoSourcePrivate::loadMeta() { metaData = plugins().value(providerName); @@ -128,6 +133,16 @@ void QGeoPositionInfoSourcePrivate::loadPlugin() factory = factoryV2; } +bool QGeoPositionInfoSourcePrivate::setBackendProperty(const QString &/*name*/, QVariant /*value*/) +{ + return false; +} + +QVariant QGeoPositionInfoSourcePrivate::backendProperty(const QString &/*name*/) const +{ + return QVariant(); +} + QHash<QString, QJsonObject> QGeoPositionInfoSourcePrivate::plugins(bool reload) { static QHash<QString, QJsonObject> plugins; @@ -216,6 +231,36 @@ QString QGeoPositionInfoSource::sourceName() const } /*! + Sets the backend-specific property named \a name to \a value. + Returns \c true on success, \c false otherwise. + Backend-specific properties can be used to configure the positioning subsystem behavior + at runtime. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \sa backendProperty + \since Qt 5.14 +*/ +bool QGeoPositionInfoSource::setBackendProperty(const QString &name, QVariant value) +{ + return d->setBackendProperty(name, value); +} + +/*! + Returns the value of the backend-specific property named \a name, if present. + Otherwise, the returned value will be invalid. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \sa setBackendProperty + \since Qt 5.14 +*/ +QVariant QGeoPositionInfoSource::backendProperty(const QString &name) const +{ + return d->backendProperty(name); +} + +/*! \property QGeoPositionInfoSource::updateInterval \brief This property holds the requested interval in milliseconds between each update. @@ -382,6 +427,15 @@ QStringList QGeoPositionInfoSource::availableSources() return plugins; } +QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent) +: QObject(parent), + d(&dd) +{ + qRegisterMetaType<QGeoPositionInfo>(); + d->interval = 0; + d->methods = NoPositioningMethods; +} + /*! \fn QGeoPositionInfo QGeoPositionInfoSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0; diff --git a/src/positioning/qgeopositioninfosource.h b/src/positioning/qgeopositioninfosource.h index 23b3ac46..eaf5e106 100644 --- a/src/positioning/qgeopositioninfosource.h +++ b/src/positioning/qgeopositioninfosource.h @@ -87,6 +87,9 @@ public: QString sourceName() const; + bool setBackendProperty(const QString &name, QVariant value); + QVariant backendProperty(const QString &name) const; + static QGeoPositionInfoSource *createDefaultSource(QObject *parent); static QGeoPositionInfoSource *createDefaultSource(const QVariantMap ¶meters, QObject *parent); static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent); @@ -106,6 +109,9 @@ Q_SIGNALS: void error(QGeoPositionInfoSource::Error); void supportedPositioningMethodsChanged(); +protected: + QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent); + private: Q_DISABLE_COPY(QGeoPositionInfoSource) QGeoPositionInfoSourcePrivate *d; diff --git a/src/positioning/qgeopositioninfosource_p.h b/src/positioning/qgeopositioninfosource_p.h index f5f85ec9..ccd92a4e 100644 --- a/src/positioning/qgeopositioninfosource_p.h +++ b/src/positioning/qgeopositioninfosource_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include <QtPositioning/private/qpositioningglobal_p.h> #include "qgeopositioninfosource.h" #include "qgeopositioninfosourcefactory.h" #include <QJsonObject> @@ -60,10 +61,11 @@ QT_BEGIN_NAMESPACE -class QGeoPositionInfoSourcePrivate +class Q_POSITIONING_PRIVATE_EXPORT QGeoPositionInfoSourcePrivate { public: static QGeoPositionInfoSourcePrivate *get(const QGeoPositionInfoSource &source); + virtual ~QGeoPositionInfoSourcePrivate(); int interval; QGeoPositionInfoSource::PositioningMethods methods; @@ -74,6 +76,8 @@ public: void loadMeta(); void loadPlugin(); + virtual bool setBackendProperty(const QString &name, QVariant value); + virtual QVariant backendProperty(const QString &name) const; static QHash<QString, QJsonObject> plugins(bool reload = false); static void loadPluginMetadata(QHash<QString, QJsonObject> &list); diff --git a/src/positioningquick/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp index 3bf39081..cfbcc9da 100644 --- a/src/positioningquick/qdeclarativepositionsource.cpp +++ b/src/positioningquick/qdeclarativepositionsource.cpp @@ -862,6 +862,44 @@ void QDeclarativePositionSource::componentComplete() } /*! + \qmlmethod bool QtLocation::PositionSource::setBackendProperty(string name, Variant value) + + Sets the backend-specific property named \a name to \a value. + Returns true on success, false otherwise, including if called on an uninitialized PositionSource. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \since Qt Positioning 5.14 + + \sa backendProperty, QGeoPositionInfoSource::setBackendProperty +*/ +bool QDeclarativePositionSource::setBackendProperty(const QString &name, QVariant value) +{ + if (m_positionSource) + return m_positionSource->setBackendProperty(name, value); + return false; +} + +/*! + \qmlmethod Variant QtLocation::PositionSource::backendProperty(string name) + + Returns the value of the backend-specific property named \a name, if present. + Otherwise, including if called on an uninitialized PositionSource, the return value will be invalid. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \since Qt Positioning 5.14 + + \sa backendProperty, QGeoPositionInfoSource::setBackendProperty +*/ +QVariant QDeclarativePositionSource::backendProperty(const QString &name) const +{ + if (m_positionSource) + return m_positionSource->backendProperty(name); + return QVariant(); +} + +/*! \internal */ void QDeclarativePositionSource::sourceErrorReceived(const QGeoPositionInfoSource::Error error) diff --git a/src/positioningquick/qdeclarativepositionsource_p.h b/src/positioningquick/qdeclarativepositionsource_p.h index 7e389b85..dff0006c 100644 --- a/src/positioningquick/qdeclarativepositionsource_p.h +++ b/src/positioningquick/qdeclarativepositionsource_p.h @@ -131,6 +131,9 @@ public: void classBegin() { } void componentComplete(); + Q_INVOKABLE bool setBackendProperty(const QString &name, QVariant value); + Q_INVOKABLE QVariant backendProperty(const QString &name) const; + public Q_SLOTS: void update(); // TODO Qt 6 change to void update(int) void start(); diff --git a/tests/auto/declarative_core/tst_positionsource.qml b/tests/auto/declarative_core/tst_positionsource.qml index 9b78936b..7b787a0c 100644 --- a/tests/auto/declarative_core/tst_positionsource.qml +++ b/tests/auto/declarative_core/tst_positionsource.qml @@ -187,7 +187,7 @@ TestCase { compare(directionValidSpyWParams.count, 0) compare(directionSpyWParams.count, 0) - + compare(testingSourceWParams.backendProperty("altitude"), altitudeParameter.value) testingSourceWParams.active = true; tryCompare(updateSpyWParams, "count", 1, 1500); @@ -199,23 +199,25 @@ TestCase { fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) verify(!testingSourceWParams.position.speedValid) verify(isNaN(testingSourceWParams.position.speed)) + testingSourceWParams.setBackendProperty("altitude", 24.24) tryCompare(updateSpyWParams, "count", 2, 1500); compare(testingSourceWParams.position.coordinate.longitude, 0.2); compare(testingSourceWParams.position.coordinate.latitude, 0.2); - compare(testingSourceWParams.position.coordinate.altitude, altitudeParameter.value); + compare(testingSourceWParams.position.coordinate.altitude, 24.24); compare(directionValidSpyWParams.count, 1) compare(directionSpyWParams.count, 2) fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) verify(testingSourceWParams.position.speedValid) verify(testingSourceWParams.position.speed > 10000) + compare(testingSourceWParams.backendProperty("altitude"), 24.24) testingSourceWParams.active = false; wait(2500); compare(updateSpyWParams.count, 2); compare(testingSourceWParams.position.coordinate.longitude, 0.2); compare(testingSourceWParams.position.coordinate.latitude, 0.2); - compare(testingSourceWParams.position.coordinate.altitude, altitudeParameter.value); + compare(testingSourceWParams.position.coordinate.altitude, 24.24); compare(directionValidSpyWParams.count, 1) compare(directionSpyWParams.count, 2) fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) diff --git a/tests/auto/positionplugin/plugin.cpp b/tests/auto/positionplugin/plugin.cpp index b6016b95..9d5c7dd5 100644 --- a/tests/auto/positionplugin/plugin.cpp +++ b/tests/auto/positionplugin/plugin.cpp @@ -27,6 +27,7 @@ ****************************************************************************/ #include <QtPositioning/qgeopositioninfosource.h> +#include <QtPositioning/private/qgeopositioninfosource_p.h> #include <QtPositioning/qgeopositioninfosourcefactory.h> #include <QObject> #include <QtPlugin> @@ -65,15 +66,38 @@ private slots: void doTimeout(); }; +class DummySourcePrivate : public QGeoPositionInfoSourcePrivate +{ +public: + bool setBackendProperty(const QString &name, QVariant value) override + { + if (name == QStringLiteral("altitude")) { + m_altitude = value.toReal(); + return true; + } + return false; + } + QVariant backendProperty(const QString &name) const override + { + if (name == QStringLiteral("altitude")) + return m_altitude; + return QVariant(); + } + + qreal m_altitude = 0.0; +}; + DummySource::DummySource(const QVariantMap ¶meters, QObject *parent) : - QGeoPositionInfoSource(parent), + QGeoPositionInfoSource(*new DummySourcePrivate, parent), timer(new QTimer(this)), timeoutTimer(new QTimer(this)), singleTimer(new QTimer(this)), lastPosition(QGeoCoordinate(0,0), QDateTime::currentDateTime()) { + DummySourcePrivate *dd = static_cast<DummySourcePrivate *>(QGeoPositionInfoSourcePrivate::get(*this)); if (parameters.contains(QStringLiteral("test.source.altitude"))) { const qreal alti = parameters.value(QStringLiteral("test.source.altitude")).toReal(); + dd->m_altitude = alti; QGeoCoordinate crd = lastPosition.coordinate(); crd.setAltitude(alti); lastPosition.setCoordinate(crd); @@ -157,6 +181,7 @@ DummySource::~DummySource() void DummySource::updatePosition() { + DummySourcePrivate *dd = static_cast<DummySourcePrivate *>(QGeoPositionInfoSourcePrivate::get(*this)); timeoutTimer->stop(); singleTimer->stop(); @@ -164,7 +189,7 @@ void DummySource::updatePosition() QGeoCoordinate coord(lastPosition.coordinate().latitude() + 0.1, lastPosition.coordinate().longitude() + 0.1, - lastPosition.coordinate().altitude()); + dd->m_altitude); QGeoPositionInfo info(coord, now); info.setAttribute(QGeoPositionInfo::Direction, lastPosition.coordinate().azimuthTo(coord)); diff --git a/tests/auto/positionplugin/positionplugin.pro b/tests/auto/positionplugin/positionplugin.pro index 9ccd030f..84d08ac0 100644 --- a/tests/auto/positionplugin/positionplugin.pro +++ b/tests/auto/positionplugin/positionplugin.pro @@ -1,5 +1,5 @@ TARGET = qtposition_testplugin -QT += positioning +QT += positioning-private PLUGIN_TYPE = position PLUGIN_CLASS_NAME = QGeoPositionInfoSourceFactoryTest |