From fad93b42c285ffb463e9494070f40d3b339d732f Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Thu, 16 Dec 2021 15:07:44 -0500 Subject: 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 Change-Id: Ib717ac8ac68ec457eaee74755dcf9d4f36b79d12 --- voice-capabilities/guimetadata.cpp | 349 ------------------------------------- 1 file changed, 349 deletions(-) delete mode 100644 voice-capabilities/guimetadata.cpp (limited to 'voice-capabilities/guimetadata.cpp') 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 -#include - -#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 msg = MessageFactory::getInstance().createOutboundMessage(MessageId::Call); - if (!msg) - return; - - CallMessage *tmsg = static_cast(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 msg) -{ - if (!msg) - return; - - if (msg->isEvent()) { - std::shared_ptr emsg = std::static_pointer_cast(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(); - } - } -} -- cgit 1.2.3-korg