locationsettings.h 7.09 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/*
 * Copyright (C) 2017 Jolla Ltd.
 * Contact: Chris Adams <chris.adams@jolla.com>
 *
 * You may use this file under the terms of the BSD license as follows:
 *
 * "Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *   * Neither the name of Nemo Mobile nor the names of its contributors
 *     may be used to endorse or promote products derived from this
 *     software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
 */

#ifndef LOCATIONSETTINGS_H
#define LOCATIONSETTINGS_H

#include <systemsettingsglobal.h>

#include <QObject>
#include <QString>
40
#include <QStringList>
41

42 43
#define LOCATION_SETTINGS_LAST_DATA_SOURCE_BIT 31

44 45 46 47 48 49 50 51 52
struct LocationProvider {
    bool hasAgreement = false;
    bool agreementAccepted = false;
    bool onlineCapable = true;
    bool onlineEnabled = false;
    bool offlineCapable = false;
    bool offlineEnabled = false;
};

53 54 55 56 57
// The settings component here expects two types of usage for modifications.
// Either locationMode to high level location types, after which pendingAgreements tells
// which location services need to be explicitly turned on to ensure the usage agreement is acknowledged.
// Or setting location mode to custom, and modifying specific details.

58
class LocationSettingsPrivate;
59 60 61 62 63
class SYSTEMSETTINGS_EXPORT LocationSettings : public QObject
{
    Q_OBJECT

    Q_PROPERTY(bool locationEnabled READ locationEnabled WRITE setLocationEnabled NOTIFY locationEnabledChanged)
64 65 66 67
    Q_PROPERTY(LocationMode locationMode READ locationMode WRITE setLocationMode NOTIFY locationModeChanged)
    Q_PROPERTY(QStringList pendingAgreements READ pendingAgreements NOTIFY pendingAgreementsChanged)
    Q_PROPERTY(DataSources allowedDataSources READ allowedDataSources WRITE setAllowedDataSources NOTIFY allowedDataSourcesChanged)
    Q_PROPERTY(bool gpsAvailable READ gpsAvailable CONSTANT)
68 69
    Q_PROPERTY(bool gpsEnabled READ gpsEnabled WRITE setGpsEnabled NOTIFY gpsEnabledChanged)
    Q_PROPERTY(bool gpsFlightMode READ gpsFlightMode WRITE setGpsFlightMode NOTIFY gpsFlightModeChanged)
70
    Q_PROPERTY(QStringList locationProviders READ locationProviders CONSTANT)
71

72
    // Some specific locators provided as convenience for qml
73
    Q_PROPERTY(bool hereAvailable READ hereAvailable CONSTANT)
74 75
    Q_PROPERTY(OnlineAGpsState hereState READ hereState WRITE setHereState NOTIFY hereStateChanged)
    Q_PROPERTY(bool mlsAvailable READ mlsAvailable CONSTANT)
76 77
    Q_PROPERTY(bool mlsEnabled READ mlsEnabled WRITE setMlsEnabled NOTIFY mlsEnabledChanged)
    Q_PROPERTY(OnlineAGpsState mlsOnlineState READ mlsOnlineState WRITE setMlsOnlineState NOTIFY mlsOnlineStateChanged)
78 79
    Q_PROPERTY(bool yandexAvailable READ yandexAvailable CONSTANT)
    Q_PROPERTY(OnlineAGpsState yandexOnlineState READ yandexOnlineState WRITE setYandexOnlineState NOTIFY yandexOnlineStateChanged)
80

81
    Q_ENUMS(OnlineAGpsState)
82
    Q_ENUMS(LocationMode)
83 84

public:
85 86 87 88 89
    enum Mode {
        AsynchronousMode,
        SynchronousMode
    };

90 91 92 93 94 95
    enum OnlineAGpsState {
        OnlineAGpsAgreementNotAccepted,
        OnlineAGpsDisabled,
        OnlineAGpsEnabled
    };

96 97 98 99 100 101 102
    enum LocationMode {
        HighAccuracyMode,
        BatterySavingMode,
        DeviceOnlyMode,
        CustomMode
    };

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
    // Data sources are grouped roughly by type,
    // with gaps left for future expansion.
    enum DataSource {
        NoDataSources                   = 0UL,

        OnlineDataSources               = 1UL << 0,

        DeviceSensorsData               = 1UL << 5,
        BluetoothData                   = 1UL << 10,
        WlanData                        = 1UL << 15,
        CellTowerData                   = 1UL << 20,

        GpsData                         = 1UL << 25,
        GlonassData                     = 1UL << 26,
        BeidouData                      = 1UL << 27,
        GalileoData                     = 1UL << 28,
        QzssData                        = 1UL << 29,
        SbasData                        = 1UL << 30,

        LastDataSource                  = 1UL << LOCATION_SETTINGS_LAST_DATA_SOURCE_BIT
    };
    Q_DECLARE_FLAGS(DataSources, DataSource)
    Q_FLAG(DataSources)

127 128 129 130 131 132 133 134 135 136 137 138 139
    explicit LocationSettings(QObject *parent = 0);
    explicit LocationSettings(Mode mode, QObject *parent = 0);
    virtual ~LocationSettings();

    bool locationEnabled() const;
    void setLocationEnabled(bool enabled);

    bool gpsEnabled() const;
    void setGpsEnabled(bool enabled);
    bool gpsFlightMode() const;
    void setGpsFlightMode(bool flightMode);
    bool gpsAvailable() const;

140 141 142 143 144
    QStringList locationProviders() const;
    LocationProvider providerInfo(const QString &name) const;
    bool updateLocationProvider(const QString &name, const LocationProvider &providerState);

    // qml helpers for specific location providers
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
    OnlineAGpsState hereState() const;
    void setHereState(OnlineAGpsState state);
    bool hereAvailable() const;

    bool mlsEnabled() const;
    void setMlsEnabled(bool enabled);
    OnlineAGpsState mlsOnlineState() const;
    void setMlsOnlineState(OnlineAGpsState state);
    bool mlsAvailable() const;

    OnlineAGpsState yandexOnlineState() const;
    void setYandexOnlineState(OnlineAGpsState state);
    bool yandexAvailable() const;

    LocationMode locationMode() const;
    void setLocationMode(LocationMode locationMode);
    QStringList pendingAgreements() const;

163 164 165
    DataSources allowedDataSources() const;
    void setAllowedDataSources(DataSources dataSources);

166 167 168 169
signals:
    void locationEnabledChanged();
    void gpsEnabledChanged();
    void gpsFlightModeChanged();
170
    void locationModeChanged();
171
    void pendingAgreementsChanged();
172
    void allowedDataSourcesChanged();
173 174 175 176
    void hereStateChanged();
    void mlsEnabledChanged();
    void mlsOnlineStateChanged();
    void yandexOnlineStateChanged();
177 178

private:
179 180 181
    LocationSettingsPrivate *d_ptr;
    Q_DISABLE_COPY(LocationSettings)
    Q_DECLARE_PRIVATE(LocationSettings)
182 183
};

184 185
Q_DECLARE_OPERATORS_FOR_FLAGS(LocationSettings::DataSources)

186
#endif // LOCATIONSETTINGS_H