aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>2019-05-28 14:00:55 +0800
committerwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>2019-05-28 14:00:55 +0800
commit7d29d877baafe52cc0e0bbdf7d86deff61073651 (patch)
treeb3d106a241e5c3b5be6b7f1fbe596ac3024ae0ad
parent33c89065c315edd838873116bec8723326f43488 (diff)
registerShortcut
Change-Id: I66dbf6f12a890e67908594ed238556f5456b7ed7
-rw-r--r--homescreen/homescreen.pro8
-rw-r--r--homescreen/qml/ShortcutArea.qml52
-rw-r--r--homescreen/qml/ShortcutIcon.qml64
-rw-r--r--homescreen/qml/StatusArea.qml15
-rw-r--r--homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.pngbin949053 -> 951359 bytes
-rw-r--r--homescreen/qml/images/AGL_HMI_Full_Background.pngbin0 -> 9120 bytes
-rw-r--r--homescreen/qml/images/AGL_HMI_Normal_Background.pngbin0 -> 10012 bytes
-rw-r--r--homescreen/qml/images/Shortcut/blank.svg81
-rw-r--r--homescreen/qml/images/Shortcut/blank_active.svg100
-rw-r--r--homescreen/qml/images/Shortcut/sdl_usb.svg311
-rw-r--r--homescreen/qml/images/Shortcut/sdl_usb_active.svg278
-rw-r--r--homescreen/qml/images/Shortcut/shortcut.qrc6
-rw-r--r--homescreen/qml/images/Shortcut/video.svg109
-rw-r--r--homescreen/qml/images/Shortcut/video_active.svg126
-rw-r--r--homescreen/qml/images/fullscreen.pngbin0 -> 1633 bytes
-rw-r--r--homescreen/qml/images/images.qrc5
-rw-r--r--homescreen/qml/images/normal.pngbin0 -> 1626 bytes
-rw-r--r--homescreen/qml/images/normal_disable.pngbin0 -> 1721 bytes
-rw-r--r--homescreen/qml/main.qml140
-rw-r--r--homescreen/src/applicationlauncher.cpp1
-rw-r--r--homescreen/src/homescreenhandler.cpp109
-rw-r--r--homescreen/src/homescreenhandler.h15
-rw-r--r--homescreen/src/main.cpp64
-rw-r--r--homescreen/src/shortcutappmodel.cpp268
-rw-r--r--homescreen/src/shortcutappmodel.h62
-rw-r--r--homescreen/src/toucharea.cpp36
-rw-r--r--homescreen/src/toucharea.h30
-rw-r--r--package/etc/registeredApp.aaa.json18
-rw-r--r--package/etc/registeredApp.json18
-rw-r--r--package/package.pro6
30 files changed, 1838 insertions, 84 deletions
diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro
index 4fcfb31..0de8e03 100644
--- a/homescreen/homescreen.pro
+++ b/homescreen/homescreen.pro
@@ -28,14 +28,18 @@ SOURCES += \
src/statusbarserver.cpp \
src/applicationlauncher.cpp \
src/mastervolume.cpp \
- src/homescreenhandler.cpp
+ src/homescreenhandler.cpp \
+ src/toucharea.cpp \
+ src/shortcutappmodel.cpp
HEADERS += \
src/statusbarmodel.h \
src/statusbarserver.h \
src/applicationlauncher.h \
src/mastervolume.h \
- src/homescreenhandler.h
+ src/homescreenhandler.h \
+ src/toucharea.h \
+ src/shortcutappmodel.h
OTHER_FILES += \
README.md
diff --git a/homescreen/qml/ShortcutArea.qml b/homescreen/qml/ShortcutArea.qml
index a8ce127..217aa9f 100644
--- a/homescreen/qml/ShortcutArea.qml
+++ b/homescreen/qml/ShortcutArea.qml
@@ -24,47 +24,41 @@ Item {
width: 785
height: 218
-
- ListModel {
- id: applicationModel
- ListElement {
- appid: 'launcher'
- name: 'launcher'
- application: 'launcher@0.1'
- }
- ListElement {
- appid: 'mediaplayer'
- name: 'MediaPlayer'
- application: 'mediaplayer@0.1'
- }
- ListElement {
- appid: 'hvac'
- name: 'HVAC'
- application: 'hvac@0.1'
- }
- ListElement {
- appid: 'navigation'
- name: 'Navigation'
- application: 'navigation@0.1'
- }
- }
-
property int pid: -1
RowLayout {
anchors.fill: parent
spacing: 2
Repeater {
- model: applicationModel
+ id: repeater
+ model: shortcutAppModel
delegate: ShortcutIcon {
Layout.fillWidth: true
Layout.fillHeight: true
- name: model.name
- active: model.name === launcher.current
+ name: shortcutAppModel.getName(model.index)
+ icon: shortcutAppModel.getIcon(model.index)
+ isBlank: shortcutAppModel.isBlank(model.index)
+ active: shortcutAppModel.getName(model.index).toLowerCase() === launcher.current
onClicked: {
- homescreenHandler.tapShortcut(model.appid)
+ console.log("launcher.current====="+homescreenHandler.getCurrentApplication())
+ if(launcher.current === shortcutAppModel.getName(model.index)) {
+ return
+ }
+ homescreenHandler.tapShortcut(shortcutAppModel.getId(model.index), false)
}
}
}
}
+
+ Connections {
+ target: shortcutAppModel
+ onUpdateShortcut: {
+ for(var i = 0; i < 4; i++) {
+ var item = repeater.itemAt(i)
+ item.name = shortcutAppModel.getName(i)
+ item.icon = shortcutAppModel.getIcon(i)
+ item.isBlank = shortcutAppModel.isBlank(i)
+ }
+ }
+ }
}
diff --git a/homescreen/qml/ShortcutIcon.qml b/homescreen/qml/ShortcutIcon.qml
index 1100a7c..e891c99 100644
--- a/homescreen/qml/ShortcutIcon.qml
+++ b/homescreen/qml/ShortcutIcon.qml
@@ -24,7 +24,10 @@ MouseArea {
width: 195
height: 216.8
property string name: 'Home'
+ property string icon:'./images/Shortcut/'
property bool active: false
+ property bool isBlank: false
+
Item {
id: icon
property real desaturation: 0
@@ -32,14 +35,42 @@ MouseArea {
Image {
id: inactiveIcon
anchors.fill: parent
- source: './images/Shortcut/%1.svg'.arg(root.name.toLowerCase())
+ source: './images/Shortcut/blank.svg'
+// source: isBlank ? './images/Shortcut/blank.svg' : root.icon
+ property string initial: root.name.substring(0,1).toUpperCase()
+ Label {
+ style: Text.Outline
+ styleColor: '#00FFFF'
+ color: 'transparent'
+ font.pixelSize: 75
+ anchors.centerIn: parent
+ text: inactiveIcon.initial
+ visible: root.isBlank
+ }
}
Image {
id: activeIcon
anchors.fill: parent
- source: './images/Shortcut/%1_active.svg'.arg(root.name.toLowerCase())
+ source: './images/Shortcut/blank_active.svg'
+// source: isBlank ? './images/Shortcut/blank_active.svg' : root.icon
+ property string initial: root.name.substring(0,1).toUpperCase()
+ Label {
+ style: Text.Outline
+ styleColor: '#00FFFF'
+ color: 'transparent'
+ font.pixelSize: 75
+ anchors.centerIn: parent
+ text: activeIcon.initial
+ visible: root.isBlank
+ }
opacity: 0.0
}
+ Image {
+ id: sourceIcon
+ anchors.fill: parent
+ source: isBlank ? null : root.icon
+ }
+
layer.enabled: true
layer.effect: Desaturate {
id: desaturate
@@ -47,6 +78,7 @@ MouseArea {
cached: true
}
}
+
Label {
id: name
y: 160
@@ -57,21 +89,11 @@ MouseArea {
anchors.horizontalCenter: parent.horizontalCenter
horizontalAlignment: Text.AlignHCenter
color: "white"
- text: qsTr(model.name.toUpperCase())
+ text: qsTr((root.name === "launcher" ? "home" : root.name).toUpperCase())
}
+
states: [
State {
- when: launcher.launching
- PropertyChanges {
- target: root
- enabled: false
- }
- PropertyChanges {
- target: icon
- desaturation: 1.0
- }
- },
- State {
when: root.active
PropertyChanges {
target: inactiveIcon
@@ -83,18 +105,4 @@ MouseArea {
}
}
]
-
- transitions: [
- Transition {
- NumberAnimation {
- properties: 'opacity'
- duration: 500
- easing.type: Easing.OutExpo
- }
- NumberAnimation {
- properties: 'desaturation'
- duration: 250
- }
- }
- ]
}
diff --git a/homescreen/qml/StatusArea.qml b/homescreen/qml/StatusArea.qml
index d2e0930..961cd88 100644
--- a/homescreen/qml/StatusArea.qml
+++ b/homescreen/qml/StatusArea.qml
@@ -109,6 +109,12 @@ Item {
font.pixelSize: 32
}
}
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ homescreenHandler.killRunningApplications()
+ }
+ }
}
}
ColumnLayout {
@@ -117,11 +123,16 @@ Item {
Layout.fillHeight: true
Layout.preferredWidth: 76
spacing: -10
+ Rectangle {
+ Layout.preferredWidth: 77
+ Layout.preferredHeight: 55
+ opacity: 0
+ }
Image {
id: bt_icon
Layout.preferredWidth: 77
- Layout.preferredHeight: 73
+ Layout.preferredHeight: 55
source: connStatus ? './images/Status/HMI_Status_Bluetooth_On-01.png' : './images/Status/HMI_Status_Bluetooth_Inactive-01.png'
fillMode: Image.PreserveAspectFit
property string deviceName: "none"
@@ -138,7 +149,7 @@ Item {
model: StatusBarModel { objectName: "statusBar" }
delegate: Image {
Layout.preferredWidth: 77
- Layout.preferredHeight: 73
+ Layout.preferredHeight: 55
source: model.modelData
fillMode: Image.PreserveAspectFit
}
diff --git a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png b/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png
index 357c204..a4e026c 100644
--- a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png
+++ b/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png
Binary files differ
diff --git a/homescreen/qml/images/AGL_HMI_Full_Background.png b/homescreen/qml/images/AGL_HMI_Full_Background.png
new file mode 100644
index 0000000..9631ca0
--- /dev/null
+++ b/homescreen/qml/images/AGL_HMI_Full_Background.png
Binary files differ
diff --git a/homescreen/qml/images/AGL_HMI_Normal_Background.png b/homescreen/qml/images/AGL_HMI_Normal_Background.png
new file mode 100644
index 0000000..c686067
--- /dev/null
+++ b/homescreen/qml/images/AGL_HMI_Normal_Background.png
Binary files differ
diff --git a/homescreen/qml/images/Shortcut/blank.svg b/homescreen/qml/images/Shortcut/blank.svg
new file mode 100644
index 0000000..3bccdca
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/blank.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Home"
+ x="0px"
+ y="0px"
+ viewBox="0 0 195 216.8"
+ style="enable-background:new 0 0 195 216.8;"
+ xml:space="preserve"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+ sodipodi:docname="sdl_usb.svg"><metadata
+ id="metadata61"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs59" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1018"
+ id="namedview57"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:zoom="1.0885609"
+ inkscape:cx="18.255591"
+ inkscape:cy="102.46209"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Home"><sodipodi:guide
+ position="52.936865,144.9161"
+ orientation="0,1"
+ id="guide4189"
+ inkscape:locked="false" /><sodipodi:guide
+ position="66.027543,153.29873"
+ orientation="1,0"
+ id="guide4191"
+ inkscape:locked="false" /><sodipodi:guide
+ position="34.449153,79.00339"
+ orientation="0,1"
+ id="guide4193"
+ inkscape:locked="false" /><sodipodi:guide
+ position="132.05509,117.35678"
+ orientation="1,0"
+ id="guide4195"
+ inkscape:locked="false" /><sodipodi:guide
+ position="98.9839,162.94449"
+ orientation="1,0"
+ id="guide4266"
+ inkscape:locked="false" /><sodipodi:guide
+ position="67.290679,111.95975"
+ orientation="0,1"
+ id="guide4268"
+ inkscape:locked="false" /></sodipodi:namedview><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:11px;}
+ .st3{letter-spacing:2;}
+ .st4{fill:url(#SVGID_1_);}
+ .st5{fill:url(#SVGID_2_);}
+ .st6{fill:url(#SVGID_3_);}
+ .st7{fill:url(#SVGID_4_);}
+ .st8{fill:url(#SVGID_5_);}
+</style></svg> \ No newline at end of file
diff --git a/homescreen/qml/images/Shortcut/blank_active.svg b/homescreen/qml/images/Shortcut/blank_active.svg
new file mode 100644
index 0000000..0b63bc9
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/blank_active.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Home"
+ x="0px"
+ y="0px"
+ viewBox="0 0 195 216.8"
+ style="enable-background:new 0 0 195 216.8;"
+ xml:space="preserve"
+ sodipodi:docname="sdl_usb_active.svg"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
+ id="metadata3773"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs3771" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1018"
+ id="namedview3769"
+ showgrid="false"
+ inkscape:zoom="3.8560885"
+ inkscape:cx="97.5"
+ inkscape:cy="108.4"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3764" />
+<style
+ type="text/css"
+ id="style3750">
+ .st0{fill:#0DF9FF;}
+ .st1{fill:url(#Active_2_1_);}
+ .st2{fill:#FFFFFF;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:11px;}
+ .st5{letter-spacing:2;}
+ .st6{fill:url(#SVGID_1_);}
+ .st7{fill:url(#SVGID_2_);}
+ .st8{fill:url(#SVGID_3_);}
+ .st9{fill:url(#SVGID_4_);}
+ .st10{fill:url(#SVGID_5_);}
+</style>
+<switch
+ id="switch3766">
+ <g
+ i:extraneous="self"
+ id="g3764">
+ <rect
+ id="Active_1"
+ y="214.3"
+ transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)"
+ class="st0"
+ width="195.9"
+ height="2.4" />
+ <linearGradient
+ id="Active_2_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="97.9416"
+ y1="236.9585"
+ x2="97.9416"
+ y2="-68.5304">
+ <stop
+ offset="0"
+ style="stop-color:#0DF9FF"
+ id="stop3753" />
+ <stop
+ offset="9.208472e-02"
+ style="stop-color:#0DF9FF;stop-opacity:0.853"
+ id="stop3755" />
+ <stop
+ offset="0.6264"
+ style="stop-color:#0DF9FF;stop-opacity:0"
+ id="stop3757" />
+ </linearGradient>
+ <rect
+ id="Active_2"
+ class="st1"
+ width="195.9"
+ height="214.3" />
+
+ </g>
+</switch>
+</svg> \ No newline at end of file
diff --git a/homescreen/qml/images/Shortcut/sdl_usb.svg b/homescreen/qml/images/Shortcut/sdl_usb.svg
new file mode 100644
index 0000000..3b6a7e9
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/sdl_usb.svg
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Home"
+ x="0px"
+ y="0px"
+ viewBox="0 0 195 216.8"
+ style="enable-background:new 0 0 195 216.8;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="sdl.svg"><metadata
+ id="metadata61"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs59" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1855"
+ inkscape:window-height="1056"
+ id="namedview57"
+ showgrid="false"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:zoom="1.0885609"
+ inkscape:cx="18.255591"
+ inkscape:cy="102.46209"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Home"><sodipodi:guide
+ position="52.936865,144.9161"
+ orientation="0,1"
+ id="guide4189" /><sodipodi:guide
+ position="66.027543,153.29873"
+ orientation="1,0"
+ id="guide4191" /><sodipodi:guide
+ position="34.449153,79.00339"
+ orientation="0,1"
+ id="guide4193" /><sodipodi:guide
+ position="132.05509,117.35678"
+ orientation="1,0"
+ id="guide4195" /><sodipodi:guide
+ position="98.9839,162.94449"
+ orientation="1,0"
+ id="guide4266" /><sodipodi:guide
+ position="67.290679,111.95975"
+ orientation="0,1"
+ id="guide4268" /></sodipodi:namedview><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:11px;}
+ .st3{letter-spacing:2;}
+ .st4{fill:url(#SVGID_1_);}
+ .st5{fill:url(#SVGID_2_);}
+ .st6{fill:url(#SVGID_3_);}
+ .st7{fill:url(#SVGID_4_);}
+ .st8{fill:url(#SVGID_5_);}
+</style><image
+ y="71.883904"
+ x="66.027542"
+ id="image4332"
+ xlink:href="data:image/png;base64,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
+"
+ preserveAspectRatio="none"
+ height="65.912712"
+ width="66.02755" /></svg>
diff --git a/homescreen/qml/images/Shortcut/sdl_usb_active.svg b/homescreen/qml/images/Shortcut/sdl_usb_active.svg
new file mode 100644
index 0000000..9584885
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/sdl_usb_active.svg
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Home" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
+ style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{fill:url(#Active_2_1_);}
+ .st2{fill:#FFFFFF;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:11px;}
+ .st5{letter-spacing:2;}
+ .st6{fill:url(#SVGID_1_);}
+ .st7{fill:url(#SVGID_2_);}
+ .st8{fill:url(#SVGID_3_);}
+ .st9{fill:url(#SVGID_4_);}
+ .st10{fill:url(#SVGID_5_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/>
+ <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304">
+ <stop offset="0" style="stop-color:#0DF9FF"/>
+ <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/>
+ <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/>
+ </linearGradient>
+ <rect id="Active_2" class="st1" width="195.9" height="214.3"/>
+ <g>
+<image
+ y="71.883904"
+ x="66.027542"
+ id="image4332"
+ xlink:href="data:image/png;base64,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
+"
+ preserveAspectRatio="none"
+ height="65.912712"
+ width="66.02755" />
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/homescreen/qml/images/Shortcut/shortcut.qrc b/homescreen/qml/images/Shortcut/shortcut.qrc
index 5d67341..54df1ad 100644
--- a/homescreen/qml/images/Shortcut/shortcut.qrc
+++ b/homescreen/qml/images/Shortcut/shortcut.qrc
@@ -8,5 +8,11 @@
<file>mediaplayer_active.svg</file>
<file>navigation.svg</file>
<file>navigation_active.svg</file>
+ <file>video.svg</file>
+ <file>video_active.svg</file>
+ <file>sdl_usb.svg</file>
+ <file>sdl_usb_active.svg</file>
+ <file>blank.svg</file>
+ <file>blank_active.svg</file>
</qresource>
</RCC>
diff --git a/homescreen/qml/images/Shortcut/video.svg b/homescreen/qml/images/Shortcut/video.svg
new file mode 100644
index 0000000..e368922
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/video.svg
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 195 217"
+ height="217"
+ width="195"
+ version="1.1"
+ id="svg2">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <image
+ y="0"
+ x="0"
+ id="image10"
+ xlink:href="data:image/png;base64,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
+saNgIER9vJAmFrMmFNr4923DxrbK3eEE48FgwnyeM+8JRbttnpoQvAnDeNY8Jobp2evzAtM+a/wq
+xLBCG0jWKrRSqR82y+Iny2do43Qri+kZhgl6Ln94jzKqA0S1uAgtlDS/s9XM2nhRRafI4rmhQBO6
+PmNb5hjf8m+/V3lWAABFZ95IFM8JXudnis58A3X3BtsH9fmCEornD0woRWZEjKDcKOmhiPhVUfHL
+4dbQb74/b96W6VoL0z4M23WhbhmpN5/ZXJ9ZqlZu3VpPVZ1bBWfS20f3Ntq91Hs7hZc5doPtpJ5Q
+JGQNsug82bMEamPjJEQk9d6xp34GSR9kRW8CfUnVHa8XyMzu66LqgR51psgE6lCVnXnXMqmy8/ml
+ekJGkvXOMkTQSy9V937HmRA9tayyUdVa0ajtXI4uZ20D7eGzaWZmZmZmZmZmZmZmZmZmZmZmZmZm
+ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm
+ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYv6v8BHUYYj+AaytYAAAAA
+SUVORK5CYII=
+"
+ style="image-rendering:optimizeQuality"
+ preserveAspectRatio="none"
+ height="217"
+ width="195" />
+</svg>
diff --git a/homescreen/qml/images/Shortcut/video_active.svg b/homescreen/qml/images/Shortcut/video_active.svg
new file mode 100644
index 0000000..344385f
--- /dev/null
+++ b/homescreen/qml/images/Shortcut/video_active.svg
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ viewBox="0 0 195 217"
+ height="217"
+ width="195"
+ version="1.1"
+ id="svg2">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <image
+ y="0"
+ x="0"
+ id="image10"
+ xlink:href="data:image/png;base64,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
+"
+ style="image-rendering:optimizeQuality"
+ preserveAspectRatio="none"
+ height="217"
+ width="195" />
+</svg>
diff --git a/homescreen/qml/images/fullscreen.png b/homescreen/qml/images/fullscreen.png
new file mode 100644
index 0000000..f56a13c
--- /dev/null
+++ b/homescreen/qml/images/fullscreen.png
Binary files differ
diff --git a/homescreen/qml/images/images.qrc b/homescreen/qml/images/images.qrc
index 37ad676..39f7eb6 100644
--- a/homescreen/qml/images/images.qrc
+++ b/homescreen/qml/images/images.qrc
@@ -6,5 +6,10 @@
<file>Utility_Music_Background-01.png</file>
<file>Utility_Radio_Background-01.png</file>
<file>AGL_HMI_Blue_Background_NoCar-01.png</file>
+ <file>AGL_HMI_Full_Background.png</file>
+ <file>AGL_HMI_Normal_Background.png</file>
+ <file>fullscreen.png</file>
+ <file>normal.png</file>
+ <file>normal_disable.png</file>
</qresource>
</RCC>
diff --git a/homescreen/qml/images/normal.png b/homescreen/qml/images/normal.png
new file mode 100644
index 0000000..92dee7a
--- /dev/null
+++ b/homescreen/qml/images/normal.png
Binary files differ
diff --git a/homescreen/qml/images/normal_disable.png b/homescreen/qml/images/normal_disable.png
new file mode 100644
index 0000000..f191241
--- /dev/null
+++ b/homescreen/qml/images/normal_disable.png
Binary files differ
diff --git a/homescreen/qml/main.qml b/homescreen/qml/main.qml
index 7d40276..a8d095b 100644
--- a/homescreen/qml/main.qml
+++ b/homescreen/qml/main.qml
@@ -26,6 +26,7 @@ Window {
width: container.width * container.scale
height: container.height * container.scale
title: 'HomeScreen'
+ color: "#00000000"
Image {
id: container
@@ -60,6 +61,145 @@ Window {
Layout.preferredHeight: 215
}
}
+
+
+ state: "normal"
+
+ states: [
+ State {
+ name: "normal"
+ PropertyChanges {
+ target: topArea
+ y: 0
+ }
+ PropertyChanges {
+ target: applicationArea
+ y: 218
+ }
+ PropertyChanges {
+ target: mediaArea
+ y: 1705
+ }
+ },
+ State {
+ name: "fullscreen"
+ PropertyChanges {
+ target: topArea
+ y: -220
+ }
+ PropertyChanges {
+ target: applicationArea
+ y: -1490
+ }
+ PropertyChanges {
+ target: mediaArea
+ y: 2135
+ }
+ }
+ ]
+ transitions: Transition {
+ NumberAnimation {
+ target: topArea
+ property: "y"
+ easing.type: "OutQuad"
+ duration: 250
+ }
+ NumberAnimation {
+ target: mediaArea
+ property: "y"
+ easing.type: "OutQuad"
+ duration: 250
+ }
+ }
+
+ }
+ Item {
+ id: switchBtn
+ width: 70
+ height: 70
+ anchors.right: parent.right
+ anchors.top: parent.top
+ z: 1
+ property bool enableSwitchBtn: true
+ Image {
+ anchors.right: parent.right
+ anchors.rightMargin: 20
+ anchors.top: parent.top
+ anchors.topMargin: 25
+ width: 35
+ height: 35
+ id: image
+ source: './images/normal.png'
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ if(switchBtn.enableSwitchBtn) {
+ var appName = homescreenHandler.getCurrentApplication()
+ if (container.state === 'normal') {
+ image.source = './images/fullscreen.png'
+ container.state = 'fullscreen'
+ touchArea.switchArea(1)
+ homescreenHandler.tapShortcut(appName, true)
+ container.opacity = 0.0
+ } else {
+ image.source = './images/normal.png'
+ container.state = 'normal'
+ touchArea.switchArea(0)
+ homescreenHandler.tapShortcut(appName, false)
+ container.opacity = 1.0
+ }
+ }
+ }
+ }
+ }
+
+ Item {
+ id: rebootBtn
+ width: 70
+ height: 70
+ anchors.left: parent.left
+ anchors.top: parent.top
+ z: 1
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ homescreenHandler.reboot();
+ }
+ }
+ }
+
+ function changeSwitchState(is_navigation) {
+ if(container.state === 'normal') {
+ if(is_navigation) {
+ switchBtn.enableSwitchBtn = true
+ image.source = './images/normal.png'
+ } else {
+ switchBtn.enableSwitchBtn = false
+ image.source = './images/normal_disable.png'
+ }
+ }
+ }
+
+ Connections {
+ target: homescreenHandler
+ onShowWindow: {
+ container.state = 'normal'
+ image.visible = true
+ touchArea.switchArea(0)
+ container.opacity = 1.0
+ }
+ }
+
+ Connections {
+ target: homescreenHandler
+ onHideWindow: {
+ container.state = 'fullscreen'
+ image.visible = false
+ touchArea.switchArea(1)
+ container.opacity = 0.0
+ }
}
Timer {
diff --git a/homescreen/src/applicationlauncher.cpp b/homescreen/src/applicationlauncher.cpp
index 5a1e2d6..a72ea9f 100644
--- a/homescreen/src/applicationlauncher.cpp
+++ b/homescreen/src/applicationlauncher.cpp
@@ -81,5 +81,6 @@ void ApplicationLauncher::setCurrent(const QString &current)
{
if (m_current == current) return;
m_current = current;
+ qDebug() << "setCurrent" << m_current;
emit currentChanged(current);
}
diff --git a/homescreen/src/homescreenhandler.cpp b/homescreen/src/homescreenhandler.cpp
index 865f6a5..a06fa7e 100644
--- a/homescreen/src/homescreenhandler.cpp
+++ b/homescreen/src/homescreenhandler.cpp
@@ -17,13 +17,18 @@
#include <QFileInfo>
#include "homescreenhandler.h"
#include <functional>
+#include <QProcess>
+#include <dirent.h>
+#include <stdio.h>
#include "hmi-debug.h"
+#define BUF_SIZE 1024
void* HomescreenHandler::myThis = 0;
HomescreenHandler::HomescreenHandler(QObject *parent) :
QObject(parent),
- mp_qhs(NULL)
+ mp_qhs(NULL),
+ current_application("launcher")
{
}
@@ -48,6 +53,7 @@ void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm
mp_qhs->set_event_handler(QLibHomeScreen::Event_ShowWindow,[this](json_object *object){
HMI_DEBUG("Launcher","Surface launcher got Event_ShowWindow\n");
mp_qwm->activateWindow(m_myname);
+ emit showWindow();
});
mp_qhs->set_event_handler(QLibHomeScreen::Event_OnScreenMessage, [this](json_object *object){
@@ -83,17 +89,112 @@ void HomescreenHandler::init(int port, const char *token, QLibWindowmanager *qwm
emit showInformation(QString(QLatin1String(info)));
});
+
+ mp_qhs->set_event_handler(QLibHomeScreen::Event_HideWindow, [this](json_object *object) {
+ emit hideWindow();
+ HMI_DEBUG("HomeScreen","set_event_handler Event_HideWindow");
+ });
+
+ mp_qhs->set_event_handler(QLibHomeScreen::Event_RegisterShortcut,[this](json_object *object){
+ HMI_DEBUG("HomeScreen","set_event_handler Event_RegisterShortcut");
+ json_object *p_obj = json_object_object_get(object, "parameter");
+ const char *shortcut_id = json_object_get_string(
+ json_object_object_get(p_obj, "shortcut_id"));
+ const char *shortcut_name = json_object_get_string(
+ json_object_object_get(p_obj, "shortcut_name"));
+ const char *position = json_object_get_string(
+ json_object_object_get(p_obj, "position"));
+ HMI_DEBUG("HomeScreen", "Event_RegisterShortcut id==%s, name==%s, position ==%s", shortcut_id, shortcut_name, position);
+ emit shortcutChanged(QString(QLatin1String(shortcut_id)), QString(QLatin1String(shortcut_name)), QString(QLatin1String(position)));
+ });
}
-void HomescreenHandler::tapShortcut(QString application_id)
+void HomescreenHandler::tapShortcut(QString application_id, bool is_full)
{
HMI_DEBUG("HomeScreen","tapShortcut %s", application_id.toStdString().c_str());
struct json_object* j_json = json_object_new_object();
struct json_object* value;
- value = json_object_new_string("normal.full");
+ if(is_full) {
+ value = json_object_new_string("fullscreen");
+ HMI_DEBUG("HomeScreen","fullscreen");
+ } else {
+ value = json_object_new_string("normal.full");
+ HMI_DEBUG("HomeScreen","normal");
+ }
json_object_object_add(j_json, "area", value);
+ mp_qhs->showWindow(application_id.section('@', 0, 0).toStdString().c_str(), j_json);
+}
+
+void HomescreenHandler::updateShortcut(QString id, struct json_object* object)
+{
+ mp_qhs->updateShortcut(id.toStdString().c_str(), object);
+}
+
+
+void HomescreenHandler::setCurrentApplication(QString application_name)
+{
+ HMI_DEBUG("HomeScreen","setCurrentApplication %s", application_name.toStdString().c_str());
+ current_application = application_name;
+}
+
+QString HomescreenHandler::getCurrentApplication()
+{
+ HMI_DEBUG("HomeScreen","getCurrentApplication %s", current_application.toStdString().c_str());
+ return current_application;
+}
+
+int HomescreenHandler::getPidOfApplication(QString application_name) {
+ DIR *dir = NULL;
+ struct dirent *dir_ent_ptr = NULL;
+ FILE *fp = NULL;
+ char file_path[50] = {0};
+ char cur_task_ame[50] = {0};
+ char buf[BUF_SIZE] = {0};
+ int pid = -1;
+
+ dir = opendir("/proc");
+ if (dir) {
+ while((dir_ent_ptr = readdir(dir)) != NULL) {
+ if ((strcmp(dir_ent_ptr->d_name, ".") == 0) || (strcmp(dir_ent_ptr->d_name, "..") == 0)
+ || (DT_DIR != dir_ent_ptr->d_type))
+ continue;
+ sprintf(file_path, "/proc/%s/status", dir_ent_ptr->d_name);
+ fp = fopen(file_path, "r");
+ if (fp) {
+ if (fgets(buf, BUF_SIZE - 1, fp) == NULL) {
+ fclose(fp);
+ continue;
+ }
+ sscanf(buf, "%*s %s", cur_task_ame);
+ if (0 == strcmp(application_name.toStdString().c_str(), cur_task_ame)) {
+ pid = atoi(dir_ent_ptr->d_name);
+ break;
+ }
+ }
+ }
+ }
- mp_qhs->showWindow(application_id.toStdString().c_str(), j_json);
+ return pid;
+}
+
+void HomescreenHandler::killRunningApplications()
+{
+ QProcess *proc = new QProcess;
+ QProcess *proc2 = new QProcess;
+// int num = getPidOfApplication("afbd-video@0.1");
+// QString procNum = QString::number(num);
+ QString command = "/usr/bin/pkill videoplayer";
+ QString command2 = "/usr/bin/pkill navigation";
+ proc->start(command);
+ proc2->start(command2);
+ HMI_DEBUG("homescreen", command.toStdString().c_str());
+ HMI_DEBUG("homescreen", command2.toStdString().c_str());
+}
+
+void HomescreenHandler::reboot()
+{
+ QProcess::execute("sync");
+ QProcess::execute("reboot -f");
}
void HomescreenHandler::onRep_static(struct json_object* reply_contents)
diff --git a/homescreen/src/homescreenhandler.h b/homescreen/src/homescreenhandler.h
index d617737..4afbac4 100644
--- a/homescreen/src/homescreenhandler.h
+++ b/homescreen/src/homescreenhandler.h
@@ -34,7 +34,12 @@ public:
void init(int port, const char* token, QLibWindowmanager *qwm, QString myname);
- Q_INVOKABLE void tapShortcut(QString application_id);
+ Q_INVOKABLE void tapShortcut(QString application_name, bool is_full);
+ Q_INVOKABLE QString getCurrentApplication();
+ Q_INVOKABLE void killRunningApplications();
+ Q_INVOKABLE void reboot();
+ void setCurrentApplication(QString application_name);
+ int getPidOfApplication(QString application_name);
void onRep(struct json_object* reply_contents);
void onEv(const string& event, struct json_object* event_contents);
@@ -47,10 +52,18 @@ public:
signals:
void showNotification(QString application_id, QString icon_path, QString text);
void showInformation(QString info);
+ void shortcutChanged(QString shortcut_id, QString shortcut_name, QString position);
+ void showWindow();
+ void hideWindow();
+
+public slots:
+ void updateShortcut(QString id, struct json_object* object);
+
private:
QLibHomeScreen *mp_qhs;
QLibWindowmanager *mp_qwm;
QString m_myname;
+ QString current_application;
};
#endif // HOMESCREENHANDLER_H
diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp
index ec0a76b..0c477fd 100644
--- a/homescreen/src/main.cpp
+++ b/homescreen/src/main.cpp
@@ -22,6 +22,7 @@
#include <QtQml/QQmlContext>
#include <QtQml/qqml.h>
#include <QQuickWindow>
+#include <QThread>
#include <qlibwindowmanager.h>
#include <weather.h>
@@ -31,6 +32,8 @@
#include "afm_user_daemon_proxy.h"
#include "mastervolume.h"
#include "homescreenhandler.h"
+#include "toucharea.h"
+#include "shortcutappmodel.h"
#include "hmi-debug.h"
// XXX: We want this DBus connection to be shared across the different
@@ -91,9 +94,12 @@ int main(int argc, char *argv[])
// qmlRegisterType<ApplicationLauncher>("HomeScreen", 1, 0, "ApplicationLauncher");
qmlRegisterType<StatusBarModel>("HomeScreen", 1, 0, "StatusBarModel");
qmlRegisterType<MasterVolume>("MasterVolume", 1, 0, "MasterVolume");
+ qmlRegisterType<ShortcutAppModel>("ShortcutAppModel", 1, 0, "ShortcutAppModel");
ApplicationLauncher *launcher = new ApplicationLauncher();
QLibWindowmanager* layoutHandler = new QLibWindowmanager();
+ HomescreenHandler* homescreenHandler = new HomescreenHandler();
+ ShortcutAppModel* shortcutAppModel = new ShortcutAppModel();
if(layoutHandler->init(port,token) != 0){
exit(EXIT_FAILURE);
}
@@ -104,24 +110,6 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
- layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, &graphic_role](json_object *object) {
- layoutHandler->endDraw(graphic_role);
- });
-
- layoutHandler->set_event_handler(QLibWindowmanager::Event_ScreenUpdated, [layoutHandler, launcher](json_object *object) {
- json_object *jarray = json_object_object_get(object, "ids");
- int arrLen = json_object_array_length(jarray);
- for( int idx = 0; idx < arrLen; idx++)
- {
- QString label = QString(json_object_get_string( json_object_array_get_idx(jarray, idx) ));
- HMI_DEBUG("HomeScreen","Event_ScreenUpdated application: %s.", label.toStdString().c_str());
- QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label));
- }
- });
-
- HomescreenHandler* homescreenHandler = new HomescreenHandler();
- homescreenHandler->init(port, token.toStdString().c_str(), layoutHandler, graphic_role);
-
QUrl bindingAddress;
bindingAddress.setScheme(QStringLiteral("ws"));
bindingAddress.setHost(QStringLiteral("localhost"));
@@ -132,11 +120,16 @@ int main(int argc, char *argv[])
query.addQueryItem(QStringLiteral("token"), token);
bindingAddress.setQuery(query);
+ TouchArea* touchArea = new TouchArea();
+ homescreenHandler->init(port, token.toStdString().c_str(), layoutHandler, graphic_role);
+
// mail.qml loading
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("bindingAddress", bindingAddress);
engine.rootContext()->setContextProperty("layoutHandler", layoutHandler);
engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler);
+ engine.rootContext()->setContextProperty("touchArea", touchArea);
+ engine.rootContext()->setContextProperty("shortcutAppModel", shortcutAppModel);
engine.rootContext()->setContextProperty("launcher", launcher);
engine.rootContext()->setContextProperty("weather", new Weather(bindingAddress));
engine.rootContext()->setContextProperty("bluetooth", new Bluetooth(bindingAddress, engine.rootContext()));
@@ -147,9 +140,44 @@ int main(int argc, char *argv[])
QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
homescreenHandler->setQuickWindow(window);
+ layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, &graphic_role](json_object *object) {
+ layoutHandler->endDraw(graphic_role);
+ });
+
+ layoutHandler->set_event_handler(QLibWindowmanager::Event_ScreenUpdated, [layoutHandler, launcher, homescreenHandler, root](json_object *object) {
+ json_object *jarray = json_object_object_get(object, "ids");
+ HMI_DEBUG("HomeScreen","ids=%s", json_object_to_json_string(object));
+ int arrLen = json_object_array_length(jarray);
+ QString label = QString("");
+ for( int idx = 0; idx < arrLen; idx++)
+ {
+ label = QString(json_object_get_string( json_object_array_get_idx(jarray, idx) ));
+ HMI_DEBUG("HomeScreen","Event_ScreenUpdated application11: %s.", label.toStdString().c_str());
+ homescreenHandler->setCurrentApplication(label);
+ QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label));
+ }
+ if((arrLen == 1) && (QString("navigation") == label)){
+ QMetaObject::invokeMethod(root, "changeSwitchState", Q_ARG(QVariant, true));
+ }else{
+ QMetaObject::invokeMethod(root, "changeSwitchState", Q_ARG(QVariant, false));
+ }
+ });
+
+ touchArea->setWindow(window);
+ QThread* thread = new QThread;
+ touchArea->moveToThread(thread);
+ QObject::connect(thread, &QThread::started, touchArea, &TouchArea::init);
+
+ thread->start();
+
QList<QObject *> sobjs = engine.rootObjects();
StatusBarModel *statusBar = sobjs.first()->findChild<StatusBarModel *>("statusBar");
statusBar->init(bindingAddress, engine.rootContext());
+ QObject::connect(homescreenHandler, SIGNAL(shortcutChanged(QString, QString, QString)), shortcutAppModel, SLOT(changeShortcut(QString, QString, QString)));
+ QObject::connect(shortcutAppModel, SIGNAL(shortcutUpdated(QString, struct json_object*)), homescreenHandler, SLOT(updateShortcut(QString, struct json_object*)));
+
+ shortcutAppModel->screenUpdated();
+
return a.exec();
}
diff --git a/homescreen/src/shortcutappmodel.cpp b/homescreen/src/shortcutappmodel.cpp
new file mode 100644
index 0000000..76078da
--- /dev/null
+++ b/homescreen/src/shortcutappmodel.cpp
@@ -0,0 +1,268 @@
+/*
+ * Copyright (c) 2017 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 "shortcutappmodel.h"
+#include "hmi-debug.h"
+#include <unistd.h>
+#define SHORTCUTKEY_PATH "/var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json"
+
+class ShortcutAppModel::Private
+{
+public:
+ Private();
+
+ QList<RegisterApp> data;
+};
+
+ShortcutAppModel::Private::Private()
+{
+}
+
+
+ShortcutAppModel::ShortcutAppModel(QObject *parent)
+ : QAbstractListModel(parent)
+ , d(new Private())
+{
+ getAppQueue();
+}
+
+ShortcutAppModel::~ShortcutAppModel()
+{
+ delete this->d;
+}
+
+int ShortcutAppModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+
+ return this->d->data.count();
+}
+
+QVariant ShortcutAppModel::data(const QModelIndex &index, int role) const
+{
+ QVariant ret;
+ if (!index.isValid())
+ return ret;
+
+ switch (role) {
+ case Qt::DecorationRole:
+ ret = this->d->data[index.row()].icon;
+ break;
+ case Qt::DisplayRole:
+ ret = this->d->data[index.row()].name;
+ break;
+ case Qt::UserRole:
+ ret = this->d->data[index.row()].id;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+QHash<int, QByteArray> ShortcutAppModel::roleNames() const
+{
+ QHash<int, QByteArray> roles;
+ roles[Qt::DecorationRole] = "icon";
+ roles[Qt::DisplayRole] = "name";
+ roles[Qt::UserRole] = "id";
+ return roles;
+}
+
+void ShortcutAppModel::changeShortcut(QString id, QString name, QString position)
+{
+ for(int i = 1; i < d->data.size(); i++) {
+ if(id == d->data.at(i).id) {
+ return;
+ }
+ }
+ d->data.removeAt(position.toInt() + 1);
+
+ RegisterApp temp;
+ temp.id = id;
+ temp.name = name;
+ temp.icon = temp.icon = getIconPath(temp.id);
+ if (temp.icon == "") {
+ temp.isBlank = true;
+ } else {
+ temp.isBlank = false;
+ }
+
+ d->data.insert(position.toInt() + 1, temp);
+ setAppQueue();
+ emit updateShortcut();
+ struct json_object* obj = makeAppListJson();
+ emit shortcutUpdated(QString("launcher"), obj);
+}
+
+struct json_object* ShortcutAppModel::makeAppListJson()
+{
+ struct json_object* obj = json_object_new_object();
+ struct json_object* obj_array = json_object_new_array();
+ for(int i = 1; i < d->data.size(); i++)
+ {
+ struct json_object* obj_shortcut = json_object_new_object();
+ json_object_object_add(obj_shortcut, "shortcut_id", json_object_new_string(d->data.at(i).id.toStdString().c_str()));
+ json_object_object_add(obj_shortcut, "shortcut_name", json_object_new_string(d->data.at(i).name.toStdString().c_str()));
+ json_object_array_add(obj_array, obj_shortcut);
+ }
+ json_object_object_add(obj, "shortcut", obj_array);
+ HMI_DEBUG("Homescreen", "makeAppListJson id1=%s",json_object_new_string(d->data.at(1).name.toStdString().c_str()));
+ return obj;
+}
+
+QString ShortcutAppModel::getId(int index) const
+{
+ return d->data.at(index).id;
+}
+
+QString ShortcutAppModel::getName(int index) const
+{
+ return d->data.at(index).name;
+}
+
+QString ShortcutAppModel::getIcon(int index) const
+{
+ return d->data.at(index).icon;
+}
+
+bool ShortcutAppModel::isBlank(int index) const
+{
+ return d->data.at(index).isBlank;
+}
+
+QString ShortcutAppModel::getIconPath(QString id)
+{
+ QString name = id.section('@', 0, 0);
+ QString version = id.section('@', 1, 1);
+ QString boardIconPath = "/var/local/lib/afm/applications/" + name + "/" + version + "/icon.svg";
+ QString appIconPath = ":/images/Shortcut/" + name + ".svg";
+ if (QFile::exists(boardIconPath)) {
+ return "file://" + boardIconPath;
+ } else if (QFile::exists(appIconPath)) {
+ return appIconPath.section('/', 1, -1);
+ }
+ return "";
+}
+
+void ShortcutAppModel::getAppQueue()
+{
+ QProcess *process = new QProcess(this);
+ if(checkAppFile()) {
+ process->start("cp /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.aaa.json /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json");
+ } else {
+ process->start("cp /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.json /var/local/lib/afm/applications/homescreen/0.1/etc/registeredApp.aaa.json");
+ }
+ QThread::msleep(300);
+
+ QFile file(SHORTCUTKEY_PATH);
+ if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QByteArray allData = file.readAll();
+ QString str(allData);
+ if(str == "") {
+ file.close();
+
+ }
+ QJsonParseError json_error;
+ QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));
+
+ if(json_error.error != QJsonParseError::NoError)
+ {
+ HMI_ERROR("HomeScreen", "registeredApp.json error");
+ return;
+ }
+
+ QJsonObject rootObj = jsonDoc.object();
+
+ QJsonObject subObj = rootObj.value("1st shortcut key").toObject();
+ setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString());
+ subObj = rootObj.value("2nd shortcut key").toObject();
+ setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString());
+ subObj = rootObj.value("3rd shortcut key").toObject();
+ setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString());
+ subObj = rootObj.value("4th shortcut key").toObject();
+ setAppQueuePoint(subObj["id"].toString(), subObj["name"].toString());
+ }
+ file.close();
+}
+
+void ShortcutAppModel::setAppQueuePoint(QString id, QString name)
+{
+ app.id = id;
+ app.icon = getIconPath(app.id);
+ if (app.icon == "") {
+ app.isBlank = true;
+ } else {
+ app.isBlank = false;
+ }
+ app.name = name;
+ d->data.append(app);
+}
+
+void ShortcutAppModel::screenUpdated()
+{
+ struct json_object* obj = makeAppListJson();
+ emit shortcutUpdated(QString("launcher"), obj);
+}
+
+void ShortcutAppModel::setAppQueue()
+{
+ QFile file(SHORTCUTKEY_PATH);
+ if(file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ QJsonObject rootObj, subObj1, subObj2, subObj3, subObj4;
+ subObj1.insert("id", d->data.at(0).id);
+ subObj1.insert("name", d->data.at(0).name);
+ subObj2.insert("id", d->data.at(1).id);
+ subObj2.insert("name", d->data.at(1).name);
+ subObj3.insert("id", d->data.at(2).id);
+ subObj3.insert("name", d->data.at(2).name);
+ subObj4.insert("id", d->data.at(3).id);
+ subObj4.insert("name", d->data.at(3).name);
+ rootObj.insert("1st shortcut key", subObj1);
+ rootObj.insert("2nd shortcut key", subObj2);
+ rootObj.insert("3rd shortcut key", subObj3);
+ rootObj.insert("4th shortcut key", subObj4);
+
+ QJsonDocument jsonDoc;
+ jsonDoc.setObject(rootObj);
+
+ file.write(jsonDoc.toJson());
+ } else {
+ HMI_ERROR("HomeScreen", "write to registeredApp.json file failed");
+ }
+ file.flush();
+ fsync(file.handle());
+ file.close();
+}
+
+bool ShortcutAppModel::checkAppFile()
+{
+ bool fileError = false;
+ QFile file(SHORTCUTKEY_PATH);
+ if(file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ QByteArray line = file.readLine();
+ if(line == "\n" || line.isEmpty()) {
+ fileError = true;
+ }
+ } else {
+ fileError = true;
+ HMI_ERROR("HomeScreen", "registeredApp.json file open failed");
+ }
+ file.close();
+ return fileError;
+}
diff --git a/homescreen/src/shortcutappmodel.h b/homescreen/src/shortcutappmodel.h
new file mode 100644
index 0000000..f177a95
--- /dev/null
+++ b/homescreen/src/shortcutappmodel.h
@@ -0,0 +1,62 @@
+#ifndef SHORTCUTAPPMODEL_H
+#define SHORTCUTAPPMODEL_H
+
+#include <QtCore/QAbstractListModel>
+#include <QXmlStreamReader>
+#include <QXmlStreamWriter>
+#include <QFile>
+#include <QProcess>
+#include <QThread>
+#include <QJsonDocument>
+#include <QJsonParseError>
+#include <QJsonObject>
+#include <json_object.h>
+
+struct RegisterApp {
+ QString id;
+ QString name;
+ QString icon;
+ bool isBlank;
+};
+
+class ShortcutAppModel : public QAbstractListModel
+{
+ Q_OBJECT
+public:
+ explicit ShortcutAppModel(QObject *parent = nullptr);
+ ~ShortcutAppModel();
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ QHash<int, QByteArray> roleNames() const override;
+
+ Q_INVOKABLE QString getId(int index) const;
+ Q_INVOKABLE QString getName(int index) const;
+ Q_INVOKABLE QString getIcon(int index) const;
+ Q_INVOKABLE bool isBlank(int index) const;
+
+ void screenUpdated();
+
+public slots:
+ void changeShortcut(QString id, QString name, QString position);
+
+signals:
+ void updateShortcut();
+ void shortcutUpdated(QString id, struct json_object* object);
+
+private:
+ void getAppQueue();
+ void setAppQueue();
+ bool checkAppFile();
+ void setAppQueuePoint(QString id, QString name);
+ QString getIconPath(QString id);
+ struct json_object* makeAppListJson();
+
+ class Private;
+ Private *d;
+ RegisterApp app;
+
+};
+
+#endif // SHORTCUTAPPMODEL_H
diff --git a/homescreen/src/toucharea.cpp b/homescreen/src/toucharea.cpp
new file mode 100644
index 0000000..1cf4384
--- /dev/null
+++ b/homescreen/src/toucharea.cpp
@@ -0,0 +1,36 @@
+#include "toucharea.h"
+#include "hmi-debug.h"
+
+TouchArea::TouchArea()
+{
+}
+
+TouchArea::~TouchArea()
+{
+
+}
+
+void TouchArea::setWindow(QQuickWindow *window)
+{
+ myWindow = window;
+}
+
+void TouchArea::init()
+{
+ bitmapNormal = QPixmap(":/images/AGL_HMI_Normal_Background.png").createHeuristicMask();
+ bitmapFullscreen = QPixmap(":/images/AGL_HMI_Full_Background.png").createHeuristicMask();
+ myWindow->setMask(QRegion(bitmapNormal));
+}
+
+void TouchArea::switchArea(int areaType)
+{
+ if(areaType == NORMAL) {
+ myWindow->setMask(QRegion(bitmapNormal));
+ HMI_DEBUG("HomeScreen","TouchArea switchArea: %d.", areaType);
+ } else if (areaType == FULLSCREEN) {
+ HMI_DEBUG("HomeScreen","TouchArea switchArea: %d.", areaType);
+ myWindow->setMask(QRegion(bitmapFullscreen));
+ }
+}
+
+
diff --git a/homescreen/src/toucharea.h b/homescreen/src/toucharea.h
new file mode 100644
index 0000000..69c6872
--- /dev/null
+++ b/homescreen/src/toucharea.h
@@ -0,0 +1,30 @@
+#ifndef TOUCHAREA_H
+#define TOUCHAREA_H
+
+#include <QBitmap>
+#include <QQuickWindow>
+
+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
diff --git a/package/etc/registeredApp.aaa.json b/package/etc/registeredApp.aaa.json
new file mode 100644
index 0000000..490b33c
--- /dev/null
+++ b/package/etc/registeredApp.aaa.json
@@ -0,0 +1,18 @@
+{
+ "1st shortcut key": {
+ "id": "launcher@0.1",
+ "name": "launcher"
+ },
+ "2nd shortcut key": {
+ "id": "sdl_usb@5.0",
+ "name": "sdl_usb"
+ },
+ "3rd shortcut key": {
+ "id": "video@0.1",
+ "name": "video"
+ },
+ "4th shortcut key": {
+ "id": "navigation@0.1",
+ "name": "navigation"
+ }
+}
diff --git a/package/etc/registeredApp.json b/package/etc/registeredApp.json
new file mode 100644
index 0000000..490b33c
--- /dev/null
+++ b/package/etc/registeredApp.json
@@ -0,0 +1,18 @@
+{
+ "1st shortcut key": {
+ "id": "launcher@0.1",
+ "name": "launcher"
+ },
+ "2nd shortcut key": {
+ "id": "sdl_usb@5.0",
+ "name": "sdl_usb"
+ },
+ "3rd shortcut key": {
+ "id": "video@0.1",
+ "name": "video"
+ },
+ "4th shortcut key": {
+ "id": "navigation@0.1",
+ "name": "navigation"
+ }
+}
diff --git a/package/package.pro b/package/package.pro
index 09c7a01..1f175d3 100644
--- a/package/package.pro
+++ b/package/package.pro
@@ -12,6 +12,12 @@ copy_config.commands = $(COPY_FILE) \"$$replace(copy_config.depends, /, $$QMAKE_
QMAKE_EXTRA_TARGETS += copy_config
PRE_TARGETDEPS += $$copy_config.target
+copy_json.target = $$OUT_PWD/root/etc
+copy_json.depends = $$_PRO_FILE_PWD_/etc
+copy_json.commands = $(COPY_DIR) \"$$replace(copy_json.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_json.target, /, $$QMAKE_DIR_SEP)\"
+QMAKE_EXTRA_TARGETS += copy_json
+PRE_TARGETDEPS += $$copy_json.target
+
wgt.target = package
wgt.commands = wgtpkg-pack -f -o homescreen.wgt root