summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorMatt Ranostay <matt.ranostay@konsulko.com>2019-07-01 11:18:24 -0700
committerMatt Ranostay <matt.ranostay@konsulko.com>2019-07-09 14:08:34 -0700
commitd24a8a6bc4b1241d1057d78006da3c5dac454dd1 (patch)
treea2bbbab6b521d26e9e97f4fd323212d998f43c5f /app
parent7dff10809be5feeda6f81b942c8671cdda2e3a27 (diff)
Initial Messaging application that enables notifications of incoming SMS messages. Bug-AGL: SPEC-2566 Change-Id: If9a196536cf5aa4ce016d541c276b9750a9af48f Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Diffstat (limited to 'app')
-rw-r--r--app/Messaging.qml82
-rw-r--r--app/Messaging.qrc6
-rw-r--r--app/Notification.qml26
-rw-r--r--app/app.pri13
-rw-r--r--app/app.pro11
-rw-r--r--app/main.cpp101
6 files changed, 239 insertions, 0 deletions
diff --git a/app/Messaging.qml b/app/Messaging.qml
new file mode 100644
index 0000000..ec7c7c7
--- /dev/null
+++ b/app/Messaging.qml
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2019 Konsulko Group
+ *
+ * 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.3
+import QtQuick.Controls 2.0
+import AGL.Demo.Controls 1.0
+
+ApplicationWindow {
+ id: root
+
+ width: 1080 * container.scale
+ height: 1487 * container.scale
+
+ Connections {
+ target: messaging
+
+ onNotificationEvent: {
+ notificationModel.append({"name": message.sender.fn, "message": message.message })
+ notificationView.currentIndex = notificationModel.count - 1
+ }
+ }
+
+ ListModel {
+ id: notificationModel
+ }
+
+ Item {
+ id: container
+ width: 1080
+ height: 1487
+ scale: screenInfo.scale_factor()
+ anchors.centerIn: parent
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+
+ // ----- Childs
+ Label {
+ id: title
+ font.pixelSize: 48
+ text: "Notifications"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ ListView {
+ id: notificationView
+ model: notificationModel
+
+ anchors.margins: 50
+ anchors.top: title.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ spacing: 40
+
+ highlight: Rectangle {
+ color: "transparent"
+ radius: 5
+ border.color: "white"
+ border.width: 1
+ }
+ highlightFollowsCurrentItem: true
+
+ delegate: Notification { }
+ }
+ }
+}
diff --git a/app/Messaging.qrc b/app/Messaging.qrc
new file mode 100644
index 0000000..6c16a61
--- /dev/null
+++ b/app/Messaging.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>Messaging.qml</file>
+ <file>Notification.qml</file>
+ </qresource>
+</RCC>
diff --git a/app/Notification.qml b/app/Notification.qml
new file mode 100644
index 0000000..45c98f6
--- /dev/null
+++ b/app/Notification.qml
@@ -0,0 +1,26 @@
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Item {
+ height: msg.height
+ width: parent.width
+ Column {
+ id: msg
+ anchors.left: parent.left
+ anchors.right: parent.right
+ Label {
+ text: '<b>' + name + '</b>'
+ font.pixelSize: 42
+ wrapMode: Text.WordWrap
+ }
+ Label {
+ text: message
+ anchors.margins: 5
+ anchors.left: parent.left
+ anchors.right: parent.right
+ font.pixelSize: 32
+ wrapMode: Text.WordWrap
+ }
+ }
+}
diff --git a/app/app.pri b/app/app.pri
new file mode 100644
index 0000000..c3b1fd1
--- /dev/null
+++ b/app/app.pri
@@ -0,0 +1,13 @@
+TEMPLATE = app
+QMAKE_LFLAGS += "-Wl,--hash-style=gnu -Wl,--as-needed"
+
+load(configure)
+qtCompileTest(libhomescreen)
+
+config_libhomescreen {
+ CONFIG += link_pkgconfig
+ PKGCONFIG += homescreen
+ DEFINES += HAVE_LIBHOMESCREEN
+}
+
+DESTDIR = $${OUT_PWD}/../package/root/bin
diff --git a/app/app.pro b/app/app.pro
new file mode 100644
index 0000000..b64584b
--- /dev/null
+++ b/app/app.pro
@@ -0,0 +1,11 @@
+TARGET = messaging
+QT = quickcontrols2 websockets
+
+SOURCES = main.cpp
+
+CONFIG += link_pkgconfig
+PKGCONFIG += libhomescreen qlibwindowmanager qtappfw libafbwsc
+
+RESOURCES += Messaging.qrc
+
+include(app.pri)
diff --git a/app/main.cpp b/app/main.cpp
new file mode 100644
index 0000000..783d2f5
--- /dev/null
+++ b/app/main.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2019 Konsulko Group
+ *
+ * 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 <QtCore/QDebug>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QUrlQuery>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQuickControls2/QQuickStyle>
+#include <QQuickWindow>
+#include <libhomescreen.hpp>
+#include <qlibwindowmanager.h>
+
+#include <map.h>
+
+int main(int argc, char *argv[])
+{
+ QString graphic_role = QString("messaging");
+
+ QGuiApplication app(argc, argv);
+
+ QQuickStyle::setStyle("AGL");
+
+ QQmlApplicationEngine engine;
+
+ QCommandLineParser parser;
+ parser.addPositionalArgument("port", app.translate("main", "port for binding"));
+ parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.process(app);
+ QStringList positionalArguments = parser.positionalArguments();
+ if (positionalArguments.length() == 2) {
+ int port = positionalArguments.takeFirst().toInt();
+ QString secret = positionalArguments.takeFirst();
+ std::string token = secret.toStdString();
+ QUrl bindingAddress;
+ bindingAddress.setScheme(QStringLiteral("ws"));
+ bindingAddress.setHost(QStringLiteral("localhost"));
+ bindingAddress.setPort(port);
+ bindingAddress.setPath(QStringLiteral("/api"));
+ QUrlQuery query;
+ query.addQueryItem(QStringLiteral("token"), secret);
+ bindingAddress.setQuery(query);
+ QQmlContext *context = engine.rootContext();
+ context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
+ Map *map = new Map(bindingAddress, context);
+ context->setContextProperty("messaging", map);
+
+ LibHomeScreen* hs = new LibHomeScreen();
+ QLibWindowmanager* qwm = new QLibWindowmanager();
+
+ // WindowManager
+ if(qwm->init(port, secret) != 0){
+ exit(EXIT_FAILURE);
+ }
+
+ AGLScreenInfo screenInfo(qwm->get_scale_factor());
+
+ // Request a surface as described in layers.json windowmanager’s file
+ if (qwm->requestSurface(graphic_role) != 0) {
+ exit(EXIT_FAILURE);
+ }
+ // Create an event callback against an event type. Here a lambda is called when SyncDraw event occurs
+ qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm, graphic_role](json_object *object) {
+ Q_UNUSED(object);
+ qwm->endDraw(graphic_role);
+ });
+
+ // HomeScreen
+ hs->init(port, token.c_str());
+ // Set the event handler for Event_ShowWindow which will activate the surface for windowmanager
+ hs->set_event_handler(LibHomeScreen::Event_ShowWindow, [qwm, &graphic_role](json_object *object){
+ qDebug("Surface %s got showWindow\n", graphic_role.toStdString().c_str());
+ qwm->activateWindow(graphic_role);
+ });
+
+ engine.rootContext()->setContextProperty("screenInfo", &screenInfo);
+ engine.load(QUrl(QStringLiteral("qrc:/Messaging.qml")));
+ QObject *root = engine.rootObjects().first();
+ QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
+ QObject::connect(window, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateWindow()
+ ));
+ }
+ return app.exec();
+}