Commit f4131710 authored by Gus Grubba's avatar Gus Grubba

Airmap API key integration.

The build system will look for src/Airmap/Airmap_api_key.h
If it find is, it will used the provided API key and client ID for Airmap.
That file should provide two strings:
static const char* kAirmapAPIKey = "key data";
static const char* kAirmapClientID = "id data";

Local builds, without these will have no Airmap support by default (users can always enter their own within the Airmap settings panel).
parent 06272ff6
......@@ -56,6 +56,7 @@ thirdParty/qserialport/lib/
libs/thirdParty/libxbee/lib/
GeneratedFiles/
gstreamer-1.0-android*
src/Airmap/Airmap_api_key.h
*.autosave
.settings/
......
......@@ -1137,6 +1137,13 @@ contains (DEFINES, QGC_AIRMAP_ENABLED) {
src/Airmap/AirMapVehicleManager.cc \
src/Airmap/AirMapWeatherInfoManager.cc \
#-- Do we have an API key?
exists(src/Airmap/Airmap_api_key.h) {
HEADERS += \
src/Airmap/Airmap_api_key.h
DEFINES += QGC_AIRMAP_KEY_AVAILABLE
}
} else {
#-- Dummies
INCLUDEPATH += \
......
......@@ -34,17 +34,5 @@
"shortDescription": "Enable AirMap Telemetry",
"type": "bool",
"defaultValue": false
},
{
"name": "loginEmail",
"shortDescription": "AirMap Login Email",
"type": "string",
"defaultValue": ""
},
{
"name": "loginPassword",
"shortDescription": "AirMap Login Password",
"type": "string",
"defaultValue": ""
}
]
......@@ -27,6 +27,11 @@
#include <airmap/authenticator.h>
//-- Hardwired API key
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
#include "Airmap_api_key.h"
#endif
using namespace airmap;
QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog")
......@@ -81,10 +86,21 @@ AirMapManager::_settingsChanged()
AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings();
AirMapSharedState::Settings settings;
settings.apiKey = ap->apiKey()->rawValueString();
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty();
#else
bool apiKeyChanged = settings.apiKey != _shared.settings().apiKey;
#endif
settings.clientID = ap->clientID()->rawValueString();
settings.userName = ap->userName()->rawValueString();
settings.password = ap->password()->rawValueString();
//-- If we have a hardwired key (and no custom key), set it.
#if defined(QGC_AIRMAP_KEY_AVAILABLE)
if(settings.apiKey.isEmpty() || settings.clientID.isEmpty()) {
settings.apiKey = kAirmapAPIKey;
settings.clientID = kAirmapClientID;
}
#endif
_shared.setSettings(settings);
//-- Need to re-create the client if the API key changed
if (_shared.client() && apiKeyChanged) {
......
......@@ -21,8 +21,6 @@ DECLARE_SETTINGGROUP(AirMap)
INIT_SETTINGFACT(password);
INIT_SETTINGFACT(enableAirMap);
INIT_SETTINGFACT(enableTelemetry);
INIT_SETTINGFACT(loginEmail);
INIT_SETTINGFACT(loginPassword);
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
qmlRegisterUncreatableType<AirMapSettings>("QGroundControl.SettingsManager", 1, 0, "AirMapSettings", "Reference only");
}
......@@ -33,5 +31,3 @@ DECLARE_SETTINGSFACT(AirMapSettings, userName)
DECLARE_SETTINGSFACT(AirMapSettings, password)
DECLARE_SETTINGSFACT(AirMapSettings, enableAirMap)
DECLARE_SETTINGSFACT(AirMapSettings, enableTelemetry)
DECLARE_SETTINGSFACT(AirMapSettings, loginEmail)
DECLARE_SETTINGSFACT(AirMapSettings, loginPassword)
......@@ -25,7 +25,5 @@ public:
DEFINE_SETTINGFACT(password)
DEFINE_SETTINGFACT(enableAirMap)
DEFINE_SETTINGFACT(enableTelemetry)
DEFINE_SETTINGFACT(loginEmail)
DEFINE_SETTINGFACT(loginPassword)
};
......@@ -122,21 +122,21 @@ QGCView {
columns: 2
rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25
anchors.centerIn: parent
QGCLabel { text: qsTr("Email:") }
QGCLabel { text: qsTr("User Name:") }
FactTextField {
fact: _loginEmailFact
fact: _usernameFact
width: _editFieldWidth
enabled: _airMapEnabled
visible: _loginEmailFact.visible
property Fact _loginEmailFact: QGroundControl.settingsManager.airMapSettings.loginEmail
visible: _usernameFact.visible
property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName
}
QGCLabel { text: qsTr("Password:") }
FactTextField {
fact: _loginPasswordFact
fact: _passwordFact
width: _editFieldWidth
enabled: _airMapEnabled
visible: _loginPasswordFact.visible
property Fact _loginPasswordFact: QGroundControl.settingsManager.airMapSettings.loginPassword
visible: _passwordFact.visible
property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password
}
Item {
width: 1
......@@ -144,20 +144,20 @@ QGCView {
Layout.columnSpan: 2
}
QGCLabel {
text: qsTr("Forgot Your AirMap Password?")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
text: qsTr("Forgot Your AirMap Password?")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
}
Item {
width: 1
height: 1
Layout.columnSpan: 2
Layout.columnSpan: 2
}
QGCButton {
text: qsTr("Register for an AirMap Account")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
enabled: _airMapEnabled
text: qsTr("Register for an AirMap Account")
Layout.alignment: Qt.AlignHCenter
Layout.columnSpan: 2
enabled: _airMapEnabled
onClicked: {
Qt.openUrlExternally("https://www.airmap.com");
}
......@@ -174,7 +174,7 @@ QGCView {
visible: QGroundControl.settingsManager.appSettings.visible
QGCLabel {
id: profileLabel
text: qsTr("Pilot Profile")
text: qsTr("Pilot Profile (WIP)")
font.family: ScreenTools.demiboldFontFamily
}
}
......@@ -226,14 +226,25 @@ QGCView {
columnSpacing: ScreenTools.defaultFontPixelHeight * 2
rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25
anchors.centerIn: parent
QGCLabel { text: qsTr("API Key:") }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth; }
QGCLabel { text: qsTr("Client ID:") }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth; }
QGCLabel { text: qsTr("User Name:") }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.userName; width: _editFieldWidth; }
QGCLabel { text: qsTr("Password:") }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.password; width: _editFieldWidth; echoMode: TextInput.Password }
QGCCheckBox {
id: hasPrivateKey
text: qsTr("Personal API Key")
Layout.columnSpan: 2
Component.onCompleted: {
if(QGroundControl.settingsManager.airMapSettings.apiKey !== "")
checked = true
}
}
Item {
width: 1
height: 1
visible: hasPrivateKey.checked
Layout.columnSpan: 2
}
QGCLabel { text: qsTr("API Key:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; }
QGCLabel { text: qsTr("Client ID:"); visible: hasPrivateKey.checked; }
FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; }
}
}
//-----------------------------------------------------------------
......
......@@ -128,7 +128,7 @@ const QObject* QmlObjectListModel::operator[](int index) const
return _objectList[index];
}
void QmlObjectListModel::clear(void)
void QmlObjectListModel::clear()
{
while (rowCount()) {
removeAt(0);
......@@ -218,7 +218,7 @@ QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist)
return oldlist;
}
int QmlObjectListModel::count(void) const
int QmlObjectListModel::count() const
{
return rowCount();
}
......@@ -247,7 +247,7 @@ void QmlObjectListModel::_childDirtyChanged(bool dirty)
emit dirtyChanged(_dirty);
}
void QmlObjectListModel::deleteListAndContents(void)
void QmlObjectListModel::deleteListAndContents()
{
for (int i=0; i<_objectList.count(); i++) {
_objectList[i]->deleteLater();
......@@ -255,7 +255,7 @@ void QmlObjectListModel::deleteListAndContents(void)
deleteLater();
}
void QmlObjectListModel::clearAndDeleteContents(void)
void QmlObjectListModel::clearAndDeleteContents()
{
beginResetModel();
for (int i=0; i<_objectList.count(); i++) {
......
......@@ -31,50 +31,50 @@ public:
// Property accessors
int count(void) const;
bool dirty(void) const { return _dirty; }
void setDirty(bool dirty);
void append(QObject* object);
void append(QList<QObject*> objects);
QObjectList swapObjectList(const QObjectList& newlist);
void clear(void);
QObject* removeAt(int i);
QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); }
void insert(int i, QObject* object);
void insert(int i, QList<QObject*> objects);
QObject* operator[](int i);
const QObject* operator[](int i) const;
bool contains(QObject* object) { return _objectList.indexOf(object) != -1; }
int indexOf(QObject* object) { return _objectList.indexOf(object); }
template<class T> T value(int index) { return qobject_cast<T>(_objectList[index]); }
int count () const;
bool dirty () const { return _dirty; }
void setDirty (bool dirty);
void append (QObject* object);
void append (QList<QObject*> objects);
QObjectList swapObjectList (const QObjectList& newlist);
void clear ();
QObject* removeAt (int i);
QObject* removeOne (QObject* object) { return removeAt(indexOf(object)); }
void insert (int i, QObject* object);
void insert (int i, QList<QObject*> objects);
bool contains (QObject* object) { return _objectList.indexOf(object) != -1; }
int indexOf (QObject* object) { return _objectList.indexOf(object); }
QObject* operator[] (int i);
const QObject* operator[] (int i) const;
template<class T> T value (int index) { return qobject_cast<T>(_objectList[index]); }
QList<QObject*>* objectList () { return &_objectList; }
/// Calls deleteLater on all items and this itself.
void deleteListAndContents (void);
void deleteListAndContents ();
/// Clears the list and calls deleteLater on each entry
void clearAndDeleteContents (void);
void clearAndDeleteContents ();
void beginReset () { beginResetModel(); }
void endReset () { endResetModel(); }
void beginReset () { beginResetModel(); }
void endReset () { endResetModel(); }
signals:
void countChanged (int count);
void dirtyChanged (bool dirtyChanged);
void countChanged (int count);
void dirtyChanged (bool dirtyChanged);
private slots:
void _childDirtyChanged (bool dirty);
void _childDirtyChanged (bool dirty);
private:
// Overrides from QAbstractListModel
int rowCount(const QModelIndex & parent = QModelIndex()) const override;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override;
int rowCount (const QModelIndex & parent = QModelIndex()) const override;
QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const override;
bool insertRows (int position, int rows, const QModelIndex &index = QModelIndex()) override;
bool removeRows (int position, int rows, const QModelIndex &index = QModelIndex()) override;
bool setData (const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
QHash<int, QByteArray> roleNames(void) const override;
bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) override;
bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()) override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
private:
QList<QObject*> _objectList;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment