nymea-app/androidservice/controlviews/devicecontrolapplication.cpp

102 lines
3.6 KiB
C++

#include "devicecontrolapplication.h"
#include "engine.h"
#include "connection/discovery/nymeadiscovery.h"
#include "connection/nymeahosts.h"
#include "libnymea-app-core.h"
#include "../nymea-app/stylecontroller.h"
#include "../nymea-app/platformhelper.h"
#include "../nymea-app/platformintegration/android/platformhelperandroid.h"
#include <QQmlApplicationEngine>
#include <QtDebug>
#include <QtQml>
#include <QtAndroid>
#include <QAndroidJniObject>
#include <QNdefNfcUriRecord>
QObject *platformHelperProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
return new PlatformHelperAndroid();
}
DeviceControlApplication::DeviceControlApplication(int argc, char *argv[]) : QApplication(argc, argv)
{
setApplicationName("nymea-app");
setOrganizationName("nymea");
QNearFieldManager *manager = new QNearFieldManager(this);
int ret = manager->registerNdefMessageHandler(this, SLOT(handleNdefMessage(QNdefMessage,QNearFieldTarget*)));
qDebug() << "*** NFC registered" << ret;
QString nymeaId = QtAndroid::androidActivity().callObjectMethod<jstring>("nymeaId").toString();
QString thingId = QtAndroid::androidActivity().callObjectMethod<jstring>("thingId").toString();
QSettings settings;
m_discovery = new NymeaDiscovery(this);
AWSClient::instance()->setConfig(settings.value("cloudEnvironment").toString());
m_discovery->setAwsClient(AWSClient::instance());
NymeaHost *host = m_discovery->nymeaHosts()->find(nymeaId);
if (nymeaId.isEmpty() && !host) {
qWarning() << "No such nymea host:" << nymeaId;
// TODO: We could wait here until the discovery finds it... But it really should be cached already...
exit(1);
}
m_engine = new Engine(this);
m_engine->jsonRpcClient()->connectToHost(host);
qDebug() << "Connecting to:" << host;
qDebug() << "Creating QML view";
QQmlApplicationEngine *qmlEngine = new QQmlApplicationEngine(this);
registerQmlTypes();
qmlRegisterSingletonType<PlatformHelper>("Nymea", 1, 0, "PlatformHelper", platformHelperProvider);
qmlRegisterSingletonType(QUrl("qrc:///ui/utils/NymeaUtils.qml"), "Nymea", 1, 0, "NymeaUtils" );
StyleController styleController;
qmlEngine->rootContext()->setContextProperty("styleController", &styleController);
qmlEngine->rootContext()->setContextProperty("engine", m_engine);
qmlEngine->rootContext()->setContextProperty("_engine", m_engine);
qmlEngine->rootContext()->setContextProperty("controlledThingId", thingId);
qmlEngine->load(QUrl(QLatin1String("qrc:/Main.qml")));
}
void DeviceControlApplication::handleNdefMessage(QNdefMessage message, QNearFieldTarget *target)
{
qDebug() << "************* NFC message!" << message.toByteArray() << target;
foreach (const QNdefRecord &record, message) {
QNdefNfcUriRecord uriRecord(record);
qDebug() << "record" << uriRecord.uri();
QUrl url = uriRecord.uri();
QUuid nymeaId = QUuid(url.host().split('.').first());
QUuid thingId = QUuid(url.host().split('.').last());
QList<QPair<QString, QString>> queryItems = QUrlQuery(url.query()).queryItems();
for (int i = 0; i < queryItems.count(); i++) {
QUuid stateTypeId = queryItems.at(i).first;
QVariant value = queryItems.at(i).second;
}
NymeaHost *host = m_discovery->nymeaHosts()->find(nymeaId);
m_engine->jsonRpcClient()->connectToHost(host);
qmlEngine->rootContext()->setContextProperty("controlledThingId", thingId);
}
}
void DeviceControlApplication::createView()
{
}