change onscreenapp
[apps/onscreenapp.git] / app / eventhandler.cpp
index 044eec6..802b11b 100644 (file)
 #include <QDebug>
 #include <QJsonDocument>
 #include <QJsonObject>
-#include <QQuickWindow>
+#include <QQmlContext>
+#include <QtQml/QQmlApplicationEngine>
 #include <cstring>
+#include <QFileInfo>
 
 #include "eventhandler.h"
 
+const char _myrole[] = "on_screen";
+const char _parameter[] = "parameter";
+const char _replyto[] = "replyto";
+const char _button_name[] = "buttonName";
+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_dsp_sts(false)
 {
-    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;
     }
 }
@@ -56,93 +62,84 @@ 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));
+        /*
+        {
+            "application_id": "onscreenapp",
+            "parameter": {
+                "title": "onscreen title",
+                "type": "critical,exclamation,question,information",
+                "contents": "message contents",
+                "buttons": ["button_name1", "button_name2", "button_name3"],
+                "replyto":"caller application 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);
-        if(json_object_get_type(param) != json_type_object ) {
+        if(!json_object_object_get_ex(object, _parameter, &param)
+        || json_object_get_type(param) != json_type_object) {
             HMI_DEBUG(APP_ID, "parameter error!");
             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_req = qMakePair(QString(replyto), QString(json_object_to_json_string(param)));
 
-        m_dspreq = QString(_replyid);
-        if(m_req.contains(m_dspreq)) {
-            m_req[m_dspreq] = qMakePair(QString(_path), QString(_data));
+        if (this->getDisplayStatus() == HIDING) {
+            this->activateWindow(_myrole, "on_screen");
+        }
+        else if(this->getDisplayStatus() == SHOWING) {
+            this->setDisplayStatus(SWAPPING);
+            emit this->hideOnScreen();
+        }
+        else {
+            HMI_DEBUG(APP_ID, "onscreen swapping!");
         }
-        else
-            m_req.insert(QString(m_dspreq), qMakePair(QString(_path), QString(_data)));
-
-        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);
-        const char *appid = json_object_get_string(value);
-
-        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!!!!!");
-        }
+        emit this->hideOnScreen();
+        HMI_DEBUG(APP_ID, "hideWindow json_object=%s", json_object_get_string(object));
     });
 
-    if (mp_wm->requestSurface(ROLE_NAME) != 0) {
+    if (mp_wm->requestSurface(_myrole) != 0) {
         HMI_DEBUG(APP_ID, "!!!!LayoutHandler requestSurface Failed!!!!!");
         exit(EXIT_FAILURE);
     }
 
     mp_wm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [this](json_object *object) {
-        HMI_DEBUG(APP_ID, "Surface %s got syncDraw!", ROLE_NAME);
-        emit this->signalLoader(QVariant("file://" + m_req[m_dspreq].first));
-        emit this->signalOnScreenParameter(QVariant(m_req[m_dspreq].second));
-        this->mp_wm->endDraw(QString(ROLE_NAME));
+        HMI_DEBUG(APP_ID, "Surface %s got syncDraw!", _myrole);
+        this->mp_wm->endDraw(QString(_myrole));
     });
 
     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);
+        if(!strcasecmp(_myrole, name)){
+            this->setDisplayStatus(SHOWING);
+            this->m_dsp = this->m_req;
+            this->updateModel(QVariant(this->m_dsp.second));
+            emit this->showOnScreen();
+        }
 
         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);
@@ -151,48 +148,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);
+    if(getDisplayStatus() == SWAPPING) {
+        setDisplayStatus(SHOWING);
+        m_dsp = m_req;
+        updateModel(QVariant(this->m_dsp.second));
+        emit showOnScreen();
+    }
+    else {
+        this->setDisplayStatus(HIDING);
+        mp_wm->deactivateWindow(_myrole);
+    }
 }
 
 void EventHandler::onScreenReply(const QString &btn_name)
 {
-    HMI_DEBUG(APP_ID, "EventHandler::onScreenReply()");
-    deactivateWindow(my_role);
-
-    struct json_object* j_obj = json_object_new_object();
-    json_object_object_add(j_obj, "application_id", json_object_new_string(m_dspreq.toLatin1()));
+    HMI_DEBUG(APP_ID, "EventHandler::onScreenReply(),btn_name=%s", btn_name.toStdString().c_str());
+    emit this->hideOnScreen();
 
     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);
-
-    mp_hs->replyShowWindow(m_dspreq.toLatin1(), j_obj);
+    json_object_object_add(j_param, _button_name, json_object_new_string(btn_name.toStdString().c_str()));
+    mp_hs->replyShowWindow(m_dsp.first.toStdString().c_str(), j_param);
 }