launcher: rely on applaunchd for application startup
[apps/launcher.git] / launcher / src / homescreenhandler.cpp
index 9f15b6a..9cf7e61 100644 (file)
  * limitations under the License.
  */
 
-#include <QFileInfo>
+#include <QDBusMessage>
+#include <QDBusConnection>
 #include "homescreenhandler.h"
-#include <functional>
 #include "hmi-debug.h"
 
-void* HomescreenHandler::myThis = 0;
+#include <json.h>
 
-HomescreenHandler::HomescreenHandler(QObject *parent) :
-    QObject(parent),
-    mp_hs(NULL)
-{
-
-}
+#define APPLAUNCH_DBUS_IFACE     "org.automotivelinux.AppLaunch"
+#define APPLAUNCH_DBUS_OBJECT    "/org/automotivelinux/AppLaunch"
 
-HomescreenHandler::~HomescreenHandler()
+HomescreenHandler::HomescreenHandler(QObject *parent) : QObject(parent)
 {
-    if (mp_hs != NULL) {
-        delete mp_hs;
-    }
+    applaunch_iface = new org::automotivelinux::AppLaunch(APPLAUNCH_DBUS_IFACE, APPLAUNCH_DBUS_OBJECT, QDBusConnection::sessionBus(), this);
 }
 
-void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm, QString myname)
+HomescreenHandler::~HomescreenHandler()
 {
-    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") {
-                /* { "application_id": "launcher",
-                 *   "type": "application-list-changed",
-                 *   "parameter":{
-                 *      "operation": "uninstall",
-                 *      "data": "onstestapp@0.1"
-                 *   }
-                 * } */
-                QString id = json_object_get_string(obj_data);
-                QStringList info;
-                // icon, name, id
-                info << "" << "" << id;
-                emit appListUpdate(info);
-            }
-            else if(oper == "install") {
-                /* { "application_id": "launcher",
-                 *   "type": "application-list-changed",
-                 *   "parameter": {
-                 *      "operation": "install",
-                 *      "data": {
-                 *          "description":"This is a demo onstestapp application",
-                 *          "name": "onstestapp",
-                 *          "shortname": "",
-                 *          "id": "onstestapp@0.1",
-                 *          "version": "0.1",
-                 *          "author": "Qt",
-                 *          "author-email": "",
-                 *          "width": "",
-                 *          "height": "",
-                 *          "icon": "\/var\/local\/lib\/afm\/applications\/onstestapp\/0.1\/icon.svg",
-                 *          "http-port": 31022
-                 *      }
-                 *    }
-                 * } */
-                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);
+    QDBusPendingReply<> reply = applaunch_iface->start(application_id);
+    reply.waitForFinished();
+    if (reply.isError()) {
+        HMI_ERROR("Launcher","Unable to start application '%s': %s",
+                  application_id.toStdString().c_str(),
+                  reply.error().message().toStdString().c_str());
+    }
 }
 
-void HomescreenHandler::onRep_static(struct json_object* reply_contents)
+void HomescreenHandler::getRunnables(void)
 {
-    static_cast<HomescreenHandler*>(HomescreenHandler::myThis)->onRep(reply_contents);
-}
+       struct json_object *json_applist;
+       QString applist;
+    QStringList apps;
 
-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);
+    QDBusPendingReply<QVariantList> reply = applaunch_iface->listApplications(true);
+    reply.waitForFinished();
+    if (reply.isError()) {
+        HMI_ERROR("Launcher","Unable to retrieve application list: %s",
+                  reply.error().message().toStdString().c_str());
+        return;
+    } else {
+        QVariantList applist_variant = reply.value();
+        for (auto &v: applist_variant) {
+            QString app_id;
+            QString name;
+            QString icon_path;
+            const QDBusArgument &dbus_arg = v.value<QDBusArgument>();
+
+            dbus_arg.beginStructure();
+            dbus_arg >> app_id >> name >> icon_path;
+
+            apps << QString("{ \"name\":\"%1\", \"id\":\"%2\", \"icon\":\"%3\" }")
+                        .arg(name)
+                        .arg(app_id)
+                        .arg(icon_path);
+            dbus_arg.endStructure();
         }
     }
-}
 
-void HomescreenHandler::getRunnables(void)
-{
-    mp_hs->getRunnables();
+    applist = QString("[ %1 ]").arg(apps.join(", "));
+    json_applist = json_tokener_parse(applist.toLocal8Bit().data());
+    if (json_applist) {
+        QString data = json_object_to_json_string(json_applist);
+        HMI_DEBUG("Launcher", "doing an emit initAppList()");
+        emit initAppList(data);
+    } else {
+        HMI_DEBUG("Launcher", "app list is invalid!");
+    }
 }