get runnables list from hss
authorwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>
Tue, 22 Jan 2019 12:30:46 +0000 (20:30 +0800)
committerwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>
Tue, 22 Jan 2019 12:30:46 +0000 (20:30 +0800)
Change-Id: If92738046cf9aa61bedef1c0ca44fa27a0e99eb6

launcher/launcher.pro
launcher/qml/Launcher.qml
launcher/src/applicationmodel.cpp
launcher/src/applicationmodel.h
launcher/src/homescreenhandler.cpp [new file with mode: 0644]
launcher/src/homescreenhandler.h [new file with mode: 0644]
launcher/src/main.cpp

index 7fd1319..6d05165 100644 (file)
@@ -18,7 +18,7 @@ TARGET = launcher
 QT = qml quick dbus websockets
 CONFIG += c++11 link_pkgconfig
 DESTDIR = $${OUT_PWD}/../package/root/bin
-PKGCONFIG += qlibwindowmanager qlibhomescreen
+PKGCONFIG += qlibwindowmanager libhomescreen
 
 include(../interfaces/interfaces.pri)
 
@@ -26,12 +26,14 @@ SOURCES += \
     src/main.cpp \
     src/applicationmodel.cpp \
     src/appinfo.cpp \
-    src/applicationlauncher.cpp
+    src/applicationlauncher.cpp \
+    src/homescreenhandler.cpp
 
 HEADERS  += \
     src/applicationlauncher.h \
     src/applicationmodel.h \
-    src/appinfo.h
+    src/appinfo.h \
+    src/homescreenhandler.h
 
 OTHER_FILES += \
     README.md
index 1ddfc4b..ad15fe9 100644 (file)
@@ -59,6 +59,21 @@ ApplicationWindow {
             height: grid.cellHeight
         }
 
+        Connections {
+            target: homescreenHandler
+            onAppListUpdate: {
+                console.warn("applist update in Launcher.qml")
+                applicationModel.updateApplist(info);
+            }
+        }
+        Connections {
+            target: homescreenHandler
+            onInitAppList: {
+                console.warn("applist init in Launcher.qml")
+                applicationModel.initAppList(data);
+            }
+        }
+
         MouseArea {
             id: loc
             anchors.fill: parent
index 14e2ea1..c18291c 100644 (file)
@@ -33,6 +33,9 @@ class ApplicationModel::Private
 public:
     Private();
 
+    void addApp(QString icon, QString name, QString id);
+    void removeApp(QString id);
+
     QList<AppInfo> data;
 };
 
