From 51c221923d1cb380051a6a8804bd0ef371f37b45 Mon Sep 17 00:00:00 2001 From: zheng_wenlong Date: Fri, 5 Apr 2019 19:45:14 +0900 Subject: Add demo3 homescreen source code Add demo3 homescreen source code [Patch Set 2]Update LICENSE file. Change-Id: I22768e87b2e440428cb38b84d52e152f50a4794e BUG-AGL: SPEC-2261 Signed-off-by: zheng_wenlong --- homescreen/src/applicationlauncher.cpp | 85 +++++++++++++++++ homescreen/src/applicationlauncher.h | 55 +++++++++++ homescreen/src/hmi-debug.h | 70 ++++++++++++++ homescreen/src/homescreenhandler.cpp | 154 +++++++++++++++++++++++++++++++ homescreen/src/homescreenhandler.h | 69 ++++++++++++++ homescreen/src/main.cpp | 163 +++++++++++++++++++++++++++++++++ homescreen/src/statusbarmodel.cpp | 148 ++++++++++++++++++++++++++++++ homescreen/src/statusbarmodel.h | 48 ++++++++++ homescreen/src/statusbarserver.cpp | 92 +++++++++++++++++++ homescreen/src/statusbarserver.h | 53 +++++++++++ homescreen/src/toucharea.cpp | 49 ++++++++++ homescreen/src/toucharea.h | 46 ++++++++++ 12 files changed, 1032 insertions(+) create mode 100644 homescreen/src/applicationlauncher.cpp create mode 100644 homescreen/src/applicationlauncher.h create mode 100644 homescreen/src/hmi-debug.h create mode 100644 homescreen/src/homescreenhandler.cpp create mode 100644 homescreen/src/homescreenhandler.h create mode 100644 homescreen/src/main.cpp create mode 100644 homescreen/src/statusbarmodel.cpp create mode 100644 homescreen/src/statusbarmodel.h create mode 100644 homescreen/src/statusbarserver.cpp create mode 100644 homescreen/src/statusbarserver.h create mode 100644 homescreen/src/toucharea.cpp create mode 100644 homescreen/src/toucharea.h (limited to 'homescreen/src') diff --git a/homescreen/src/applicationlauncher.cpp b/homescreen/src/applicationlauncher.cpp new file mode 100644 index 0000000..2fa23fc --- /dev/null +++ b/homescreen/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) 2017-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("HomeScreen","ApplicationLauncher launch %s.", application.toStdString().c_str()); + + result = afm_user_daemon_proxy->start(application).value().toInt(); + HMI_DEBUG("HomeScreen","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/homescreen/src/applicationlauncher.h b/homescreen/src/applicationlauncher.h new file mode 100644 index 0000000..a2dc2d1 --- /dev/null +++ b/homescreen/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) 2017-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/homescreen/src/hmi-debug.h b/homescreen/src/hmi-debug.h new file mode 100644 index 0000000..0d01221 --- /dev/null +++ b/homescreen/src/hmi-debug.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017-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/homescreen/src/homescreenhandler.cpp b/homescreen/src/homescreenhandler.cpp new file mode 100644 index 0000000..250783c --- /dev/null +++ b/homescreen/src/homescreenhandler.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2017-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 "homescreenhandler.h" +#include +#include +#include +#include "hmi-debug.h" + +void* HomescreenHandler::myThis = 0; + +HomescreenHandler::HomescreenHandler(QObject *parent) : + QObject(parent), + mp_hs(NULL), mp_wm(NULL), m_role() +{ + +} + +HomescreenHandler::~HomescreenHandler() +{ + if (mp_hs != NULL) { + delete mp_hs; + } + if (mp_wm != NULL) { + delete mp_wm; + } +} + +void HomescreenHandler::init(const char* role, int port, const char *token) +{ + this->m_role = role; + + // LibWindowManager initialize + mp_wm = new LibWindowmanager(); + if(mp_wm->init(port,token) != 0){ + exit(EXIT_FAILURE); + } + + int surface = mp_wm->requestSurface(m_role.c_str()); + if (surface < 0) { + exit(EXIT_FAILURE); + } + std::string ivi_id = std::to_string(surface); + setenv("QT_IVI_SURFACE_ID", ivi_id.c_str(), true); + + // LibHomeScreen initialize + mp_hs = new LibHomeScreen(); + mp_hs->init(port, token); + + myThis = this; + + mp_hs->registerCallback(nullptr, HomescreenHandler::onRep_static); + + mp_hs->set_event_handler(LibHomeScreen::Event_OnScreenMessage, [this](json_object *object){ + const char *display_message = json_object_get_string( + json_object_object_get(object, "display_message")); + HMI_DEBUG("HomeScreen","set_event_handler Event_OnScreenMessage display_message = %s", display_message); + }); +} + +void HomescreenHandler::setWMHandler(WMHandler& h) { + h.on_sync_draw = [&](const char* role, const char* area, Rect r) { + this->mp_wm->endDraw(this->m_role.c_str()); + }; + mp_wm->setEventHandler(h); +} + +void HomescreenHandler::disconnect_frame_swapped(void) +{ + qDebug("Let's start homescreen"); + QObject::disconnect(this->loading); + mp_wm->activateWindow(m_role.c_str(), "fullscreen"); +} + +void HomescreenHandler::attach(QQmlApplicationEngine* engine) +{ + QQuickWindow *window = qobject_cast(engine->rootObjects().first()); + this->loading = QObject::connect(window, SIGNAL(frameSwapped()), this, SLOT(disconnect_frame_swapped())); +} + +void HomescreenHandler::changeLayout(int pattern) +{ + HMI_NOTICE("HomeScreen", "Pressed %d, %s", pattern, + (pattern == P_LEFT_METER_RIGHT_MAP) ? "left:meter, right:map": "left:map, right:meter"); + ChangeAreaReq req; + std::unordered_map map_list; + switch(pattern) { + case P_LEFT_METER_RIGHT_MAP: + map_list["split.main"] = Rect(0, 180, 1280, 720); + map_list["split.sub"] = Rect(1280, 180, 640, 720); + break; + case P_LEFT_MAP_RIGHT_METER: + map_list["split.main"] = Rect(640, 180, 1280, 720); + map_list["split.sub"] = Rect(0, 180, 640, 720); + break; + default: + break; + } + if(map_list.size() != 0) + { + req.setAreaReq(map_list); + HMI_NOTICE("Homescreen", "Change layout"); + mp_wm->changeAreaSize(req); + } +} + +void HomescreenHandler::tapShortcut(QString application_name) +{ + HMI_DEBUG("HomeScreen","tapShortcut %s", application_name.toStdString().c_str()); + mp_hs->tapShortcut(application_name.toStdString().c_str()); +} + +void HomescreenHandler::onRep_static(struct json_object* reply_contents) +{ + static_cast(HomescreenHandler::myThis)->onRep(reply_contents); +} + +void HomescreenHandler::onEv_static(const string& event, struct json_object* event_contents) +{ + static_cast(HomescreenHandler::myThis)->onEv(event, event_contents); +} + +void HomescreenHandler::onRep(struct json_object* reply_contents) +{ + const char* str = json_object_to_json_string(reply_contents); + HMI_DEBUG("HomeScreen","HomeScreen onReply %s", str); +} + +void HomescreenHandler::onEv(const string& event, struct json_object* event_contents) +{ + const char* str = json_object_to_json_string(event_contents); + HMI_DEBUG("HomeScreen","HomeScreen onEv %s, contents: %s", event.c_str(), str); + + if (event.compare("homescreen/on_screen_message") == 0) { + struct json_object *json_data = json_object_object_get(event_contents, "data"); + struct json_object *json_display_message = json_object_object_get(json_data, "display_message"); + const char* display_message = json_object_get_string(json_display_message); + + HMI_DEBUG("HomeScreen","display_message = %s", display_message); + } +} diff --git a/homescreen/src/homescreenhandler.h b/homescreen/src/homescreenhandler.h new file mode 100644 index 0000000..275b46c --- /dev/null +++ b/homescreen/src/homescreenhandler.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2017-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 QQmlApplicationEngine; + +class HomescreenHandler : public QObject +{ + Q_OBJECT +public: + enum CHANGE_LAYOUT_PATTERN { + P_LEFT_METER_RIGHT_MAP = 0, + P_LEFT_MAP_RIGHT_METER + }; + Q_ENUMS(CHANGE_LAYOUT_PATTERN) + explicit HomescreenHandler(QObject *parent = 0); + ~HomescreenHandler(); + + void init(const char* role, int port, const char* token); + void attach(QQmlApplicationEngine* engine); + void setWMHandler(WMHandler &handler); + + Q_INVOKABLE void tapShortcut(QString application_name); + Q_INVOKABLE void changeLayout(int pattern); + + void onRep(struct json_object* reply_contents); + void onEv(const string& event, struct json_object* event_contents); + + static void* myThis; + static void onRep_static(struct json_object* reply_contents); + static void onEv_static(const string& event, struct json_object* event_contents); + +signals: + void notification(QString id, QString icon, QString text); + void information(QString text); + +private Q_SLOTS: + void disconnect_frame_swapped(void); + +private: + LibHomeScreen *mp_hs; + LibWindowmanager *mp_wm; + std::string m_role; + QMetaObject::Connection loading; +}; + +#endif // HOMESCREENHANDLER_H diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp new file mode 100644 index 0000000..22c6bd5 --- /dev/null +++ b/homescreen/src/main.cpp @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * Copyright (c) 2017-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 +#include "applicationlauncher.h" +#include "statusbarmodel.h" +#include "afm_user_daemon_proxy.h" +#include "homescreenhandler.h" +#include "toucharea.h" +#include "hmi-debug.h" +#include + +// 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[]) +{ + QGuiApplication a(argc, argv); + const char* graphic_role = "homescreen"; + + // 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("HomeScreen"); + QCoreApplication::setApplicationVersion("0.7.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("HomeScreen","port = %d, token = %s", port, token.toStdString().c_str()); + + // import C++ class to QML + // qmlRegisterType("HomeScreen", 1, 0, "ApplicationLauncher"); + qmlRegisterType("HomeScreen", 1, 0, "StatusBarModel"); + + ApplicationLauncher *launcher = new ApplicationLauncher(); + HomescreenHandler* homescreenHandler = new HomescreenHandler(); + homescreenHandler->init(graphic_role, port, token.toStdString().c_str()); + + 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); + + TouchArea* touchArea = new TouchArea(); + + // mail.qml loading + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler); + engine.rootContext()->setContextProperty("touchArea", touchArea); + engine.rootContext()->setContextProperty("launcher", launcher); + engine.rootContext()->setContextProperty("weather", new Weather(bindingAddress)); + engine.rootContext()->setContextProperty("bluetooth", new Bluetooth(bindingAddress)); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + + QObject *root = engine.rootObjects().first(); + + WMHandler wmh; + wmh.on_screen_updated = [launcher, root](std::vector list) { + for(const auto& i : list) { + HMI_DEBUG("HomeScreen", "ids=%s", i.c_str()); + } + int arrLen = list.size(); + QString label = QString(""); + for( int idx = 0; idx < arrLen; idx++) + { + label = list[idx].c_str(); + HMI_DEBUG("HomeScreen","Event_ScreenUpdated application: %s.", label.toStdString().c_str()); + QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label)); + if(label == "launcher") { + QMetaObject::invokeMethod(root, "turnToNormal"); + } else { + QMetaObject::invokeMethod(root, "turnToFullscreen"); + } + if((arrLen == 1) && (QString("restriction") != label)) { + QMetaObject::invokeMethod(root, "disableSplitSwitchBtn"); + } else { + QMetaObject::invokeMethod(root, "enableSplitSwitchBtn"); + } + } + }; + homescreenHandler->setWMHandler(wmh); + homescreenHandler->attach(&engine); + + QQuickWindow *window = qobject_cast(root); + + touchArea->setWindow(window); + QThread* thread = new QThread; + touchArea->moveToThread(thread); + QObject::connect(thread, &QThread::started, touchArea, &TouchArea::init); + + thread->start(); + + QList sobjs = engine.rootObjects(); + StatusBarModel *statusBar = sobjs.first()->findChild("statusBar"); + statusBar->init(bindingAddress, engine.rootContext()); + + return a.exec(); +} diff --git a/homescreen/src/statusbarmodel.cpp b/homescreen/src/statusbarmodel.cpp new file mode 100644 index 0000000..ceb09ab --- /dev/null +++ b/homescreen/src/statusbarmodel.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (c) 2017-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 "statusbarmodel.h" +#include "statusbarserver.h" +#include +#include "hmi-debug.h" + +#include + +#include "network.h" + + +class StatusBarModel::Private +{ +public: + Private(StatusBarModel *parent); + +private: + StatusBarModel *q; +public: + StatusBarServer server; + QString iconList[StatusBarServer::SupportedCount]; + Network *network; +}; + +StatusBarModel::Private::Private(StatusBarModel *parent) + : q(parent) +{ + QDBusConnection dbus = QDBusConnection::sessionBus(); + dbus.registerObject("/StatusBar", &server); + dbus.registerService("org.agl.homescreen"); + connect(&server, &StatusBarServer::statusIconChanged, [&](int placeholderIndex, const QString &icon) { + if (placeholderIndex < 0 || StatusBarServer::SupportedCount <= placeholderIndex) return; + if (iconList[placeholderIndex] == icon) return; + iconList[placeholderIndex] = icon; + emit q->dataChanged(q->index(placeholderIndex), q->index(placeholderIndex)); + }); + for (int i = 0; i < StatusBarServer::SupportedCount; i++) { + iconList[i] = server.getStatusIcon(i); + } +} + +StatusBarModel::StatusBarModel(QObject *parent) + : QAbstractListModel(parent) + , d(new Private(this)) +{ +} + +StatusBarModel::~StatusBarModel() +{ + delete d; +} + +void StatusBarModel::init(QUrl &url, QQmlContext *context) +{ + HMI_DEBUG("HomeScreen", "StatusBarModel::init"); + d->network = new Network(url, context); + context->setContextProperty("network", d->network); + + QObject::connect(d->network, &Network::wifiConnectedChanged, this, &StatusBarModel::onWifiConnectedChanged); + QObject::connect(d->network, &Network::wifiEnabledChanged, this, &StatusBarModel::onWifiEnabledChanged); + QObject::connect(d->network, &Network::wifiStrengthChanged, this, &StatusBarModel::onWifiStrengthChanged); + + setWifiStatus(d->network->wifiConnected(), d->network->wifiEnabled(), d->network->wifiStrength()); +} + +void StatusBarModel::setWifiStatus(bool connected, bool enabled, int strength) +{ + HMI_DEBUG("HomeScreen", "StatusBarModel::setWifiStatus"); + if (enabled && connected) + if (strength < 30) + d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_1Bar-01.png")); + else if (strength < 50) + d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_2Bars-01.png")); + else if (strength < 70) + d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_3Bars-01.png")); + else + d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_Full-01.png")); + else + d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_NoBars-01.png")); +} + +void StatusBarModel::onWifiConnectedChanged(bool connected) +{ + setWifiStatus(connected, d->network->wifiEnabled(), d->network->wifiStrength()); +} + +void StatusBarModel::onWifiEnabledChanged(bool enabled) +{ + setWifiStatus(d->network->wifiConnected(), enabled, d->network->wifiStrength()); +} + +void StatusBarModel::onWifiStrengthChanged(int strength) +{ + qInfo() << "Strength changed: " << strength; + setWifiStatus(d->network->wifiConnected(), d->network->wifiEnabled(), strength); +} + +int StatusBarModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return StatusBarServer::SupportedCount - 1; +} + +QVariant StatusBarModel::data(const QModelIndex &index, int role) const +{ + QVariant ret; + if (!index.isValid()) + return ret; + + switch (role) { + case Qt::DisplayRole: + if (index.row() == 0) { + ret = d->iconList[StatusBarServer::StatusWifi]; + } else if (index.row() == 1) { + ret = d->iconList[StatusBarServer::StatusCellular]; + } + break; + default: + break; + } + + return ret; +} + +QHash StatusBarModel::roleNames() const +{ + QHash roles; + roles[Qt::DisplayRole] = "icon"; + return roles; +} diff --git a/homescreen/src/statusbarmodel.h b/homescreen/src/statusbarmodel.h new file mode 100644 index 0000000..0e3ba7b --- /dev/null +++ b/homescreen/src/statusbarmodel.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (c) 2017-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 STATUSBARMODEL_H +#define STATUSBARMODEL_H + +#include +#include + +class StatusBarModel : public QAbstractListModel +{ + Q_OBJECT +public: + explicit StatusBarModel(QObject *parent = NULL); + ~StatusBarModel(); + + void init(QUrl &url, QQmlContext *context); + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + + // slots + void onWifiConnectedChanged(bool connected); + void onWifiEnabledChanged(bool enabled); + void onWifiStrengthChanged(int strength); + +private: + class Private; + Private *d; + void setWifiStatus(bool connected, bool enabled, int strength); +}; + +#endif // STATUSBARMODEL_H diff --git a/homescreen/src/statusbarserver.cpp b/homescreen/src/statusbarserver.cpp new file mode 100644 index 0000000..1387f79 --- /dev/null +++ b/homescreen/src/statusbarserver.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH + * Copyright (c) 2017-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 "statusbarserver.h" +#include "statusbar_adaptor.h" + +class StatusBarServer::Private +{ +public: + Private(StatusBarServer *parent); + QString texts[SupportedCount]; + QString icons[SupportedCount]; + StatusbarAdaptor adaptor; +}; + +StatusBarServer::Private::Private(StatusBarServer *parent) + : adaptor(parent) +{ + icons[0] = QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_NoBars-01.png"); + icons[1] = QStringLiteral("qrc:/images/Status/HMI_Status_Bluetooth_Inactive-01.png"); + icons[2] = QStringLiteral("qrc:/images/Status/HMI_Status_Signal_NoBars-01.png"); +} + +StatusBarServer::StatusBarServer(QObject *parent) + : QObject(parent) + , d(new Private(this)) +{ +} + +StatusBarServer::~StatusBarServer() +{ + delete d; +} + +QList StatusBarServer::getAvailablePlaceholders() const +{ + QList ret; + for (int i = 0; i < SupportedCount; ++i) { + ret.append(i); + } + return ret; +} + +QString StatusBarServer::getStatusIcon(int placeholderIndex) const +{ + QString ret; + if (-1 < placeholderIndex && placeholderIndex < SupportedCount) + ret = d->icons[placeholderIndex]; + return ret; +} + +void StatusBarServer::setStatusIcon(int placeholderIndex, const QString &icon) +{ + if (-1 < placeholderIndex && placeholderIndex < SupportedCount) { + if (d->icons[placeholderIndex] == icon) return; + d->icons[placeholderIndex] = icon; + emit statusIconChanged(placeholderIndex, icon); + } +} + +QString StatusBarServer::getStatusText(int placeholderIndex) const +{ + QString ret; + if (-1 < placeholderIndex && placeholderIndex < SupportedCount) { + ret = d->texts[placeholderIndex]; + } + return ret; +} + +void StatusBarServer::setStatusText(int placeholderIndex, const QString &text) +{ + if (-1 < placeholderIndex && placeholderIndex < SupportedCount) { + if (d->texts[placeholderIndex] == text) return; + d->texts[placeholderIndex] = text; + emit statusTextChanged(placeholderIndex, text); + } +} diff --git a/homescreen/src/statusbarserver.h b/homescreen/src/statusbarserver.h new file mode 100644 index 0000000..fa939cf --- /dev/null +++ b/homescreen/src/statusbarserver.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 The Qt Company Ltd. + * Copyright (c) 2017-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 STATUSBARSERVER_H +#define STATUSBARSERVER_H + +#include + +class StatusBarServer : public QObject +{ + Q_OBJECT +public: + enum { + StatusWifi = 0, + StatusBluetooth = 1, + StatusCellular = 2, + SupportedCount = 3, + }; + explicit StatusBarServer(QObject *parent = NULL); + ~StatusBarServer(); + + Q_INVOKABLE QList getAvailablePlaceholders() const; + Q_INVOKABLE QString getStatusIcon(int placeholderIndex) const; + Q_INVOKABLE QString getStatusText(int placeholderIndex) const; + +public slots: + void setStatusIcon(int placeholderIndex, const QString &icon); + void setStatusText(int placeholderIndex, const QString &text); + +signals: + void statusIconChanged(int placeholderIndex, const QString &icon); + void statusTextChanged(int placeholderIndex, const QString &text); + +private: + class Private; + Private *d; +}; + +#endif // STATUSBARSERVER_H diff --git a/homescreen/src/toucharea.cpp b/homescreen/src/toucharea.cpp new file mode 100644 index 0000000..05a48c7 --- /dev/null +++ b/homescreen/src/toucharea.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017-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 "toucharea.h" + +TouchArea::TouchArea() +{ +} + +TouchArea::~TouchArea() +{ + +} + +void TouchArea::setWindow(QQuickWindow *window) +{ + myWindow = window; +} + +void TouchArea::init() +{ + bitmapNormal = QPixmap(":/images/menubar_normal_mask.png").createHeuristicMask(); + bitmapFullscreen = QPixmap(":/images/menubar_fullscreen_mask.png").createHeuristicMask(); + myWindow->setMask(QRegion(bitmapNormal)); +} + +void TouchArea::switchArea(int areaType) +{ + if(areaType == NORMAL) { + myWindow->setMask(QRegion(bitmapNormal)); + } else if (areaType == FULLSCREEN) { + myWindow->setMask(QRegion(bitmapFullscreen)); + } +} + + diff --git a/homescreen/src/toucharea.h b/homescreen/src/toucharea.h new file mode 100644 index 0000000..0b5c3bf --- /dev/null +++ b/homescreen/src/toucharea.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2017-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 TOUCHAREA_H +#define TOUCHAREA_H + +#include +#include + +enum { + NORMAL=0, + FULLSCREEN +}; + +class TouchArea : public QObject +{ + Q_OBJECT +public: + explicit TouchArea(); + ~TouchArea(); + + Q_INVOKABLE void switchArea(int areaType); + void setWindow(QQuickWindow* window); + +public slots: + void init(); + +private: + QBitmap bitmapNormal, bitmapFullscreen; + QQuickWindow* myWindow; +}; + +#endif // TOUCHAREA_H -- cgit 1.2.3-korg