#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
-#include <QQuickWindow>
+#include <QQmlContext>
+#include <QtQml/QQmlApplicationEngine>
#include <cstring>
+#include <QFileInfo>
#include "eventhandler.h"
+const char _parameter[] = "parameter";
+const char _replyto[] = "replyto";
+const char _data[] = "data";
+const char _file[] = "file";
+const char _area[] = "area";
+const char _suffix[] = ".qml";
+const char _button_name[] = "buttonName";
+const char _button_press_mode[] = "buttonPressMode";
+const char _button_press_state[] = "buttonPressState";
+const char _drawing_name[] = "drawing_name";
+const char _application_id[] = "application_id";
+
void* EventHandler::myThis = 0;
EventHandler::EventHandler(QObject *parent) :
QObject(parent),
- mp_hs(NULL),
- mp_wm(NULL),
- mp_qw(NULL)
+ mp_hs(nullptr),
+ mp_wm(nullptr)
{
m_dspreq = QString("");
- my_id = QString(APP_ID);
- my_role = QString(ROLE_NAME);
m_req.clear();
}
EventHandler::~EventHandler()
{
- if (mp_hs != NULL) {
+ if (mp_hs != nullptr) {
delete mp_hs;
}
- if (mp_wm != NULL) {
+ if (mp_wm != nullptr) {
delete mp_wm;
}
}
mp_hs = new LibHomeScreen();
mp_hs->init(port, token);
-// my_id = QString(std::strtok(std::getenv("AFM_ID"), "@"));
mp_hs->registerCallback(nullptr, EventHandler::onRep_static);
mp_hs->set_event_handler(LibHomeScreen::Event_ShowWindow, [this](json_object *object){
- // {"id": "onscreenXXX", "parameter": {"replyid": "app's id", "file": "onsreen file path", "data": {"key": "value", ...}}}
- struct json_object *appid;
- json_object_object_get_ex(object, "application_id", &appid);
- const char *id = json_object_get_string(appid);
- if(my_id != QString(id)) {
- HMI_DEBUG(APP_ID, "Event_ShowWindow id = %s", id);
- return;
- }
- else
- HMI_DEBUG(APP_ID, "recived json message is[%s]", json_object_get_string(object));
+ // {"id": "onscreenXXX", "parameter": {"file": "onsreen file path", "data": {"key": "value", ...}}, "replyto": "app's id"}
+ HMI_DEBUG(APP_ID, "recived json message is[%s]", json_object_get_string(object));
struct json_object *param;
- json_object_object_get_ex(object, "parameter", ¶m);
+ json_object_object_get_ex(object, _parameter, ¶m);
if(json_object_get_type(param) != json_type_object ) {
HMI_DEBUG(APP_ID, "parameter error!");
return;
}
+ struct json_object *qml_path;
+ const char *file = nullptr;
+ if(json_object_object_get_ex(param, _file, &qml_path))
+ file = json_object_get_string(qml_path);
+ if(file == nullptr) {
+ HMI_DEBUG(APP_ID, "received qml file is null!");
+ return;
+ }
+
+ QFileInfo file_info(file);
+ if(!file_info.isFile() || !QString(file).contains(QString(_suffix), Qt::CaseSensitive)) {
+ HMI_DEBUG(APP_ID, "received qml file error! file=%s.", file);
+ return;
+ }
+
struct json_object *replyid;
- json_object_object_get_ex(param, "replyid", &replyid);
- const char *_replyid = json_object_get_string(replyid);
-
- struct json_object *path;
- json_object_object_get_ex(param, "file", &path);
- const char *_path = json_object_get_string(path);
-
- struct json_object *data;
- json_bool rtn = json_object_object_get_ex(param, "data", &data);
- const char* _data = "";
- if(rtn) {
- _data = json_object_to_json_string(data);
+ const char *replyto = nullptr;
+ if(json_object_object_get_ex(param, _replyto, &replyid))
+ replyto = json_object_get_string(replyid);
+ if(replyto == nullptr) {
+ HMI_DEBUG(APP_ID, "received replyto is null!");
+ return;
}
- m_dspreq = QString(_replyid);
+ struct json_object *display_area;
+ const char *area = nullptr;
+ if(json_object_object_get_ex(param, _area, &display_area))
+ area = json_object_get_string(display_area);
+
+ struct json_object *param_data;
+ const char* data = nullptr;
+ if(json_object_object_get_ex(param, _data, ¶m_data))
+ data = json_object_to_json_string(param_data);
+
+ m_dspreq = QString(replyto);
if(m_req.contains(m_dspreq)) {
- m_req[m_dspreq] = qMakePair(QString(_path), QString(_data));
+ m_req[m_dspreq] = qMakePair(QString(file), QString(data));
}
else
- m_req.insert(QString(m_dspreq), qMakePair(QString(_path), QString(_data)));
+ m_req.insert(QString(m_dspreq), qMakePair(QString(file), QString(data)));
+
+ if(area == nullptr)
+ this->activateWindow(ROLE_NAME);
+ else
+ this->activateWindow(ROLE_NAME, area);
- this->mp_wm->activateWindow(ROLE_NAME);
HMI_DEBUG(APP_ID, "received showWindow event, end!, line=%d", __LINE__);
});
mp_hs->set_event_handler(LibHomeScreen::Event_HideWindow, [this](json_object *object){
struct json_object *value;
- json_object_object_get_ex(object, "application_id", &value);
+ json_object_object_get_ex(object, _application_id, &value);
const char *appid = json_object_get_string(value);
+ HMI_DEBUG(APP_ID, "request release onScreen application is %s!", appid);
- HMI_DEBUG(APP_ID, "release onScreen is %s!", appid);
-
- if (appid == my_id) {
- emit this->signalLoader(QVariant(""));
- this->mp_wm->deactivateWindow(ROLE_NAME);
- }
- else {
- HMI_DEBUG(APP_ID, "!!!!releaseOnScreen is not displaying!!!!!");
- }
+ // onscreenapp only can release by application which request show
+ if (appid == m_dspreq)
+ this->deactivateWindow();
+ else
+ HMI_DEBUG(APP_ID, "request hideWindow application isn't request displaying application, m_dspreq=%s", m_dspreq.toStdString().c_str());
});
if (mp_wm->requestSurface(ROLE_NAME) != 0) {
mp_wm->set_event_handler(QLibWindowmanager::Event_Visible, [this](json_object *object) {
struct json_object *value;
- json_object_object_get_ex(object, "drawing_name", &value);
+ json_object_object_get_ex(object, _drawing_name, &value);
const char *name = json_object_get_string(value);
HMI_DEBUG(APP_ID, "Event_Visible kKeyDrawingName = %s", name);
mp_wm->set_event_handler(QLibWindowmanager::Event_Invisible, [this](json_object *object) {
struct json_object *value;
- json_object_object_get_ex(object, "drawing_name", &value);
+ json_object_object_get_ex(object, _drawing_name, &value);
const char *name = json_object_get_string(value);
HMI_DEBUG(APP_ID, "Event_Invisible kKeyDrawingName = %s", name);
HMI_DEBUG(APP_ID, "LayoutHander::init() finished.");
}
-void EventHandler::setQuickWindow(QQuickWindow *qw)
-{
- mp_qw = qw;
-}
-
void EventHandler::onRep_static(struct json_object* reply_contents)
{
static_cast<EventHandler*>(EventHandler::myThis)->onRep(reply_contents);
}
+
void EventHandler::onRep(struct json_object* reply_contents)
{
const char* str = json_object_to_json_string(reply_contents);
HMI_DEBUG(APP_ID, "EventHandler::onReply %s", str);
}
-void EventHandler::activateWindow(QString &role)
+void EventHandler::activateWindow(const char *role, const char *area)
{
HMI_DEBUG(APP_ID, "EventHandler::activateWindow()");
- mp_wm->activateWindow(role);
+ mp_wm->activateWindow(role, area);
}
-void EventHandler::deactivateWindow(QString &role)
+void EventHandler::deactivateWindow()
{
HMI_DEBUG(APP_ID, "EventHandler::deactivateWindow()");
emit this->signalLoader(QVariant(""));
- mp_wm->deactivateWindow(role);
+ mp_wm->deactivateWindow(ROLE_NAME);
}
-void EventHandler::onScreenReply(const QString &btn_name)
+void EventHandler::onScreenReply(const QString &btn_name, const QString &press_mode, const QString &press_state)
{
HMI_DEBUG(APP_ID, "EventHandler::onScreenReply()");
- deactivateWindow(my_role);
+// deactivateWindow();
struct json_object* j_obj = json_object_new_object();
- json_object_object_add(j_obj, "application_id", json_object_new_string(m_dspreq.toLatin1()));
+ json_object_object_add(j_obj, _application_id, json_object_new_string(m_dspreq.toLatin1()));
struct json_object* j_param = json_object_new_object();
- json_object_object_add(j_param, "method", json_object_new_string("Buttons.ButtonPress"));
- json_object_object_add(j_param, "buttonName", json_object_new_string(btn_name.toStdString().c_str()));
- json_object_object_add(j_param, "buttonPressMode", json_object_new_string("Short"));
- json_object_object_add(j_obj, "parameter", j_param);
+ json_object_object_add(j_param, _button_name, json_object_new_string(btn_name.toStdString().c_str()));
+ json_object_object_add(j_param, _button_press_mode, json_object_new_string(press_mode.toStdString().c_str()));
+ json_object_object_add(j_param, _button_press_state, json_object_new_string(press_state.toStdString().c_str()));
+ json_object_object_add(j_obj, _parameter, j_param);
mp_hs->replyShowWindow(m_dspreq.toLatin1(), j_obj);
}
#include <QVariant>
#include <QPair>
#include <QMap>
-
#include <libhomescreen.hpp>
#include <qlibwindowmanager.h>
#include "hmi-debug.h"
-#define ROLE_NAME "on_screen.app"
+#define ROLE_NAME "on_screen"
#define APP_ID "onscreenapp"
-class QQuickWindow;
+class QQmlApplicationEngine;
class EventHandler : public QObject
{
public:
explicit EventHandler(QObject *parent = 0);
~EventHandler();
+ EventHandler(const EventHandler&) = delete;
+ EventHandler& operator=(const EventHandler&) = delete;
void init(int port, const char* token);
- void setQuickWindow(QQuickWindow *qw);
-
void onRep(struct json_object* reply_contents);
static void* myThis;
static void onRep_static(struct json_object* reply_contents);
- void activateWindow(QString &role);
- Q_INVOKABLE void deactivateWindow(QString &role);
- Q_INVOKABLE void onScreenReply(const QString &btn_name);
+ void activateWindow(const char *role, const char *area = "normal");
+ Q_INVOKABLE void deactivateWindow();
+ Q_INVOKABLE void onScreenReply(const QString &btn_name,
+ const QString &press_mode = QString("shortPress"),
+ const QString &press_state = QString("release"));
signals:
void signalLoader(QVariant url);
void signalOnScreenParameter(QVariant text);
private:
-
LibHomeScreen *mp_hs;
QLibWindowmanager* mp_wm;
-
- QQuickWindow *mp_qw;
-
QMap<QString, QPair<QString, QString>> m_req;
QString m_dspreq;
- QString my_id;
- QString my_role;
};
-
#endif // HOMESCREENHANDLER_H
#include <QGuiApplication>
#include <QCommandLineParser>
-#include <QtGui/QBitmap>
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
#include <QtQml/QQmlContext>
-#include <QtQml/qqml.h>
#include <QQuickWindow>
#include <QtQuickControls2/QQuickStyle>
#include "eventhandler.h"
-using namespace std;
-
-static EventHandler* eventHandler;
int main(int argc, char *argv[])
{
HMI_DEBUG(APP_ID, "port = %d, token = %s", port, token.toStdString().c_str());
- eventHandler = new EventHandler();
- eventHandler->init(port, token.toStdString().c_str());
-
QQmlApplicationEngine engine;
+ EventHandler *eventHandler = new EventHandler();
+ eventHandler->init(port, token.toStdString().c_str());
engine.rootContext()->setContextProperty("eventHandler", eventHandler);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty()) {
QObject *root = engine.rootObjects().first();
QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
-
- eventHandler->setQuickWindow(window);
QObject::connect(eventHandler, SIGNAL(signalLoader(QVariant)), window, SLOT(qmlLoader(QVariant)));
QObject::connect(eventHandler, SIGNAL(signalOnScreenParameter(QVariant)), window, SLOT(qmlOnScreenParameter(QVariant)));
HMI_DEBUG(APP_ID, "Launched!");
-
return app.exec();
}
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" id="onscreenapp" version="0.1">
- <name>onscreenapp</name>
+ <name>OnScreenApp</name>
<icon src="icon.svg"/>
<content src="bin/onscreenapp" type="application/vnd.agl.native"/>
<description>This is a demo OnScreen application</description>
TARGET = onstestapp
-QT = quick
+QT = quick quickcontrols2 qml
+
+CONFIG += c++11 link_pkgconfig
+PKGCONFIG += qlibwindowmanager qlibhomescreen
+DESTDIR = $${OUT_PWD}/../package/root/bin
SOURCES = main.cpp \
eventhandler.cpp
RESOURCES += \
qml.qrc
-LIBS += -lqtwindowmanager -lqthomescreen -ljson-c
-
-DESTDIR = $${OUT_PWD}/../package/root/bin
-
HEADERS += \
eventhandler.h
+LIBS += -ljson-c
+
#include <QJsonDocument>
#include <QJsonObject>
#include <QQuickWindow>
-#include <QtQml/QQmlContext>
+//#include <QtQml/QQmlContext>
+#include <QQmlContext>
+#include <QtQml/QQmlApplicationEngine>
#include "eventhandler.h"
void* EventHandler::myThis = 0;
+const char _drawing_name[] = "drawing_name";
+
EventHandler::EventHandler(QObject *parent) :
QObject(parent),
mp_hs(NULL),
mp_hs = new QLibHomeScreen();
mp_hs->init(port, token);
- mp_hs->set_event_handler(QLibHomeScreen::Event_TapShortcut, [this](json_object *object){
- this->mp_wm->activateWindow(ROLE_NAME);
+ mp_hs->set_event_handler(QLibHomeScreen::Event_ShowWindow, [this](json_object *object){
+ this->mp_wm->activateWindow(ROLE_NAME, "normal");
HMI_DEBUG(APP_ID, "received showWindow event, end!, line=%d", __LINE__);
});
mp_wm->set_event_handler(QLibWindowmanager::Event_Visible, [this](json_object *object) {
struct json_object *value;
- json_object_object_get_ex(object, "drawing_name", &value);
+ json_object_object_get_ex(object, _drawing_name, &value);
const char *name = json_object_get_string(value);
HMI_DEBUG(APP_ID, "Event_Active kKeyDrawingName = %s", name);
mp_wm->set_event_handler(QLibWindowmanager::Event_Invisible, [this](json_object *object) {
struct json_object *value;
- json_object_object_get_ex(object, "drawing_name", &value);
+ json_object_object_get_ex(object, _drawing_name, &value);
const char *name = json_object_get_string(value);
HMI_DEBUG(APP_ID, "Event_Inactive kKeyDrawingName = %s", name);
else
mp_hs->showWindow(id.toStdString().c_str(), json_tokener_parse(json.toStdString().c_str()));
}
+
+void EventHandler::hideWindow(QString id)
+{
+ mp_hs->hideWindow(id.toStdString().c_str());
+}
using namespace std;
class QQuickWindow;
+class QQmlApplicationEngine;
class EventHandler : public QObject
{
static void* myThis;
Q_INVOKABLE void showWindow(QString id, QString json);
+ Q_INVOKABLE void hideWindow(QString id);
signals:
void signalOnReplyShowWindow(QVariant val);
* limitations under the License.
*/
-#include <QUrlQuery>
#include <QQmlContext>
-#include <QtCore/QDebug>
#include <QtCore/QCommandLineParser>
-#include <QtCore/QUrlQuery>
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlContext>
#include <QtQml/QQmlApplicationEngine>
#include <QtQuickControls2/QQuickStyle>
#include <QtQuick/QQuickWindow>
+#include <QtCore/QDir>
#include "eventhandler.h"
-static EventHandler* eventHandler;
int main(int argc, char *argv[])
{
app.setOrganizationDomain(QStringLiteral("automotivelinux.org"));
app.setOrganizationName(QStringLiteral("AutomotiveGradeLinux"));
- //QQuickStyle::setStyle("AGL");
+ QQuickStyle::setStyle("AGL");
QCommandLineParser parser;
parser.addPositionalArgument("port", app.translate("main", "port for binding"));
QStringList positionalArguments = parser.positionalArguments();
QQmlApplicationEngine engine;
- QQmlContext *context = engine.rootContext();
- QUrl bindingAddress;
int port = 0;
QString secret;
if (positionalArguments.length() == 2) {
port = positionalArguments.takeFirst().toInt();
secret = positionalArguments.takeFirst();
- bindingAddress.setScheme(QStringLiteral("ws"));
- bindingAddress.setHost(QStringLiteral("localhost"));
- bindingAddress.setPort(port);
- bindingAddress.setPath(QStringLiteral("/api"));
- QUrlQuery query;
- query.addQueryItem(QStringLiteral("token"), secret);
- bindingAddress.setQuery(query);
- context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
- } else {
- context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
}
- eventHandler = new EventHandler();
+ EventHandler *eventHandler = new EventHandler();
eventHandler->init(port, secret.toStdString().c_str());
engine.rootContext()->setContextProperty("eventHandler", eventHandler);
+ QString qmldir = QCoreApplication::applicationDirPath();
+ qmldir.replace(QString("bin"), QString("qml"));
+ qmldir.append('/');
+ qDebug() << "####qmldir=" << qmldir;
+ engine.rootContext()->setContextProperty("qmldir", qmldir);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
+ if (engine.rootObjects().isEmpty()) {
+ HMI_DEBUG(APP_ID, "Fatal Error, rootObject is empty!");
+ return -1;
+ }
+ qDebug() << "####" << QDir::currentPath() << QCoreApplication::applicationDirPath();
+
QObject *root = engine.rootObjects().first();
QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
-
QObject::connect(eventHandler, SIGNAL(signalOnReplyShowWindow(QVariant)), window, SLOT(qmlOnReplyShowWindow(QVariant)));
eventHandler->setQuickWindow(window);
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtQuick.VirtualKeyboard 2.1
-
+import AGL.Demo.Controls 1.0
ApplicationWindow {
id: root
height: 1487
property string onsId: qsTr("onscreenapp")
- property string pri_path: qsTr("/home/0/app-data/OnScreen/qml/")
+// property string pri_path: qsTr("/home/0/app-data/OnScreen/qml/")
+ property string pri_path: qmldir
property string filepath: pri_path + qsTr("vics.qml")
property string msgdata: ""
property string postmsg: ""
function qmlOnReplyShowWindow(text) {
console.log("onstestapp received:",text);
output.text = text;
+ eventHandler.hideWindow(onsId);
}
}
QMAKE_EXTRA_TARGETS += copy_config
PRE_TARGETDEPS += $$copy_config.target
+copy_qml.target = $$OUT_PWD/root/qml/
+copy_qml.depends = $$_PRO_FILE_PWD_/qml/.
+copy_qml.commands = $(COPY_DIR) \"$$replace(copy_qml.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qml.target, /, $$QMAKE_DIR_SEP)\"
+QMAKE_EXTRA_TARGETS += copy_qml
+PRE_TARGETDEPS += $$copy_qml.target
+
wgt.target = package
wgt.commands = wgtpkg-pack -f -o onstestapp.wgt root
visible: true
width: 1079
height: 400
+ scale: screenInfo.scale_factor()
function qmlOnScreenParameter(message) {
console.log(qsTr('OnScreenVICS:QML:System >>> qmlOnScreenMessage.'), message);
visible: true
width: 1079
height: 400
+ scale: screenInfo.scale_factor()
property string messageText: "Incoming Call"
function qmlOnScreenParameter(message) {
visible: true
width: 1079
height: 400
+ scale: screenInfo.scale_factor()
function qmlOnScreenParameter(message) {
console.log(qsTr('OnScreenSys:QML:System >>> qmlOnScreenMessage.'), message);
visible: true
width: 1079
height: 400
+ scale: screenInfo.scale_factor()
function qmlOnScreenParameter(message) {
console.log(qsTr('OnScreenVICS:QML:System >>> qmlOnScreenMessage.'), message);
- when onscreenapp is compiled, this app's wgt file will exist at "onscreenapp/sample/package", called onstestapp.wgt.
- install
-: `afm-util install onstestapp.wgt;sync`
+ `afm-util install onstestapp.wgt;sync`
## dependence