@@ -52,22 +55,50 @@ namespace {
 
 ApplicationModel::Private::Private()
 {
-    QString apps = afm_user_daemon_proxy->runnables(QStringLiteral(""));
-    QJsonDocument japps = QJsonDocument::fromJson(apps.toUtf8());
-    for (auto const &app : japps.array()) {
-        QJsonObject const &jso = app.toObject();
-        auto const name = jso["name"].toString();
-        auto const id = jso["id"].toString();
-        auto const icon = get_icon_name(jso);
+//    QString apps = afm_user_daemon_proxy->runnables(QStringLiteral(""));
+//    QJsonDocument japps = QJsonDocument::fromJson(apps.toUtf8());
+//    for (auto const &app : japps.array()) {
+//        QJsonObject const &jso = app.toObject();
+//        auto const name = jso["name"].toString();
+//        auto const id = jso["id"].toString();
+//        auto const icon = get_icon_name(jso);
+
+//        if ( name != "launcher" &&
+//             name != "homescreen-2017" &&
+//             name != "homescreen" &&
+//             name != "OnScreenApp") {
+//            this->data.append(AppInfo(icon, name, id));
+//        }
+
+//        HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
+//    }
+}
 
-        if ( name != "launcher" &&
-             name != "homescreen-2017" &&
-             name != "homescreen" &&
-             name != "OnScreenApp") {
-            this->data.append(AppInfo(icon, name, id));
-        }
+void ApplicationModel::Private::addApp(QString icon, QString name, QString id)
+{
+    HMI_DEBUG("addApp","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
+    for(int i = 0; i < this->data.size(); ++i) {
+        if(this->data[i].id() == id)
+            return;
+    }
 
-        HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
+    QString _icon = name.toLower();
+    if ( !QFile::exists(QString(":/images/%1_active.svg").arg(_icon)) ||
+         !QFile::exists(QString(":/images/%1_inactive.svg").arg(_icon)) )
+    {
+        _icon = "blank";
+    }
+    this->data.append(AppInfo(_icon, name, id));
+}
+
+void ApplicationModel::Private::removeApp(QString id)
+{
+    HMI_DEBUG("removeApp","id: %s.",id.toStdString().c_str());
+    for (int i = 0; i < this->data.size(); ++i) {
+          if (this->data.at(i).id() == id) {
+              this->data.removeAt(i);
+              break;
+          }
     }
 }
 
@@ -160,3 +191,37 @@ void ApplicationModel::move(int from, int to)
         HMI_NOTICE("launcher","from : %d, to : %d. false.", from, to);
     }
 }
+
+void ApplicationModel::updateApplist(QStringList info)
+{
+    QString icon = info.at(0);
+    QString name = info.at(1);
+    QString id = info.at(2);
+    QString appid = id.split('@')[0];
+
+    beginResetModel();
+    if(icon == "") { // uninstall
+        d->removeApp(id);
+    }
+    else {
+        // new app
+        d->addApp(icon, name, id);
+    }
+    endResetModel();
+}
+
+void ApplicationModel::initAppList(QString data)
+{
+    beginResetModel();
+    QJsonDocument japps = QJsonDocument::fromJson(data.toUtf8());
+    for (auto const &app : japps.array()) {
+        QJsonObject const &jso = app.toObject();
+        auto const name = jso["name"].toString();
+        auto const id = jso["id"].toString();
+        auto const icon = get_icon_name(jso);
+
+        d->addApp(icon, name, id);
+        HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
+    }
+    endResetModel();
+}
index 71c79fc..7ff3503 100644 (file)
@@ -35,6 +35,8 @@ public:
     Q_INVOKABLE QString id(int index) const;
     Q_INVOKABLE QString name(int index) const;
     Q_INVOKABLE void move(int from, int to);
+    Q_INVOKABLE void initAppList(QString data);
+    Q_INVOKABLE void updateApplist(QStringList info);
 
 private:
     class Private;
diff --git a/launcher/src/homescreenhandler.cpp b/launcher/src/homescreenhandler.cpp
new file mode 100644 (file)
index 0000000..9035fb1
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * 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 <QFileInfo>
+#include "homescreenhandler.h"
+#include <functional>
+#include "hmi-debug.h"
+
+void* HomescreenHandler::myThis = 0;
+
+HomescreenHandler::HomescreenHandler(QObject *parent) :
+    QObject(parent),
+    mp_hs(NULL)
+{
+
+}
+
+HomescreenHandler::~HomescreenHandler()
+{
+    if (mp_hs != NULL) {
+        delete mp_hs;
+    }
+}
+
+void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm, QString myname)
+{
+    myThis = this;
+    mp_qwm = qwm;
+    m_myname = myname;
+
+    mp_hs = new LibHomeScreen();
+    mp_hs->init(port, token);
+    mp_hs->registerCallback(nullptr, HomescreenHandler::onRep_static);
+
+    mp_hs->set_event_handler(LibHomeScreen::Event_ShowWindow,[this](json_object *object){
+        HMI_DEBUG("Launcher","Surface launcher got Event_ShowWindow\n");
+        mp_qwm->activateWindow(m_myname);
+    });
+
+    mp_hs->set_event_handler(LibHomeScreen::Event_AppListChanged,[this](json_object *object){
+        HMI_DEBUG("Launcher","laucher: appListChanged [%s]\n", json_object_to_json_string(object));
+
+        struct json_object *obj_param, *obj_oper, *obj_data;
+        if(json_object_object_get_ex(object, "parameter", &obj_param)
+        && json_object_object_get_ex(obj_param, "operation", &obj_oper)
+        && json_object_object_get_ex(obj_param, "data", &obj_data)) {
+            QString oper = json_object_get_string(obj_oper);
+            if(oper == "uninstall") {
+                QString id = json_object_get_string(obj_data);
+                QStringList info;
+                // icon, name, id
+                info << "" << "" << id;
+                emit appListUpdate(info);
+            }
+            else if(oper == "install") {
+                struct json_object *obj_icon, *obj_name, *obj_id;
+                if(json_object_object_get_ex(obj_data, "icon", &obj_icon)
+                && json_object_object_get_ex(obj_data, "name", &obj_name)
+                && json_object_object_get_ex(obj_data, "id", &obj_id)) {
+                    QString icon = json_object_get_string(obj_icon);
+                    QString name = json_object_get_string(obj_name);
+                    QString id = json_object_get_string(obj_id);
+                    QStringList info;
+                    // icon, name, id
+                    info << icon << name << id;
+                    emit appListUpdate(info);
+                }
+            }
+            else {
+                HMI_ERROR("Launcher","error operation.\n");
+            }
+        }
+    });
+}
+
+void HomescreenHandler::tapShortcut(QString application_id)
+{
+    HMI_DEBUG("Launcher","tapShortcut %s", application_id.toStdString().c_str());
+    struct json_object* j_json = json_object_new_object();
+    struct json_object* value;
+    value = json_object_new_string("normal.full");
+    json_object_object_add(j_json, "area", value);
+
+    mp_hs->showWindow(application_id.toStdString().c_str(), j_json);
+}
+
+void HomescreenHandler::onRep_static(struct json_object* reply_contents)
+{
+    static_cast<HomescreenHandler*>(HomescreenHandler::myThis)->onRep(reply_contents);
+}
+
+void HomescreenHandler::onRep(struct json_object* reply_contents)
+{
+    HMI_DEBUG("launcher","HomeScreen onReply %s", json_object_to_json_string(reply_contents));
+    struct json_object *obj_res, *obj_verb;
+    if(json_object_object_get_ex(reply_contents, "response", &obj_res)
+    && json_object_object_get_ex(obj_res, "verb", &obj_verb)
+    && !strcasecmp("getRunnables", json_object_get_string(obj_verb))) {
+        struct json_object *obj_data;
+        if(json_object_object_get_ex(obj_res, "data", &obj_data)) {
+            HMI_DEBUG("launcher","HomescreenHandler emit initAppList");
+            QString data = json_object_to_json_string(obj_data);
+            emit initAppList(data);
+        }
+    }
+}
+
+void HomescreenHandler::getRunnables(void)
+{
+    mp_hs->getRunnables();
+}
diff --git a/launcher/src/homescreenhandler.h b/launcher/src/homescreenhandler.h
new file mode 100644 (file)
index 0000000..99fa316
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * 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.
+ */
+
+#ifndef HOMESCREENHANDLER_H
+#define HOMESCREENHANDLER_H
+
+#include <QObject>
+#include <libhomescreen.hpp>
+#include <string>
+#include <qlibwindowmanager.h>
+
+using namespace std;
+
+class HomescreenHandler : public QObject
+{
+    Q_OBJECT
+public:
+    explicit HomescreenHandler(QObject *parent = 0);
+    ~HomescreenHandler();
+
+    void init(int port, const char* token, QLibWindowmanager *qwm, QString myname);
+
+    Q_INVOKABLE void tapShortcut(QString application_id);
+    Q_INVOKABLE void getRunnables(void);
+
+    void onRep(struct json_object* reply_contents);
+
+    static void* myThis;
+    static void onRep_static(struct json_object* reply_contents);
+
+signals:
+    void initAppList(QString data);
+    void appListUpdate(QStringList info);
+
+private:
+    LibHomeScreen *mp_hs;
+    QLibWindowmanager *mp_qwm;
+    QString m_myname;
+};
+
+#endif // HOMESCREENHANDLER_H
index 291e9d5..389da19 100644 (file)
@@ -29,7 +29,7 @@
 #include "applicationmodel.h"
 #include "appinfo.h"
 #include "afm_user_daemon_proxy.h"
