From 8cc6188eaf2b333e169eab6f58857adcb7e47568 Mon Sep 17 00:00:00 2001 From: zheng_wenlong Date: Mon, 8 Apr 2019 18:16:07 +0900 Subject: Add demo3 launcher source code for cluster mode Add demo3 launcher source code for cluster mode. [Patch Set 2]Update LICENSE file. Change-Id: I9026690d30229b2587f4a6f02198cc88ba776f1d BUG-AGL: SPEC-2261 Signed-off-by: zheng_wenlong --- .gitignore | 4 + .gitreview | 5 + LICENSE | 204 +++++++++ README.md | 34 ++ interfaces/README.md | 10 + interfaces/afm_user_daemon.xml | 52 +++ interfaces/appframework.xml | 57 +++ interfaces/include/afm_user_daemon.hpp | 21 + interfaces/include/appframework.hpp | 66 +++ interfaces/interfaces.pri | 18 + interfaces/interfaces.pro | 60 +++ interfaces/src/appframework.cpp | 167 ++++++++ launcher.pro | 24 ++ launcher/README.md | 10 + launcher/launcher.pro | 41 ++ launcher/qml/ChangeItemPosition.js | 89 ++++ launcher/qml/IconItem.qml | 137 ++++++ launcher/qml/Launcher.qml | 516 +++++++++++++++++++++++ launcher/qml/images/blank_active.png | Bin 0 -> 68320 bytes launcher/qml/images/blank_inactive.png | Bin 0 -> 868 bytes launcher/qml/images/browser_active.png | Bin 0 -> 68979 bytes launcher/qml/images/browser_inactive.png | Bin 0 -> 1949 bytes launcher/qml/images/center_background.png | Bin 0 -> 278523 bytes launcher/qml/images/connectivity_active.png | Bin 0 -> 78821 bytes launcher/qml/images/connectivity_inactive.png | Bin 0 -> 6171 bytes launcher/qml/images/dashboard_meter_active.png | Bin 0 -> 74200 bytes launcher/qml/images/dashboard_meter_inactive.png | Bin 0 -> 4775 bytes launcher/qml/images/gtf_launcher_active.png | Bin 0 -> 57222 bytes launcher/qml/images/gtf_launcher_inactive.png | Bin 0 -> 868 bytes launcher/qml/images/hvac_active.png | Bin 0 -> 74342 bytes launcher/qml/images/hvac_inactive.png | Bin 0 -> 5202 bytes launcher/qml/images/images.qrc | 37 ++ launcher/qml/images/mediaplayer_active.png | Bin 0 -> 72606 bytes launcher/qml/images/mediaplayer_inactive.png | Bin 0 -> 3854 bytes launcher/qml/images/mixer_active.png | Bin 0 -> 72342 bytes launcher/qml/images/mixer_inactive.png | Bin 0 -> 3282 bytes launcher/qml/images/music_active.png | Bin 0 -> 72606 bytes launcher/qml/images/music_inactive.png | Bin 0 -> 3854 bytes launcher/qml/images/navigation_active.png | Bin 0 -> 82996 bytes launcher/qml/images/navigation_inactive.png | Bin 0 -> 9335 bytes launcher/qml/images/phone_active.png | Bin 0 -> 77864 bytes launcher/qml/images/phone_inactive.png | Bin 0 -> 4962 bytes launcher/qml/images/poi_active.png | Bin 0 -> 79835 bytes launcher/qml/images/poi_inactive.png | Bin 0 -> 6367 bytes launcher/qml/images/radio_active.png | Bin 0 -> 73543 bytes launcher/qml/images/radio_inactive.png | Bin 0 -> 3680 bytes launcher/qml/images/settings_active.png | Bin 0 -> 77571 bytes launcher/qml/images/settings_inactive.png | Bin 0 -> 4975 bytes launcher/qml/images/videoplayer_active.png | Bin 0 -> 72440 bytes launcher/qml/images/videoplayer_inactive.png | Bin 0 -> 3339 bytes launcher/qml/images/weather_active.png | Bin 0 -> 88254 bytes launcher/qml/images/weather_inactive.png | Bin 0 -> 21222 bytes launcher/qml/qml.qrc | 7 + launcher/src/appinfo.cpp | 177 ++++++++ launcher/src/appinfo.h | 69 +++ launcher/src/applicationlauncher.cpp | 85 ++++ launcher/src/applicationlauncher.h | 55 +++ launcher/src/applicationmodel.cpp | 171 ++++++++ launcher/src/applicationmodel.h | 43 ++ launcher/src/hmi-debug.h | 70 +++ launcher/src/main.cpp | 160 +++++++ package/config.xml | 18 + package/icon.svg | 279 ++++++++++++ package/package.pro | 22 + 64 files changed, 2708 insertions(+) create mode 100644 .gitignore create mode 100644 .gitreview create mode 100644 LICENSE create mode 100644 README.md create mode 100644 interfaces/README.md create mode 100644 interfaces/afm_user_daemon.xml create mode 100644 interfaces/appframework.xml create mode 100644 interfaces/include/afm_user_daemon.hpp create mode 100644 interfaces/include/appframework.hpp create mode 100644 interfaces/interfaces.pri create mode 100644 interfaces/interfaces.pro create mode 100644 interfaces/src/appframework.cpp create mode 100644 launcher.pro create mode 100644 launcher/README.md create mode 100644 launcher/launcher.pro create mode 100644 launcher/qml/ChangeItemPosition.js create mode 100644 launcher/qml/IconItem.qml create mode 100644 launcher/qml/Launcher.qml create mode 100644 launcher/qml/images/blank_active.png create mode 100644 launcher/qml/images/blank_inactive.png create mode 100644 launcher/qml/images/browser_active.png create mode 100644 launcher/qml/images/browser_inactive.png create mode 100644 launcher/qml/images/center_background.png create mode 100644 launcher/qml/images/connectivity_active.png create mode 100644 launcher/qml/images/connectivity_inactive.png create mode 100644 launcher/qml/images/dashboard_meter_active.png create mode 100644 launcher/qml/images/dashboard_meter_inactive.png create mode 100644 launcher/qml/images/gtf_launcher_active.png create mode 100644 launcher/qml/images/gtf_launcher_inactive.png create mode 100644 launcher/qml/images/hvac_active.png create mode 100644 launcher/qml/images/hvac_inactive.png create mode 100644 launcher/qml/images/images.qrc create mode 100644 launcher/qml/images/mediaplayer_active.png create mode 100644 launcher/qml/images/mediaplayer_inactive.png create mode 100644 launcher/qml/images/mixer_active.png create mode 100644 launcher/qml/images/mixer_inactive.png create mode 100644 launcher/qml/images/music_active.png create mode 100644 launcher/qml/images/music_inactive.png create mode 100644 launcher/qml/images/navigation_active.png create mode 100644 launcher/qml/images/navigation_inactive.png create mode 100644 launcher/qml/images/phone_active.png create mode 100644 launcher/qml/images/phone_inactive.png create mode 100644 launcher/qml/images/poi_active.png create mode 100644 launcher/qml/images/poi_inactive.png create mode 100644 launcher/qml/images/radio_active.png create mode 100644 launcher/qml/images/radio_inactive.png create mode 100644 launcher/qml/images/settings_active.png create mode 100644 launcher/qml/images/settings_inactive.png create mode 100644 launcher/qml/images/videoplayer_active.png create mode 100644 launcher/qml/images/videoplayer_inactive.png create mode 100644 launcher/qml/images/weather_active.png create mode 100644 launcher/qml/images/weather_inactive.png create mode 100644 launcher/qml/qml.qrc create mode 100644 launcher/src/appinfo.cpp create mode 100644 launcher/src/appinfo.h create mode 100644 launcher/src/applicationlauncher.cpp create mode 100644 launcher/src/applicationlauncher.h create mode 100644 launcher/src/applicationmodel.cpp create mode 100644 launcher/src/applicationmodel.h create mode 100644 launcher/src/hmi-debug.h create mode 100644 launcher/src/main.cpp create mode 100644 package/config.xml create mode 100644 package/icon.svg create mode 100644 package/package.pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3285f1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +build +*.pro.user +app/config.tests +.vscode diff --git a/.gitreview b/.gitreview new file mode 100644 index 0000000..262b2fc --- /dev/null +++ b/.gitreview @@ -0,0 +1,5 @@ +[gerrit] +host=gerrit.automotivelinux.org +port=29418 +project=apps/demo3-launcher +defaultbranch=master diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b3201ab --- /dev/null +++ b/LICENSE @@ -0,0 +1,204 @@ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don`t include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..62b4130 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +**Install SDK** + +Install sdk following this URL from AGL website. +``` +http://docs.automotivelinux.org/docs/getting_started/en/dev/reference/setup-sdk-environment.html +``` + +**Download source code** + +Download launcher source code from AGL gerrit. +``` +$ git clone https://gerrit.automotivelinux.org/gerrit/apps/launcher +``` + +**Build launcher application** + +Source SDK envirment and make. +``` +$ source /xdt/sdk/environment-setup- +$ cd launcher +$ mkdir build +$ cd build +$ qmake .. +$ make +``` +**Install launcher wgt** + +``` +$ scp package/launcher.wgt root@ +$ ssh root@ +$ afm-util install launcher +``` + +Reboot target board and launcher application will start by default. diff --git a/interfaces/README.md b/interfaces/README.md new file mode 100644 index 0000000..4a80a6c --- /dev/null +++ b/interfaces/README.md @@ -0,0 +1,10 @@ +AGL launcher reference implementation + + +Build with QtCreator 3.5.1 + +AGL repo for source code: +https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/launcher + +AGL repo for bitbake recipe: +https://gerrit.automotivelinux.org/gerrit/apps/launcher diff --git a/interfaces/afm_user_daemon.xml b/interfaces/afm_user_daemon.xml new file mode 100644 index 0000000..17b7d63 --- /dev/null +++ b/interfaces/afm_user_daemon.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interfaces/appframework.xml b/interfaces/appframework.xml new file mode 100644 index 0000000..ebc5088 --- /dev/null +++ b/interfaces/appframework.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + diff --git a/interfaces/include/afm_user_daemon.hpp b/interfaces/include/afm_user_daemon.hpp new file mode 100644 index 0000000..b9a5321 --- /dev/null +++ b/interfaces/include/afm_user_daemon.hpp @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * + * 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 AFM_USER_DAEMON_HPP +#define AFM_USER_DAEMON_HPP + + +#endif // AFM_USER_DAEMON_HPP diff --git a/interfaces/include/appframework.hpp b/interfaces/include/appframework.hpp new file mode 100644 index 0000000..98ec317 --- /dev/null +++ b/interfaces/include/appframework.hpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * + * 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 APPFRAMEWORK_HPP +#define APPFRAMEWORK_HPP + +#include +#include + +class AppInfo +{ + Q_GADGET + Q_PROPERTY(QString id READ id) + Q_PROPERTY(QString version READ version) + Q_PROPERTY(int width READ width) + Q_PROPERTY(int height READ height) + Q_PROPERTY(QString name READ name) + Q_PROPERTY(QString description READ description) + Q_PROPERTY(QString shortname READ shortname) + Q_PROPERTY(QString author READ author) + Q_PROPERTY(QString iconPath READ iconPath) +public: + AppInfo(); + AppInfo(const AppInfo &other); + virtual ~AppInfo(); + AppInfo &operator =(const AppInfo &other); + void swap(AppInfo &other) { qSwap(d, other.d); } + + QString id() const; + QString version() const; + int width() const; + int height() const; + QString name() const; + QString description() const; + QString shortname() const; + QString author() const; + QString iconPath() const; + + void read(const QJsonObject &json); + + friend QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo); + friend const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo); + +private: + class Private; + QSharedDataPointer d; +}; + +Q_DECLARE_SHARED(AppInfo) +Q_DECLARE_METATYPE(AppInfo) +Q_DECLARE_METATYPE(QList) + +#endif // APPFRAMEWORK_HPP diff --git a/interfaces/interfaces.pri b/interfaces/interfaces.pri new file mode 100644 index 0000000..07b9e6a --- /dev/null +++ b/interfaces/interfaces.pri @@ -0,0 +1,18 @@ +# Copyright (C) 2016 The Qt Company Ltd. +# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH +# +# 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. + +INCLUDEPATH += $$PWD $$OUT_PWD/../interfaces/ + +LIBS += -L$$OUT_PWD/../interfaces/ -linterfaces diff --git a/interfaces/interfaces.pro b/interfaces/interfaces.pro new file mode 100644 index 0000000..281eeb8 --- /dev/null +++ b/interfaces/interfaces.pro @@ -0,0 +1,60 @@ +# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH +# +# 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. + +TEMPLATE = lib +TARGET = interfaces +QT = dbus +CONFIG += staticlib + +HEADERS += \ + include/appframework.hpp + +SOURCES += \ + src/appframework.cpp + +XMLSOURCES = \ + afm_user_daemon.xml \ + appframework.xml + +gen_adaptor_cpp.input = XMLSOURCES +gen_adaptor_cpp.commands = \ + qdbusxml2cpp -i include/${QMAKE_FILE_IN_BASE}.hpp -m -a ${QMAKE_FILE_IN_BASE}_adaptor ${QMAKE_FILE_IN}; \ + moc $$OUT_PWD/${QMAKE_FILE_IN_BASE}_adaptor.h -o $$OUT_PWD/${QMAKE_FILE_IN_BASE}_adaptor.moc +gen_adaptor_cpp.output = ${QMAKE_FILE_IN_BASE}_adaptor.cpp +gen_adaptor_cpp.variable_out = SOURCES +gen_adaptor_cpp.clean = ${QMAKE_FILE_IN_BASE}_adaptor.cpp + +gen_proxy_cpp.input = XMLSOURCES +gen_proxy_cpp.commands = \ + qdbusxml2cpp -i include/${QMAKE_FILE_IN_BASE}.hpp -m -p ${QMAKE_FILE_IN_BASE}_proxy ${QMAKE_FILE_IN}; \ + moc $$OUT_PWD/${QMAKE_FILE_IN_BASE}_proxy.h -o $$OUT_PWD/${QMAKE_FILE_IN_BASE}_proxy.moc +gen_proxy_cpp.output = ${QMAKE_FILE_IN_BASE}_proxy.cpp +gen_proxy_cpp.variable_out = SOURCES +gen_proxy_cpp.clean = ${QMAKE_FILE_IN_BASE}_proxy.cpp + +gen_adaptor_h.input = XMLSOURCES +gen_adaptor_h.commands = @echo Fake making the header for ${QMAKE_FILE_IN} +gen_adaptor_h.depends = ${QMAKE_FILE_IN_BASE}_adaptor.cpp +gen_adaptor_h.output = ${QMAKE_FILE_IN_BASE}_adaptor.h +gen_adaptor_h.clean = ${QMAKE_FILE_IN_BASE}_adaptor.h + +gen_proxy_h.input = XMLSOURCES +gen_proxy_h.commands = @echo Fake making the header for ${QMAKE_FILE_IN} +gen_proxy_h.depends = ${QMAKE_FILE_IN_BASE}_proxy.cpp +gen_proxy_h.output = ${QMAKE_FILE_IN_BASE}_proxy.h +gen_proxy_h.clean = ${QMAKE_FILE_IN_BASE}_proxy.h + +QMAKE_EXTRA_COMPILERS += gen_adaptor_cpp gen_proxy_cpp gen_adaptor_h gen_proxy_h + +DISTFILES += diff --git a/interfaces/src/appframework.cpp b/interfaces/src/appframework.cpp new file mode 100644 index 0000000..7420642 --- /dev/null +++ b/interfaces/src/appframework.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * + * 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/appframework.hpp" + +#include + +class AppInfo::Private : public QSharedData +{ +public: + Private(); + Private(const Private &other); + + QString id; + QString version; + int width; + int height; + QString name; + QString description; + QString shortname; + QString author; + QString iconPath; +}; + +AppInfo::Private::Private() + : width(-1) + , height(-1) +{ +} + +AppInfo::Private::Private(const Private &other) + : QSharedData(other) + , id(other.id) + , version(other.version) + , width(other.width) + , height(other.height) + , name(other.name) + , description(other.description) + , shortname(other.shortname) + , author(other.author) + , iconPath(other.iconPath) +{ +} + +AppInfo::AppInfo() + : d(new Private) +{ +} + +AppInfo::AppInfo(const AppInfo &other) + : d(other.d) +{ +} + +AppInfo::~AppInfo() +{ +} + +AppInfo &AppInfo::operator =(const AppInfo &other) +{ + d = other.d; + return *this; +} + +QString AppInfo::id() const +{ + return d->id; +} + +QString AppInfo::version() const +{ + return d->version; +} + +int AppInfo::width() const +{ + return d->width; +} + +int AppInfo::height() const +{ + return d->height; +} + +QString AppInfo::name() const +{ + return d->name; +} + +QString AppInfo::description() const +{ + return d->description; +} + +QString AppInfo::shortname() const +{ + return d->shortname; +} + +QString AppInfo::author() const +{ + return d->author; +} + +QString AppInfo::iconPath() const +{ + return d->iconPath; +} + +void AppInfo::read(const QJsonObject &json) +{ + d->id = json["id"].toString(); + d->version = json["version"].toString(); + d->width = json["width"].toInt(); + d->height = json["height"].toInt(); + d->name = json["name"].toString(); + d->description = json["description"].toString(); + d->shortname = json["shortname"].toString(); + d->author = json["author"].toString(); + d->iconPath = json["iconPath"].toString(); +} + +QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo) +{ + argument.beginStructure(); + argument << appInfo.d->id; + argument << appInfo.d->version; + argument << appInfo.d->width; + argument << appInfo.d->height; + argument << appInfo.d->name; + argument << appInfo.d->description; + argument << appInfo.d->shortname; + argument << appInfo.d->author; + argument << appInfo.d->iconPath; + argument.endStructure(); + + return argument; +} + +const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo) +{ + argument.beginStructure(); + argument >> appInfo.d->id; + argument >> appInfo.d->version; + argument >> appInfo.d->width; + argument >> appInfo.d->height; + argument >> appInfo.d->name; + argument >> appInfo.d->description; + argument >> appInfo.d->shortname; + argument >> appInfo.d->author; + argument >> appInfo.d->iconPath; + argument.endStructure(); + return argument; +} diff --git a/launcher.pro b/launcher.pro new file mode 100644 index 0000000..419a70a --- /dev/null +++ b/launcher.pro @@ -0,0 +1,24 @@ +# 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. + +TEMPLATE = subdirs + +load(configure) + +SUBDIRS = interfaces \ + launcher \ + package + +launcher.depends = interfaces +package.depends += launcher diff --git a/launcher/README.md b/launcher/README.md new file mode 100644 index 0000000..4a80a6c --- /dev/null +++ b/launcher/README.md @@ -0,0 +1,10 @@ +AGL launcher reference implementation + + +Build with QtCreator 3.5.1 + +AGL repo for source code: +https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/launcher + +AGL repo for bitbake recipe: +https://gerrit.automotivelinux.org/gerrit/apps/launcher diff --git a/launcher/launcher.pro b/launcher/launcher.pro new file mode 100644 index 0000000..cf36ae8 --- /dev/null +++ b/launcher/launcher.pro @@ -0,0 +1,41 @@ +# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH +# 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. + +TEMPLATE = app +TARGET = launcher +QT = qml quick dbus websockets +CONFIG += c++11 link_pkgconfig +DESTDIR = $${OUT_PWD}/../package/root/bin +PKGCONFIG += qlibwindowmanager qlibhomescreen + +include(../interfaces/interfaces.pri) + +SOURCES += \ + src/main.cpp \ + src/applicationmodel.cpp \ + src/appinfo.cpp \ + src/applicationlauncher.cpp + +HEADERS += \ + src/applicationlauncher.h \ + src/applicationmodel.h \ + src/appinfo.h + +OTHER_FILES += \ + README.md + +RESOURCES += \ + qml/images/images.qrc \ + qml/qml.qrc diff --git a/launcher/qml/ChangeItemPosition.js b/launcher/qml/ChangeItemPosition.js new file mode 100644 index 0000000..9fae07c --- /dev/null +++ b/launcher/qml/ChangeItemPosition.js @@ -0,0 +1,89 @@ +function next() { + repeater.currentItem += 1; + if (repeater.currentItem > repeater.count - 1) + { + repeater.currentItem = 0; + } + var count = 0; + + for (var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState -= 1; + if ( item.currentState < 1 ) + { + item.currentState = repeater.count; + } + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } +} + +function prev() { + repeater.currentItem -= 1; + if (repeater.currentItem < 0) + { + repeater.currentItem = repeater.count - 1; + } + var count = repeater.count; + for (var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState += 1; + if ( item.currentState > repeater.count ) + { + item.currentState = 1; + } + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } +} + +function move(pos, item) { + var distance = firstPox - pos; + if(distance > 200) { + next() + firstPox = pos + iconMoved = true + item.iconReleased() + } else if (distance < -200) { + prev() + firstPox = pos + iconMoved = true + item.iconReleased() + } +} + +function getCenterItem() { + var item; + for (var i = 0; i < repeater.count; i++) + { + item = repeater.itemAt(i) + if (item.state === "pos5" || item.state === "pos14") + return item + } +} diff --git a/launcher/qml/IconItem.qml b/launcher/qml/IconItem.qml new file mode 100644 index 0000000..342b539 --- /dev/null +++ b/launcher/qml/IconItem.qml @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * 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. + */ +import QtQuick 2.0 +import QtQuick.Controls 2.0 +import QtGraphicalEffects 1.0 +import "ChangeItemPosition.js" as Cip + +Item { + id: main + width: 300 + height: 300 + property string icon: model.icon + property int pid: -1 + property bool isBlank: false + property bool isPressing: false + + Timer { + id: launchTimer + interval: 650 + repeat: false + onTriggered: { + launchApp() + } + } + + Item { + id: container + width: main.width + height: main.height + MouseArea { + anchors.fill: parent + onClicked: { + if(main.state === "pos14") { + launchApp() + } else if(main.state === "pos4") { + Cip.prev() + launchTimer.start() + } else if(main.state === "pos3") { + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos2") { + Cip.prev() + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos1") { + Cip.prev() + Cip.prev() + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos6") { + Cip.next() + launchTimer.start() + } else if(main.state === "pos7") { + Cip.next() + Cip.next() + launchTimer.start() + } else if(main.state === "pos8") { + Cip.next() + Cip.next() + Cip.next() + launchTimer.start() + } else if(main.state === "pos9") { + Cip.next() + Cip.next() + Cip.next() + Cip.next() + launchTimer.start() + } + } + } + + Image { + id: item + anchors.fill: parent + source: './images/%1_active.png'.arg(model.icon) + property string initial: model.name.substring(0,1).toUpperCase() + property bool hasIcon: model.icon !== 'blank' + + Label { + style: Text.Outline + styleColor: 'white' + color: 'transparent' + font.pixelSize: 225 + anchors.centerIn: parent + anchors.verticalCenterOffset: -50 + text: item.initial + visible: item.hasIcon ? false : true + } + + Label { + id: name + anchors.bottom: item.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 20 + font.pixelSize: 25 + font.letterSpacing: 5 + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + color: "white" + text: qsTr(model.name.toUpperCase()) + } + + } + } + function iconPressed() { + item.source = './images/%1_inactive.png'.arg(model.icon) + } + function iconReleased() { + item.source = './images/%1_active.png'.arg(model.icon) + } + function launchApp() { + pid = launcher.launch(model.id) + if (1 < pid) { + } else { + console.warn("app cannot be launched!") + } + homescreenHandler.tapShortcut(model.name) + } +} diff --git a/launcher/qml/Launcher.qml b/launcher/qml/Launcher.qml new file mode 100644 index 0000000..605eba4 --- /dev/null +++ b/launcher/qml/Launcher.qml @@ -0,0 +1,516 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * 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. + */ +import QtQuick 2.6 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.0 +import AppModel 1.0 +import "ChangeItemPosition.js" as Cip + +ApplicationWindow { + id: root + width: 1920 + height: 720 + + property int pid: -1 + property int firstPox: -1 + property bool iconMoved: false + + Timer { + id: timer + interval: 650 + repeat: false + onTriggered: { + var centerItem = Cip.getCenterItem() + centerItem.state = "pos14" + centerImage.opacity = 1.0 + } + } + + Repeater { + id: repeater + model: ApplicationModel { id: applicationModel } + + property int currentItem + + IconItem { + id: rect1 + property int currentState: 1 + + width: 300 + height: 300 + anchors.topMargin: 230 + + smooth: true + + anchors.centerIn: parent + + Behavior on opacity { + NumberAnimation { duration: 200 } + } + + Behavior on z { + NumberAnimation { duration: 300 } + } + transform: [ + Rotation { + id: rotate + angle: 0 + origin.y: 150 + origin.x: 150 + axis { x: 0; y: 1; z: 0 } + Behavior on angle { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + }, + Translate { + id: trans + x: 0 + y: 0 + Behavior on x { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + Behavior on y { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + }, + Scale { + id: scale + origin.x: 150 + origin.y: 150 + xScale: 1 + yScale: 1 + Behavior on xScale { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + Behavior on yScale { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + } + ] + + states: [ + State { + name: "pos0" + PropertyChanges { + target: rotate + angle: 80 + } + PropertyChanges { + target: trans + x: -1050 + y: 270 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos1" + PropertyChanges { + target: rotate + angle: 75 + } + PropertyChanges { + target: trans + x: -700 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos2" + PropertyChanges { + target: rotate + angle: 60 + } + PropertyChanges { + target: trans + x: -820 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.79 + yScale: 0.79 + } + }, + State { + name: "pos3" + PropertyChanges { + target: rotate + angle: 40 + } + PropertyChanges { + target: trans + x: -780 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.55 + yScale: 0.55 + } + }, + State { + name: "pos4" + PropertyChanges { + target: rotate + angle: 15 + } + PropertyChanges { + target: trans + x: -470 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.45 + yScale: 0.45 + } + }, + State { + name: "pos5" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: 0 + } + PropertyChanges { + target: rect1 + z: 1 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.42 + yScale: 0.42 + } + }, + State { + name: "pos6" + PropertyChanges { + target: rotate + angle: -15 + } + PropertyChanges { + target: trans + x: 470 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.45 + yScale: 0.45 + } + }, + State { + name: "pos7" + PropertyChanges { + target: rotate + angle: -40 + } + PropertyChanges { + target: trans + x: 780 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.55 + yScale: 0.55 + } + }, + State { + name: "pos8" + PropertyChanges { + target: rotate + angle: -60 + } + PropertyChanges { + target: trans + x: 820 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.79 + yScale: 0.79 + } + }, + State { + name: "pos9" + PropertyChanges { + target: rotate + angle: -75 + } + PropertyChanges { + target: trans + x: 700 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos10" + PropertyChanges { + target: rotate + angle: -80 + } + PropertyChanges { + target: trans + x: 1050 + y: 270 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos11" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 1050 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos12" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos13" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: -1050 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos14" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: 0 + } + PropertyChanges { + target: rect1 + z: 1 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + } + ] + } + + } + Component.onCompleted: { + repeater.currentItem = 5; + var count = repeater.count; + for ( var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState = i + 1; + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState; + if ( item.currentState === 5 ) + item.state = "pos14"; + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } + } + + Image { + id: centerImage + source: './images/center_background.png' + height: 590 + width: 350 + anchors.centerIn: parent + opacity: 1.0 + } + + MouseArea { + anchors.fill: parent + propagateComposedEvents: true + z: 2 + + onPressed: { + firstPox = mouseX; + iconMoved = false; + centerImage.opacity = 0.0; + if(mouseX >= 800 && mouseX <= 1120) + { + var item = Cip.getCenterItem() + item.iconPressed() + } + } + + onReleased: { + timer.start() + if(mouseX >= 800 && mouseX <= 1120) + { + var item = Cip.getCenterItem() + item.iconReleased() + } + } + + onClicked: { + if (iconMoved) + { + mouse.accepted = true + } else { + mouse.accepted = false + } + } + + onPositionChanged: { + var item = Cip.getCenterItem() + Cip.move(mouseX, item) + } + } + +} diff --git a/launcher/qml/images/blank_active.png b/launcher/qml/images/blank_active.png new file mode 100644 index 0000000..e5a0dd4 Binary files /dev/null and b/launcher/qml/images/blank_active.png differ diff --git a/launcher/qml/images/blank_inactive.png b/launcher/qml/images/blank_inactive.png new file mode 100644 index 0000000..80b5198 Binary files /dev/null and b/launcher/qml/images/blank_inactive.png differ diff --git a/launcher/qml/images/browser_active.png b/launcher/qml/images/browser_active.png new file mode 100644 index 0000000..8ef350b Binary files /dev/null and b/launcher/qml/images/browser_active.png differ diff --git a/launcher/qml/images/browser_inactive.png b/launcher/qml/images/browser_inactive.png new file mode 100644 index 0000000..faeee45 Binary files /dev/null and b/launcher/qml/images/browser_inactive.png differ diff --git a/launcher/qml/images/center_background.png b/launcher/qml/images/center_background.png new file mode 100644 index 0000000..8e160f4 Binary files /dev/null and b/launcher/qml/images/center_background.png differ diff --git a/launcher/qml/images/connectivity_active.png b/launcher/qml/images/connectivity_active.png new file mode 100644 index 0000000..168b7fd Binary files /dev/null and b/launcher/qml/images/connectivity_active.png differ diff --git a/launcher/qml/images/connectivity_inactive.png b/launcher/qml/images/connectivity_inactive.png new file mode 100644 index 0000000..68f1ca0 Binary files /dev/null and b/launcher/qml/images/connectivity_inactive.png differ diff --git a/launcher/qml/images/dashboard_meter_active.png b/launcher/qml/images/dashboard_meter_active.png new file mode 100644 index 0000000..84b973b Binary files /dev/null and b/launcher/qml/images/dashboard_meter_active.png differ diff --git a/launcher/qml/images/dashboard_meter_inactive.png b/launcher/qml/images/dashboard_meter_inactive.png new file mode 100644 index 0000000..045658c Binary files /dev/null and b/launcher/qml/images/dashboard_meter_inactive.png differ diff --git a/launcher/qml/images/gtf_launcher_active.png b/launcher/qml/images/gtf_launcher_active.png new file mode 100644 index 0000000..fa39830 Binary files /dev/null and b/launcher/qml/images/gtf_launcher_active.png differ diff --git a/launcher/qml/images/gtf_launcher_inactive.png b/launcher/qml/images/gtf_launcher_inactive.png new file mode 100644 index 0000000..80b5198 Binary files /dev/null and b/launcher/qml/images/gtf_launcher_inactive.png differ diff --git a/launcher/qml/images/hvac_active.png b/launcher/qml/images/hvac_active.png new file mode 100644 index 0000000..9d4f6ac Binary files /dev/null and b/launcher/qml/images/hvac_active.png differ diff --git a/launcher/qml/images/hvac_inactive.png b/launcher/qml/images/hvac_inactive.png new file mode 100644 index 0000000..806d661 Binary files /dev/null and b/launcher/qml/images/hvac_inactive.png differ diff --git a/launcher/qml/images/images.qrc b/launcher/qml/images/images.qrc new file mode 100644 index 0000000..4f22483 --- /dev/null +++ b/launcher/qml/images/images.qrc @@ -0,0 +1,37 @@ + + + connectivity_active.png + connectivity_inactive.png + dashboard_meter_active.png + dashboard_meter_inactive.png + hvac_active.png + hvac_inactive.png + mixer_active.png + mixer_inactive.png + mediaplayer_active.png + mediaplayer_inactive.png + music_active.png + music_inactive.png + navigation_active.png + navigation_inactive.png + phone_active.png + phone_inactive.png + poi_active.png + poi_inactive.png + radio_active.png + radio_inactive.png + settings_active.png + settings_inactive.png + videoplayer_active.png + videoplayer_inactive.png + browser_active.png + browser_inactive.png + weather_active.png + weather_inactive.png + blank_active.png + blank_inactive.png + gtf_launcher_active.png + gtf_launcher_inactive.png + center_background.png + + diff --git a/launcher/qml/images/mediaplayer_active.png b/launcher/qml/images/mediaplayer_active.png new file mode 100644 index 0000000..140733a Binary files /dev/null and b/launcher/qml/images/mediaplayer_active.png differ diff --git a/launcher/qml/images/mediaplayer_inactive.png b/launcher/qml/images/mediaplayer_inactive.png new file mode 100644 index 0000000..38e6111 Binary files /dev/null and b/launcher/qml/images/mediaplayer_inactive.png differ diff --git a/launcher/qml/images/mixer_active.png b/launcher/qml/images/mixer_active.png new file mode 100644 index 0000000..ab0b9f3 Binary files /dev/null and b/launcher/qml/images/mixer_active.png differ diff --git a/launcher/qml/images/mixer_inactive.png b/launcher/qml/images/mixer_inactive.png new file mode 100644 index 0000000..e3872bb Binary files /dev/null and b/launcher/qml/images/mixer_inactive.png differ diff --git a/launcher/qml/images/music_active.png b/launcher/qml/images/music_active.png new file mode 100644 index 0000000..140733a Binary files /dev/null and b/launcher/qml/images/music_active.png differ diff --git a/launcher/qml/images/music_inactive.png b/launcher/qml/images/music_inactive.png new file mode 100644 index 0000000..38e6111 Binary files /dev/null and b/launcher/qml/images/music_inactive.png differ diff --git a/launcher/qml/images/navigation_active.png b/launcher/qml/images/navigation_active.png new file mode 100644 index 0000000..ae3f720 Binary files /dev/null and b/launcher/qml/images/navigation_active.png differ diff --git a/launcher/qml/images/navigation_inactive.png b/launcher/qml/images/navigation_inactive.png new file mode 100644 index 0000000..52530d6 Binary files /dev/null and b/launcher/qml/images/navigation_inactive.png differ diff --git a/launcher/qml/images/phone_active.png b/launcher/qml/images/phone_active.png new file mode 100644 index 0000000..8a10a92 Binary files /dev/null and b/launcher/qml/images/phone_active.png differ diff --git a/launcher/qml/images/phone_inactive.png b/launcher/qml/images/phone_inactive.png new file mode 100644 index 0000000..2b61477 Binary files /dev/null and b/launcher/qml/images/phone_inactive.png differ diff --git a/launcher/qml/images/poi_active.png b/launcher/qml/images/poi_active.png new file mode 100644 index 0000000..dcf799f Binary files /dev/null and b/launcher/qml/images/poi_active.png differ diff --git a/launcher/qml/images/poi_inactive.png b/launcher/qml/images/poi_inactive.png new file mode 100644 index 0000000..c0a4fd3 Binary files /dev/null and b/launcher/qml/images/poi_inactive.png differ diff --git a/launcher/qml/images/radio_active.png b/launcher/qml/images/radio_active.png new file mode 100644 index 0000000..411f94a Binary files /dev/null and b/launcher/qml/images/radio_active.png differ diff --git a/launcher/qml/images/radio_inactive.png b/launcher/qml/images/radio_inactive.png new file mode 100644 index 0000000..f8c2cc1 Binary files /dev/null and b/launcher/qml/images/radio_inactive.png differ diff --git a/launcher/qml/images/settings_active.png b/launcher/qml/images/settings_active.png new file mode 100644 index 0000000..e9bec82 Binary files /dev/null and b/launcher/qml/images/settings_active.png differ diff --git a/launcher/qml/images/settings_inactive.png b/launcher/qml/images/settings_inactive.png new file mode 100644 index 0000000..fc72f9d Binary files /dev/null and b/launcher/qml/images/settings_inactive.png differ diff --git a/launcher/qml/images/videoplayer_active.png b/launcher/qml/images/videoplayer_active.png new file mode 100644 index 0000000..69bd5bc Binary files /dev/null and b/launcher/qml/images/videoplayer_active.png differ diff --git a/launcher/qml/images/videoplayer_inactive.png b/launcher/qml/images/videoplayer_inactive.png new file mode 100644 index 0000000..99c44ff Binary files /dev/null and b/launcher/qml/images/videoplayer_inactive.png differ diff --git a/launcher/qml/images/weather_active.png b/launcher/qml/images/weather_active.png new file mode 100644 index 0000000..4ff7223 Binary files /dev/null and b/launcher/qml/images/weather_active.png differ diff --git a/launcher/qml/images/weather_inactive.png b/launcher/qml/images/weather_inactive.png new file mode 100644 index 0000000..d5a18b3 Binary files /dev/null and b/launcher/qml/images/weather_inactive.png differ diff --git a/launcher/qml/qml.qrc b/launcher/qml/qml.qrc new file mode 100644 index 0000000..0dfd6b1 --- /dev/null +++ b/launcher/qml/qml.qrc @@ -0,0 +1,7 @@ + + + Launcher.qml + IconItem.qml + ChangeItemPosition.js + + diff --git a/launcher/src/appinfo.cpp b/launcher/src/appinfo.cpp new file mode 100644 index 0000000..c8bb943 --- /dev/null +++ b/launcher/src/appinfo.cpp @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * Copyright (C) 2016 The Qt Company Ltd. + * 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 "appinfo.h" + +#include + +class AppInfo::Private : public QSharedData +{ +public: + Private(); + Private(const Private &other); + + QString id; + QString version; + int width; + int height; + QString name; + QString description; + QString shortname; + QString author; + QString iconPath; +}; + +AppInfo::Private::Private() + : width(-1) + , height(-1) +{ +} + +AppInfo::Private::Private(const Private &other) + : QSharedData(other) + , id(other.id) + , version(other.version) + , width(other.width) + , height(other.height) + , name(other.name) + , description(other.description) + , shortname(other.shortname) + , author(other.author) + , iconPath(other.iconPath) +{ +} + +AppInfo::AppInfo() + : d(new Private) +{ +} + +AppInfo::AppInfo(const QString &icon, const QString &name, const QString &id) + : d(new Private) +{ + d->iconPath = icon; + d->name = name; + d->id = id; +} + +AppInfo::AppInfo(const AppInfo &other) + : d(other.d) +{ +} + +AppInfo::~AppInfo() +{ +} + +AppInfo &AppInfo::operator =(const AppInfo &other) +{ + d = other.d; + return *this; +} + +QString AppInfo::id() const +{ + return d->id; +} + +QString AppInfo::version() const +{ + return d->version; +} + +int AppInfo::width() const +{ + return d->width; +} + +int AppInfo::height() const +{ + return d->height; +} + +QString AppInfo::name() const +{ + return d->name; +} + +QString AppInfo::description() const +{ + return d->description; +} + +QString AppInfo::shortname() const +{ + return d->shortname; +} + +QString AppInfo::author() const +{ + return d->author; +} + +QString AppInfo::iconPath() const +{ + return d->iconPath; +} + +void AppInfo::read(const QJsonObject &json) +{ + d->id = json["id"].toString(); + d->version = json["version"].toString(); + d->width = json["width"].toInt(); + d->height = json["height"].toInt(); + d->name = json["name"].toString(); + d->description = json["description"].toString(); + d->shortname = json["shortname"].toString(); + d->author = json["author"].toString(); + d->iconPath = json["iconPath"].toString(); +} + +QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo) +{ + argument.beginStructure(); + argument << appInfo.d->id; + argument << appInfo.d->version; + argument << appInfo.d->width; + argument << appInfo.d->height; + argument << appInfo.d->name; + argument << appInfo.d->description; + argument << appInfo.d->shortname; + argument << appInfo.d->author; + argument << appInfo.d->iconPath; + argument.endStructure(); + + return argument; +} + +const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo) +{ + argument.beginStructure(); + argument >> appInfo.d->id; + argument >> appInfo.d->version; + argument >> appInfo.d->width; + argument >> appInfo.d->height; + argument >> appInfo.d->name; + argument >> appInfo.d->description; + argument >> appInfo.d->shortname; + argument >> appInfo.d->author; + argument >> appInfo.d->iconPath; + argument.endStructure(); + return argument; +} diff --git a/launcher/src/appinfo.h b/launcher/src/appinfo.h new file mode 100644 index 0000000..b6beaa2 --- /dev/null +++ b/launcher/src/appinfo.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * Copyright (C) 2016 The Qt Company Ltd. + * 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 APPINFO_H +#define APPINFO_H + +#include +#include + +class AppInfo +{ + Q_GADGET + Q_PROPERTY(QString id READ id) + Q_PROPERTY(QString version READ version) + Q_PROPERTY(int width READ width) + Q_PROPERTY(int height READ height) + Q_PROPERTY(QString name READ name) + Q_PROPERTY(QString description READ description) + Q_PROPERTY(QString shortname READ shortname) + Q_PROPERTY(QString author READ author) + Q_PROPERTY(QString iconPath READ iconPath) +public: + AppInfo(); + AppInfo(const QString &icon, const QString &name, const QString &id); + AppInfo(const AppInfo &other); + virtual ~AppInfo(); + AppInfo &operator =(const AppInfo &other); + void swap(AppInfo &other) { qSwap(d, other.d); } + + QString id() const; + QString version() const; + int width() const; + int height() const; + QString name() const; + QString description() const; + QString shortname() const; + QString author() const; + QString iconPath() const; + + void read(const QJsonObject &json); + + friend QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo); + friend const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo); + +private: + class Private; + QSharedDataPointer d; +}; + +Q_DECLARE_SHARED(AppInfo) +Q_DECLARE_METATYPE(AppInfo) +Q_DECLARE_METATYPE(QList) + +#endif // APPINFO_H diff --git a/launcher/src/applicationlauncher.cpp b/launcher/src/applicationlauncher.cpp new file mode 100644 index 0000000..fe76b0c --- /dev/null +++ b/launcher/src/applicationlauncher.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * 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 "applicationlauncher.h" + +#include "afm_user_daemon_proxy.h" + +#include "hmi-debug.h" + +extern org::AGL::afm::user *afm_user_daemon_proxy; + +ApplicationLauncher::ApplicationLauncher(QObject *parent) + : QObject(parent) + , m_launching(false) + , m_timeout(new QTimer(this)) +{ + m_timeout->setInterval(3000); + m_timeout->setSingleShot(true); + connect(m_timeout, &QTimer::timeout, [&]() { + setLaunching(false); + }); + connect(this, &ApplicationLauncher::launchingChanged, [&](bool launching) { + if (launching) + m_timeout->start(); + else + m_timeout->stop(); + }); + connect(this, &ApplicationLauncher::currentChanged, [&]() { + setLaunching(false); + }); +} + +int ApplicationLauncher::launch(const QString &application) +{ + int result = -1; + HMI_DEBUG("launch","ApplicationLauncher launch %s.", application.toStdString().c_str()); + + result = afm_user_daemon_proxy->start(application).value().toInt(); + HMI_DEBUG("launch","ApplicationLauncher pid: %d.", result); + + if (result > 1) { + setLaunching(true); + } + + return result; +} + +bool ApplicationLauncher::isLaunching() const +{ + return m_launching; +} + +void ApplicationLauncher::setLaunching(bool launching) +{ + if (m_launching == launching) return; + m_launching = launching; + launchingChanged(launching); +} + +QString ApplicationLauncher::current() const +{ + return m_current; +} + +void ApplicationLauncher::setCurrent(const QString ¤t) +{ + if (m_current == current) return; + m_current = current; + emit currentChanged(current); +} diff --git a/launcher/src/applicationlauncher.h b/launcher/src/applicationlauncher.h new file mode 100644 index 0000000..95b1dec --- /dev/null +++ b/launcher/src/applicationlauncher.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * 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 APPLICATIONLAUNCHER_H +#define APPLICATIONLAUNCHER_H + +#include + +class QTimer; + +class ApplicationLauncher : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool launching READ isLaunching NOTIFY launchingChanged) + Q_PROPERTY(QString current READ current WRITE setCurrent NOTIFY currentChanged) +public: + explicit ApplicationLauncher(QObject *parent = NULL); + + bool isLaunching() const; + QString current() const; + +signals: + void newAppRequestsToBeVisible(int pid); + void launchingChanged(bool launching); + void currentChanged(const QString ¤t); + +public slots: + int launch(const QString &application); + void setCurrent(const QString ¤t); + +private: + void setLaunching(bool launching); + +private: + bool m_launching; + QString m_current; + QTimer *m_timeout; +}; + +#endif // APPLICATIONLAUNCHER_H diff --git a/launcher/src/applicationmodel.cpp b/launcher/src/applicationmodel.cpp new file mode 100644 index 0000000..fe5e1c1 --- /dev/null +++ b/launcher/src/applicationmodel.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * 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 "applicationmodel.h" +#include "appinfo.h" + +#include "hmi-debug.h" + +#include +#include + +#include "afm_user_daemon_proxy.h" + +extern org::AGL::afm::user *afm_user_daemon_proxy; + +class ApplicationModel::Private +{ +public: + Private(); + int loadAppInfo(); + + QList data; +}; + +namespace { + QString get_icon_name(QJsonObject const &i) + { + QString icon = i["name"].toString().toLower(); + + if ( !QFile::exists(QString(":/images/%1_active.png").arg(icon)) || + !QFile::exists(QString(":/images/%1_inactive.png").arg(icon)) ) + { + icon = "blank"; + } + return icon; + } +} + +ApplicationModel::Private::Private() +{ + int appCount = 0; + while(appCount <= 22) + { + appCount += loadAppInfo(); + HMI_DEBUG("launcher", "appCount = %d", appCount); + } +} + +int ApplicationModel::Private::loadAppInfo() +{ + QString apps = afm_user_daemon_proxy->runnables(QStringLiteral("")); + QJsonDocument japps = QJsonDocument::fromJson(apps.toUtf8()); + int appCount = 0; + 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); + + // Hide HomeScreen icon itself + if (name != "launcher" && + name != "homescreen" && + name != "HomeScreen" && + !name.contains("OnScreen", Qt::CaseInsensitive)) { + this->data.append(AppInfo(icon, name, id)); + } + appCount++; + + HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str()); + } + return appCount; +} + +ApplicationModel::ApplicationModel(QObject *parent) + : QAbstractListModel(parent) + , d(new Private()) +{ +} + +ApplicationModel::~ApplicationModel() +{ + delete this->d; +} + +int ApplicationModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return this->d->data.count(); +} + +QVariant ApplicationModel::data(const QModelIndex &index, int role) const +{ + QVariant ret; + if (!index.isValid()) + return ret; + + switch (role) { + case Qt::DecorationRole: + ret = this->d->data[index.row()].iconPath(); + break; + case Qt::DisplayRole: + ret = this->d->data[index.row()].name(); + break; + case Qt::UserRole: + ret = this->d->data[index.row()].id(); + break; + default: + break; + } + + return ret; +} + +QHash ApplicationModel::roleNames() const +{ + QHash roles; + roles[Qt::DecorationRole] = "icon"; + roles[Qt::DisplayRole] = "name"; + roles[Qt::UserRole] = "id"; + return roles; +} + +QString ApplicationModel::id(int i) const +{ + return data(index(i), Qt::UserRole).toString(); +} + +QString ApplicationModel::name(int i) const +{ + return data(index(i), Qt::DisplayRole).toString(); +} + +void ApplicationModel::move(int from, int to) +{ + QModelIndex parent; + if (to < 0 || to > rowCount()) return; + if (from < to) { + if (!beginMoveRows(parent, from, from, parent, to + 1)) { + HMI_NOTICE("launcher","from : %d, to : %d. false.", from, to); + return; + } + d->data.move(from, to); + endMoveRows(); + } else if (from > to) { + if (!beginMoveRows(parent, from, from, parent, to)) { + HMI_NOTICE("launcher","from : %d, to : %d. false.", from, to); + return; + } + d->data.move(from, to); + endMoveRows(); + } else { + HMI_NOTICE("launcher","from : %d, to : %d. false.", from, to); + } +} diff --git a/launcher/src/applicationmodel.h b/launcher/src/applicationmodel.h new file mode 100644 index 0000000..5b7c6aa --- /dev/null +++ b/launcher/src/applicationmodel.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * 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 APPLICATIONMODEL_H +#define APPLICATIONMODEL_H + +#include + +class ApplicationModel : public QAbstractListModel +{ + Q_OBJECT +public: + explicit ApplicationModel(QObject *parent = nullptr); + ~ApplicationModel(); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + Q_INVOKABLE QString id(int index) const; + Q_INVOKABLE QString name(int index) const; + Q_INVOKABLE void move(int from, int to); + +private: + class Private; + Private *d; +}; + +#endif // APPLICATIONMODEL_H diff --git a/launcher/src/hmi-debug.h b/launcher/src/hmi-debug.h new file mode 100644 index 0000000..f637db3 --- /dev/null +++ b/launcher/src/hmi-debug.h @@ -0,0 +1,70 @@ +/* + * 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 __HMI_DEBUG_H__ +#define __HMI_DEBUG_H__ + +#include +#include +#include +#include +#include + +enum LOG_LEVEL{ + LOG_LEVEL_NONE = 0, + LOG_LEVEL_ERROR, + LOG_LEVEL_WARNING, + LOG_LEVEL_NOTICE, + LOG_LEVEL_INFO, + LOG_LEVEL_DEBUG, + LOG_LEVEL_MAX = LOG_LEVEL_DEBUG +}; + +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) + +#define HMI_ERROR(prefix, args,...) _HMI_LOG(LOG_LEVEL_ERROR, __FILENAME__, __FUNCTION__, __LINE__, prefix, args, ##__VA_ARGS__) +#define HMI_WARNING(prefix, args,...) _HMI_LOG(LOG_LEVEL_WARNING, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_NOTICE(prefix, args,...) _HMI_LOG(LOG_LEVEL_NOTICE, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_INFO(prefix, args,...) _HMI_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_DEBUG(prefix, args,...) _HMI_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) + +static char ERROR_FLAG[6][20] = {"NONE", "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"}; + +static void _HMI_LOG(enum LOG_LEVEL level, const char* file, const char* func, const int line, const char* prefix, const char* log, ...) +{ + const int log_level = (getenv("USE_HMI_DEBUG") == NULL)?LOG_LEVEL_ERROR:atoi(getenv("USE_HMI_DEBUG")); + if(log_level < level) + { + return; + } + + char *message; + struct timespec tp; + unsigned int time; + + clock_gettime(CLOCK_REALTIME, &tp); + time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000); + + va_list args; + va_start(args, log); + if (log == NULL || vasprintf(&message, log, args) < 0) + message = NULL; + fprintf(stderr, "[%10.3f] [%s %s] [%s, %s(), Line:%d] >>> %s \n", time / 1000.0, prefix, ERROR_FLAG[level], file, func, line, message); + va_end(args); + free(message); +} + +#endif //__HMI_DEBUG_H__ diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp new file mode 100644 index 0000000..d6a19d5 --- /dev/null +++ b/launcher/src/main.cpp @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * 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 +#include +#include +#include +#include +#include +#include + +#include +#include "applicationlauncher.h" +#include "applicationmodel.h" +#include "appinfo.h" +#include "afm_user_daemon_proxy.h" +#include "qlibhomescreen.h" +#include "hmi-debug.h" + +// XXX: We want this DBus connection to be shared across the different +// QML objects, is there another way to do this, a nice way, perhaps? +org::AGL::afm::user *afm_user_daemon_proxy; + +namespace { + +struct Cleanup { + static inline void cleanup(org::AGL::afm::user *p) { + delete p; + afm_user_daemon_proxy = Q_NULLPTR; + } +}; + +void noOutput(QtMsgType, const QMessageLogContext &, const QString &) +{ +} + +} + +int main(int argc, char *argv[]) +{ + QString myname = QString("launcher"); + QGuiApplication a(argc, argv); + + // use launch process + QScopedPointer afm_user_daemon_proxy(new org::AGL::afm::user("org.AGL.afm.user", + "/org/AGL/afm/user", + QDBusConnection::sessionBus(), + 0)); + ::afm_user_daemon_proxy = afm_user_daemon_proxy.data(); + + QCoreApplication::setOrganizationDomain("LinuxFoundation"); + QCoreApplication::setOrganizationName("AutomotiveGradeLinux"); + QCoreApplication::setApplicationName(myname); + QCoreApplication::setApplicationVersion("0.1.0"); + + QCommandLineParser parser; + parser.addPositionalArgument("port", a.translate("main", "port for binding")); + parser.addPositionalArgument("secret", a.translate("main", "secret for binding")); + parser.addHelpOption(); + parser.addVersionOption(); + parser.process(a); + QStringList positionalArguments = parser.positionalArguments(); + + int port = 1700; + QString token = "wm"; + + if (positionalArguments.length() == 2) { + port = positionalArguments.takeFirst().toInt(); + token = positionalArguments.takeFirst(); + } + + HMI_DEBUG("launcher","port = %d, token = %s", port, token.toStdString().c_str()); + + // import C++ class to QML + qmlRegisterType("AppModel", 1, 0, "ApplicationModel"); + + // DBus + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + + QLibHomeScreen* homescreenHandler = new QLibHomeScreen(); + ApplicationLauncher *launcher = new ApplicationLauncher(); + QLibWindowmanager* layoutHandler = new QLibWindowmanager(); + if(layoutHandler->init(port,token) != 0){ + exit(EXIT_FAILURE); + } + + if (layoutHandler->requestSurface(myname) != 0) { + exit(EXIT_FAILURE); + } + + layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, myname](json_object *object) { + layoutHandler->endDraw(myname); + }); + + layoutHandler->set_event_handler(QLibWindowmanager::Event_Visible, [layoutHandler, launcher](json_object *object) { + QString label = QString(json_object_get_string( json_object_object_get(object, "drawing_name") )); + qDebug() << label; + QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label == "HomeScreen" ? "Home" : label)); + }); + + layoutHandler->set_event_handler(QLibWindowmanager::Event_Invisible, [layoutHandler, launcher](json_object *object) { + const char* label = json_object_get_string( json_object_object_get(object, "drawing_name") ); + HMI_DEBUG("launch", "surface %s Event_Invisible", label); + }); + + QUrl bindingAddress; + bindingAddress.setScheme(QStringLiteral("ws")); + bindingAddress.setHost(QStringLiteral("localhost")); + bindingAddress.setPort(port); + bindingAddress.setPath(QStringLiteral("/api")); + + QUrlQuery query; + query.addQueryItem(QStringLiteral("token"), token); + bindingAddress.setQuery(query); + + const QByteArray hack_delay = qgetenv("HMI_LAUNCHER_STARTUP_DELAY"); + int delay_time = 1; + + if (!hack_delay.isEmpty()) { + delay_time = (QString::fromLocal8Bit(hack_delay)).toInt(); + } + + QThread::sleep(delay_time); + qDebug("Sleep %d sec to resolve race condtion between HomeScreen and Launcher", delay_time); + + // mail.qml loading + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("layoutHandler", layoutHandler); + engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler); + engine.rootContext()->setContextProperty("launcher", launcher); + engine.load(QUrl(QStringLiteral("qrc:/Launcher.qml"))); + + QObject *root = engine.rootObjects().first(); + QQuickWindow *window = qobject_cast(root); + QObject::connect(window, SIGNAL(frameSwapped()), layoutHandler, SLOT(slotActivateSurface())); + + homescreenHandler->init(port, token.toStdString().c_str()); + + homescreenHandler->set_event_handler(QLibHomeScreen::Event_TapShortcut, [layoutHandler, myname](json_object *object){ + layoutHandler->activateSurface(myname); + }); + + return a.exec(); +} diff --git a/package/config.xml b/package/config.xml new file mode 100644 index 0000000..62f99ed --- /dev/null +++ b/package/config.xml @@ -0,0 +1,18 @@ + + + launcher + + + This is a demo application for launcher + TOYOTA + APL 2.0 + + + + + + + + + + diff --git a/package/icon.svg b/package/icon.svg new file mode 100644 index 0000000..91661a7 --- /dev/null +++ b/package/icon.svg @@ -0,0 +1,279 @@ + + + +image/svg+xmlMULTIMEDIA + \ No newline at end of file diff --git a/package/package.pro b/package/package.pro new file mode 100644 index 0000000..0045478 --- /dev/null +++ b/package/package.pro @@ -0,0 +1,22 @@ +DISTFILES = icon.svg config.xml + +copy_icon.target = $$OUT_PWD/root/icon.svg +copy_icon.depends = $$_PRO_FILE_PWD_/icon.svg +copy_icon.commands = $(COPY_FILE) \"$$replace(copy_icon.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_icon.target, /, $$QMAKE_DIR_SEP)\" +QMAKE_EXTRA_TARGETS += copy_icon +PRE_TARGETDEPS += $$copy_icon.target + +copy_config.target = $$OUT_PWD/root/config.xml +copy_config.depends = $$_PRO_FILE_PWD_/config.xml +copy_config.commands = $(COPY_FILE) \"$$replace(copy_config.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_config.target, /, $$QMAKE_DIR_SEP)\" +QMAKE_EXTRA_TARGETS += copy_config +PRE_TARGETDEPS += $$copy_config.target + +wgt.target = package +wgt.commands = wgtpkg-pack -f -o launcher.wgt root + +QMAKE_EXTRA_TARGETS += wgt + +deploy.files = launcher.wgt +deploy.path = /usr/AGL/apps/autoinstall +INSTALLS += deploy -- cgit 1.2.3-korg