dynamic update applist
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>
Thu, 22 Nov 2018 05:30:38 +0000 (14:30 +0900)
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>
Thu, 22 Nov 2018 05:30:38 +0000 (14:30 +0900)
14 files changed:
.gitignore
launcher/launcher.pro
launcher/qml/Launcher.qml
launcher/qml/images/images.qrc
launcher/qml/images/sdl_active.svg [new file with mode: 0644]
launcher/qml/images/sdl_inactive.svg [new file with mode: 0644]
launcher/qml/images/webbrowser_active.svg [new file with mode: 0644]
launcher/qml/images/webbrowser_inactive.svg [new file with mode: 0644]
launcher/src/appfwhandler.cpp [new file with mode: 0644]
launcher/src/appfwhandler.h [new file with mode: 0644]
launcher/src/applicationmodel.cpp
launcher/src/applicationmodel.h
launcher/src/main.cpp
package/config.xml

index 567609b..684dcbc 100644 (file)
@@ -1 +1,3 @@
-build/
+build
+*.pro.user
+app/config.tests
index 7fd1319..1130052 100644 (file)
@@ -18,7 +18,7 @@ TARGET = launcher
 QT = qml quick dbus websockets
 CONFIG += c++11 link_pkgconfig
 DESTDIR = $${OUT_PWD}/../package/root/bin
-PKGCONFIG += qlibwindowmanager qlibhomescreen
+PKGCONFIG += qlibwindowmanager qlibhomescreen libafbwsc
 
 include(../interfaces/interfaces.pri)
 
@@ -26,12 +26,14 @@ SOURCES += \
     src/main.cpp \
     src/applicationmodel.cpp \
     src/appinfo.cpp \
-    src/applicationlauncher.cpp
+    src/applicationlauncher.cpp \
+    src/appfwhandler.cpp
 
 HEADERS  += \
     src/applicationlauncher.h \
     src/applicationmodel.h \
-    src/appinfo.h
+    src/appinfo.h \
+    src/appfwhandler.h
 
 OTHER_FILES += \
     README.md
index 6756589..7ad3f38 100644 (file)
@@ -59,6 +59,14 @@ ApplicationWindow {
             height: grid.cellHeight
         }
 
