modify display/hide onscreen sequence
[apps/onscreenapp.git] / app / eventhandler.cpp
index 044eec6..39db933 100644 (file)
 #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;
     }
 }
@@ -57,67 +68,78 @@ void EventHandler::init(int port, const char *token)
     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", &param);
+        json_object_object_get_ex(object, _parameter, &param);
         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, &param_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) {
@@ -134,7 +156,7 @@ void EventHandler::init(int port, const char *token)
 
     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);
@@ -142,7 +164,7 @@ void EventHandler::init(int port, const char *token)
 
     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);
@@ -151,48 +173,44 @@ void EventHandler::init(int port, const char *token)
     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);
 }