From 607fdc0374e76a272455cc010f35693ba8b6894b Mon Sep 17 00:00:00 2001 From: wang_zhiqiang Date: Wed, 20 Feb 2019 17:08:32 +0800 Subject: Start app and get runnables list by homescreen 1.only call showWindow when start application. 2.get runnalbes list from homescreen-service. 3.subscribe and deal with Event_AppListChanged. 4.move LICENSE file to top-level directory. Bug-AGL: SPEC-2188 Change-Id: If0ce87a2f770b1a06ba72fdb087a24719d92d124 Signed-off-by: wang_zhiqiang --- launcher/src/applicationmodel.cpp | 77 +++++++++++++++---- launcher/src/applicationmodel.h | 4 +- launcher/src/homescreenhandler.cpp | 151 +++++++++++++++++++++++++++++++++++++ launcher/src/homescreenhandler.h | 55 ++++++++++++++ launcher/src/main.cpp | 12 +-- 5 files changed, 275 insertions(+), 24 deletions(-) create mode 100644 launcher/src/homescreenhandler.cpp create mode 100644 launcher/src/homescreenhandler.h (limited to 'launcher/src') diff --git a/launcher/src/applicationmodel.cpp b/launcher/src/applicationmodel.cpp index 14e2ea1..258fac6 100644 --- a/launcher/src/applicationmodel.cpp +++ b/launcher/src/applicationmodel.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2016 The Qt Company Ltd. * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH - * Copyright (c) 2018 TOYOTA MOTOR CORPORATION + * Copyright (c) 2018,2019 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. @@ -33,6 +33,9 @@ class ApplicationModel::Private public: Private(); + void addApp(QString icon, QString name, QString id); + void removeApp(QString id); + QList data; }; @@ -52,22 +55,33 @@ 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); +} - 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; + } + + 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)); +} - HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str()); +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 +174,36 @@ 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); + + beginResetModel(); + if(icon == "") { // uninstall + d->removeApp(id); + } + else { + // new app + d->addApp(icon, name, id); + } + endResetModel(); +} + +void ApplicationModel::initAppList(QString data) +{ + HMI_DEBUG("launcher","init application list."); + 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); + } + endResetModel(); +} diff --git a/launcher/src/applicationmodel.h b/launcher/src/applicationmodel.h index 71c79fc..780e575 100644 --- a/launcher/src/applicationmodel.h +++ b/launcher/src/applicationmodel.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2016 The Qt Company Ltd. - * Copyright (c) 2018 TOYOTA MOTOR CORPORATION + * Copyright (c) 2018,2019 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. @@ -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 index 0000000..9f15b6a --- /dev/null +++ b/launcher/src/homescreenhandler.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * Copyright (c) 2018,2019 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 +#include "homescreenhandler.h" +#include +#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") { + /* { "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); +} + +void HomescreenHandler::onRep_static(struct json_object* reply_contents) +{ + static_cast(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 index 0000000..09b6848 --- /dev/null +++ b/launcher/src/homescreenhandler.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * Copyright (c) 2018,2019 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 +#include +#include +#include + +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 diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 291e9d5..e56ff5a 100644 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -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,6 @@ int main(int argc, char *argv[]) qDBusRegisterMetaType(); qDBusRegisterMetaType >(); - QLibHomeScreen* homescreenHandler = new QLibHomeScreen(); ApplicationLauncher *launcher = new ApplicationLauncher(); QLibWindowmanager* layoutHandler = new QLibWindowmanager(); if(layoutHandler->init(port,token) != 0){ @@ -121,12 +120,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 +150,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(root); -- cgit 1.2.3-korg