summaryrefslogtreecommitdiffstats
path: root/voice-capabilities/guimetadata.cpp
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2021-12-16 15:07:44 -0500
committerScott Murray <scott.murray@konsulko.com>2021-12-16 16:03:51 -0500
commitfad93b42c285ffb463e9494070f40d3b339d732f (patch)
tree6ae60914c578bd34b8ebbde9b271859e8b87ab65 /voice-capabilities/guimetadata.cpp
parentfe20f1b029f67dee1f790ade7a9114086f2abd38 (diff)
Initial rework to replace app framework usage
Changes: - Remove "core" code related to WebSocket messaging for the app framework. - Stub out hvac, navigation, network, and weather interfaces. This allows building several of the demo applications without modification for now. The network interface will definitely be reused to plumb in a new connman-glib library derived from the previous network binding. The others may potentially be reused to plumb in other new backend implementations. - Update the Network interface object constructor arguments to add a agent registration flag. This prepares for the connman-glib switch and means users will not need to be updated twice. - Update the Bluetooth interface to use a new bluez-glib library that is derived from the previous Bluetooth binding. This has been successfully tested with a the Settings application. - Remove signal-composer and voice API interface code as there are no direct replacements planned. The signal-composer interface was effectively exposing the binding events, so has little reuse potential with a new backend. For the voice interface, if some form of Alexa support becomes desirable, it can potentially be brought back for adaptation if required. - Disable compilation of the remaining interfaces for now. Some like map, pbap, and mediaplayer are very likely to be used as the basis for updating their associated applications, so keeping the code for the planned iterative development seems easier. - Updated copyright lines in all touched files. Bug-AGL: SPEC-4182 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: Ib717ac8ac68ec457eaee74755dcf9d4f36b79d12
Diffstat (limited to 'voice-capabilities/guimetadata.cpp')
-rw-r--r--voice-capabilities/guimetadata.cpp349
1 files changed, 0 insertions, 349 deletions
diff --git a/voice-capabilities/guimetadata.cpp b/voice-capabilities/guimetadata.cpp
deleted file mode 100644
index cc65ba0..0000000
--- a/voice-capabilities/guimetadata.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2020 Konsulko Group
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <QDebug>
-#include <QJsonArray>
-
-#include "callmessage.h"
-#include "eventmessage.h"
-#include "messagefactory.h"
-#include "messageengine.h"
-#include "messageenginefactory.h"
-#include "guimetadata.h"
-
-GuiMetadata::GuiMetadata(QUrl &url, QQmlContext *context, QObject * parent) :
- QObject(parent)
-{
- m_mloop = MessageEngineFactory::getInstance().getMessageEngine(url);
- m_context = context;
- QObject::connect(m_mloop.get(), &MessageEngine::connected, this, &GuiMetadata::onConnected);
- QObject::connect(m_mloop.get(), &MessageEngine::disconnected, this, &GuiMetadata::onDisconnected);
- QObject::connect(m_mloop.get(), &MessageEngine::messageReceived, this, &GuiMetadata::onMessageReceived);
-}
-
-GuiMetadata::~GuiMetadata()
-{
-}
-
-// Qt UI Context
-
-void GuiMetadata::clearMetadata()
-{
- m_type = "";
- m_title = "";
- m_subtitle = "";
-
- m_bodyText = "";
- m_bodyImageSmallUrl = "";
- m_bodyImageMediumUrl = "";
- m_bodyImageLargeUrl = "";
-
- m_weatherCurrentTemperature = "";
- m_weatherCurrentWeatherIconSmallUrl = "";
- m_weatherCurrentWeatherIconSmallDarkBgUrl = "";
- m_weatherCurrentWeatherIconMediumUrl = "";
- m_weatherCurrentWeatherIconMediumDarkBgUrl = "";
- m_weatherCurrentWeatherIconLargeUrl = "";
- m_weatherCurrentWeatherIconLargeDarkBgUrl = "";
-
- m_weatherLowTemperature = "";
- m_weatherLowTemperatureArrowSmallUrl = "";
- m_weatherLowTemperatureArrowSmallDarkBgUrl = "";
- m_weatherLowTemperatureArrowMediumUrl = "";
- m_weatherLowTemperatureArrowMediumDarkBgUrl = "";
- m_weatherLowTemperatureArrowLargeUrl = "";
- m_weatherLowTemperatureArrowLargeDarkBgUrl = "";
-
- m_weatherHighTemperature = "";
- m_weatherHighTemperatureArrowSmallUrl = "";
- m_weatherHighTemperatureArrowSmallDarkBgUrl = "";
- m_weatherHighTemperatureArrowMediumUrl = "";
- m_weatherHighTemperatureArrowMediumDarkBgUrl = "";
- m_weatherHighTemperatureArrowLargeUrl = "";
- m_weatherHighTemperatureArrowLargeDarkBgUrl = "";
-}
-
-bool GuiMetadata::parseImageMetadata(QJsonObject &imageObj,
- QUrl &smallUrl, QUrl &mediumUrl, QUrl &largeUrl,
- QUrl *pSmallDarkBgUrl, QUrl *pMediumDarkBgUrl, QUrl *pLargeDarkBgUrl)
-{
- if(!(imageObj.contains("sources") && imageObj["sources"].isArray())) {
- // error
- qWarning() << "Could not find image.sources parameter!";
- return false;
- }
- QJsonArray sourcesObj = imageObj["sources"].toArray();
- bool found = false;
- for(QJsonArray::iterator it = sourcesObj.begin(); it != sourcesObj.end(); it++) {
- if(!it->isObject()) {
- // unexpected, skip
- continue;
- }
- QJsonObject sourceObj = it->toObject();
- if(!(sourceObj.contains("url") && sourceObj["url"].isString())) {
- // error
- qWarning() << "Missing image.sources.url parameter!";
- continue;
- }
- QString url = sourceObj["url"].toString();
- QString darkBackgroundUrl = "";
- if(sourceObj.contains("darkBackgroundUrl") && sourceObj["darkBackgroundUrl"].isString()) {
- darkBackgroundUrl = sourceObj["darkBackgroundUrl"].toString();
- }
- if(sourceObj.contains("size") && sourceObj["size"].isString()) {
- QString size = sourceObj["size"].toString();
- if(size == "SMALL") {
- smallUrl = url;
- if(pSmallDarkBgUrl)
- pSmallDarkBgUrl->setUrl(darkBackgroundUrl);
- found = true;
- } else if(size == "MEDIUM") {
- mediumUrl = url;
- if(pMediumDarkBgUrl)
- pMediumDarkBgUrl->setUrl(darkBackgroundUrl);
- found = true;
- } else if(size == "LARGE") {
- largeUrl = url;
- if(pLargeDarkBgUrl)
- pLargeDarkBgUrl->setUrl(darkBackgroundUrl);
- found = true;
- }
- // else ignore (X-SMALL, X-LARGE)
- }
- // FIXME: Should handle image sources w/o size fields,
- // parse width/height if present
- }
- return found;
-}
-
-bool GuiMetadata::updateMetadata(QJsonObject data)
-{
- if(!data.contains("type"))
- return false;
-
- clearMetadata();
-
- QString type = data["type"].toString();
- if(!(type == "BodyTemplate1" ||
- type == "BodyTemplate2" ||
- type == "WeatherTemplate")) {
- // Show unsupported type message
- m_type = "Unsupported";
- return true;
- }
- m_type = type;
-
- // All template types have title
- if(data.contains("title") && data["title"].isObject()) {
- QJsonObject titleObj = data["title"].toObject();
- if(titleObj.contains("mainTitle")) {
- m_title = titleObj["mainTitle"].toString();
- } else {
- qWarning() << "Could not find title.mainTitle parameter!";
- return false;
- }
- // subTitle is apparently optional
- if(titleObj.contains("subTitle"))
- m_subtitle = titleObj["subTitle"].toString();
- } else {
- // error
- qWarning() << "Could not find title parameter!";
- return false;
- }
-
- if(type == "BodyTemplate1" || type == "BodyTemplate2")
- return updateBodyMetadata(data);
- else
- return updateWeatherMetadata(data);
-}
-
-bool GuiMetadata::updateBodyMetadata(QJsonObject &data)
-{
- if(!data.contains("type"))
- return false;
-
- QString type = data["type"].toString();
- if(!(type == "BodyTemplate1" || type == "BodyTemplate2"))
- return false;
-
- // BodyTemplate1/2 have text field
- if(data.contains("textField")) {
- m_bodyText = data["textField"].toString();
- } else {
- // error
- qWarning() << "Could not find textField parameter!";
- return false;
- }
-
- // BodyTemplate2 has image
- if(type == "BodyTemplate2") {
- if(!(data.contains("image") && data["image"].isObject())) {
- // error
- qWarning() << "Could not find image parameter!";
- return false;
- }
- QJsonObject imageObj = data["image"].toObject();
- if(!parseImageMetadata(imageObj,
- m_bodyImageSmallUrl,
- m_bodyImageMediumUrl,
- m_bodyImageLargeUrl)) {
- qWarning() << "Could not parse image parameter!";
- return false;
- }
- }
-
- return true;
-}
-
-bool GuiMetadata::updateWeatherMetadata(QJsonObject &data)
-{
- if(!data.contains("type"))
- return false;
-
- QString type = data["type"].toString();
- if(type != "WeatherTemplate")
- return false;
-
- if(data.contains("currentWeather")) {
- m_weatherCurrentTemperature = data["currentWeather"].toString();
- } else {
- // error
- qWarning() << "Could not find currentWeather parameter!";
- return false;
- }
-
- if(!(data.contains("currentWeatherIcon") && data["currentWeatherIcon"].isObject())) {
- // error
- qWarning() << "Could not find currentWeatherIcon parameter!";
- return false;
- }
- QJsonObject imageObj = data["currentWeatherIcon"].toObject();
- if(!parseImageMetadata(imageObj,
- m_weatherCurrentWeatherIconSmallUrl,
- m_weatherCurrentWeatherIconMediumUrl,
- m_weatherCurrentWeatherIconLargeUrl,
- &m_weatherCurrentWeatherIconSmallDarkBgUrl,
- &m_weatherCurrentWeatherIconMediumDarkBgUrl,
- &m_weatherCurrentWeatherIconLargeDarkBgUrl)) {
- qWarning() << "Could not parse currentWeatherIcon.image parameter!";
- return false;
- }
-
- if(!(data.contains("lowTemperature") && data["lowTemperature"].isObject())) {
- // error
- qWarning() << "Could not find lowTemperature parameter!";
- return false;
- }
- QJsonObject tempObj = data["lowTemperature"].toObject();
- if(!(tempObj.contains("value") && tempObj["value"].isString())) {
- // error
- qWarning() << "Could not find lowTemperature.value parameter!";
- return false;
- }
- m_weatherLowTemperature = tempObj["value"].toString();
-
- if(!(tempObj.contains("arrow") && tempObj["arrow"].isObject())) {
- // error
- qWarning() << "Could not find lowTemperature.arrow parameter!";
- return false;
- }
- imageObj = tempObj["arrow"].toObject();
- if(!parseImageMetadata(imageObj,
- m_weatherLowTemperatureArrowSmallUrl,
- m_weatherLowTemperatureArrowMediumUrl,
- m_weatherLowTemperatureArrowLargeUrl,
- &m_weatherLowTemperatureArrowSmallDarkBgUrl,
- &m_weatherLowTemperatureArrowMediumDarkBgUrl,
- &m_weatherLowTemperatureArrowLargeDarkBgUrl)) {
- qWarning() << "Could not parse lowTemperature.arrow parameter!";
- return false;
- }
-
- if(!(data.contains("highTemperature") && data["highTemperature"].isObject())) {
- // error
- qWarning() << "Could not find highTemperature parameter!";
- return false;
- }
- tempObj = data["highTemperature"].toObject();
- if(!(tempObj.contains("value") && tempObj["value"].isString())) {
- // error
- qWarning() << "Could not find highTemperature.value parameter!";
- return false;
- }
- m_weatherHighTemperature = tempObj["value"].toString();
-
- if(!(tempObj.contains("arrow") && tempObj["arrow"].isObject())) {
- // error
- qWarning() << "Could not find highTemperature.arrow parameter!";
- return false;
- }
- imageObj = tempObj["arrow"].toObject();
- if(!parseImageMetadata(imageObj,
- m_weatherHighTemperatureArrowSmallUrl,
- m_weatherHighTemperatureArrowMediumUrl,
- m_weatherHighTemperatureArrowLargeUrl,
- &m_weatherHighTemperatureArrowSmallDarkBgUrl,
- &m_weatherHighTemperatureArrowMediumDarkBgUrl,
- &m_weatherHighTemperatureArrowLargeDarkBgUrl)) {
- qWarning() << "Could not parse highTemperature.arrow parameter!";
- return false;
- }
-
- return true;
-
-}
-
-void GuiMetadata::onConnected()
-{
- std::unique_ptr<Message> msg = MessageFactory::getInstance().createOutboundMessage(MessageId::Call);
- if (!msg)
- return;
-
- CallMessage *tmsg = static_cast<CallMessage*>(msg.get());
- QStringListIterator eventIterator(events);
- QJsonObject parameter;
- QJsonArray actions;
- while (eventIterator.hasNext()) {
- actions.append(QJsonValue(eventIterator.next()));
- }
- parameter.insert("actions", actions);
- tmsg->createRequest("vshl-capabilities", "guimetadata/subscribe", parameter);
- m_mloop->sendMessage(std::move(msg));
-}
-
-void GuiMetadata::onDisconnected()
-{
- // vshl-capabilities currently has no unsubscribe verb...
-}
-
-void GuiMetadata::onMessageReceived(std::shared_ptr<Message> msg)
-{
- if (!msg)
- return;
-
- if (msg->isEvent()) {
- std::shared_ptr<EventMessage> emsg = std::static_pointer_cast<EventMessage>(msg);
- if (emsg->eventApi() != "vshl-capabilities")
- return;
- QString ename = emsg->eventName();
- QJsonObject data = emsg->eventData();
- if ((ename == "render_template") && updateMetadata(data)) {
- emit renderTemplate();
- } else if (ename == "clear_template") {
- emit clearTemplate();
- }
- }
-}