diff options
59 files changed, 956 insertions, 48 deletions
diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro index 1ca59b6..07b6b15 100644 --- a/homescreen/homescreen.pro +++ b/homescreen/homescreen.pro @@ -14,7 +14,7 @@ TEMPLATE = app TARGET = HomeScreen -QT = qml quick dbus +QT = qml quick widgets dbus websockets CONFIG += c++11 include(../interfaces/interfaces.pri) @@ -23,6 +23,7 @@ SOURCES += \ src/main.cpp \ src/homescreencontrolinterface.cpp \ src/layouthandler.cpp \ + src/usermanagement.cpp \ src/applicationmodel.cpp \ src/appinfo.cpp \ src/statusbarmodel.cpp \ @@ -32,6 +33,7 @@ SOURCES += \ HEADERS += \ src/homescreencontrolinterface.h \ src/layouthandler.h \ + src/usermanagement.h \ src/statusbarmodel.h \ src/statusbarserver.h \ src/applicationlauncher.h \ diff --git a/homescreen/qml/Home.qml b/homescreen/qml/Home.qml index aa3a129..66d8b95 100644 --- a/homescreen/qml/Home.qml +++ b/homescreen/qml/Home.qml @@ -16,10 +16,17 @@ */ import QtQuick 2.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 import Home 1.0 Item { id: root + property int pid: -1 + signal languageChanged + signal disconnect Image { anchors.fill: parent @@ -27,8 +34,176 @@ Item { anchors.bottomMargin: -215 source: './images/AGL_HMI_Background_Car-01.png' } + Image { + id: sign90 + width: 200 + height: 200 + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 20 + source: './images/B14-90.png' + visible: false + } + Image { + id: flagLanguage + scale: 0.7 + anchors.left: parent.left + anchors.leftMargin: 20 + anchors.top: parent.top + anchors.topMargin: 10 + source: './images/us_flag.png' + visible: true + } + Image { + id: visa + sourceSize.width: 170 + anchors.right: parent.right + anchors.rightMargin: 20 + anchors.top: parent.top + anchors.topMargin: 20 + source: './images/visa.png' + visible: false + MouseArea { + anchors.fill: parent + onPressed: { + n1.target = visa + n1.start() + } + onReleased: { + n2.target = visa + n2.start() + } + } + Label { + id: cardNumber + anchors.top: parent.bottom + anchors.topMargin: 10 + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + color: "white" + text: "111" + font.pixelSize: 20 + font.family: "Roboto" + } + } + Image { + id: licence + sourceSize.width: 170 + anchors.right: visa.right + anchors.top: visa.bottom + anchors.topMargin: 50 + visible: false + MouseArea { + anchors.fill: parent + onPressed: { + n1.target = licence + n1.start() + } + onReleased: { + n2.target = licence + n2.start() + } + } - property int pid: -1 + } + NumberAnimation { + id: n1 + property: "sourceSize.width" + duration: 800 + to: parent.width * .8 + easing.type: Easing.InOutQuad + onStarted: target.z = 100 + } + NumberAnimation { + id: n2 + property: "sourceSize.width" + duration: 300 + to: 170 + easing.type: Easing.InOutQuad + onStopped: target.z = 0 + } + Item { + id: hello + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 40 + visible: true + Text { + id: helloText + anchors.centerIn: parent + color: 'white' + text: 'No Authenticated User' + font.pixelSize: 40 + font.family: 'Roboto' + SequentialAnimation on font.letterSpacing { + id: animation1 + loops: 1; + NumberAnimation { from: 0; to: 50; easing.type: Easing.InQuad; duration: 3000 } + running: false + onRunningChanged: { + if(running) { + hello.visible = true + } else { + helloText.opacity = 1 + helloText.font.letterSpacing = 0 + } + } + } + + SequentialAnimation on opacity { + id: animation2 + loops: 1; + running: false + NumberAnimation { from: 1; to: 0; duration: 2600 } + PauseAnimation { duration: 400 } + } + } + } + function showHello(helloString) { + helloText.text = helloString + animation1.running = true; + animation2.running = true; + } + + function showSign90(show, lang) { + sign90.visible = show + if(show) { + if(lang === 'fr') + sign90.source = './images/B14-90.png' + else + sign90.source = './images/B14-60.png' + } + } + + function showVisa(show, num) { + visa.visible = show + cardNumber.text = num + } + function showLicence(show, licenceImage) { + if(show) { + licence.source = licenceImage + licence.visible = true + } else { + licence.visible = false + } + } + + function changeFlag(flagImage) { + flagLanguage.source = flagImage + } + function setUser(type, auts) { + if(type === '') { + authorisations.visible = false + } else { + authorisations.visible = true + labelUserType.text = type + myModel.clear() + for (var i=0; i<auts.length; i++) { + if(auts[i] !== '') + myModel.append({"name": auts[i]}) + } + } + } GridView { anchors.centerIn: parent @@ -43,8 +218,26 @@ Item { width: 320 height: 320 Image { + id: appImage anchors.fill: parent source: './images/HMI_AppLauncher_%1_%2-01.png'.arg(model.icon).arg(pressed ? 'Active' : 'Inactive') + Label { + id: labelName + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + y: 257 + font.pixelSize: 32 + font.family: "Roboto" + color: "white" + text: '%1'.arg(model.name) + function myChangeLanguage() { + text = '%1'.arg(model.name) + appImage.source = './images/HMI_AppLauncher_%1_%2-01.png'.arg(model.icon).arg(pressed ? 'Active' : 'Inactive') + } + Component.onCompleted: { + root.languageChanged.connect(myChangeLanguage) + } + } } onClicked: { console.log("app is ", model.id) @@ -54,7 +247,7 @@ Item { applicationArea.visible = true appLauncherAreaLauncher.visible = false - layoutHandler.showAppLayer(pid) + layoutHandler.showAppLayer(model.id, pid) } else { console.warn("app cannot be launched!") @@ -62,4 +255,81 @@ Item { } } } + ListModel { + id: myModel + ListElement { + name: 'Install App' + } + ListElement { + name: 'Open Trunk' + } + ListElement { + name: 'Update Software' + } + ListElement { + name: 'View Online' + } + } + Item { + id: authorisations + anchors.fill: parent + visible: false + GridLayout { + id: gridAut + columns: 2 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.bottomMargin: 50 + anchors.leftMargin: 20 + Repeater { + model: myModel + Image { + source: './images/' + model.name + '.png' + width: sourceSize.width + height: sourceSize.height + visible: true + } + } + } + Label { + id: labelUserType + anchors.bottom: gridAut.top + anchors.bottomMargin: 10 + anchors.left: gridAut.left + color: "white" + text: "Owner" + font.pixelSize: 30 + font.family: "Roboto" + } + } + + Image { + id: logout + width: sourceSize.width + height: sourceSize.height + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.bottomMargin: 10 + anchors.rightMargin: 20 + source: './images/Logout-01.png' + visible: true + MouseArea { + anchors.fill: parent + onClicked: { + rotateLogout.start() + disconnect() + helloText.text= 'No Authenticated User' + + } + } + RotationAnimator { + id: rotateLogout + target: logout; + from: 0; + to: 360; + loops: 1 + duration: 500 + running: false + } + } } diff --git a/homescreen/qml/MediaAreaBlank.qml b/homescreen/qml/MediaAreaBlank.qml index 0dde451..37ee8e1 100644 --- a/homescreen/qml/MediaAreaBlank.qml +++ b/homescreen/qml/MediaAreaBlank.qml @@ -23,7 +23,11 @@ Image { source: './images/Utility_Logo_Background-01.png' Image { + objectName: "Logo_colour" anchors.centerIn: parent source: './images/Utility_Logo_Colour-01.png' + function setImage(imagePath) { + source = imagePath + } } } diff --git a/homescreen/qml/ShortcutArea.qml b/homescreen/qml/ShortcutArea.qml index 9be3fd0..835504c 100644 --- a/homescreen/qml/ShortcutArea.qml +++ b/homescreen/qml/ShortcutArea.qml @@ -29,18 +29,53 @@ Item { ListElement { name: 'Home' application: '' + label: 'HOME' } ListElement { name: 'Multimedia' application: 'mediaplayer@0.1' + label: 'MULTIMEDIA' } ListElement { name: 'HVAC' application: 'hvac@0.1' + label: 'HVAC' } ListElement { name: 'Navigation' application: 'navigation@0.1' + label: 'NAVIGATION' + } + } + function languageChanged(lang) { + if(lang === "fr") { + applicationModel.setProperty(0, "label", 'ACCEUIL') + + applicationModel.setProperty(2, "label", 'MULTIMÉDIA') + applicationModel.setProperty(2, "name", 'Multimedia') + applicationModel.setProperty(2, "application", 'mediaplayer@0.1') + + applicationModel.setProperty(3, "label", 'CLIMATISATION') + applicationModel.setProperty(3, "name", 'HVAC') + applicationModel.setProperty(3, "application", 'hvac@0.1') + + applicationModel.setProperty(1, "label", 'NAVIGATION') + applicationModel.setProperty(1, "name", 'Navigation') + applicationModel.setProperty(1, "application", 'navigation@0.1') + } else { + applicationModel.setProperty(0, "label", 'HOME') + + applicationModel.setProperty(1, "label", 'MULTIMEDIA') + applicationModel.setProperty(1, "name", 'Multimedia') + applicationModel.setProperty(1, "application", 'mediaplayer@0.1') + + applicationModel.setProperty(2, "label", 'HVAC') + applicationModel.setProperty(2, "name", 'HVAC') + applicationModel.setProperty(2, "application", 'hvac@0.1') + + applicationModel.setProperty(3, "label", 'NAVIGATION') + applicationModel.setProperty(3, "name", 'Navigation') + applicationModel.setProperty(3, "application", 'navigation@0.1') } } @@ -79,4 +114,10 @@ Item { } } } + Component.onCompleted: { + appLauncherAreaLauncher.visible = true + applicationArea.visible = false + layoutHandler.hideAppLayer() + launcher.current = '' + } } diff --git a/homescreen/qml/ShortcutIcon.qml b/homescreen/qml/ShortcutIcon.qml index 6f8e05e..1891788 100644 --- a/homescreen/qml/ShortcutIcon.qml +++ b/homescreen/qml/ShortcutIcon.qml @@ -16,6 +16,7 @@ */ import QtQuick 2.2 +import QtQuick.Controls 1.0 MouseArea { id: root @@ -33,6 +34,16 @@ MouseArea { source: './images/Shortcut/HMI_Shortcut_%1_Active-01.png'.arg(root.name) opacity: 1.0 - icon.opacity } + Label { + id: labelName + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + y: 155 + font.pixelSize: 20 + font.family: "Roboto" + color: "white" + text: '%1'.arg(model.label) + } states: [ State { when: root.active diff --git a/homescreen/qml/StatusArea.qml b/homescreen/qml/StatusArea.qml index 3fc3079..e58305f 100644 --- a/homescreen/qml/StatusArea.qml +++ b/homescreen/qml/StatusArea.qml @@ -24,6 +24,62 @@ Item { id: root width: 295 height: 218 + function languageChanged(lang) { + if(lang === "fr") { + labelTime.text = Qt.formatTime(now, 'HH:mm').toUpperCase() + labelTemperature.text = '18°C' + switch(now.getDay()) { + case 1: + labelDay.text = 'LUNDI' + break + case 2: + labelDay.text = 'MARDI' + break + case 3: + labelDay.text = 'MERCREDI' + break + case 4: + labelDay.text = 'JEUDI' + break + case 5: + labelDay.text = 'VENDREDI' + break + case 6: + labelDay.text = 'SAMEDI' + break + case 7: + labelDay.text = 'DIMANCHE' + break + } + + } else { + labelTime.text = Qt.formatTime(now, 'h:mm ap').toUpperCase() + labelTemperature.text = '64°F' + switch(now.getDay()) { + case 1: + labelDay.text = 'MONDAY' + break + case 2: + labelDay.text = 'TUESDAY' + break + case 3: + labelDay.text = 'WEDNESDAY' + break + case 4: + labelDay.text = 'THURSDAY' + break + case 5: + labelDay.text = 'FRIDAY' + break + case 6: + labelDay.text = 'SATURDAY' + break + case 7: + labelDay.text = 'SUNDAY' + break + } + } + } property date now: new Date Timer { @@ -42,12 +98,14 @@ Item { anchors.fill: parent anchors.margins: 40 spacing: 0 - Text { + Label { + id: labelDay Layout.fillWidth: true Layout.fillHeight: true text: Qt.formatDate(now, 'dddd').toUpperCase() font.family: 'Roboto' - font.pixelSize: 13 +// font.pixelSize: 13 + font.pixelSize: 18 color: 'white' verticalAlignment: Text.AlignVCenter // Rectangle { @@ -59,7 +117,8 @@ Item { // z: -1 // } } - Text { + Label { + id: labelTime Layout.fillWidth: true Layout.fillHeight: true text: Qt.formatTime(now, 'h:mm ap').toUpperCase() @@ -76,7 +135,8 @@ Item { Image { source: './images/Weather/WeatherIcons_Rain-01.png' } - Text { + Label { + id: labelTemperature text: '64°F' color: 'white' font.family: 'Helvetica' @@ -84,6 +144,7 @@ Item { } } } + Component.onCompleted: root.languageChanged("en") } ColumnLayout { id: icons diff --git a/homescreen/qml/TopArea.qml b/homescreen/qml/TopArea.qml index 922742d..2d28e5e 100644 --- a/homescreen/qml/TopArea.qml +++ b/homescreen/qml/TopArea.qml @@ -29,12 +29,14 @@ Image { spacing: 0 ShortcutArea { id: shortcutArea + objectName: "ShortcutArea" Layout.fillWidth: true Layout.fillHeight: true Layout.preferredWidth: 785 } StatusArea { id: statusArea + objectName: "StatusArea" Layout.fillWidth: true Layout.fillHeight: true Layout.preferredWidth: 295 diff --git a/homescreen/qml/images/Home/B14-60.png b/homescreen/qml/images/Home/B14-60.png Binary files differnew file mode 100755 index 0000000..012c314 --- /dev/null +++ b/homescreen/qml/images/Home/B14-60.png diff --git a/homescreen/qml/images/Home/B14-90.png b/homescreen/qml/images/Home/B14-90.png Binary files differnew file mode 100755 index 0000000..155aea2 --- /dev/null +++ b/homescreen/qml/images/Home/B14-90.png diff --git a/homescreen/qml/images/Home/DL_Alain.png b/homescreen/qml/images/Home/DL_Alain.png Binary files differnew file mode 100755 index 0000000..04f15d3 --- /dev/null +++ b/homescreen/qml/images/Home/DL_Alain.png diff --git a/homescreen/qml/images/Home/DL_Olivier.png b/homescreen/qml/images/Home/DL_Olivier.png Binary files differnew file mode 100755 index 0000000..baf4f76 --- /dev/null +++ b/homescreen/qml/images/Home/DL_Olivier.png diff --git a/homescreen/qml/images/Home/DL_Philippe.png b/homescreen/qml/images/Home/DL_Philippe.png Binary files differnew file mode 100755 index 0000000..151342a --- /dev/null +++ b/homescreen/qml/images/Home/DL_Philippe.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Active-01.png Binary files differindex 888d0bd..b37a2d9 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Inactive-01.png Binary files differindex ab83b0e..c4b12a9 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Connectivity_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Active-01.png Binary files differindex 11d39e5..d1fba09 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Inactive-01.png Binary files differindex 6c0b914..138ebf7 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Dashboard_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Active-01.png Binary files differindex efc11e9..deeb402 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Inactive-01.png Binary files differindex b528376..92cd8a8 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_HVAC_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Active-01.png Binary files differindex 41c499d..303dbb1 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Inactive-01.png Binary files differindex 93f81af..df5816c 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Mixer_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Active-01.png Binary files differindex 1c99ac4..c1af827 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Inactive-01.png Binary files differindex 0bed61d..9a9c96a 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Multimedia_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Active-01.png Binary files differindex e7ad085..e5bae8b 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Inactive-01.png Binary files differindex dd40750..cc9cb1a 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Navigation_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_POI_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_POI_Active-01.png Binary files differindex 2df01d3..c52d5bb 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_POI_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_POI_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_POI_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_POI_Inactive-01.png Binary files differindex ec62b87..d55e5fb 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_POI_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_POI_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Active-01.png Binary files differindex 2150581..7a079e2 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Inactive-01.png Binary files differindex 61dcedc..0de908b 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Phone_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Active-01.png Binary files differindex 1aa5a01..8503ae2 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Inactive-01.png Binary files differindex 616983e..f8693c9 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Radio_Inactive-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Active-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Active-01.png Binary files differindex 1d13fd6..ff030ef 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Active-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Active-01.png diff --git a/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Inactive-01.png b/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Inactive-01.png Binary files differindex 027f1fe..15bdeb8 100644 --- a/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Inactive-01.png +++ b/homescreen/qml/images/Home/HMI_AppLauncher_Settings_Inactive-01.png diff --git a/homescreen/qml/images/Home/Install App.png b/homescreen/qml/images/Home/Install App.png Binary files differnew file mode 100755 index 0000000..17da664 --- /dev/null +++ b/homescreen/qml/images/Home/Install App.png diff --git a/homescreen/qml/images/Home/Logout-01.png b/homescreen/qml/images/Home/Logout-01.png Binary files differnew file mode 100755 index 0000000..5436ebc --- /dev/null +++ b/homescreen/qml/images/Home/Logout-01.png diff --git a/homescreen/qml/images/Home/Open Trunk.png b/homescreen/qml/images/Home/Open Trunk.png Binary files differnew file mode 100755 index 0000000..8fdb660 --- /dev/null +++ b/homescreen/qml/images/Home/Open Trunk.png diff --git a/homescreen/qml/images/Home/Update Software.png b/homescreen/qml/images/Home/Update Software.png Binary files differnew file mode 100755 index 0000000..dd107fd --- /dev/null +++ b/homescreen/qml/images/Home/Update Software.png diff --git a/homescreen/qml/images/Home/View Online.png b/homescreen/qml/images/Home/View Online.png Binary files differnew file mode 100755 index 0000000..d1fa287 --- /dev/null +++ b/homescreen/qml/images/Home/View Online.png diff --git a/homescreen/qml/images/Home/french_flag.png b/homescreen/qml/images/Home/french_flag.png Binary files differnew file mode 100755 index 0000000..948f828 --- /dev/null +++ b/homescreen/qml/images/Home/french_flag.png diff --git a/homescreen/qml/images/Home/home.qrc b/homescreen/qml/images/Home/home.qrc index e73633e..8d4ad7b 100644 --- a/homescreen/qml/images/Home/home.qrc +++ b/homescreen/qml/images/Home/home.qrc @@ -21,5 +21,18 @@ <file>HMI_AppLauncher_Radio_Inactive-01.png</file> <file>HMI_AppLauncher_Settings_Active-01.png</file> <file>HMI_AppLauncher_Settings_Inactive-01.png</file> + <file>visa.png</file> + <file>french_flag.png</file> + <file>us_flag.png</file> + <file>Logout-01.png</file> + <file>Update Software.png</file> + <file>Open Trunk.png</file> + <file>Install App.png</file> + <file>View Online.png</file> + <file>B14-60.png</file> + <file>B14-90.png</file> + <file>DL_Alain.png</file> + <file>DL_Olivier.png</file> + <file>DL_Philippe.png</file> </qresource> </RCC> diff --git a/homescreen/qml/images/Home/us_flag.png b/homescreen/qml/images/Home/us_flag.png Binary files differnew file mode 100755 index 0000000..a85592a --- /dev/null +++ b/homescreen/qml/images/Home/us_flag.png diff --git a/homescreen/qml/images/Home/visa.png b/homescreen/qml/images/Home/visa.png Binary files differnew file mode 100755 index 0000000..766f194 --- /dev/null +++ b/homescreen/qml/images/Home/visa.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC-01.png Binary files differindex f5188f5..221fe60 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC_Active-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC_Active-01.png Binary files differindex abe92d2..cbd625a 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC_Active-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_HVAC_Active-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Home-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Home-01.png Binary files differindex 9aca151..3685d4a 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Home-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Home-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Home_Active-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Home_Active-01.png Binary files differindex 696168f..4c64670 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Home_Active-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Home_Active-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia-01.png Binary files differindex 229860c..797d893 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia_Active-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia_Active-01.png Binary files differindex b0a023c..3d831bf 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia_Active-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Multimedia_Active-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation-01.png Binary files differindex 34b0671..a58534c 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation-01.png diff --git a/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation_Active-01.png b/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation_Active-01.png Binary files differindex 98e6146..99fbc23 100644 --- a/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation_Active-01.png +++ b/homescreen/qml/images/Shortcut/HMI_Shortcut_Navigation_Active-01.png diff --git a/homescreen/qml/images/Utility_Logo_Red-01.png b/homescreen/qml/images/Utility_Logo_Red-01.png Binary files differnew file mode 100644 index 0000000..8c49068 --- /dev/null +++ b/homescreen/qml/images/Utility_Logo_Red-01.png diff --git a/homescreen/qml/images/images.qrc b/homescreen/qml/images/images.qrc index 2d8e902..1323107 100644 --- a/homescreen/qml/images/images.qrc +++ b/homescreen/qml/images/images.qrc @@ -6,5 +6,6 @@ <file>Utility_Music_Background-01.png</file> <file>Utility_Radio_Background-01.png</file> <file>AGL_HMI_Background_NoCar-01.png</file> + <file>Utility_Logo_Red-01.png</file> </qresource> </RCC> diff --git a/homescreen/qml/main.qml b/homescreen/qml/main.qml index 11bd9d5..f14c80a 100644 --- a/homescreen/qml/main.qml +++ b/homescreen/qml/main.qml @@ -54,15 +54,16 @@ Window { Layout.fillHeight: true Layout.preferredHeight: 1920 - 218 - 215 - visible: false + visible: true } Home { id: appLauncherAreaLauncher + objectName: "Home" Layout.fillWidth: true Layout.fillHeight: true Layout.preferredHeight: 1920 - 218 - 215 - visible: true + visible: false } MediaArea { diff --git a/homescreen/src/appinfo.cpp b/homescreen/src/appinfo.cpp index fd9a585..0c90ff4 100644 --- a/homescreen/src/appinfo.cpp +++ b/homescreen/src/appinfo.cpp @@ -108,6 +108,10 @@ QString AppInfo::name() const { return d->name; } +void AppInfo::setName(const QString &name) +{ + d->name = name; +} QString AppInfo::description() const { diff --git a/homescreen/src/appinfo.h b/homescreen/src/appinfo.h index 0d98b10..c5faf11 100644 --- a/homescreen/src/appinfo.h +++ b/homescreen/src/appinfo.h @@ -56,6 +56,7 @@ public: friend QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo); friend const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo); + void setName(const QString &name); private: class Private; QSharedDataPointer<Private> d; diff --git a/homescreen/src/applicationmodel.cpp b/homescreen/src/applicationmodel.cpp index c43e1bc..6174b9b 100644 --- a/homescreen/src/applicationmodel.cpp +++ b/homescreen/src/applicationmodel.cpp @@ -18,61 +18,110 @@ #include "applicationmodel.h" #include "appinfo.h" -#include <QtCore/QDebug> - #include <QtDBus/QDBusInterface> #include <QtDBus/QDBusReply> -#include "afm_user_daemon_proxy.h" - -extern org::AGL::afm::user *afm_user_daemon_proxy; - class ApplicationModel::Private { public: - Private(); - + Private(ApplicationModel *parent); + QList<QList<int> > orders; + QList<AppInfo> originalData; +private: + ApplicationModel *q; +public: + QDBusInterface proxy; QList<AppInfo> data; }; -namespace { - QString get_icon_name(QJsonObject const &i) - { - QString icon = i["id"].toString().split("@").front(); - if (icon == "hvac" || icon == "poi") { - icon = icon.toUpper(); - } else if (icon == "mediaplayer") { - icon = "Multimedia"; - } else { - icon[0] = icon[0].toUpper(); - } - return icon; +ApplicationModel::Private::Private(ApplicationModel *parent) + : q(parent) + , proxy(QStringLiteral("org.agl.homescreenappframeworkbinder"), QStringLiteral("/AppFramework"), QStringLiteral("org.agl.appframework"), QDBusConnection::sessionBus()) +{ + QDBusReply<QList<AppInfo>> reply = proxy.call("getAvailableApps"); + if (false)/*reply.isValid()) TODO: test for CES! */ { + data = reply.value(); + } else { + data.append(AppInfo(QStringLiteral("HVAC"), QStringLiteral("HVAC"), QStringLiteral("hvac@0.1"))); + data.append(AppInfo(QStringLiteral("Navigation"), QStringLiteral("NAVIGATION"), QStringLiteral("navigation@0.1"))); + data.append(AppInfo(QStringLiteral("Phone"), QStringLiteral("PHONE"), QStringLiteral("phone@0.1"))); + data.append(AppInfo(QStringLiteral("Radio"), QStringLiteral("RADIO"), QStringLiteral("radio@0.1"))); + data.append(AppInfo(QStringLiteral("Multimedia"), QStringLiteral("MULTIMEDIA"), QStringLiteral("mediaplayer@0.1"))); + data.append(AppInfo(QStringLiteral("Mixer"), QStringLiteral("MIXER"), QStringLiteral("mixer@0.1"))); + data.append(AppInfo(QStringLiteral("Dashboard"), QStringLiteral("DASHBOARD"), QStringLiteral("dashboard@0.1"))); + data.append(AppInfo(QStringLiteral("Settings"), QStringLiteral("SETTINGS"), QStringLiteral("settings@0.1"))); + data.append(AppInfo(QStringLiteral("POI"), QStringLiteral("POINT OF\nINTEREST"), QStringLiteral("poi@0.1"))); } + originalData = data; + QList<int> o; + o << 5 << 4 << 3 << 7 << 8 << 0 << 2 << 1 << 6; + orders.append(o); + o.clear(); + o << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 ; + orders.append(o); + o.clear(); + o << 3 << 8 << 1 << 0 << 2 << 7 << 5 << 4 << 6; + orders.append(o); + o.clear(); + o << 2 << 7 << 3 << 8 << 4 << 0 << 1 << 5 << 6; + orders.append(o); + o.clear(); + o << 2 << 7 << 3 << 8 << 4 << 0 << 1 << 5 << 6; + orders.append(o); + o.clear(); + o << 6 << 0 << 2 << 1 << 7 << 3 << 5 << 4 << 8; + orders.append(o); } - -ApplicationModel::Private::Private() +void ApplicationModel::changeOrder(const int &hash) { - QString apps = afm_user_daemon_proxy->runnables(QStringLiteral("")); - QJsonDocument japps = QJsonDocument::fromJson(apps.toUtf8()); - for (auto const &app : japps.array()) { - QJsonObject const &jso = app.toObject(); - auto const name = jso["name"].toString(); - auto const id = jso["id"].toString(); - auto const icon = get_icon_name(jso); - this->data.append(AppInfo(icon, name, id)); - qDebug() << "name:" << name << "icon:" << icon << "id:" << id; + if(hash < 0) { + d->data = d->originalData; + return; + } + int order = qAbs(hash) % 7; + QList<int> o = d->orders.at(order); + QList<AppInfo> newData; + for(int i = 0; i < o.size(); ++i) { + newData.append(d->originalData.at(o.at(i))); + } + d->data = newData; +} + +void ApplicationModel::changeLanguage(const QString &lang) +{ //todo: use QT translator instead of hardcoded strings. + if(lang == "fr") { + d->originalData[0].setName("CLIMATISATION"); + d->originalData[1].setName("NAVIGATION"); + d->originalData[2].setName("TÉLÉPHONE"); + d->originalData[3].setName("RADIO"); + d->originalData[4].setName("MULTIMÉDIA"); + d->originalData[5].setName("MIXER"); + d->originalData[6].setName("TABLEAU DE\nBORD"); + d->originalData[7].setName("PARAMÈTRES"); + d->originalData[8].setName("POINT D'INTÉRÊT"); + } else { + d->originalData[0].setName("HVAC"); + d->originalData[1].setName("NAVIGATION"); + d->originalData[2].setName("PHONE"); + d->originalData[3].setName("RADIO"); + d->originalData[4].setName("MULTIMEDIA"); + d->originalData[5].setName("MIXER"); + d->originalData[6].setName("DASHBOARD"); + d->originalData[7].setName("SETTINGS"); + d->originalData[8].setName("POINT OF\nINTEREST"); } } ApplicationModel::ApplicationModel(QObject *parent) : QAbstractListModel(parent) - , d(new Private()) + , d(new Private(this)) { + setObjectName("ApplicationModel"); } ApplicationModel::~ApplicationModel() { - delete this->d; + delete d; } int ApplicationModel::rowCount(const QModelIndex &parent) const @@ -80,7 +129,7 @@ int ApplicationModel::rowCount(const QModelIndex &parent) const if (parent.isValid()) return 0; - return this->d->data.count(); + return d->data.count(); } QVariant ApplicationModel::data(const QModelIndex &index, int role) const @@ -91,13 +140,13 @@ QVariant ApplicationModel::data(const QModelIndex &index, int role) const switch (role) { case Qt::DecorationRole: - ret = this->d->data[index.row()].iconPath(); + ret = d->data[index.row()].iconPath(); break; case Qt::DisplayRole: - ret = this->d->data[index.row()].name(); + ret = d->data[index.row()].name(); break; case Qt::UserRole: - ret = this->d->data[index.row()].id(); + ret = d->data[index.row()].id(); break; default: break; diff --git a/homescreen/src/applicationmodel.h b/homescreen/src/applicationmodel.h index bffc4c9..1dc4d72 100644 --- a/homescreen/src/applicationmodel.h +++ b/homescreen/src/applicationmodel.h @@ -30,7 +30,8 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QHash<int, QByteArray> roleNames() const override; - + void changeLanguage(const QString &lang); + void changeOrder(const int &hash); private: class Private; Private *d; diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp index 28a8d38..641c38f 100644 --- a/homescreen/src/main.cpp +++ b/homescreen/src/main.cpp @@ -26,6 +26,7 @@ #include "applicationlauncher.h" #include "statusbarmodel.h" #include "applicationmodel.h" +#include "usermanagement.h" #include "appinfo.h" #include "afm_user_daemon_proxy.h" @@ -98,6 +99,7 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("layoutHandler", layoutHandler); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); - + UserManagement userManagement(engine.rootObjects().first()); + Q_UNUSED(userManagement); return a.exec(); } diff --git a/homescreen/src/usermanagement.cpp b/homescreen/src/usermanagement.cpp new file mode 100644 index 0000000..2537afc --- /dev/null +++ b/homescreen/src/usermanagement.cpp @@ -0,0 +1,354 @@ +#include "usermanagement.h" +#include <QDebug> +#include <QtCore/QJsonDocument> +#include <QByteArray> +UserManagement::UserManagement(QObject *root) : QObject() +{ + home = root->findChild<QObject *>("Home"); + QObject::connect(home, SIGNAL(disconnect()), + this, SLOT(slot_disconnect())); + logo = root->findChild<QObject *>("Logo_colour"); + shortcutArea = root->findChild<QObject *>("ShortcutArea"); + statusArea = root->findChild<QObject *>("StatusArea"); + this->appModel = home->findChild<ApplicationModel *>("ApplicationModel"); + sequence = 0; + isRed = false; + connect(&timerRed, SIGNAL(timeout()), this, SLOT(slot_turnOffRed())); + timerRed.setSingleShot(true); + timerRed.setInterval(3000); +#ifdef REAL_SERVER + connectWebsockets(); +#else + pSocket = NULL; + connect(&timerTest, SIGNAL(timeout()), this, SLOT(slot_timerTest())); + timerTest.setSingleShot(false); + timerTest.start(5000); + launchServer(); +#endif +} +void UserManagement::slot_disconnect() +{ + appModel->changeLanguage("us"); + appModel->changeOrder(-1); + timerRed.stop(); + slot_turnOffRed(); + QMetaObject::invokeMethod(home, "languageChanged"); + QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, "en")); + QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, "en")); + QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, false), Q_ARG(QVariant, "en")); + QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, "")); + QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, false), Q_ARG(QVariant, "")); + QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, "./images/us_flag.png")); + QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, ""), Q_ARG(QVariant, "")); + QVariantList list; + list << 2 << QString().setNum(++sequence) << "agl-identity-agent/logout" << true; + listToJson(list, &data); + slot_sendData(); +} + +void UserManagement::setUser(const User &user) +{ + int hash = qHash(user.name + user.first_name); + timerRed.stop(); + appModel->changeLanguage(user.graphPreferredLanguage); + appModel->changeOrder(hash); + slot_turnOffRed(); + QMetaObject::invokeMethod(home, "languageChanged"); + QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage)); + QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage)); + QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, !user.graphActions.contains("Exceed 90 Kph")), Q_ARG(QVariant, user.graphPreferredLanguage)); + QStringList t; + foreach(const QString &s, user.graphActions) { + if(!s.contains("Exceed")) + t.append(s); + } + QString type = user.policy; + if(user.graphPreferredLanguage == "fr") { + if(type == "Owner") + type = "Propriétaire"; + else if(type == "Driver") + type = "Conducteur"; + else if(type == "Maintainer") + type = "Maintenance"; + } + QMetaObject::invokeMethod(home, "setUser", Q_ARG(QVariant, type), Q_ARG(QVariant, QVariant::fromValue(t))); + if(user.ccNumberMasked.isEmpty()) + QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false), Q_ARG(QVariant, "")); + else + QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true), Q_ARG(QVariant, user.ccNumberMasked)); + const QString welcome = QString("%1").arg(user.graphPreferredLanguage == "fr" ? "Bonjour " : "Hello") + " "; + QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, welcome + user.first_name)); + QMetaObject::invokeMethod(home, "changeFlag", Q_ARG(QVariant, user.graphPreferredLanguage == "fr" ? "./images/french_flag.png" : "./images/us_flag.png")); + if(user.name.toLower() == "philippea") + QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Philippe.png")); + else if(user.name.toLower() == "alainp") + QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Alain.png")); + else if(user.name.toLower() == "olivierc") + QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, true), Q_ARG(QVariant, "./images/DL_Olivier.png")); + else + QMetaObject::invokeMethod(home, "showLicence", Q_ARG(QVariant, false), Q_ARG(QVariant, "")); + +} +void UserManagement::slot_turnOffRed() +{ + if(!isRed) + return; + QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Colour-01.png")); + isRed = false; +} + +void UserManagement::connectWebsockets() +{ +#ifdef REAL_SERVER + const QUrl url(REAL_SERVER); +#else + const QUrl url(QStringLiteral("ws://localhost:1234")); +#endif + QSslConfiguration config = QSslConfiguration::defaultConfiguration(); + config.setProtocol(QSsl::SecureProtocols); + webSocket.setSslConfiguration(config); + connect(&webSocket, &QWebSocket::connected, this, &UserManagement::onConnected); + connect(&webSocket, &QWebSocket::disconnected, this, &UserManagement::onClosed); + if(!connect(&webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError)))) { + qWarning() << "Failed to connect to QWebSocket::error"; + } + webSocket.open(QUrl(url)); +} +void UserManagement::onWebSocketError(QAbstractSocket::SocketError) +{ + qWarning()<<"Websocket error:" << webSocket.errorString(); +} + +void UserManagement::onConnected() +{ + connect(&webSocket, &QWebSocket::textMessageReceived, + this, &UserManagement::onTextMessageReceived); + QVariantList list; + QByteArray json; + list << 2 << QString().setNum(++sequence) << "agl-identity-agent/subscribe" << true; + listToJson(list, &json); + webSocket.sendTextMessage(QString(json)); + list .clear(); + list << 2 << QString().setNum(++sequence) << "agl-identity-agent/scan" << true; + listToJson(list, &json); + webSocket.sendTextMessage(QString(json)); +} +void UserManagement::onTextMessageReceived(QString message) +{ + QVariantList list; + const bool ok = jsonToList(message.toUtf8(), &list); + if(!ok || list.size() < 3) { + qWarning()<<"error 1 decoding json"<<list.size()<<message; + return; + } + QVariantMap map = list.at(2).toMap(); + if(list.first().toInt() == 5) { + if(!isRed) + QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Red-01.png")); + isRed = true; + timerRed.start(); + map = map["data"].toMap(); + if(map["eventName"].toString() == "login") { + //qWarning()<<"login received in client"; + list.clear(); + list << 2 << QString().setNum(++sequence) << "agl-identity-agent/get" << true; + listToJson(list, &data); + QTimer::singleShot(300, this, SLOT(slot_sendData())); + } + return; + } + if(list.first().toInt() == 3) { + if(!map.contains("response")) { + return; + } + map = map["response"].toMap(); + User user; + user.postal_address = map["postal_address"].toString(); + QStringList temp = map["loc"].toString().split(","); + if(temp.size() == 2) { + user.loc.setX(temp.at(0).toDouble()); + user.loc.setY(temp.at(1).toDouble()); + } + user.graphActions = map["graphActions"].toString().split(","); + user.country = map["country"].toString(); + user.mail = map["mail"].toString(); + user.city = map["city"].toString(); + user.graphEmail = map["graphEmail"].toString(); + user.graphPreferredLanguage = map["graphPreferredLanguage"].toString(); + user.ccNumberMasked = map["ccNumberMasked"].toString(); + user.ccExpYear = map["ccExpYear"].toString(); + user.ccExpMonth = map["ccExpMonth"].toString(); + user.description = map["description"].toString(); + user.groups = map["groups"].toStringList(); + user.last_name = map["last_name"].toString(); + user.ccNumber = map["ccNumber"].toString(); + user.house_identifier = map["house_identifier"].toString(); + user.phone = map["phone"].toString(); + user.name = map["name"].toString(); + user.state = map["state"].toString(); + user.common_name = map["common_name"].toString(); + user.fax = map["fax"].toString(); + user.postal_code = map["postal_code"].toString(); + user.first_name = map["first_name"].toString(); + user.keytoken = map["keytoken"].toString(); + user.policy = map["graphPolicies"].toString(); + setUser(user); + } +} +void UserManagement::slot_sendData() +{ + webSocket.sendTextMessage(QString(data)); +} + +void UserManagement::onClosed() +{ + qWarning()<<"webSocket closed"; +} +bool UserManagement::listToJson(const QList<QVariant> &list, QByteArray *json) const +{ + QVariant v(list); + *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact); + return true; +} +bool UserManagement::jsonToList(const QByteArray &buf, QList<QVariant> *list) const +{ + if(!list) + return false; + QJsonParseError err; + QVariant v = QJsonDocument::fromJson(buf, &err).toVariant(); + if(err.error != 0) { + qWarning() << "Error parsing json data" << err.errorString() << buf; + *list = QList<QVariant>(); + return false; + } + *list = v.toList(); + return true; +} +bool UserManagement::mapToJson( const QVariantMap &map, QByteArray *json) const +{ + if(!json) + return false; + QVariant v(map); + *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact); + return true; +} +bool UserManagement::jsonToMap(const QByteArray &buf, QVariantMap *map) const +{ + if(!map) + return false; + QJsonParseError err; + QVariant v = QJsonDocument::fromJson(buf, &err).toVariant(); + if(err.error != 0) { + qWarning() << "Error parsing json data" << err.errorString() << buf; + *map = QVariantMap(); + return false; + } + *map = v.toMap(); + return true; +} +#ifndef REAL_SERVER +void UserManagement::launchServer() +{ + webSocketServer = new QWebSocketServer(QStringLiteral("My Server"), + QWebSocketServer::NonSecureMode, this); + if(webSocketServer->listen(QHostAddress::Any, 1234)) { + connect(webSocketServer, &QWebSocketServer::newConnection, + this, &UserManagement::onServerNewConnection); + connect(webSocketServer, &QWebSocketServer::closed, this, &UserManagement::onServerClosed); + QTimer::singleShot(100, this, SLOT(connectWebsockets())); + } else { + qWarning()<<"unable to launch webSocket server"; + } +} +void UserManagement::onServerNewConnection() +{ + pSocket = webSocketServer->nextPendingConnection(); + connect(pSocket, &QWebSocket::textMessageReceived, this, &UserManagement::processTextMessage, Qt::UniqueConnection); + connect(pSocket, &QWebSocket::binaryMessageReceived, this, &UserManagement::processBinaryMessage, Qt::UniqueConnection); + connect(pSocket, &QWebSocket::disconnected, this, &UserManagement::serverSocketDisconnected, Qt::UniqueConnection); +} +void UserManagement::processTextMessage(QString message) +{ + QString clientDetails_1 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\",\"graphActions\":\"Install App,Update Software,Open Trunk,View Online\"" + ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":" + "\"bjensen@example.com\",\"graphPreferredLanguage\":\"en\",\"ccNumberMasked\":\"-111\",\"ccExpYear\"" + ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\"" + "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\"" + "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\"" + "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Barbara\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Driver\"}"; + QString clientDetails_2 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\"" + ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":" + "\"bjensen@example.com\",\"graphPreferredLanguage\":\"fr\",\"ccNumberMasked\":\"-222\",\"ccExpYear\"" + ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\"" + "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\"" + "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\"" + "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Philippe\",\"keytoken\":\"a123456\",\"graphPolicies\":\"Maintainer\"}"; + QString clientDetails = clientDetails_1; + if(sequence % 2 == 1) + clientDetails = clientDetails_2; + QWebSocket *pClient = qobject_cast<QWebSocket *>(sender()); + //qDebug() << "message received in server:" << message; + if (!pClient) + return; + QVariantList list; + if(!jsonToList(message.toUtf8(), &list)) + return; + if(list.size() < 2) + return; + const int messType = list.at(0).toInt(); + const QString messId = list.at(1).toString(); + const QString cmd = list.at(2).toString(); + list.clear(); + QString reply; + switch(messType) { + case 2: + if(cmd == "agl-identity-agent/subscribe") { + reply = "[3,\"999maitai999\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\",\"uuid\":\"1f2f7678-6f2e-4f54-b7b5-d0d4dcbf2e41\"}}]"; + } else if (cmd == "agl-identity-agent/get") { + reply = "[3,\"999maitai99\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\"},\"response\":....}]"; + reply = reply.replace("....", clientDetails); + } else { + qWarning()<<"invalid cmd received:"<<cmd; + return; + } + break; + default: + qWarning()<<"invalid message type"<<messType; + return; + break; + } + reply = reply.replace("999maitai999", messId); + pClient->sendTextMessage(reply); +} +void UserManagement::processBinaryMessage(QByteArray message) +{ + QWebSocket *pClient = qobject_cast<QWebSocket *>(sender()); + qDebug() << "Binary Message received ????:" << message; + if (pClient) { + // pClient->sendBinaryMessage(message); + } +} +void UserManagement::serverSocketDisconnected() +{ + QWebSocket *pClient = qobject_cast<QWebSocket *>(sender()); + qDebug() << "socketDisconnected:" << pClient; + if (pClient) { + pClient->deleteLater(); + } +} +void UserManagement::slot_timerTest() +{ + if(!pSocket) + return; + if(sequence > 3) { + timerTest.stop(); + return; + } + pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"incoming\",\"accountid\":\"D2:D4:71:0D:B5:F1\",\"nickname\":\"D2:D4:71:0D:B5:F1\"},\"jtype\":\"afb-event\"}]"); + pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"login\",\"accountid\":\"null\"},\"jtype\":\"afb-event\"}]"); +} +void UserManagement::onServerClosed() +{ + qWarning()<<"websocket server closed"; +} +#endif diff --git a/homescreen/src/usermanagement.h b/homescreen/src/usermanagement.h new file mode 100644 index 0000000..32db93f --- /dev/null +++ b/homescreen/src/usermanagement.h @@ -0,0 +1,91 @@ +#ifndef USERMANAGEMENT_H +#define USERMANAGEMENT_H + +#define REAL_SERVER "ws://localhost:1212/api?token=hello" + +#include <QObject> +#include "applicationmodel.h" +#include <QTimer> +#include <QPointF> +#include <QtWebSockets/QWebSocket> +#ifndef REAL_SERVER +#include <QtWebSockets/QWebSocketServer> +#endif +struct User { + QString postal_address; + QPointF loc; + QString country; + QString mail; + QString city; + QString graphEmail; + QString graphPreferredLanguage; + QString ccNumberMasked; + QString ccExpYear; + QString description; + QString ccExpMonth; + QStringList groups; + QString last_name; + QString ccNumber; + QString house_identifier; + QString phone; + QString name; + QString state; + QString fax; + QString common_name; + QString postal_code; + QString first_name; + QString keytoken; + QStringList graphActions; + QString policy; +}; + +class UserManagement : public QObject +{ + Q_OBJECT +public: + explicit UserManagement(QObject *root); + +signals: + +public slots: + void connectWebsockets(); + void onConnected(); + void onClosed(); + void onTextMessageReceived(QString message); + void onWebSocketError(QAbstractSocket::SocketError); + void slot_sendData(); +#ifndef REAL_SERVER + void onServerNewConnection(); + void onServerClosed(); + void processBinaryMessage(QByteArray message); + void processTextMessage(QString message); + void serverSocketDisconnected(); + void slot_timerTest(); +#endif + void slot_turnOffRed(); + void slot_disconnect(); +private: + QObject *home; + QObject *shortcutArea; + QObject *statusArea; + QObject *logo; + QByteArray data; + ApplicationModel *appModel; + QWebSocket webSocket; + QTimer timerRed; + bool isRed; + int sequence; + bool jsonToMap(const QByteArray &buf, QVariantMap *map) const; + bool mapToJson(const QVariantMap &map, QByteArray *json) const; + bool jsonToList(const QByteArray &buf, QList<QVariant> *list) const; + bool listToJson(const QList<QVariant> &list, QByteArray *json) const; + void setUser(const User &user); +#ifndef REAL_SERVER + QTimer timerTest; + QWebSocket *pSocket; + QWebSocketServer *webSocketServer; + void launchServer(); +#endif +}; + +#endif // USERMANAGEMENT_H |