+        Connections {
+            target: appfwhandler
+            onApplistupdate: {
+                console.warn("applist update in Launcher.qml")
+                applicationModel.updateApplist(info);
+            }
+        }
+
         MouseArea {
             id: loc
             anchors.fill: parent
@@ -67,15 +75,15 @@ ApplicationWindow {
             property int index: grid.indexAt(loc.mouseX, loc.mouseY)
             x: 62
             y: 264
-            anchors.rightMargin: 0
-            anchors.bottomMargin: 0
-            anchors.leftMargin: 0
-            anchors.topMargin: 0
             onPressAndHold: currentId = applicationModel.id(newIndex = index)
             onReleased: {
+                if(loc.index < 0) {
+                    return
+                }
                 if (currentId === '') {
                     pid = launcher.launch(applicationModel.id(loc.index))
                     if (1 < pid) {
+                        homescreenHandler.tapShortcut(applicationModel.name(loc.index))
                     }
                     else {
                         console.warn("app cannot be launched!")
@@ -83,7 +91,7 @@ ApplicationWindow {
                 } else {
                     currentId = ''
                 }
-                homescreenHandler.tapShortcut(applicationModel.name(loc.index))
+                //homescreenHandler.tapShortcut(applicationModel.name(loc.index))
             }
             onPositionChanged: {
                 if (loc.currentId === '') return
index b3a1cf6..64b5f9c 100644 (file)
         <file>video_inactive.svg</file>
         <file>browser_active.svg</file>
         <file>browser_inactive.svg</file>
+        <file>sdl_active.svg</file>
+        <file>sdl_inactive.svg</file>
         <file>blank_active.svg</file>
         <file>blank_inactive.svg</file>
         <file>plus_active.svg</file>
         <file>plus_inactive.svg</file>
+        <file>webbrowser_active.svg</file>
+        <file>webbrowser_inactive.svg</file>
     </qresource>
 </RCC>
diff --git a/launcher/qml/images/sdl_active.svg b/launcher/qml/images/sdl_active.svg
new file mode 100644 (file)
index 0000000..efe3fe7
--- /dev/null
@@ -0,0 +1,140 @@
+<?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="HVAC_Active"
+   x="0px"
+   y="0px"
+   viewBox="0 0 300 300"
+   style="enable-background:new 0 0 300 300;"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="blank_active.svg"><metadata
+     id="metadata3708"><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="defs3706" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1002"
+     inkscape:window-height="778"
+     id="namedview3704"
+     showgrid="false"
+     inkscape:zoom="0.78666667"
+     inkscape:cx="-90.254237"
+     inkscape:cy="150"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="HVAC_Active" /><style
+     type="text/css"
+     id="style3659">
+    .st0{fill:url(#SVGID_1_);}
+    .st1{opacity:0.4;fill:url(#SVGID_2_);}
+    .st2{fill:url(#SVGID_3_);}
+  </style><switch
+     id="switch3661"
+     transform="matrix(1.3314132,0,0,1.3314132,5.608242,5.2107165)"><g
+       i:extraneous="self"
+       id="g3663"><linearGradient
+         id="SVGID_1_"
+         gradientUnits="userSpaceOnUse"
+         x1="65.307999"
+         y1="229.46629"
+         x2="205.7616"
+         y2="-158.244"><stop
+           offset="0"
+           style="stop-color:#0DF9FF"
+           id="stop3666" /><stop
+           offset="9.208472e-02"
+           style="stop-color:#0DF9FF;stop-opacity:0.853"
+           id="stop3668" /><stop
+           offset="0.6264"
+           style="stop-color:#0DF9FF;stop-opacity:0"
+           id="stop3670" /></linearGradient><circle
+         class="st0"
+         cx="109.1"
+         cy="108.7"
+         r="101.9"
+         id="circle3672"
+         style="fill:url(#SVGID_1_)" /><linearGradient
+         id="SVGID_2_"
+         gradientUnits="userSpaceOnUse"
+         x1="-106.5709"
+         y1="410.58551"
+         x2="166.1564"
+         y2="28.7673"><stop
+           offset="0.2978"
+           style="stop-color:#FFFFFF;stop-opacity:0"
+           id="stop3675" /><stop
+           offset="0.3685"
+           style="stop-color:#FAFAFA;stop-opacity:0.1007"
+           id="stop3677" /><stop
+           offset="0.4554"
+           style="stop-color:#EBEBEB;stop-opacity:0.2245"
+           id="stop3679" /><stop
+           offset="0.5508"
+           style="stop-color:#D2D2D2;stop-opacity:0.3603"
+           id="stop3681" /><stop
+           offset="0.6523"
+           style="stop-color:#AFAFAF;stop-opacity:0.5048"
+           id="stop3683" /><stop
+           offset="0.7585"
+           style="stop-color:#828282;stop-opacity:0.6562"
+           id="stop3685" /><stop
+           offset="0.8689"
+           style="stop-color:#4B4B4B;stop-opacity:0.8133"
+           id="stop3687" /><stop
+           offset="0.9806"
+           style="stop-color:#0C0C0C;stop-opacity:0.9724"
+           id="stop3689" /><stop
+           offset="1"
+           style="stop-color:#000000"
+           id="stop3691" /></linearGradient><circle
+         class="st1"
+         cx="109.1"
+         cy="108.7"
+         r="101.9"
+         id="circle3693"
+         style="opacity:0.4;fill:url(#SVGID_2_)" /><g
+         id="g3695"><linearGradient
+           id="SVGID_3_"
+           gradientUnits="userSpaceOnUse"
+           x1="-47.346401"
+           y1="263.00369"
+           x2="269.0914"
+           y2="-40.3484"
+           gradientTransform="matrix(1,0.00546456,-0.00546456,1,-2.3177,-2.7461)"><stop
+             offset="0"
+             style="stop-color:#00ADDC"
+             id="stop3698" /><stop
+             offset="1"
+             style="stop-color:#6BFBFF"
+             id="stop3700" /></linearGradient><path
+           class="st2"
+           d="m 108.5,213.9 c -0.2,0 -0.4,0 -0.6,0 C 49.9,213.5 3,166.1 3.3,108.1 3.6,50.4 50.7,3.6 108.4,3.6 c 0.2,0 0.4,0 0.6,0 58,0.3 104.9,47.7 104.6,105.7 l 0,0 c -0.3,57.8 -47.4,104.6 -105.1,104.6 z M 108.4,7.2 C 52.7,7.2 7.3,52.4 7,108.2 c -0.3,55.9 45,101.7 100.9,102 0.2,0 0.4,0 0.6,0 C 164.2,210.2 209.7,165 210,109.3 210.3,53.4 165,7.6 109.1,7.3 108.8,7.2 108.6,7.2 108.4,7.2 Z"
+           id="path3702"
+           style="fill:url(#SVGID_3_)"
+           inkscape:connector-curvature="0" /></g></g></switch><image
+     width="144.91524"
+     height="147.77542"
+     preserveAspectRatio="none"
+     xlink:href="data:image/png;base64,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 "
+     id="image4332"
+     x="75"
+     y="78.81356" /></svg>
diff --git a/launcher/qml/images/sdl_inactive.svg b/launcher/qml/images/sdl_inactive.svg
new file mode 100644 (file)
index 0000000..dcc077a
--- /dev/null
@@ -0,0 +1,83 @@
+<?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="Connectivity_Inactive"
+   x="0px"
+   y="0px"
+   viewBox="0 0 300 300"
+   style="enable-background:new 0 0 300 300;"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="blank_inactive.svg"><metadata
+     id="metadata24"><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="defs22" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1794"
+     inkscape:window-height="836"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.78666667"
+     inkscape:cx="-241.52542"
+     inkscape:cy="58.474576"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="Connectivity_Inactive" /><style
+     type="text/css"
+     id="style3">
+    .st0{fill:#FFFFFF;}
+    .st1{font-family:'Roboto-Regular';}
+    .st2{font-size:25px;}
+    .st3{letter-spacing:6;}
+    .st4{fill:url(#SVGID_1_);}
+  </style><switch
+     id="switch5"
+     transform="matrix(1.3314132,0,0,1.3314132,5.608242,5.2107165)"><g
+       i:extraneous="self"
+       id="g7"><g
+         id="g9"><g
+           id="g11"><linearGradient
+             id="SVGID_1_"
+             gradientUnits="userSpaceOnUse"
+             x1="-47.346401"
+             y1="263.00369"
+             x2="269.0914"
+             y2="-40.3484"
+             gradientTransform="matrix(1,0.00546456,-0.00546456,1,-2.3177,-2.7461)"><stop
+               offset="0"
+               style="stop-color:#00ADDC"
+               id="stop14" /><stop
+               offset="1"
+               style="stop-color:#6BFBFF"
+               id="stop16" /></linearGradient><path
+             class="st4"
+             d="m 108.5,213.9 c -0.2,0 -0.4,0 -0.6,0 C 49.9,213.5 3,166.1 3.3,108.1 3.6,50.4 50.7,3.6 108.4,3.6 c 0.2,0 0.4,0 0.6,0 58,0.3 104.9,47.7 104.6,105.7 l 0,0 c -0.3,57.8 -47.4,104.6 -105.1,104.6 z M 108.4,7.2 C 52.7,7.2 7.3,52.4 7,108.2 c -0.3,55.9 45,101.7 100.9,102 0.2,0 0.4,0 0.6,0 C 164.2,210.2 209.7,165 210,109.3 210.3,53.4 165,7.6 109.1,7.3 108.8,7.2 108.6,7.2 108.4,7.2 Z"
+             id="path18"
+             style="fill:url(#SVGID_1_)"
+             inkscape:connector-curvature="0" /></g></g></g></switch><image
+     width="144.91524"
+     height="147.77542"
+     preserveAspectRatio="none"
+     xlink:href="data:image/png;base64,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 "
+     id="image4332"
+     x="75"
+     y="78.81356" /></svg>
diff --git a/launcher/qml/images/webbrowser_active.svg b/launcher/qml/images/webbrowser_active.svg
new file mode 100644 (file)
index 0000000..6bb1ac5
--- /dev/null
@@ -0,0 +1,368 @@
+<?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="HVAC_Active"
+   x="0px"
+   y="0px"
+   viewBox="0 0 300 300"
+   style="enable-background:new 0 0 300 300;"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="sdl_active.svg"><metadata
+     id="metadata3708"><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="defs3706" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1002"
+     inkscape:window-height="778"
+     id="namedview3704"
+     showgrid="false"
+     inkscape:zoom="0.78666667"
+     inkscape:cx="-90.254237"
+     inkscape:cy="150"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="HVAC_Active" /><style
+     type="text/css"
+     id="style3659">
+    .st0{fill:url(#SVGID_1_);}
+    .st1{opacity:0.4;fill:url(#SVGID_2_);}
+    .st2{fill:url(#SVGID_3_);}
+  </style><switch
+     id="switch3661"
+     transform="matrix(1.3314132,0,0,1.3314132,5.608242,5.2107165)"><g
+       i:extraneous="self"
+       id="g3663"><linearGradient
+         id="SVGID_1_"
+         gradientUnits="userSpaceOnUse"
+         x1="65.307999"
+         y1="229.46629"
+         x2="205.7616"
+         y2="-158.244"><stop
+           offset="0"
+           style="stop-color:#0DF9FF"
+           id="stop3666" /><stop
+           offset="9.208472e-02"
+           style="stop-color:#0DF9FF;stop-opacity:0.853"
+           id="stop3668" /><stop
+           offset="0.6264"
+           style="stop-color:#0DF9FF;stop-opacity:0"
+           id="stop3670" /></linearGradient><circle
+         class="st0"
+         cx="109.1"
+         cy="108.7"
+         r="101.9"
+         id="circle3672"
+         style="fill:url(#SVGID_1_)" /><linearGradient
+         id="SVGID_2_"
+         gradientUnits="userSpaceOnUse"
+         x1="-106.5709"
+         y1="410.58551"
+         x2="166.1564"
+         y2="28.7673"><stop
+           offset="0.2978"
+           style="stop-color:#FFFFFF;stop-opacity:0"
+           id="stop3675" /><stop
+           offset="0.3685"
+           style="stop-color:#FAFAFA;stop-opacity:0.1007"
+           id="stop3677" /><stop
+           offset="0.4554"
+           style="stop-color:#EBEBEB;stop-opacity:0.2245"
+           id="stop3679" /><stop
+           offset="0.5508"
+           style="stop-color:#D2D2D2;stop-opacity:0.3603"
+           id="stop3681" /><stop
+           offset="0.6523"
+           style="stop-color:#AFAFAF;stop-opacity:0.5048"
+           id="stop3683" /><stop
+           offset="0.7585"
+           style="stop-color:#828282;stop-opacity:0.6562"
+           id="stop3685" /><stop
+           offset="0.8689"
+           style="stop-color:#4B4B4B;stop-opacity:0.8133"
+           id="stop3687" /><stop
+           offset="0.9806"
+           style="stop-color:#0C0C0C;stop-opacity:0.9724"
+           id="stop3689" /><stop
+           offset="1"
+           style="stop-color:#000000"
+           id="stop3691" /></linearGradient><circle
+         class="st1"
+         cx="109.1"
+         cy="108.7"
+         r="101.9"
+         id="circle3693"
+         style="opacity:0.4;fill:url(#SVGID_2_)" /><g
+         id="g3695"><linearGradient
+           id="SVGID_3_"
+           gradientUnits="userSpaceOnUse"
+           x1="-47.346401"
+           y1="263.00369"
+           x2="269.0914"
+           y2="-40.3484"
+           gradientTransform="matrix(1,0.00546456,-0.00546456,1,-2.3177,-2.7461)"><stop
+             offset="0"
+             style="stop-color:#00ADDC"
+             id="stop3698" /><stop
+             offset="1"
+             style="stop-color:#6BFBFF"
+             id="stop3700" /></linearGradient><path
+           class="st2"
+           d="m 108.5,213.9 c -0.2,0 -0.4,0 -0.6,0 C 49.9,213.5 3,166.1 3.3,108.1 3.6,50.4 50.7,3.6 108.4,3.6 c 0.2,0 0.4,0 0.6,0 58,0.3 104.9,47.7 104.6,105.7 l 0,0 c -0.3,57.8 -47.4,104.6 -105.1,104.6 z M 108.4,7.2 C 52.7,7.2 7.3,52.4 7,108.2 c -0.3,55.9 45,101.7 100.9,102 0.2,0 0.4,0 0.6,0 C 164.2,210.2 209.7,165 210,109.3 210.3,53.4 165,7.6 109.1,7.3 108.8,7.2 108.6,7.2 108.4,7.2 Z"
+           id="path3702"
+           style="fill:url(#SVGID_3_)"
+           inkscape:connector-curvature="0" /></g></g></switch><image
+     width="144.91524"
+     height="147.77542"
+     preserveAspectRatio="none"
+     xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAACUCAYAAACTFcuQAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4gsNBy0he+6l0QAAIABJREFUeNrtnXe8nFWd/9/fZ+a2
+NJIQkhBIgVACSA1NwEKzQFhQaYKNVRErurqK6K5Zd9ey6qooKuz+LCjogq4rGEBFUCkaIRBCE0hI
+Jb3dm7l1Zs7n98d5ZuZpM7kJKfeSe3wF79w788xzzvM53/Otn68xNDLHB/t0k4yzq78Qv/9Os71t
+aGXSw4aWoDZmS8HaIj/BGGPGcYjxkT+vE8yrvHB53vk9s7VDqzYEIq7q1SuCgLeHLwMzrkKM2Nrn
+JG7AaC85fnJjiz0xBKI9cHygT8cQcISJ44GPbu91JK4j4K/hkbf4O0320BCIXu6Sp1vTcq0MV5GP
+mfHuHXz5X5PnmlIvfTe02vN7yprm9zQQBXluoMRZ2I7fQIJzrcQ5+RzPAYcNSaKXybhSmpIv8qvI
+jKcbjNzJq9ojx98AXJk3fa/NlgyBaDCa6EW9UuJKjFEGb96OSxSB/wO+CfQAHwHeCjRt43V+KdEO
+YAG3XZ+3O4dANJCBI53kihwZSpqZZly+HZdZB3wfuB5YnvjbvsCVwIeBvbdjtX8tx704Fn6n1e4Y
+AtFAUpaLOjUHrU683Yw3GjH/Tn/HfOC7wE+Arq28txW4CLgGOHw7LLoHzJgtcOTZ9DQ8+Qez0hCI
+dvG4SMqNh9EAlHkUMWU7LlMGfgVcB/xxe/R04I2hi+Cs7VDEewweUpn3WQubitBxo1lx0BkrgxVE
+E+FQSiygxALEpG38eEeo6xwEvGU7AQTggDnA2cCh4TW7tuHzLYJTyPMnSizI9fKaIUm0k8cHSroc
+8bbwxkcCp6b2duNpPQ98G/h/QGc/jx5s21ZpH+DvgQ8B+2+jZJoHrDNxy/XN9uMhEO3A8f6+0jtN
+uRkYpwGn1cDSn6lJwO+9lLA54evE1OPgi4LGgLKDIAjfpUZAVeRraQbOBz4OnFT9g1Hn9hX96UGT
+3Q/gxKrvtdp1QyDaniHZVX3lC0SuNWd8QtJxjZ5dxswKwC3hEfN0SkglPmMBSP6PKsP32tJf9O7u
+bppzzVUtwCyCqaybUPX7TkV2NcabgZzHkWqYUgJfUaCZLXHiWoCuTdz+44nWOQSiBuPyDRtGDRsx
+djJAYMW8ufw9GOO2fkrFHsILwI3hv039WYDKg/tec7CNEtJDwQzk+iMdORC40uB9wGht4/o4lV8v
+y7/Y1czym806hhTrjDF8xNgzctL8nDTflH9Etk2+mAeAi4FDgC8jNvXn1HMSG5qNDU3bvp/WN8GG
+JlDZ9fcjLwDXSEyRuBpYsk0Py3Jzcmj+iL5ttwRf9pLofT3lDwt7l3mT/cD6ynIKFb3A/wBfA1uQ
+qVxnfEwSQS6gJAh64cZRL20Z3tPVRT7fVlXBFFONGp6jAXAOcHXaRWAZt1691guCzQAm3XlDW+6f
+9lgQvaer/I9mHG7YTNCRjc+b2FgF3ID3Kq/v9ywt8D+7Xm5sbd3h87myUwQ5cAHgXMatx5So5DgW
+n8v0DqA1U+/PWg6zRZLuN1h9Y1vu0y97EL1LGt3U694Z2Wvvl3Roo5tKLPm8UFH+GVCM2V8ZHzYD
+ZGD+Dd3FgB+P3DVTvkhiTI/Lxk2WcKoJzonyOtOHDMYpy/CzzAe5VhZ8Aefo7AtuumW0bXpZgeg9
+BU1wOQ432N/kbuqfsqvKruvDe5W/DvbnTCO++jo8PDx6wgMh4L/adu+pfWWPkIT3TRqocs8RC63i
+XqghrSXU8T4JvCKOP6PROsj0rhy5ZeHLRTe22bJBC6LzVq4cNnLffVvautzFoO81vokQArUVWQv8
+APi2wYrszVvZvuHSmnkrKTD+uy03ID0X7+0Wcg4LDCeXkk4WmaRqUzsV+BQwy//VkIWwk9Xer8pf
+w08LhH2+e1jwjeI6ireNt8Kgs8722WvCP7Z1lReAvtDQJRQ9tsRjiPcB0/ABzhX13lv5WQr/Oeiz
+HO3d7QPW/dXTCnkLcM5FJpCeX2KODwr+TnCoKqGVypwj849dQ1Xn6NVtXeUFI4e7/xw0kuiKQun7
+wIRQMhyGdEB9L21Vd3ESc/CB0Hsscu6bMhxwMeMrh3JlKINTDz8cMYLBMN61aRNB82hE2Usbi+g9
+VgFA0vFY/b+9EO8EPoExWRkGaUpXxFYLPWoB3ZTtvnVbgh/cMcm6BgyI3rauc998a/OHQuB8ADQ6
+pv1ZUpZUV6bdsB96fYelytQ6qaNmB4gy04Y3MdsGcUaLxBWFIliOwOszKUW8jpMd8wlyFwAfE7yy
+vuYe+1AfsifB3SejN8jlb/p+qz27W0B0aWfnpDbXPANsn7I0LTC+tLWvMVTB1nOI64H/NuiqYEqN
+bszMK6cmjBw/GJHj5Tiu6CzVQCRlroUifqSIN2om8BGDyxTmzlsKfVaNs6j28j+QPVqi/NSPR7Y8
+uUtAdMWGrsml5rYRAe61yP29wfGyDF+Gpb7IAfcC35RPn1DKnFc2eLycN+RK/GhUK3vCeOeWEhaV
+KEbaV5Dww4Yvp2FcZfBeYGyWME/JKQNh33XkvgVAnp4ft9ninQaid3YUfwmc400hcqCAxiDaAvw0
+PLL+ljUpayCAnUTrqCbmzZvHvJkztzkvYzAfc1cC3T0QlMsRJSm9dilflF+iEYjLgI+ZMYNMPSl2
+qbIZ5fDF4z8a1XTiDgXRRVJuWKF0pxxjMQ6iklFYffKZB9Ei4L+QbgA2x2AP2dGJ6MbL+Rcb29dz
+x6RJ7KnjSom+HlBvEZqakCthLvSieWM/4iXL1CEDsDPMFxrMytJQk3aLiS7B0wAun/+7nwy3VdsF
+ordt7jvO4IMACgIzdClS29YvZA+ArhP8L4TIbqAmRt2CVtkKrsxPRrcwNDJOgvYSmMOlsqIsQ6eM
+Ru4M4Bjg/UJvB9os7qJNASJ0L9xqohDAd340unlev0D0tg3FU5TXTBNHG7w7+SVpE9u7P4BbEV8B
+nkzpcoorQBYVxxZOPjB+PDI/hJJ+jss7SgRycWU55mysY6f5ZzEe4wqDj2w1tbi257/vjPn+Z3v2
+5tFNv02B6K0be4/CgjF505XyZ2nsbhQ9cmpgWInP2/k2YkNcLgqZ1RV3VkW64+bRrUOoeAnj0k19
+5CsLGtQxULJHK3A5Pi3lyBT66l7Efmc5/r3s1H3LXs1/tQs2afQww3DFX5qpYaJ4RDSGgVD9FCgp
+JlSzfDrmE7eiu6HouGX8EHh25Hj76tW4ljHILFRTxTakgp6KT0l5M9AP/4kws4WOrhPtsk19T5o0
+MhRxjZ5qL3A78DXD5iZPXBrakgYYrqV2XK1ugz/YED3SjrboLt/YTbmtjaC3N3wulnEyKcP3VD01
+puOLM98DDK/vuhRAEbOFdtnG3nZglOofh6uBHwHXCVZmRzAaxDUMpByS43/2bh560LvqiGvv82db
+GQxHdvw/7h6waK6wMQp4F+gfEFOVdN1V/XpWsLdu8CBKnodh+cqNoJuAnopDwuo5rCoftajFJcwc
+t4xpG3qquxNQ6zqxXN4/kwyFKQaiqJzxPt5K9uWngNOSsshEwS7d0NsOGpWh05sSEiaWsKm4GRCr
+VAAsDz8dNXjN9EtW90Kzql5TZwG3jW0a1GB6y9oemnM1q0hRtGQa+Fk6SiKWIivYpet72gWjttcR
+WdWYzVi4eAHzjj9+UC/0RWt7wCBnAaKW76PAlxJVxrpxLYNXp5s9m0s/fE0VSTIlc27ZanFcTZcq
+2CXrvSTKiBBbfess7gfaMrYFFsJdBw9uRfkiiWBjL3JenYiHcmJbF5dr4baxg3e+r5VoWwgcBCM2
+9mJKquBbB1GYt1Swi9b1tFsjSZQVYTerxZDl+J99Brep/qbVW8jn8n5GQVA/0JmyZhyU4baJg1vn
+u2BTNy3lHI4yJmt0simJMxGCSDDKqlm/VR+DKaEJma/SAzNuG+TAuXB9byLVQhk/ZbkswvdUjoDK
+XgoCfrH34A7VXNLRgyvKB6tylk6xRKrl70Z0ogvX9njrLL3dMo6zHL8YP7jN9AtXd6IgF4FLw3Eq
+MBsYg09L/SlQylJFpZp5YyZ+vs/glk5v6hC53p56hW9RmBTyfoPV9/E0zhQbPE64C9d2+5yk8LWo
+e4AHiHOAz2EcH1m6m4Av4+vdviXYmFlcGAqoC9d2+0v2tnLb5MG5cGr0i8iU8jWJpfRBmEgbG0xL
+MVPiwLDyqntFN2oJwrKduqMZcQnwWdAhEU9H9D37hpLpE8AtQj5HShErNeFHI9/FRRtFex/0TRhc
+XnqVGzz0SBZB4JLlBin1e3AKn8mruij1dVPq66a52afW1pnOSHyuzWLgJolDlHxjpLIiHCMEVwqe
+QtxOI5a0wCj19TDcehi7rofBPZQhe0VelXSCekIssntLg2ATXbC622fWREtoEuUQfik0EfiowfuB
+UUoQW6cdcWkrFQgE5wHnIebhJdOtkKTMC9M0BG9a3QUYvxwEFl183VRX48nHF0b9PBwH1jh/VRfI
+sCDywOof6tPwHItXAm2Kpq5kmRX9nrtm4klDvxoWan4bwvSYxKWEuGB1J5L41b4jBrTcyUzLjeU0
+m9eJGnq9TQMSR2dtFG093UTVOTnVK40AOBJfp3UZ0U4CanjmPw+8Hs9p/SOkM6JpvqasagMmgmZj
+fBrPWPJl4OlYmKjCHGIB562slX6V8447x48YUCiKVIWE28xiqcwCAoXWmULxpXCCqvyvUl05QFD0
+xg1i1toehnV3+QBv9T5d+P+qloR6PUinCt0u9LjQOyTykbdE/in6b7mkoyUdImmxpBWSzhSMlPhW
+5TOV2Hjss9Xf0SLxDoknJX4nmCVh0fc4qToHQ+RLxqy1PZy5YgDwV3VQw4GEUw0LLrJeIAJl1PDW
+xUxx97Pj5vt6sKLLliLx+z8LT3z1AF5vsX4YDBuBk4EpwIKMvxdCJbwZuLSft2yh4n0Hniv7SqCt
+3s63YpnhuaaBIoj64z3BZr1YaDesXwFYo4nb99v1zsbzVhRiSrFZXbWlkrYwG1/M19+n3C5fSfrH
+qhZgRi7BVOBKLlmyFIC9GnQHsC3nUIWs4jp8inHsZsIaTRQYv540bPc4G1eIsnVX4xZkqI2VjWWz
+lhfasSiIIumIiUO/bHDXfsN3mYPw3BWd/jbMGlqNYBUaln8CDq45MSx7S9XQ1wd6oxn3IZPMi2kL
+DKOXOybFa//OXNFBW5DLkmYWKtb/i9nkut+ZfgQVprevAk+kdkYIqAqWuyjz+/1H7ZLlP3OFaEuX
+6mfZHgU7d3mhHWMUijIKZEsiZ7bTQXTmmgItpTDA61ycayWdRzASuALxKaxWtZCWUKmplIHLQbeB
+OTMveZAIrL1fdW6zXuysRvst1BHCr5mEzwTNpM+DODdRZDwQKuFzIvUx1STAiiBQEKBykbumjN7p
+IGpVZyontrYXLCxSsoKds3xLO/08zhTsHBCds7K75pPw2mfdGwn/Mh54v8FHBaON7KCpso+89wLf
+x8yF6WbM2f+lda46d3kXmFfwI6k5Iwy+Jq8DZXviLO75De/3eeDbgv8GujJdc2Y4M6ws1NvDXQfv
+vXNA5DqTvBwZmdEq2BuXZYEoathFJpnbsSCauXIl+zXtS6k7crNqiOQDgKtlXIlo25paWKHbCy/5
+cUzXmcIAapDjrv13rL5xzootVH23qkqeFnll/D+iK1ovLhUpi24Hfgh81SocTZbWOJxzNA8bQU8Z
+fjvRdiiIWlxXLZejjvg0UyHor+m+Myz8CeVRlLoL9QPANdXjKMGPBM/Jl7W0sbVP1H66NrSm/tM5
+K5Wa85Sa8xSH7XiPcVd7N+XmfKxSXF7v+Qq+DOd0QbeiTFZ1SK6AvfBzXeS94JyUIsAKW0YUuwsE
+xR3Pka6oMyjDqFWoF9gbljaSRHF5YPmXJonOWrSRXHMT5gJkzivMkXpgI0HuVKWZs1kx8yzKZJD6
+XXUKXwc+Y4F1m3x5dm9rJ38YP56dPV63WlhfV2T1orlHMsSRwF1ej6sVM0fXOuoEjsR2H7Bkibqv
+uMBVrCgHxVyOeycPe8mSqKncGZGOYf5DSndWwV6/dEuYT2R1lO+INqqAe6ZtH4het2QzFuTDCgJl
+xaGiZGHnAp8GTumPEyZxne8AnwDrRsICuHvKSHbneMPSQqi4p0jTpwK3GZyQLe0zSYyRl07XETa6
+Sb4r2tTGEHdPHbWdICpkOrDjD0uFoOKhroSpYx7qhFf3pQxXDmqeZJfhMfbe81kSDyPukDglei/J
+e8r4+eeIMYgPStbtEL0lt9sBBHD31BH8ZspwXCUxvsa1uFTiRIkxEt+PHVeqhUcy1mG6xDclViK+
+ETL0V99XDUsIRMDZSzp43eJt5bHcQrZnn9QRF5Bw+cdCBoqHQ17SyBme6zL+v6r+EoYREKV4RibV
++3LhPxKfrj4UlFe40ibRFAScsayHs57b/NJ3wQ4Yv5s6gt9MG0nZ4ueVjM2CdyNaEdciUutDfMNV
+xijB1RKLEbcjneIT7iosBz4cZIAFOc5Y1sMZL3Rvk8s6Riyqmq5U+efC3Z9S6sSOTyW6Z+oI8qUR
+bMmNZEtuZFqR9HP+teBk+SK5O4gLnZi4Tt2ruFBineAPgkmVgGfeFQmacpz67HoGyvj9lBG8ONWv
+RefwEf6U8xPpRXwxjO9dqojek206VH+upKQ8CDwieLsqGRrhWjnk1yIobguG0t+nND7s7BfavWJt
+CZKpBHWV/31uu3Wi5Dh7cQFnLqKjWZZ78GDggyFpWFtM+aZRtoYBmgtcYrC0Qo9jAM7xu+mjGUjj
+7EWbcblmzJWStVqGzz74rWCCYZmxByNaZlFdj8XmU3lvBDYlM1td2MOtbHDvtFEZOlEH1kfMgLEM
+TVaiYGctam9XJOwRnUDqZoMdB6LqzS7ZUruvMJWjnnMR728ZW9d5l61oPw9cSCWgauFjcL5i474D
+Bw6gzlxcwGsxYTWJi81lqsH/yRNVNeb6iC9Che7wa8Bzqc0nVcvefz99VAxE9KWsrFh3tzAaVbAz
+F7VXK2AtRqIcBZH/KcjldziIouP0FwoElP3OqsaOIoVLVuUh/DjGISTCCMn9Ut23HphLBOcbLKBy
+/dAmFjnumz5yQEmnMxZ2YEFGjyLZOPPe7POzdk41bSlWc2/Il/POsZArPBuAlTiOYc2hhyv+HTUF
+rYbigp2xcHMiAFtz+Pqbqt1hOZfnT9N2fgD2zBfWINdWk4fpmEYlWn8tMf7m9LbMqMXbCPYWUCxi
+7wIwiS0bRjHv+IGTB/za5T0EfX1USMNqvEO04ft+zK54mayhe9jnmYem/6PANwgb7SRDKt58Dmlp
+4nycSjNoqWCnL9xcdTY2jjiAy+8aEMWk06IOcM4vYPZbtpGcqTraw938p6itVGoSw1r2AgZedcZr
+F7Vj8tpdUOH19t74d+H1n20dy4FvAf9F2D+t3n7MPM5CSRS4bbHEdkNOmpX6KDe14PLNjfpeXCyY
+Efa96KbOnJQOK/xB0CO4JLRwyBehd0s7xS3tsGjAdMgEoJQXRausRdVx2QfcKMgJTg83BzR4rpHf
+TRb8h2C5PAgP25qFlgx7SGCvfn5zmJQWDfDHA7AWijQn8aeDx+y+nbi4A5UrYYQ052nonh+PeL+w
+DxvaO0uoKhHtrOUM6734ZLGyYV6ih8r+Hw8eWBbdqxcVMLlaaXuMM0pTwe4QHFkNRFeOvCztoPbC
+Ce419E3g17U0e4t6V2JqmEHBXv3c5naDUamQiNUyMmq5XbsXRFUwLWwn2rfXkl3K/R5owXQx8Bng
+0JQTzeqc2X58HOx6pN6aXuU3VwD88ea9YLYNGDAFlENLLiSZqKm14wz9EDg3BYhoolK2s2Q+8F3g
+JrCeZO1HhI22YK96dnO7WTYrSIQtq4rD7lKRh48YP7B25XObqT3m1MOtKOGxWFw/G1x/EfjXyhFJ
+BExyolwK+PMRew0cnem+xWj/sd6bXFXCATQC+AKei3Frek9yrAnBdD2wLuOTBTvt2U3tYBmtdLOb
+REaV9U4LmHfoqIEDpufbvQUCdcI09iovZTiPbev19nXgn4FCPH01R68rY7kyc3dCYthLGa96tr1m
+WdWWoik0QH7W2Eed2YS5CyOdGiAVgnpKmOA2wXHJr3BhBp9DtGYR5u/GsWzFRtpH7YWrr1jfHybk
+Hx56cnv6aVR8TLBFcAswrna9Ms2IJjfwSNxzzaNoH7VXcjMV8TndObwSvi2dGIdRByx26t821fKJ
+TFl2/l3AFwX3Z2XWWRhpfvCwMQNmAU/9W6dvpAeYK2IKarOpeKy9/jce33riA2Djqg7KrI4+YVJP
+uDn/F3gvxsbIkVElf3/w0IGjhJ+2aCMuBLk5lywxNy8o7JfA5ApLZ8r9Xe3BZlUjKzIKdsozm2pM
+aXWqR8PPP4D4MlanzVSYsSzZgNITZi7aSEvRq0ZBeMwp3aGwUi1yrcGMrGTiOq0OHgB7G2hplCJL
+eAaSVas3s+T0AwbMWpz0xBpyTS0EoQM5IaXGCW4GXtdvYv2KTnTKM5vCpLStj/CCC0BfBW4BS51n
+zrvCqq/+fNjYAbOIpzy7CSvXvNMZI1TCdU3oxOyf+g0Pgy4CWxqVXJW0FALHnw8dN3DOOolTnm2n
+UqgQyUMHXz/3FeCqfl6sYCc/s7HdZKP6Q0NbrcT2x14lu+4G4lGW+NHhAopOzDtyYPlZTvnb5rAk
+qRJHS4FqJj7gezlYrk5jVeLNW3kBeBNiQap+zHlnemCOhw4fM0DXIsr4ppbQmvtKzc5Kt8w2qWAn
+P72xHSXI0JNyLIavRJxcLAX+E/MlLllKviwgGLEXq0pLWHLAAQNqAU/+2yZwatQT4ECwj4SOyGEN
+7eLavNeFFuDcLFlnw8ewrgcWDjC23ZOf2QTOYUGMECwAXg12J6RblRn4ao9k9lqYePTBTHkUfw/A
+VPmWnEuAzxE21FNk05pzqGMzE7oHljQC6OrtJWgKKNdn1XlB8FHEVMQ1JMuesz+3D/AXPLXMK2O+
+OWeoYzN7920ecGuhdkfQnEtOygF/IOzzkV4fYSc9taEdbFQqncL/J4fPxbmZWHCzoauuAx86+BK+
+L0hCqNVusBwY8waIzvTK5cIVInnIztV7a0UJ/zQZsaY6ymgf8A7gtppL2RAOw+jta2f+sQNHQs9c
+tJF8T9j3Ki1C0jrRiU9uiJQMZbUBqR6IrwHuJFbz1ZAJqhOf9/JVsBVZ9yELqnGfh48cWM66E55a
+BwQpEvTEwXQO6GqSJdOW2GCRfQO6HPg5ZuWw3VO4BKGaWy4x7+h9dvv8T3ymA8qlNIjioSVfAXvC
+kxvq6URWp4zoNcAdGCPiLWpSMZXoLvwZxr8TZtYlt6v/KoOyTyp+7KiBo3ie8PQGH2+qBHyzwk3G
+ccDVYcJcvmGLjNrfPo4PJfQm3yBnWA4ePmLMbgWRoiBSpWl1KpO0YMc/UQdEje1aA04EfoNPqejP
+cPhW5rPxSVF1DmajnDfogceOHT1guk+f+Mw6VMpVuxvWoW4+AJ/b9J4sHaKO3K4LpnLOCCRcby+P
+HbfvLgeRKxWT962MeSTKqPtf6iHEXInRgqMRa/oROwgQ5yEeAW5HnJz5PQa5kiPX5DhqQWHASKS/
+zhjHqi2ddDSPoSM/BpeN7cV4Psj9QjC9mGGTJMfX8D10v0KE40iIXNlB2RE0tcB99+16RbvOfcdf
+C5u5YEPYqqqeJKodacIIAk8ikJFneCjwO9DkpAulgWCr0Kn8OvPbwyPPCR47amDpTMc+sY6c+WaA
+DQqHm4FL8L3Cjuhf7oC+hU/7LVTV0SBcDgdFjAVHj90lkqhc6ouoxHEnmdUOjoIdt2C991hr68dZ
+WTkeP2YMxzyxiUDlSue9pJCeCtyJcXjKkKvHzi8ew6dd/NwHd9Kk7KoeIwGPHT1wvODHPb6WkLaW
+mI4YX0ozdGbIDnJeqkN3rM1p1Xfyc+D9mK2PFTBWQhYm5h+58xTwGc90MKyv6Lve1fKvlKLCMQp2
+7Pz17dTJJ0puHBeCqDKOeXIjQUm1gGUcdpPCY2tmv6j4/Xc9gfEVIj00kkD01RsBcuLxYwZOKOG4
+BevCVQ2ocINXswjjhtqxeP7sy6DG3mtWx5g2/mhwmZL+qTDzUgaut8gTx0/c4SBq6ytGKtpiNlnE
+plDBjn1sfbss2SAmRbkR/pSPgagKpsfWYhakSDrCMQ6ffnBG1mlVJ8S3GF+NcCOox78/0dLFajl8
+5fzePHXEwPH+vuKJDTQ5pfixLWYnaxpwFdhVWcZJfOMbwEMhmJZaQprLgQsgcDD/+Xvh4ot3CIha
+e/uSO12WsPXNVLBjHlvfrqhOFOVTS80sG0TJcfRj68LQWaUiwQCNM99k5Y3Qnxwew4w1oK9LfItK
+SCV6o5G0hM7hXiotfAy4eOAA6pj562r8z6rcc2wLhQ17+Udgf0uEm2QJlUG+GFPGgmpFbOQ4DFyR
+LSMnsvDmf4HZs18SiFqqIBKW8hWbL7A0PCvIjh7lYl9Y2hIb6wXnyKcc/Kqf1sEEiS/hQyrX1nMn
+CBheWM/wzvUcdfC6AaWAW3PedzVUgoSi9pYOfCD7IMS7BauSxA0JQoKDgceBRYLD4hwFwlme4YX1
+HPl3H95xJprqVH0oQkwaK9IXDShF+lcz9OSJ+zH/2PGUXNkTVcY5LjYILpAYKfHfilOtRHioo6wk
+7CPx7xLLBd8Q7FslandUy40riVNHPrqWV8wfGAQOjx0+hvnHjmf+seNxYcZAhc7HRVIwJaYL3gBM
+TK5JJZM0nKrP3BTPIqUBV3UMOo5csPYlAkhV4VNZ69p3RTg2j5y3NlSs41aWJeoBAMoBPH3Mtifp
+H7lgDVbKVXtcg7BaDkubwVcFH8g24qI6RfWY6pVnaP03g+VJraOi0Tnnc5uE48mOfeD0XX/MveLR
+ddXtasrSGWwa8GnBu/H9Duv6a8KxHDjb4NksB3o04ODM8dSx47f7OGvq7k0SaERKhqqrXrBXzFtb
+TUqzDN0uOgGX2z4QRce0+xYzYq8RNTW59gUqjA9xAAASN0lEQVQtIb/iP2e6izLcvYKiwU/l3QN/
+S3sOQuOakCZBjqKKPHf8pJ0KnKMeX025lItZ7ZXVtFrMabLEZ4G/tzBUUk1BzdYYy8D5gjnVd1hk
+DSMVwr2B8dxLtFxnPNNBvquXeFBeynD7FeyICIiqgiL5YyiWdgSIouOIR9ZUmx0SUKnUaAI+IV/i
+Ui8tNSl1ncEcjM8jHknFTKOsrWZYU0BP50YWnnzwDpvLpEdWMsblsbYc1u1QoHo+sXEYnwg92q2p
+lCSR1Qr8WuA/IFkZUdmKDrOAJ4/bcX6jGc90kOvqDo2B+CNIpJcVArm4tlQv6rEzeMZyTaKLJrqo
+eX4FxVCy5IFLY/eSVPJq9G+B4DzBw4LfSZyS5aev0Aqqr0xL047NbdqLZiwH9JVxOcWVUP/dYyU+
+J1gk8SnJAwji+mBUQAt+KBgmXyhRzmpZ16Uc3Wqi2LWDH06Hd+xGmehiKKqsqQM77OE1YaJ+ihjI
+SHqWgKdP2DmFi4c+uo5cFRURh5Mph7gQ7GZQLqrz1MCVJog28yEVUSssIGHJVA4PM+Op47dvFx/+
+yJqa595i0ZrKlw4HPgRcQ5iwZ0kPUNSI9r+bL3QuCQdjlcM+rCwplxzPnjRxpzyPGXM7CHLdyfBW
+VnJwwQ57eE29RP1IMmwNTzsLRJVxwBNraOuN1o3H0jTfiHcP5LJPChIKtgDmC/4TuMWgrMjfomLZ
+mWEOXJ/x7GlbB9SMh9eEjfoUKSWKrpZn6xD2L/guj1l7Mnm37QavD1ne4mYOYXRF0IdYePyEnfoc
+ZsztwII0iKqKTq1xRMFm/HVNtWQoVXJmcd2tZMbCE3ZRCfVscfis9cgJh6uy41PLabrTogly8dSm
+1FFs8BTGl4X9FFSKlthVuQaqeUNGyXIsOrEW9D3oLxvIWdlD2YEFsZhS9DubgCtCA2E/1bNS0ryB
+78VTCif6hXrSKeWg1Bew8ORdE4ieMbcDs+50eCFtPhbs0LkhiCIuyTgXSMQ82JUgSoxD/rI6jHNW
+S7l9TpNxj1RLobCta+JL8GXR/6Wwxj7rI77hSz7yzF1K1iU4LgPgLXiD4KB+1vqD593+GBFyO1Uj
+tOLZEyfulvWeMbcDrHsr3gbvsbZD566JpYJENJKooYbhc6J3F4iqutNfV4XMFhYNKB8J/BaY0NgE
+iHmhVuIbuNxoDcuJrQEiq4b2WwSftzo513XS0e4BLhJsNiKUPmH64HMnTtit6+xB1FV1O4gk8Wf1
+6C4EKVf2LrTOtmcUgxYU5KJyQYIFgomCowUrG5FbRf5Nkk8IWyJfpTKWOutQj5pZcFZoEd5GGIJo
+9Nnw9ytDQq6zibCTOYAgB5aDYGBwHFSMj4a4ENjBf1mdUqxTnc8qH8gFu10SRZ2W+WHDyYXOk6Aa
+WAHEVOBuYEajNKbEBimY10m+okRGYsbnThH8O/Da+oIu9buyGedL3BnzWpjIkaO3uYklxw6c3PL9
+5nYwjK7acWQRZ6NiVlfBDvrz6lQ+Ufw4q3WMH0ggSo6D566p9huLAGOqoTvChiyZXrwMNFUKC/4N
+T18cPeJPBD6LL0xMHv/11TDvmf4SVnEWhvxBGM+fNGFArud+cztoUxREiQOpNvFCviKTIkS/1R2t
+AXeY1R+Vh3HQ3NX+bPAH+FLEUfgEuf8DTqhZcIqsQyql9R1Ib8Unx30pbMk623wNnqU9xqrzmtvx
+ZdgFVMsCkRkLT5o44NdU8WxAUmXRoWlq0/+8uh1VFOtkUVF8lMix9JTxDIYx/c8vevO4SvVmII0D
+bgZ7XWPej9jGCVuO1EixrI4Uirx6AXQGsNRClldZwAuvnMBgGfvN7aDVdSb16FTLI5NtvWnezujz
+sSvGop5JWNBMsTwM+lzFdb9e8HrBGMGcfs4tUAarWh3lvYBviT4dWApQliiW23hh1HoG3ehHrpkQ
+eRfTIzJSGo2GnREH7DjdWBhZjAMfXIULrJJAtRljFmIMno/wEpnqFV+mxE80wb5quRhvQ7oFMykk
+2PHSeyIrXmUMxiFFC10z1qWSQHDAg6v8cZbw+CrMT7UYhAKcxLLT9mWwjmkPrfTMaQFhVpiB93x/
+g7Dpr6JeqBAhaZdzaHKIG0EfJqAPBZ5VIy9eeOV+g3aN9n9oOXk1YWk5rQxXe8GmPbCq6mxUltaY
+PgQBo0iOF08dz2AeUx5a7Xt11RIcWvDhimuzjq/EgjwMnAO2vlI0sOzUfQf1eux3/wqaglxomKi+
+/RpDhBVs2gMr29WojLqOWK9ILZfLs+KUwQ2myQ+uxsJUlDBs0oL4JPD51KKYrRF6leB57ysJWHrq
+xEE794l/WkWz5yHMpJ8i3i9eGX8r2NT7V4bVHinXvMXNu2z5ZMDStsgOPN4GL5puFZMnrfKOS68M
+NCE+hCfxKpnpAiebs7xt38E9T4BHHgFmMqV7la95a8ggE20VmZp3wSbf/2K7KZJPVFOMzgTuI1Em
+ks4MsPgNBE0sP22fQbu2+/9lLTmV6AOaqnUJygtc0GSuVHK8+Kr9BzeAbhX7T1yFmSLUOVuzKrJB
+JFGw/f/0om/LkO0DkXwO8I9FpXVpLGcmLZ5UCSIGrHj14NYRJj+w0lcnUAbKLH/NlEE7l0n3vojl
+jMDCenTbpu7QJ+HbYr05Q0sq2P5/fLGdDBBljI8D1wt6s3t7ppSH6k3KiRdPH+S7dxDrPHl5l4NF
+k8NSQiYTAKciPkUkzJN8n3kQhTpRSoIJsljCzGotCuoHG1O/LyvATKx6zaShJ7srwPP75ZDLk6uY
+6daA107RlGM1AReAfdJruDUidEypcnaDgk3644tPmzTSM8qrta5RFy0A91f9Ocb7gfXUg2lKOIme
+kv+KDcETcPrpQ097R4377mPvloOoJHu2FHsTwWhlPKEYXcMIsL8HfRyYknyK2VwnQVHSC0GhyZ1G
+G8c409yGN5m+yoWCdYL78XQyWx3OGc1BL81BL/tw0NCD34FjQv5wmvuM5r5emvt6q49MDR5n+Ld9
+8PlUS/BNB6ck31P3Gq68LGgecUoVbPvct+KYnDEG6RywS4DJ20bPH+/6vDUdK3pKyow1p+83hITt
+Ac99SzHLhX6ebGdfHRBMD/Xcd2G09TeyJbOfgW4EUC7fteZVE+emvnXivUuPgNxMmcZgNtWkj9VA
+lAgYZfu3NyIijXr74U8JWxiYM1afOQSm/ozx963EcLVnQtzYUf3z6Bh8TnecpLS+g7Hytx/I9LjD
+zVt3+tQHtq68VFB+/5oDrdT7T3jD8GJEWzaVceYNe+5m4zYwlyWbqiVB1V8FOJM/qcuOtRsLcPER
+Q4ipAOfe5dVORoEaU9tlPKVTgU+BzaI/O1uUzVgkNM9kvVZ216963ZRHoL8acMo5dWtu/LhT7kaM
+xaN/iiJ9v/oxIgypDbmvw5vyLGAOYeWAcrGVjefsvWci59bl7DMhgD4wc5FWqtlelYqrrror4RyD
+fwJOVP/OuvYAW+QCepG7q1guXrfp7OntDQ+S7doRv1v2XQX2nlC9z6WLybOPOoN/lG+h3Rvralv1
+YZDRrMVQINavnwwXMWAoiXfuENx6G3AR48YtI6j0a1OtT0uyCjghhZpNXAJ8VsYhmV6b6Gd81bGT
+4UB3rTtzyt9ty91u1xMZ99tlk1y+aUzgSm8x+Jet+ATSPLTiOuAzmAqxxtci84D2mRjCOdhw9pSX
+PYT2+f0yn5UpB0G8ZWqs2Y+l9uwYfDrL1Yh9k9LGYh6amhIVsv18r5Rr+rZTd2HzmQcu3ekgqoy9
+7lw2vamFE4VNNemL2TiqKeMxaeN/9gypFV9TVmejyF0q2pbWxIazXl6AGve7ZTXPslyEZMbix1Xk
+t2EYan/gEyRI2Ku+oAi1TfQZKRdca3JLAMrOntx09uQntue+d8jZMOzuJfu25XIfiVz1bUj71/uy
+jPP8odBaWFrv2E5/1nCCAIdKIwavziSx9z0rcHJhR8TGKktiHQ43+JTgMow8qv9gVRFbRjuy7/p9
+qG+tf92UlS91CjtFwRj72xVfw9zhiBnAtP7ehCpN50Jfk7GVzu3h78smAoxeK9F51oEDHjcjfrOa
+5qCvKl0to/duFEUZNbgnYXwGUbW0lOFtkWI8wGsEjxms3XD2lHfuyPnsVC117G+Wz8b0Xpk1+4oS
+NVfLTGJWRooZfKP5uvY/Kn6i14kBqXrNnrBxWXOL2Hz6wGrQxwPrGFbopMkgsCCjlCuZyB2zIwzs
+9ZI+h3Gyxel36jh3bRPQHR57d2583eT37oxpBTtzzTay8SvFIDhK4kqJZxJSPMmKGsMfPpepB9/W
+IIid5XVMXAmaCWjGsL6BZ8WN7u6mJTCi8MlcgrjqkpO4TOIZibvA90SJEHzFMjpi15T7bDEIjuoL
+gqOC7tZ/2Fnz2iUrvdevl45RvnywBbmRgWgD+5nQcOpL8Cxjr043nvoTq0SfN79h9yrgY+5emlnJ
+t5WOVs14uplr8cWXGe+1zKxVzK4QWl5qck91nn7A6p09v12/XW94pGnM1HFXyoJmyV0Fdsg2XuEL
+eDq+QiPwWWxn1pDorEjh9Ts3+DvyvpVYhI0+SFB5NrpXfKehfwD+AWOvLJ2ojoa+ziz4IoCK+mH7
+rKmbdtUj3a0yf+TdSz9pcER4IzOQ96ome6ZE24ZESKWuk/gMUKiS0EWS5Wq0dFRTQH1tmd+9Dii8
+YeoOnU/rb5bQLF/xGqRS1BU3uwnbqtcQMl7Yv5rxTqBFoa6T6cetXCewJyXfO85gdfsbpn5qdzzH
+AaM4jLpr8Vsx+yQKhoE7JFXtFNUj43/6X+B9iPXxnheRul/V0vAq73EyFOQoq0jPG7dfAW+9azE5
+a/ISx5VSjV7qS52qF2ganlF/Vtodn5Y9IdvwYoN2YT/seMPUb+7uZzfgtM9RcxafJLOHKoXeipgt
+DdIaMN8+/BJgqbZhkrKEROpvWCUUCyPvXtbPcuMU+I82X337yq1+ppo75s0woYsL5077xUB5ZgPP
+hLnjkWHDgwnTyVlAufhRMzsf785vCKLIiPma+uGbqgaVJOjsycObt54PPnzOYiykh4l7kOv7tcLT
+9lTgRhKsall8bBHjv2jiUQX5a+TY0NnZt4yLGwdF92wQRcawO5ccK2x6gFrwVSdnRJ3+CS6i5IQ2
+EvqaKjtZSnpjkmXino5YKgNG57nxY67tjkUEFjLlBzUfjZcORqwZXrQixiyQmGXoO8B+2Qy2lnWI
+zcf4KpIjCNZ2rnYPcsUBPQPtOQ2akHjbXUveHEgnIY4KG6k0ZFOMiJk+zPekFzirshDEP5zR3C5h
+OAc+h8fqHz1VoVYrh8nhwznXgY2upy0lGWaFPSTTAwH8rfPcA34w0J/NoMuraJmz+A05x8dktBp2
+EKZ9pbQmk5XOK/i41fE16SUuiNI+ng/hKfla+/kk1iAWIQqGbu4878CbBsszGbTJOcPuXrKvSnwa
+eHPItD8W0dwYRtXxReALQoWYyd1vJSrbQypoM3Qt8GnP4JkFtAi1vFnZ0LrwyJtTEl/rmzXtmcH2
+LAZvhtdsBRy7fjhNm1thBK3l7jnACdEuPYlWB1kP9DvANWBbtoqTCoOlMq5p7C3xHeBiox7JIRFN
+rPKWYEV30HKcf9HcS2FsJxdbeQhEu2k03bXohMDZaMp2laE3k+FXSqbVRByav5J4D2brs5nvE1ld
+VStfEwx+IjgrygRlEe7niqadIA57QAGfN9HTM+vA+wf72r/sck1b71j8WjnNJAfIDpJ0ldVRYlJ9
+1Kzma2qkJwmmmvgVcHS9lUzi0LCfSpoHAeTc872zDrz95bLmL++E5V8vOayp7K4xszxwIVJzPz/5
+gkJfU0KCzEDMAQ7MRGWq/RFg9n9IHQ53Y+n8gx58OS7znpD1Drcub2tqKd0DGmG+kfHeSC2xIyoV
+mLLQ16Tz8KGw2wmdnomQObHzyqwEdCBWABSdnc+bDljycl7ePQNEUd3pl4s+GnIIHBJdhpjLMar7
+SHWPqKS/J3zPRkO3Fy846Io9ZU3zexqIit2lnzBcd6Gm5jxchrgmyZMjJZh0s4oG4v9Bxg/K8HVw
+Zcp07ElrusdJotj4+bMzcrmmE4Smmyc12J4l/BbwcNmVn+ItBz+6Jy7jng2iqs60aEqQ14cj59nb
+ERNStpY/5roQN4DKAC6wm7hg+hN78vINgShjBL9YdL2Mg0CHA/uH5v86TI8J28zjyy9n9umloZUa
+AtHWxy+e/2oolQDdw1sOvnxoUdLj/wPaSDrGQq6emwAAAABJRU5ErkJggg==
+"
+     id="image4332"
+     x="75"
+     y="78.81356" /></svg>
diff --git a/launcher/qml/images/webbrowser_inactive.svg b/launcher/qml/images/webbrowser_inactive.svg
new file mode 100644 (file)
index 0000000..e4a87aa
--- /dev/null
@@ -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: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="Connectivity_Inactive"
+   x="0px"
+   y="0px"
+   viewBox="0 0 300 300"
+   style="enable-background:new 0 0 300 300;"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="sdl_inactive.svg"><metadata
+     id="metadata24"><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="defs22" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1794"
+     inkscape:window-height="836"
+     id="namedview20"
+     showgrid="false"
+     inkscape:zoom="0.78666667"
+     inkscape:cx="-241.52542"
+     inkscape:cy="58.474576"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="sdl_inactive" /><style
+     type="text/css"
+     id="style3">
+    .st0{fill:#FFFFFF;}
+    .st1{font-family:'Roboto-Regular';}
+    .st2{font-size:25px;}
+    .st3{letter-spacing:6;}
+    .st4{fill:url(#SVGID_1_);}
+  </style><switch
+     id="switch5"
+     transform="matrix(1.3314132,0,0,1.3314132,5.608242,5.2107165)"><g
+       i:extraneous="self"
+       id="g7"><g
+         id="g9"><g
+           id="g11"><linearGradient
+             id="SVGID_1_"
+             gradientUnits="userSpaceOnUse"
+             x1="-47.346401"
+             y1="263.00369"
+             x2="269.0914"
+             y2="-40.3484"
+             gradientTransform="matrix(1,0.00546456,-0.00546456,1,-2.3177,-2.7461)"><stop
+               offset="0"
+               style="stop-color:#00ADDC"
+               id="stop14" /><stop
+               offset="1"
+               style="stop-color:#6BFBFF"
+               id="stop16" /></linearGradient><path
+             class="st4"
+             d="m 108.5,213.9 c -0.2,0 -0.4,0 -0.6,0 C 49.9,213.5 3,166.1 3.3,108.1 3.6,50.4 50.7,3.6 108.4,3.6 c 0.2,0 0.4,0 0.6,0 58,0.3 104.9,47.7 104.6,105.7 l 0,0 c -0.3,57.8 -47.4,104.6 -105.1,104.6 z M 108.4,7.2 C 52.7,7.2 7.3,52.4 7,108.2 c -0.3,55.9 45,101.7 100.9,102 0.2,0 0.4,0 0.6,0 C 164.2,210.2 209.7,165 210,109.3 210.3,53.4 165,7.6 109.1,7.3 108.8,7.2 108.6,7.2 108.4,7.2 Z"
+             id="path18"
+             style="fill:url(#SVGID_1_)"
+             inkscape:connector-curvature="0" /></g></g></g></switch><image
+     width="144.91524"
+     height="147.77542"
+     preserveAspectRatio="none"
+     xlink:href="data:image/png;base64,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
+"
+     id="image4332"
+     x="75"
+     y="78.81356" /></svg>
diff --git a/launcher/src/appfwhandler.cpp b/launcher/src/appfwhandler.cpp
new file mode 100644 (file)
index 0000000..9df6d7d
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2018 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 <unistd.h>
+#include <sys/types.h>
+#include "appfwhandler.h"
+#include "hmi-debug.h"
+
+AppFwHandler* AppFwHandler::myself = nullptr;
+
+// called when pws hangsup
+static void _on_pws_hangup(void *closure)
+{
+    if(AppFwHandler::myself)
+        AppFwHandler::myself->on_pws_hangup();
+}
+
+static void _on_pws_reply(void *closure, void *request, struct json_object *obj, const char *error, const char *info)
+{
+    HMI_DEBUG("AppFwHandler", "%s called,error=[%s], info=[%s], obj=[%s]", __FUNCTION__, error, info, json_object_to_json_string(obj));
+    if(json_object_is_type(obj, json_type_object)) {
+        struct json_object *obj1, *obj2, *obj3;
+        json_object_object_get_ex(obj, "icon", &obj1);
+        json_object_object_get_ex(obj, "name", &obj2);
+        json_object_object_get_ex(obj, "id", &obj3);
+        if(json_object_is_type(obj3, json_type_null))
+            return;
+        QString icon = json_object_get_string(obj1);
+        QString name = json_object_get_string(obj2);
+        QString id = json_object_get_string(obj3);
+        QStringList info;
+        info << icon << name << id;
+        emit AppFwHandler::myself->applistupdate(info);
+    }
+}
+
+static void _on_pws_event_broadcast(void *closure, const char *event_name, struct json_object *data)
+{
+    HMI_DEBUG("AppFwHandler", "%s called,event=%s, [%s]", __FUNCTION__, event_name, json_object_to_json_string(data));
+    QStringList list = QString(event_name).split('/');
+    if(list[0] == "afm-main" && list[1] == "application-list-changed") {
+        struct json_object *obj1, *obj2;
+        json_object_object_get_ex(data, "operation", &obj1);
+        json_object_object_get_ex(data, "data", &obj2);
+        QString oper = json_object_get_string(obj1);
+        QString id = json_object_get_string(obj2);
+
+        if(oper == "uninstall") {
+            QStringList info;
+            // icon, name, id
+            info << "" << "" << id;
+            emit AppFwHandler::myself->applistupdate(info);
+        }
+        else if (oper == "install") {
+            // call state
+            AppFwHandler::myself->detail(id);
+        }
+        else {
+            HMI_DEBUG("AppFwHandler","data error");
+        }
+    }
+}
+
+// the callback interface for pws
+static struct afb_proto_ws_client_itf pws_itf = {
+    .on_reply = _on_pws_reply,
+    .on_event_create = nullptr,
+    .on_event_remove = nullptr,
+    .on_event_subscribe = nullptr,
+    .on_event_unsubscribe = nullptr,
+    .on_event_push = nullptr,
+    .on_event_broadcast = _on_pws_event_broadcast,
+};
+
+AppFwHandler::AppFwHandler(const char* appname, QObject *parent) : QObject(parent)
+{
+    myself = this;
+    int uid = getuid();
+    QString _uid;
+    if(uid == 0)
+        _uid = QString('0');
+    else
+        _uid = QString(uid);
+
+    m_sessionid = _uid + QString(appname);
+    m_uri = "unix:/run/user/" + _uid + "/apis/ws/afm-main";
+    HMI_NOTICE("AppFwHandler","m_uri=%s, m_sessionid=%s", m_uri.toStdString().c_str(), m_sessionid.toStdString().c_str());
+}
+
+int AppFwHandler::init(void)
+{
+    // get default loop
+    int rc = sd_event_default(&m_evloop);
+    if(rc < 0)
+    {
+        HMI_ERROR("AppFwHandler", "can't create event loop");
+        return 1;
+    }
+
+    // connect to framework
+    if (!try_connect_pws()) {
+        HMI_ERROR("connection to %s failed: %m\n", m_uri.toStdString().c_str());
+        return 1;
+    }
+//    runnables();
+    return 0;
+}
+
+int AppFwHandler::runnables(void)
+{
+    int ret = 1;
+    if(call(__FUNCTION__, "{\"info\":\"test my guess\"}") < 0)
+        ret = 0;
+    return ret;
+}
+
+int AppFwHandler::detail(QString id)
+{
+    int ret = 1;
+    HMI_DEBUG("AppFwHandler", "detail id is %s\n", id.toStdString().c_str());
+    if(call(__FUNCTION__, id.toStdString().c_str()) < 0)
+        ret = 0;
+    return ret;
+}
+
+int AppFwHandler::try_connect_pws(void)
+{
+    m_pws = afb_ws_client_connect_api(m_evloop, m_uri.toStdString().c_str(), &pws_itf, NULL);
+    if (m_pws == nullptr) {
+        HMI_ERROR("AppFwHandler", "connection to %s failed!\n", m_uri.toStdString().c_str());
+        return 0;
+    }
+    afb_proto_ws_on_hangup(m_pws, _on_pws_hangup);
+    return 1;
+}
+
+void AppFwHandler::on_pws_hangup(void)
+{
+    struct afb_proto_ws *apw = m_pws;
+    m_pws = nullptr;
+    afb_proto_ws_unref(apw);
+    attempt_connect_pws(10);
+}
+
+void AppFwHandler::attempt_connect_pws(int count)
+{
+    if(m_time != nullptr) {
+        HMI_NOTICE("AppFwHandler", "attempt_connect_pws retrying!\n");
+        return;
+    }
+    if(count > 0)
+        m_retry = count;
+    else
+        return;
+
+    m_time = new QTimer(this);
+    connect(m_time, SIGNAL(timeout()), this, SLOT(connect_pws_timer_slot()));
+    m_time->start(5000);
+}
+
+void AppFwHandler::connect_pws_timer_slot(void)
+{
+    --m_retry;
+    int ret = try_connect_pws();
+    if(ret) {
+        m_retry = 0;
+        disconnect(m_time, 0, 0, 0);
+        delete m_time;
+        m_time = nullptr;
+    }
+    else {
+        if(m_retry > 0)
+            m_time->start(5000);
+    }
+}
+
+int AppFwHandler::call(const char *verb, const char *object)
+{
+    static int num = 0;
+    if(verb == nullptr) {
+        HMI_NOTICE("AppFwHandler", "parameter is null!\n");
+        return 0;
+    }
+    num++;
+
+    QString key = QString(num) + ':' + QString(verb);
+    enum json_tokener_error jerr;
+    struct json_object *obj = json_tokener_parse_verbose(object, &jerr);
+    if (jerr != json_tokener_success)
+        obj = json_object_new_string(object);
+
+    int rc = afb_proto_ws_client_call(m_pws, verb, obj, m_sessionid.toStdString().c_str(), key.toLatin1().data(), NULL);
+    json_object_put(obj);
+    if (rc < 0) {
+        HMI_ERROR("AppFwHandler", "calling %s(%s) failed!\n", verb, object);
+    }
+
+    return rc;
+}
diff --git a/launcher/src/appfwhandler.h b/launcher/src/appfwhandler.h
new file mode 100644 (file)
index 0000000..25a401b
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPFWHANDLER_H
+#define APPFWHANDLER_H
+
+#include <QObject>
+#include <QString>
+#include <QTimer>
+#include <json-c/json.h>
+#include <systemd/sd-event.h>
+extern "C" {
+#include <afb/afb-proto-ws.h>
+#include <afb/afb-ws-client.h>
+}
+
+class AppFwHandler : public QObject
+{
+    Q_OBJECT
+public:
+    AppFwHandler(const char* appname, QObject *parent = nullptr);
+    AppFwHandler(AppFwHandler&) = delete;
+    AppFwHandler &operator=(AppFwHandler&) = delete;
+    ~AppFwHandler() = default;
+
+    int init(void);
+    int runnables(void);
+    int detail(QString id);
+    void on_pws_hangup(void);
+    void registerCallback(
+        /* can't be NULL */
+        void (*on_reply_cb)(void *closure, void *request, struct json_object *obj, const char *error, const char *info),
+
+        /* can be NULL */
+        void (*on_event_create_cb)(void *closure, const char *event_name, int event_id) = nullptr,
+        void (*on_event_remove_cb)(void *closure, const char *event_name, int event_id) = nullptr,
+        void (*on_event_subscribe_cb)(void *closure, void *request, const char *event_name, int event_id) = nullptr,
+        void (*on_event_unsubscribe_cb)(void *closure, void *request, const char *event_name, int event_id) = nullptr,
+        void (*on_event_push_cb)(void *closure, const char *event_name, int event_id, struct json_object *data) = nullptr,
+        void (*on_event_broadcast_cb)(void *closure, const char *event_name, struct json_object *data) = nullptr);
+
+    static AppFwHandler* myself;
+signals:
+    void applistupdate(QStringList info);
+
+private slots:
+    void connect_pws_timer_slot(void);
+
+private:
+    int try_connect_pws(void);
+    void attempt_connect_pws(int count);
+    int call(const char *verb, const char *object);
+
+    QString m_api = "afm-main";
+    QString m_uri;
+    QString m_sessionid;
+    sd_event *m_evloop = nullptr;
+    afb_proto_ws *m_pws = nullptr;
+    QTimer* m_time;
+    int m_retry = 0;
+};
+
+#endif // APPFWHANDLER_H
index 090a300..003fe61 100644 (file)
@@ -33,6 +33,9 @@ class ApplicationModel::Private
 public:
     Private();
 
+    void addApp(QString icon, QString name, QString id);
+    void removeApp(QString id);
+
     QList<AppInfo> data;
 };
 
@@ -61,17 +64,46 @@ ApplicationModel::Private::Private()
         auto const icon = get_icon_name(jso);
 
         // Hide HomeScreen icon itself
-        if (name != "launcher" && 
-           name != "homescreen-2017" && 
-           name != "homescreen" && 
-           !name.contains("OnScreen", Qt::CaseInsensitive)) {
-            this->data.append(AppInfo(icon, name, id));
-        }
+        if (name != "launcher" &&
+            name != "homescreen-2017" &&
+            name != "homescreen" &&
+            name != "restriction" &&
+            !name.contains("OnScreen", Qt::CaseInsensitive)) {
+                this->data.append(AppInfo(icon, name, id));
+            }
 
         HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
     }
 }
 
+void ApplicationModel::Private::addApp(QString icon, QString name, QString id)
+{
+    HMI_DEBUG("addApp","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str());
+    for(int i = 0; i < this->data.size(); ++i) {
+        if(this->data[i].id() == id)
+            return;
+    }
+
+    QString _icon = name.toLower();
+    if ( !QFile::exists(QString(":/images/%1_active.svg").arg(_icon)) ||
+         !QFile::exists(QString(":/images/%1_inactive.svg").arg(_icon)) )
+    {
+        _icon = "blank";
+    }
+    this->data.append(AppInfo(_icon, name, id));
+}
+
+void ApplicationModel::Private::removeApp(QString id)
+{
+    HMI_DEBUG("removeApp","id: %s.",id.toStdString().c_str());
+    for (int i = 0; i < this->data.size(); ++i) {
+          if (this->data.at(i).id() == id) {
+              this->data.removeAt(i);
+              break;
+          }
+    }
+}
+
 ApplicationModel::ApplicationModel(QObject *parent)
     : QAbstractListModel(parent)
     , d(new Private())
@@ -155,3 +187,27 @@ void ApplicationModel::move(int from, int to)
         HMI_NOTICE("launcher","from : %d, to : %d. false.", from, to);
     }
 }
+
+void ApplicationModel::updateApplist(QStringList info)
+{
+    QString icon = info.at(0);
+    QString name = info.at(1);
+    QString id = info.at(2);
+    QString appid = id.split('@')[0];
+
+    if ( appid == "launcher" ||
+         appid == "homescreen-2017" ||
+         appid == "homescreen" ||
+         appid.contains("onscreen", Qt::CaseInsensitive)) {
+        return;
+    }
+    beginResetModel();
+    if(icon == "") { // uninstall
+        d->removeApp(id);
+    }
+    else {
+        // new app
+        d->addApp(icon, name, id);
+    }
+    endResetModel();
+}
index 8398b62..750bf75 100644 (file)
@@ -34,6 +34,7 @@ public:
     Q_INVOKABLE QString id(int index) const;
     Q_INVOKABLE QString name(int index) const;
     Q_INVOKABLE void move(int from, int to);
+    Q_INVOKABLE void updateApplist(QStringList info);
 
 private:
     class Private;
index d79e880..8cdb76a 100644 (file)
@@ -31,6 +31,7 @@
 #include "afm_user_daemon_proxy.h"
 #include "qlibhomescreen.h"
 #include "hmi-debug.h"
+#include "appfwhandler.h"
 
 // XXX: We want this DBus connection to be shared across the different
 // QML objects, is there another way to do this, a nice way, perhaps?
@@ -128,6 +129,9 @@ int main(int argc, char *argv[])
         layoutHandler->activateSurface(myname);
     });
 
+    AppFwHandler* appfwhandler = new AppFwHandler(myname.toStdString().c_str());
+    appfwhandler->init();
+
     QUrl bindingAddress;
     bindingAddress.setScheme(QStringLiteral("ws"));
     bindingAddress.setHost(QStringLiteral("localhost"));
@@ -154,6 +158,7 @@ int main(int argc, char *argv[])
     engine.rootContext()->setContextProperty(QStringLiteral("homescreenHandler"), homescreenHandler);
     engine.rootContext()->setContextProperty(QStringLiteral("launcher"), launcher);
     engine.rootContext()->setContextProperty(QStringLiteral("screenInfo"), &screenInfo);
+    engine.rootContext()->setContextProperty(QStringLiteral("appfwhandler"), appfwhandler);
     engine.load(QUrl(QStringLiteral("qrc:/Launcher.qml")));
 
     QObject *root = engine.rootObjects().first();
index 62f99ed..0c7c021 100644 (file)
@@ -9,10 +9,14 @@
   <feature name="urn:AGL:widget:required-api">
     <param name="homescreen" value="ws" />
     <param name="windowmanager" value="ws" />
+    <param name="afm-main" value="ws" />
   </feature>
   <feature name="urn:AGL:widget:required-permission">
     <param name="urn:AGL:permission::public:no-htdocs" value="required" />
     <param name="urn:AGL:permission::system:run-by-default" value="required" />
     <param name="http://tizen.org/privilege/internal/dbus" value="required" />
+    <param name="urn:AGL:permission:afm:system:widget" value="required" />
+    <param name="urn:AGL:permission:afm:system:runner" value="required" />
+    <param name="urn:AGL:permission:afm:system:runner:state" value="required" />
   </feature>
 </widget>