-#include "qlibhomescreen.h"
+#include "homescreenhandler.h"
 #include "hmi-debug.h"
 
 // XXX: We want this DBus connection to be shared across the different
@@ -93,7 +93,7 @@ int main(int argc, char *argv[])
     qDBusRegisterMetaType<AppInfo>();
     qDBusRegisterMetaType<QList<AppInfo> >();
 
-    QLibHomeScreen* homescreenHandler = new QLibHomeScreen();
+//    QLibHomeScreen* homescreenHandler = new QLibHomeScreen();
     ApplicationLauncher *launcher = new ApplicationLauncher();
     QLibWindowmanager* layoutHandler = new QLibWindowmanager();
     if(layoutHandler->init(port,token) != 0){
@@ -121,12 +121,8 @@ int main(int argc, char *argv[])
         HMI_DEBUG("launch", "surface %s Event_Invisible", label);
     });
 
-    homescreenHandler->init(port, token.toStdString().c_str());
-
-    homescreenHandler->set_event_handler(QLibHomeScreen::Event_ShowWindow, [layoutHandler, myname](json_object *object){
-        qDebug("Surface %s got Event_ShowWindow\n", myname);
-        layoutHandler->activateWindow(myname);
-    });
+    HomescreenHandler* homescreenHandler = new HomescreenHandler();
+    homescreenHandler->init(port, token.toStdString().c_str(), layoutHandler, myname);
 
     QUrl bindingAddress;
     bindingAddress.setScheme(QStringLiteral("ws"));
@@ -155,6 +151,7 @@ int main(int argc, char *argv[])
     engine.rootContext()->setContextProperty(QStringLiteral("launcher"), launcher);
     engine.rootContext()->setContextProperty(QStringLiteral("screenInfo"), &screenInfo);
     engine.load(QUrl(QStringLiteral("qrc:/Launcher.qml")));
+    homescreenHandler->getRunnables();
 
     QObject *root = engine.rootObjects().first();
     QQuickWindow *window = qobject_cast<QQuickWindow *>(root);