void QGeoPositionInfoSourceAndroid::setPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods)
{
    PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
    QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
    if (previousPreferredPositioningMethods == preferredPositioningMethods())
        return;

    if (updatesRunning)
        reconfigureRunningSystem();
}
/*!
    \reimp
*/
void QGeoPositionInfoSourceBb::setPreferredPositioningMethods(PositioningMethods methods)
{
    PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
    QGeoPositionInfoSource::setPreferredPositioningMethods(methods);
    if (previousPreferredPositioningMethods == preferredPositioningMethods())
        return;

    Q_D(QGeoPositionInfoSourceBb);
    if (d->_startUpdatesInvoked) {
        d->stopUpdates();
        d->startUpdates();
    }
}
void QDeclarativePositionSource::setName(const QString &newName)
{
    if (m_positionSource && m_positionSource->sourceName() == newName)
        return;

    const QString previousName = name();
    int previousUpdateInterval = updateInterval();
    PositioningMethods previousPositioningMethods = supportedPositioningMethods();
    PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();

    delete m_positionSource;
    if (newName.isEmpty())
        m_positionSource = QGeoPositionInfoSource::createDefaultSource(this);
    else
        m_positionSource = QGeoPositionInfoSource::createSource(newName, this);

    if (m_positionSource) {
        connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
                this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
        connect(m_positionSource, SIGNAL(error(QGeoPositionInfoSource::Error)),
                this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error)));
        connect(m_positionSource, SIGNAL(updateTimeout()),
                this, SLOT(updateTimeoutReceived()));

        m_positionSource->setUpdateInterval(m_updateInterval);
        m_positionSource->setPreferredPositioningMethods(
            static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));

        setPosition(m_positionSource->lastKnownPosition());
    }

    if (previousUpdateInterval != updateInterval())
        emit updateIntervalChanged();

    if (previousPreferredPositioningMethods != preferredPositioningMethods())
        emit preferredPositioningMethodsChanged();

    if (previousPositioningMethods != supportedPositioningMethods())
        emit supportedPositioningMethodsChanged();

    emit validityChanged();

    if (m_active) {
        m_active = false;
        emit activeChanged();
    }

    if (previousName != name())
        emit nameChanged();
}
void QGeoPositionInfoSourceAndroidGms::setPreferredPositioningMethods(const PositioningMethods methods)
{
	const PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();
	QGeoPositionInfoSource::setPreferredPositioningMethods(methods);

	if (previousPreferredPositioningMethods == preferredPositioningMethods())
	{
		return;
	}

	if (updatesRunning_)
	{
		reconfigureRunningSystem();
	}
}
void QDeclarativePositionSource::componentComplete()
{
    if (!m_positionSource) {
        int previousUpdateInterval = updateInterval();
        PositioningMethods previousPositioningMethods = supportedPositioningMethods();
        PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();

        m_positionSource = QGeoPositionInfoSource::createDefaultSource(this);
        if (m_positionSource) {
            connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
                    this, SLOT(positionUpdateReceived(QGeoPositionInfo)));
            connect(m_positionSource, SIGNAL(error(QGeoPositionInfoSource::Error)),
                    this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error)));
            connect(m_positionSource, SIGNAL(updateTimeout()),
                    this, SLOT(updateTimeoutReceived()));

            m_positionSource->setUpdateInterval(m_updateInterval);
            m_positionSource->setPreferredPositioningMethods(
                static_cast<QGeoPositionInfoSource::PositioningMethods>(int(m_preferredPositioningMethods)));

            setPosition(m_positionSource->lastKnownPosition());
        }

        if (previousUpdateInterval != updateInterval())
            emit updateIntervalChanged();

        if (previousPreferredPositioningMethods != preferredPositioningMethods())
            emit preferredPositioningMethodsChanged();

        if (previousPositioningMethods != supportedPositioningMethods())
            emit supportedPositioningMethodsChanged();

        emit validityChanged();

        if (m_active) {
            m_active = false;
            emit activeChanged();
        }

        emit nameChanged();
    }
}
void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods)
{
    if (m_positionSource) {
        PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods();

        m_preferredPositioningMethods = methods;

        if (previousPreferredPositioningMethods != methods) {
            m_positionSource->setPreferredPositioningMethods(
                static_cast<QGeoPositionInfoSource::PositioningMethods>(int(methods)));
            if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods())
                emit preferredPositioningMethodsChanged();
        }
    } else {
        if (m_preferredPositioningMethods != methods) {
            m_preferredPositioningMethods = methods;
            emit preferredPositioningMethodsChanged();
        }
    }
}
void QGeoPositionInfoSourceAndroid::startUpdates()
{
    if (updatesRunning)
        return;

    if (preferredPositioningMethods() == 0) {
        m_error = UnknownSourceError;
        emit QGeoPositionInfoSource::error(m_error);

        return;
    }

    updatesRunning = true;
    QGeoPositionInfoSource::Error error = AndroidPositioning::startUpdates(androidClassKeyForUpdate);
    //if (error != QGeoPositionInfoSource::NoError) { //TODO
    if (error != 3) {
        updatesRunning = false;
        m_error =  error;
        emit QGeoPositionInfoSource::error(m_error);
    }
}
void QGeoPositionInfoSourceAndroidGms::startUpdates()
{
	if (updatesRunning_)
	{
		return;
	}

	Q_ASSERT(regularProvider_);
	const PositioningMethods methods = preferredPositioningMethods();

	if (methods == 0) 
	{
		setError(UnknownSourceError);
		return;
	}

	QAndroidGmsLocationProvider::enPriority priority = QAndroidGmsLocationProvider::PRIORITY_LOW_POWER;

	if (QGeoPositionInfoSource::NonSatellitePositioningMethods & methods)
	{
		priority = QAndroidGmsLocationProvider::PRIORITY_BALANCED_POWER_ACCURACY;
	}

	if (QGeoPositionInfoSource::SatellitePositioningMethods & methods)
	{
		priority = QAndroidGmsLocationProvider::PRIORITY_HIGH_ACCURACY;
	}

	regularProvider_->setPriority(priority);

	updatesRunning_ = true;

	Q_ASSERT(regularProvider_);
	regularProvider_->setUpdateInterval(updateInterval(), minimumUpdateInterval());
	regularProvider_->startUpdates();

	onProvidersChange(providersListener_->isActiveProvidersEnabled());
}
/*!
    \property QGeoPositionInfoSourceBb::provider
    \brief This property specifies the location provider you wish to use (hybrid, gnss,
    network).
*/
QString QGeoPositionInfoSourceBb::provider() const
{
    return positioningMethodsToProviderMap.value(preferredPositioningMethods());
}