add standalone wifi app
authorsrimaldia <hariasti.srimaldia-1@jp.alps.com>
Fri, 9 Dec 2016 11:05:35 +0000 (20:05 +0900)
committersrimaldia <hariasti.srimaldia-1@jp.alps.com>
Fri, 9 Dec 2016 11:05:35 +0000 (20:05 +0900)
Signed-off-by: srimaldia <hariasti.srimaldia-1@jp.alps.com>
112 files changed:
AUTHORS.txt [new file with mode: 0755]
CMakeLists.txt [new file with mode: 0755]
LICENSE-2.0.txt [new file with mode: 0755]
README.txt [new file with mode: 0755]
agent.c [new file with mode: 0755]
config.xml.in [new file with mode: 0755]
doc/AppGrid.qml [new file with mode: 0755]
doc/AppIcon.qml [new file with mode: 0755]
doc/BottomBar.qml [new file with mode: 0755]
doc/GridItem.qml [new file with mode: 0755]
doc/Key.qml [new file with mode: 0755]
doc/Keyboard.qml [new file with mode: 0755]
doc/Main.qml [new file with mode: 0755]
doc/README.md [new file with mode: 0755]
doc/Rotated.qml [new file with mode: 0755]
doc/Scaled.qml [new file with mode: 0755]
doc/Scaled_04.qml [new file with mode: 0755]
doc/Scaled_720p.qml [new file with mode: 0755]
doc/TopBar.qml [new file with mode: 0755]
doc/VolumeControl.qml [new file with mode: 0755]
doc/images/AGL-Logo.png [new file with mode: 0755]
doc/images/AppHex.png [new file with mode: 0755]
doc/images/Hex-Background.jpg [new file with mode: 0755]
doc/images/JLR-Logo.png [new file with mode: 0755]
doc/images/agl_icon.png [new file with mode: 0755]
doc/images/application_grid.png [new file with mode: 0755]
doc/images/backspace_icon.png [new file with mode: 0755]
doc/images/blank_hexagon.png [new file with mode: 0755]
doc/images/browser_app_icon.png [new file with mode: 0755]
doc/images/browser_app_icon.svg [new file with mode: 0755]
doc/images/bt_close.png [new file with mode: 0755]
doc/images/cameras_app_icon.png [new file with mode: 0755]
doc/images/cameras_app_icon.svg [new file with mode: 0755]
doc/images/dashboard_app_icon.png [new file with mode: 0755]
doc/images/dashboard_app_icon.svg [new file with mode: 0755]
doc/images/fingerprint_app_icon.png [new file with mode: 0755]
doc/images/fmradio_app_icon.png [new file with mode: 0755]
doc/images/fmradio_app_icon.svg [new file with mode: 0755]
doc/images/googlemaps_app_icon.png [new file with mode: 0755]
doc/images/googlemaps_app_icon.svg [new file with mode: 0755]
doc/images/homescreen_icon.png [new file with mode: 0755]
doc/images/hvac_app_icon.png [new file with mode: 0755]
doc/images/hvac_app_icon.svg [new file with mode: 0755]
doc/images/icon_apps_blue.png [new file with mode: 0755]
doc/images/icongear.png [new file with mode: 0755]
doc/images/media_player_app_icon.png [new file with mode: 0755]
doc/images/media_player_app_icon.svg [new file with mode: 0755]
doc/images/news_app_icon.png [new file with mode: 0755]
doc/images/news_app_icon.svg [new file with mode: 0755]
doc/images/nfc_app_icon.png [new file with mode: 0755]
doc/images/nfc_app_icon.svg [new file with mode: 0755]
doc/images/phone_app_icon.png [new file with mode: 0755]
doc/images/phone_app_icon.svg [new file with mode: 0755]
doc/images/settings_icon.png [new file with mode: 0755]
doc/images/shift_off_icon.png [new file with mode: 0755]
doc/images/shift_on_icon.png [new file with mode: 0755]
doc/images/space_bar_icon.png [new file with mode: 0755]
doc/images/switchcontrol.png [new file with mode: 0755]
doc/images/switchplate_off.png [new file with mode: 0755]
doc/images/switchplate_on.png [new file with mode: 0755]
doc/images/symbols_icon.png [new file with mode: 0755]
doc/images/symbols_off_icon.png [new file with mode: 0755]
doc/images/tizen.png [new file with mode: 0755]
doc/images/weather_app_icon.png [new file with mode: 0755]
doc/images/weather_app_icon.svg [new file with mode: 0755]
doc/images/white_return.png [new file with mode: 0755]
export.map [new file with mode: 0755]
icon_wifi_128.png [new file with mode: 0755]
imports/components/AwesomeIcon.qml [new file with mode: 0755]
imports/components/Box.qml [new file with mode: 0755]
imports/components/BoxButton.qml [new file with mode: 0755]
imports/components/BoxHeading.qml [new file with mode: 0755]
imports/components/Button.qml [new file with mode: 0755]
imports/components/DateTime.qml [new file with mode: 0755]
imports/components/HexGrid.qml [new file with mode: 0755]
imports/components/HexSwitch.qml [new file with mode: 0755]
imports/components/InShadow.qml [new file with mode: 0755]
imports/components/InsetShadow.qml [new file with mode: 0755]
imports/components/Label.qml [new file with mode: 0755]
imports/components/NumberPad.qml [new file with mode: 0755]
imports/components/OutShadow.qml [new file with mode: 0755]
imports/components/Switch.qml [new file with mode: 0755]
imports/components/qmldir [new file with mode: 0755]
imports/radio/Radio.qml [new file with mode: 0755]
imports/radio/qmldir [new file with mode: 0755]
imports/system/App.qml [new file with mode: 0755]
imports/system/System.qml [new file with mode: 0755]
imports/system/qmldir [new file with mode: 0755]
imports/utils/Marker.qml [new file with mode: 0755]
imports/utils/Style.qml [new file with mode: 0755]
imports/utils/qmldir [new file with mode: 0755]
imports/vehicle/ClimateModel.qml [new file with mode: 0755]
imports/vehicle/FuelModel.qml [new file with mode: 0755]
imports/vehicle/PositionModel.qml [new file with mode: 0755]
imports/vehicle/SpeedModel.qml [new file with mode: 0755]
imports/vehicle/TemperatureModel.qml [new file with mode: 0755]
imports/vehicle/qmldir [new file with mode: 0755]
oe-sdk_crosscompile.cmake [new file with mode: 0755]
qml/wifi-settings/components/images/back.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi1-lock.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi1.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi2-lock.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi2.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi3-lock.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi3.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi4-lock.png [new file with mode: 0755]
qml/wifi-settings/components/images/wifi4.png [new file with mode: 0755]
qml/wifi-settings/wifi-settings-app.qml [new file with mode: 0755]
wifi-api.c [new file with mode: 0755]
wifi-api.h [new file with mode: 0755]
wifi-connman.c [new file with mode: 0755]
wifi-connman.h [new file with mode: 0755]

diff --git a/AUTHORS.txt b/AUTHORS.txt
new file mode 100755 (executable)
index 0000000..cd526f9
--- /dev/null
@@ -0,0 +1,2 @@
+Milan Srdinko <msrdinko@alps.cz>
+Sri Maldia Hari Asti <hariasti.srimaldia-1@jp.alps.com>
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100755 (executable)
index 0000000..bbf3df8
--- /dev/null
@@ -0,0 +1,68 @@
+project(wifi-settings)
+
+cmake_minimum_required(VERSION 3.3)
+
+include(GNUInstallDirs)
+
+set(PROJECT_VERSION "0.1")
+set(PROJECT_ICON "icon_wifi_128.png")
+set(PROJECT_LIBDIR "lib")
+set(PROJECT_QML "qml")
+set(PROJECT_IMPORT "imports")
+set(PROJECT_DOC "doc")
+
+set(CMAKE_BUILD_TYPE Debug)
+
+###########################################################################
+add_compile_options(-Wall -Wextra -Wconversion)
+add_compile_options(-Wno-unused-parameter) # frankly not using a parameter does it care?
+add_compile_options(-Werror=maybe-uninitialized)
+add_compile_options(-Werror=implicit-function-declaration)
+add_compile_options(-ffunction-sections -fdata-sections)
+add_compile_options(-Wl,--as-needed -Wl,--gc-sections)
+add_compile_options(-fPIC)
+
+set(CMAKE_C_FLAGS_PROFILING    "-g -O0 -pg -Wp,-U_FORTIFY_SOURCE")
+set(CMAKE_C_FLAGS_DEBUG        "-g -O0 -ggdb -Wp,-U_FORTIFY_SOURCE")
+set(CMAKE_C_FLAGS_RELEASE      "-g -O2")
+set(CMAKE_C_FLAGS_CCOV         "-g -O2 --coverage")
+
+###########################################################################
+
+include(FindPkgConfig)
+
+pkg_check_modules(EXTRAS REQUIRED json-c afb-daemon glib-2.0 gio-2.0 gobject-2.0 zlib)
+add_compile_options(${EXTRAS_CFLAGS})
+include_directories(${EXTRAS_INCLUDE_DIRS})
+link_libraries(${EXTRAS_LIBRARIES})
+
+###########################################################################
+# the binding for afb
+
+message(STATUS "Creation of ${PROJECT_NAME} for AFB-DAEMON")
+
+###############################################################
+add_library(${PROJECT_NAME} MODULE wifi-api.c wifi-connman.c agent.c)
+set_target_properties(${PROJECT_NAME} PROPERTIES
+        PREFIX ""
+        LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/export.map"
+)
+
+configure_file(config.xml.in config.xml)
+
+add_custom_command(
+        OUTPUT ${PROJECT_NAME}.wgt
+        DEPENDS ${PROJECT_NAME}
+        COMMAND rm -rf package
+        COMMAND mkdir -p package/${PROJECT_LIBDIR} package/htdocs
+        COMMAND cp config.xml package/
+        COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ICON} package/icon.png
+        COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_QML} package/${PROJECT_QML}
+        COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_IMPORT} package/${PROJECT_IMPORT}
+        COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_DOC} package/${PROJECT_DOC}
+        COMMAND cp ${PROJECT_NAME}.so package/${PROJECT_LIBDIR}
+        COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt package 
+        COMMAND rm -rf package
+)
+add_custom_target(widget ALL DEPENDS ${PROJECT_NAME}.wgt)
diff --git a/LICENSE-2.0.txt b/LICENSE-2.0.txt
new file mode 100755 (executable)
index 0000000..a396b36
--- /dev/null
@@ -0,0 +1,201 @@
+                                Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
\ No newline at end of file
diff --git a/README.txt b/README.txt
new file mode 100755 (executable)
index 0000000..8565b5a
--- /dev/null
@@ -0,0 +1,34 @@
+##Wifi Manager\r
+This folder include wifi manager binding and GUI.\r
+Only support Station mode.\r
+\r
+##Function\r
+- Wifi ON and OFF\r
+- Wifi scan and display result\r
+- Connect to open and secured AccessPoint\r
+- Disconnect connection\r
+\r
+##Guidance for building Wi-Fi manager Binding\r
+A. Prepare sdk environment\r
+   - bitbake below:\r
+     $ bitbake agl-demo-platform-crosssdk\r
+   - install sdk\r
+     $ build/tmp/deploy/sdk/poky-agl-glibc*.sh\r
+B. Build\r
+   - Go to folder where WiFi Bindings source code exists\r
+   - run below command for setup and make\r
+     $ . /opt/poky-agl/xxx/environment-setup-cortexa15hf-vfp-neon-poky-linux-gnueabi\r
+     $ mkdir build\r
+     $ cmake ..\r
+     $ make \r
+     <widget wll be generated> \r
+C. Running app\r
+   - copy widget to porter board\r
+   - do install and start the app\r
+     # afm-util install *.wgt\r
+     # afm-util start <apps's name>@0.1\r
+\r
+##TODO\r
+- ADD token security\r
+- ADD event receive\r
+\r
diff --git a/agent.c b/agent.c
new file mode 100755 (executable)
index 0000000..a22dc31
--- /dev/null
+++ b/agent.c
@@ -0,0 +1,262 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   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 <stdio.h>
+#include <errno.h>
+
+#include <gio/gio.h>
+#include "wifi-connman.h"
+
+static GMainLoop *loop = NULL;
+
+static GDBusNodeInfo *introspection_data = NULL;
+
+GDBusMethodInvocation *invocation_passkey = NULL;
+
+/* Introspection data for the agent service */
+static const gchar introspection_xml[] = "<node>"
+               "  <interface name='net.connman.Agent'>"
+               "    <method name='RequestInput'>"
+               "          <arg type='o' name='service' direction='in'/>"
+               "          <arg type='a{sv}' name='fields' direction='in'/>"
+               "          <arg type='a{sv}' name='fields' direction='out'/>"
+               "    </method>"
+               "    <method name='ReportError'>"
+               "          <arg type='o' name='service' direction='in'/>"
+               "          <arg type='s' name='error' direction='in'/>"
+               "    </method>"
+               "  </interface>"
+               "</node>";
+
+callback password_callback;
+
+static void handle_method_call(GDBusConnection *connection, const gchar *sender,
+               const gchar *object_path, const gchar *interface_name,
+               const gchar *method_name, GVariant *parameters,
+               GDBusMethodInvocation *invocation, gpointer user_data) {
+       //MyObject *myobj = user_data;
+
+       if (g_strcmp0(method_name, "RequestInput") == 0) {
+               printf("Input requested\n");
+
+               invocation_passkey = invocation;
+
+               //TODO: send the  name of the network to callback
+
+               (*password_callback)(0);
+
+               GVariantIter *array;
+               gchar * object_path;
+               g_variant_get(parameters, "(oa{sv})", &object_path, &array);
+               //TODO: get only object path for now, complete parameters are
+
+               /*
+                object path "/net/connman/service/wifi_d85d4c880b1a_4c656e6f766f204b3520506c7573_managed_psk"
+                array [
+                dict entry(
+                string "Passphrase"
+                variant             array [
+                dict entry(
+                string "Type"
+                variant                      string "psk"
+                )
+                dict entry(
+                string "Requirement"
+                variant                      string "mandatory"
+                )
+                ]
+                )
+                ]
+                */
+               printf("Passphrase requested for network : %s\n", object_path);
+
+       }
+
+       if (g_strcmp0(method_name, "ReportError") == 0) {
+               printf("Error reported\n");
+
+               gchar *error_string; // = NULL;
+
+               gchar * object_path;
+               g_variant_get(parameters, "(os)", &object_path, &error_string);
+
+               printf("Error %s for %s\n", error_string, object_path);
+
+               if (g_strcmp0(error_string, "invalid-key") == 0) {
+
+                       printf("Passkey is not correct.\n");
+                       (*password_callback)(1);
+
+               }
+
+       }
+}
+
+GError* sendPasskey(gchar *passkey) {
+
+       GVariantBuilder *builder;
+       GVariant *value = NULL;
+
+       printf("Passkey to send: %s\n", passkey);
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+       g_variant_builder_add(builder, "{sv}", "Passphrase",
+                       g_variant_new_string(passkey));
+
+       value = g_variant_new("(a{sv})", builder);
+
+       g_dbus_method_invocation_return_value(invocation_passkey, value);
+
+       return NULL;
+
+}
+
+static const GDBusInterfaceVTable interface_vtable = { handle_method_call, NULL,
+               NULL };
+
+static void on_bus_acquired(GDBusConnection *connection, const gchar *name,
+               gpointer user_data) {
+       //MyObject *myobj = user_data;
+       guint registration_id;
+
+       registration_id = g_dbus_connection_register_object(connection,
+                       "/net/connman/Agent", introspection_data->interfaces[0],
+                       &interface_vtable, NULL, NULL, /* user_data_free_func */
+                       NULL); /* GError** */
+       //TODO: make some proper error message rather than exiting
+       //g_assert(registration_id > 0);
+
+       return NULL;
+}
+
+void* register_agent(void *data) {
+
+       //printf("Loop start\n");
+
+       guint owner_id;
+       //MyObject *myobj;
+
+       introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL);
+       g_assert(introspection_data != NULL);
+
+       //myobj = g_object_new(my_object_get_type(), NULL);
+
+//     owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.agent",
+//                     G_BUS_NAME_OWNER_FLAGS_NONE, on_bus_acquired, on_name_acquired,
+//                     on_name_lost, myobj,
+//                     NULL);
+
+//FIXME: ALLOW_REPLACEMENT for now, make proper deinitialization
+       owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, AGENT_SERVICE,
+                       G_BUS_NAME_OWNER_FLAGS_REPLACE, on_bus_acquired, NULL, NULL, NULL,
+                       NULL);
+       //G_BUS_NAME_OWNER_FLAGS_NONE G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT
+
+       loop = g_main_loop_new(NULL, FALSE);
+
+       //sleep(10);
+       g_main_loop_run(loop);
+
+       printf("Loop running\n");
+
+       g_bus_unown_name(owner_id);
+
+       g_dbus_node_info_unref(introspection_data);
+
+       //g_object_unref(myobj);
+
+       //printf("Loop end\n");
+
+       return NULL;
+
+}
+
+GError* create_agent(GDBusConnection *connection) {
+
+       int err = -1;
+       pthread_t tid[1];
+
+       //struct callbackData *threadData;
+
+       err = pthread_create((&tid[0]), NULL, register_agent, NULL);
+
+       if (err != 0) {
+               printf("\ncan't create thread :[%d]", err);
+               printf("Fatal error!\n\n");
+               return NULL;
+       }
+
+       GVariant *message = NULL;
+       GError *error = NULL;
+
+       GVariant *params = NULL;
+
+       char *agent_path = AGENT_PATH;
+
+       params = g_variant_new("(o)", agent_path);
+
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+       CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "RegisterAgent", params,
+                       NULL, G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT, NULL, &error);
+
+       if (error) {
+               printf("error: %d:%s\n", error->code, error->message);
+
+               return error;
+
+       } else {
+               printf("Agent registered\n");
+               return NULL;
+       }
+
+}
+
+GError* stop_agent(GDBusConnection *connection) {
+
+       GVariant *message = NULL;
+       GError *error = NULL;
+
+
+       GVariant *params = NULL;
+
+       char *agent_path = AGENT_PATH;
+
+
+       params = g_variant_new("(o)", agent_path);
+
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+       CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "UnregisterAgent", params,
+                       NULL, G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT, NULL, &error);
+
+       if (error) {
+               printf("error: %d:%s\n", error->code, error->message);
+               return error;
+
+       } else {
+               printf("Agent unregistered\n");
+               return NULL;
+       }
+
+}
+
+void register_callback(callback callback_function) {
+
+       password_callback = callback_function;
+
+}
+
diff --git a/config.xml.in b/config.xml.in
new file mode 100755 (executable)
index 0000000..b403953
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" id="@PROJECT_NAME@" version="@PROJECT_VERSION@">
+    <name>Wifi Settings</name>
+    <icon src="icon.png"/>
+    <content src="qml/@PROJECT_NAME@/@PROJECT_NAME@-app.qml" type="application/vnd.agl.qml.hybrid"/>
+    <description>Wifi Settings application</description>
+    <author>ALPS (Milan Srdinko &lt;msrdinko@alps.cz&gt;, Srimaldia Hariasti      &lt;hariasti.srimaldia-1@jp.alps.com&gt;)</author>
+    <license>APL 2.0</license>
+</widget>
diff --git a/doc/AppGrid.qml b/doc/AppGrid.qml
new file mode 100755 (executable)
index 0000000..46b7889
--- /dev/null
@@ -0,0 +1,43 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import components 1.0
+import system 1.0
+
+App {
+    id: root
+    appId: 'appgrid'
+
+    HexGrid {
+        anchors.centerIn: parent
+        columns: 5
+        spacing: 10
+
+        Repeater {
+            model: ListModel {
+                ListElement { icon: "hvac"; name: "HVAC" }
+                ListElement { icon: "browser"; name: "DNA Browser" }
+                ListElement { icon: "dashboard"; name: "Dashboard" }
+                ListElement { icon: "googlemaps"; name: "Google Maps" }
+                ListElement { icon: "news"; name: "News" }
+                ListElement { icon: "nfc"; name: "NFC" }
+                ListElement { icon: "fmradio"; name: "FM Radio" }
+                ListElement { icon: "phone"; name: "Phone" }
+                ListElement { icon: "weather"; name: "Weather" }
+                ListElement { icon: "media_player"; name: "Media Manager" }
+                ListElement { icon: "cameras"; name: "Cameras" }
+                ListElement { icon: "fingerprint"; name: "Fingerprint" }
+                ListElement { icon: "wayland"; name: "Wayland" }
+            }
+            delegate: GridItem {
+                name: model.name
+                icon: model.icon
+                onClicked: System.activeApp = model.icon
+            }
+        }
+    }
+}
diff --git a/doc/AppIcon.qml b/doc/AppIcon.qml
new file mode 100755 (executable)
index 0000000..b645ed9
--- /dev/null
@@ -0,0 +1,51 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+MouseArea {
+    id: root
+
+    width: 90
+    height: 90
+
+    property bool active: false
+    property alias source: icon.source
+
+    function click() {
+        clicked(undefined)
+    }
+
+    Image {
+        id: icon
+        anchors.centerIn: parent
+        width: 100
+        height: 100
+        fillMode: Image.PreserveAspectFit
+    }
+
+//    states: [
+//        State {
+//            name: "focused"
+//            when: root.active
+//            PropertyChanges {
+//                target: icon
+//                scale: 2.0
+//                anchors.verticalCenterOffset: 20
+//            }
+//        }
+//    ]
+
+//    transitions: [
+//        Transition {
+//            NumberAnimation {
+//                properties: 'scale, anchors.verticalCenterOffset'
+//                easing.type: Easing.OutElastic
+//                duration: 500
+//            }
+//        }
+//    ]
+}
diff --git a/doc/BottomBar.qml b/doc/BottomBar.qml
new file mode 100755 (executable)
index 0000000..0760b71
--- /dev/null
@@ -0,0 +1,65 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import system 1.0
+//import com.pelagicore.qmldevinfo 0.1
+
+Item {
+    height: 120
+
+    ShaderEffect {
+        anchors.fill: parent
+        property color color: "#777"
+        property real radius: 40
+        opacity: 0.24
+
+        fragmentShader: "
+uniform lowp float radius;
+uniform lowp float height;
+uniform lowp float width;
+uniform lowp float qt_Opacity;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+    lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0);
+    lowp float xval = smoothstep(0.0, radius, dist.x * width);
+    lowp float yval = smoothstep(0.0, radius, dist.y * height);
+    gl_FragColor = mix(color, vec4(1.0), sqrt(yval * xval)) * qt_Opacity;
+}
+        "
+    }
+
+    Image {
+        anchors.left: parent.left
+        anchors.verticalCenter: parent.verticalCenter
+        source: "images/settings_icon.png"
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: System.showSettings = !System.showSettings
+        }
+    }
+
+//    DevInfo {
+//        id: devinfo
+//    }
+
+    Image {
+        anchors.centerIn: parent
+        anchors.horizontalCenterOffset: -15
+        source: "images/AGL-Logo.png"
+        height: 80
+        fillMode: Image.PreserveAspectFit
+    }
+
+    VolumeControl {
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.right: parent.right
+        anchors.rightMargin: 40
+    }
+}
diff --git a/doc/GridItem.qml b/doc/GridItem.qml
new file mode 100755 (executable)
index 0000000..93d3031
--- /dev/null
@@ -0,0 +1,45 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    id: root
+
+    width: background.width
+    height: background.height
+
+    property string name
+    property string icon
+
+    signal clicked()
+
+    Image {
+        id: background
+        source: "images/AppHex.png"
+    }
+
+    Column {
+        y: 10
+        anchors.horizontalCenter: parent.horizontalCenter
+        spacing: -10
+
+        AppIcon {
+            source: "images/%1_app_icon.png".arg(root.icon)
+        }
+
+        Text {
+            anchors.horizontalCenter: parent.horizontalCenter
+            color: "white"
+            text: root.name
+        }
+    }
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: root.clicked()
+    }
+}
diff --git a/doc/Key.qml b/doc/Key.qml
new file mode 100755 (executable)
index 0000000..6eb5ae0
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import QtGraphicalEffects 1.0
+import utils 1.0
+
+Item {
+    id: root
+
+    width: 90
+    height: 130
+
+    property color color: Style.orangeViv
+    property alias text: textItem.text
+    property alias symbol: symbolItem.text
+    property real fade: 0.16
+    property string icon: ""
+
+    signal clicked()
+
+    Rectangle {
+        id: keyRect
+        anchors.fill: parent
+        radius: 10
+    }
+
+    LinearGradient {
+        anchors.fill: parent
+        source: keyRect
+        start: Qt.point(0, 0)
+        end: Qt.point(0, 130)
+        gradient: Gradient {
+            GradientStop { position: 0.0; color: root.color }
+            GradientStop { position: root.fade; color: Qt.darker(root.color, 2.0) }
+            GradientStop { position: 0.8; color: "black" }
+        }
+    }
+
+    Rectangle {
+        anchors.fill: parent
+        color: "transparent"
+        radius: 10
+        border.width: 4
+        border.color: Style.orangeLt
+
+        Text {
+            id: symbolItem
+            visible: icon === ""
+            anchors.top: parent.top
+            anchors.right: parent.right
+            anchors.topMargin: 15
+            anchors.rightMargin: 20
+            font.pixelSize: 28
+            font.family: "Source Sans Pro"
+            color: "white"
+        }
+
+        Text {
+            id: textItem
+            visible: icon === ""
+            anchors.horizontalCenter: parent.horizontalCenter
+            anchors.bottom: parent.bottom
+            anchors.bottomMargin: 10
+            font.pixelSize: 60
+            font.family: "Source Sans Pro"
+            color: "white"
+        }
+
+        Image {
+            anchors.horizontalCenter: parent.horizontalCenter
+            anchors.bottom: parent.bottom
+            anchors.bottomMargin: 30
+            source: icon === "" ? icon : "images/" + icon + ".png"
+        }
+    }
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: root.clicked()
+    }
+}
diff --git a/doc/Keyboard.qml b/doc/Keyboard.qml
new file mode 100755 (executable)
index 0000000..be79b75
--- /dev/null
@@ -0,0 +1,137 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import utils 1.0
+
+Item {
+    id: root
+    height: 620
+
+    property var currentString: ""
+    property bool useSymbols: false
+    property bool useUppercase: false
+
+    property var rows: [
+        ["q","w","e","r","t","y","u","i","o","p"],
+        ["a","s","d","f","g","h","j","k","l"],
+        ["z","x","c","v","b","n","m"]
+    ]
+    property var symbolRows: [
+        ["1","2","3","4","5","6","7","8","9","0"],
+        ["(",")","-","@","*","^",":",";","~"],
+        ["/","'","\"",".",",","?","!"]
+    ]
+
+    function keyPressed(text, symbol) {
+        if (useSymbols)
+            currentString += symbol
+        else
+            currentString += text
+    }
+
+    Rectangle {
+        anchors.fill: parent
+        color: "black"
+        opacity: 0.7
+    }
+
+    Column {
+        y: 20
+        width: parent.width
+        spacing: 20
+
+        Row {
+            anchors.horizontalCenter: parent.horizontalCenter
+            spacing: 10
+
+            Repeater {
+                model: rows[0]
+                Key {
+                    text: useUppercase ? modelData.toUpperCase() : modelData
+                    symbol: symbolRows[0][index]
+                    onClicked: keyPressed(text, symbol)
+                }
+            }
+        }
+
+        Row {
+            anchors.horizontalCenter: parent.horizontalCenter
+            spacing: 10
+
+            Repeater {
+                model: rows[1]
+                Key {
+                    text: useUppercase ? modelData.toUpperCase() : modelData
+                    symbol: symbolRows[1][index]
+                    onClicked: keyPressed(text, symbol)
+                }
+            }
+        }
+
+        Row {
+            anchors.horizontalCenter: parent.horizontalCenter
+            spacing: 45
+
+            Key {
+                width: 130
+                color: Style.orangeLt
+                fade: 0.3
+                icon: "shift_" + (useUppercase ? "on" : "off") + "_icon"
+                onClicked: useUppercase = !useUppercase
+            }
+
+            Row {
+                spacing: 10
+
+                Repeater {
+                    model: rows[2]
+                    Key {
+                        text: useUppercase ? modelData.toUpperCase() : modelData
+                        symbol: symbolRows[2][index]
+                        onClicked: keyPressed(text, symbol)
+                    }
+                }
+            }
+
+            Key {
+                width: 130
+                color: Style.orangeLt
+                fade: 0.3
+                icon: "backspace_icon"
+                onClicked: currentString = currentString.slice(0, -1)
+            }
+        }
+
+        Row {
+            spacing: 20
+            anchors.horizontalCenter: parent.horizontalCenter
+
+            Key {
+                width: 150
+                color: Style.orangeLt
+                fade: 0.3
+                icon: "symbols" + (useSymbols ? "" : "_off") + "_icon"
+                onClicked: useSymbols = !useSymbols
+            }
+
+            Key {
+                width: 700
+                color: Style.orangeLt
+                fade: 0.3
+                icon: "space_bar_icon"
+                onClicked: keyPressed(" ", " ")
+            }
+
+            Key {
+                width: 150
+                color: Style.orangeLt
+                fade: 0.3
+                icon: "white_return"
+            }
+        }
+    }
+}
diff --git a/doc/Main.qml b/doc/Main.qml
new file mode 100755 (executable)
index 0000000..8f92511
--- /dev/null
@@ -0,0 +1,101 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.3
+import "apps/Browser"
+import "apps/Cameras"
+import "apps/Dashboard"
+import "apps/Fingerprint"
+import "apps/FMRadio"
+import "apps/GoogleMaps"
+import "apps/Home"
+import "apps/HVAC"
+import "apps/MediaPlayer"
+import "apps/News"
+import "apps/NFC"
+import "apps/Phone"
+import "apps/Settings"
+import "apps/Weather"
+import "apps/WaylandView"
+import system 1.0
+
+Item {
+    width: 1080
+    height: 1920
+
+    Image {
+        anchors.centerIn: parent
+        source: "images/Hex-Background.jpg"
+    }
+
+    Item {
+        id: appSurface
+
+        anchors.top: topbar.bottom
+        anchors.bottom: bottombar.top
+        anchors.left: parent.left
+        anchors.right: parent.right
+
+
+        Home {}
+        GoogleMaps {}
+        Browser {}
+        Dashboard {}
+        HVAC {}
+        Weather {}
+        FMRadio {}
+        MediaPlayer {}
+        NFC {}
+        News {}
+        Phone {}
+        WaylandView {}
+        Cameras {}
+        Fingerprint {}
+        AppGrid {}
+    }
+
+    TopBar {
+        id: topbar
+        anchors.top: parent.top
+        anchors.left: parent.left
+        anchors.right: parent.right
+    }
+
+    BottomBar {
+        id: bottombar
+        anchors.bottom: parent.bottom
+        anchors.left: parent.left
+        anchors.right: parent.right
+    }
+
+    Settings {
+        id: settings
+        visible: System.showSettings
+        anchors.fill: parent
+        anchors.topMargin: 120
+        anchors.bottomMargin: 120
+    }
+
+    Keyboard {
+        id: keyboard
+        y: System.showKeyboard ? parent.height - height : parent.height
+        width: parent.width
+
+        Behavior on y { YAnimator { duration: 300; easing.type: Easing.OutQuad }}
+    }
+
+    focus: true
+    Keys.onLeftPressed: topbar.left()
+    Keys.onRightPressed: topbar.right()
+    Keys.onReturnPressed: topbar.click()
+    Keys.onBackPressed: topbar.home()
+    Keys.onPressed: {
+        switch (event.key) {
+        default:
+            console.debug('Main.qml', event.key)
+        }
+    }
+}
diff --git a/doc/README.md b/doc/README.md
new file mode 100755 (executable)
index 0000000..b01fc55
--- /dev/null
@@ -0,0 +1,23 @@
+Open source QML UI
+
+To run on target:
+$ cd /usr/AGL/CES2017
+$ /usr/bin/qt5/qmlscene -I imports Main.qml
+
+For development it can be nice to use Scaled.qml instead so it fits your screen.
+
+
+
+© 2015 Jaguar Land Rover. All Rights Reserved.
+Licensed under Creative Commons Attribution 4.0 International
+https://creativecommons.org/licenses/by/4.0/legalcode
+
+(Optional) switch shell for weston to ivi-shell and start demo apps if you want to start demo apps with ivi-shell.
+$ cd /usr/AGL/CES2017
+$ ./switch_to_ivi-shell
+(Option a) $ ./start_ALS2016_ivi-shell.sh
+(Option b) $ ./start_ALS2016_with_navi_ivi-shell.sh
+
+Option a: start QML UI only.
+Option b: start QML + CarNavigation:/home/navi. For the time being, CarNavigation expects to be Wayland native application, which will be showed on top of QML by using LayerManagerControl.
+
diff --git a/doc/Rotated.qml b/doc/Rotated.qml
new file mode 100755 (executable)
index 0000000..4eef7f3
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    width: 1920
+    height: 1080
+
+    Main {
+        anchors.centerIn: parent
+        rotation: 90
+    }
+}
diff --git a/doc/Scaled.qml b/doc/Scaled.qml
new file mode 100755 (executable)
index 0000000..c566735
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    width: 1080*scale
+    height: 1920*scale
+    scale: 0.5
+
+    Main {
+        anchors.centerIn: parent
+    }
+}
diff --git a/doc/Scaled_04.qml b/doc/Scaled_04.qml
new file mode 100755 (executable)
index 0000000..502a663
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    width: 1080*scale
+    height: 1920*scale
+    scale: 0.4
+
+    Main {
+        anchors.centerIn: parent
+    }
+}
diff --git a/doc/Scaled_720p.qml b/doc/Scaled_720p.qml
new file mode 100755 (executable)
index 0000000..86cb9b1
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    width: 1080*scale
+    height: 1920*scale
+    scale: 0.666666666
+
+    Main {
+        anchors.centerIn: parent
+    }
+}
diff --git a/doc/TopBar.qml b/doc/TopBar.qml
new file mode 100755 (executable)
index 0000000..5e0a532
--- /dev/null
@@ -0,0 +1,146 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import system 1.0
+import execScript 1.0
+
+Item {
+    id: root
+
+    height: 120
+
+    ShaderEffect {
+        anchors.fill: parent
+        property color color: "#777"
+        property real radius: 40
+        opacity: 0.24
+
+        fragmentShader: "
+uniform lowp float radius;
+uniform lowp float height;
+uniform lowp float width;
+uniform lowp float qt_Opacity;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+    lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0);
+    lowp float xval = smoothstep(0.0, radius, dist.x * width);
+    lowp float yval = smoothstep(0.0, radius, dist.y * height);
+    gl_FragColor = mix(color, vec4(1.0), sqrt(yval * xval)) * qt_Opacity;
+}
+        "
+    }
+
+    property int currentIndex: 0
+    property AppIcon currentItem
+
+    Row {
+        anchors.verticalCenter: parent.verticalCenter
+        anchors.verticalCenterOffset: 5
+        anchors.horizontalCenter: parent.horizontalCenter
+        spacing: 30
+
+        AppIcon {
+            id: homeScreen
+            active: currentIndex === 0
+            onActiveChanged: if (active) root.currentItem = homeScreen
+            property var mainScreen: root.parent
+            property bool home: System.activeApp === "home"
+            source: home ? "images/agl_icon.png" : "images/homescreen_icon.png"
+
+            onClicked: {
+                if (currentIndex === 1) {
+                    execscript.execute("./switch_off_navi.sh")
+                }
+                currentIndex = 0
+                System.activeApp = "home"
+            }
+        }
+
+        AppIcon {
+            id: googleMaps
+            active: currentIndex === 1
+            onActiveChanged: if (active) root.currentItem = googleMaps
+            source: "images/googlemaps_app_icon.png"
+
+            onClicked: {
+                currentIndex = 1
+                System.activeApp = "googlemaps"
+                execscript.execute("./switch_on_navi.sh")
+            }
+        }
+
+        Repeater {
+            model: ListModel {
+                id: applicationModel
+                ListElement { name: "browser" }
+                ListElement { name: "dashboard" }
+                ListElement { name: "hvac" }
+                ListElement { name: "weather" }
+                ListElement { name: "fmradio" }
+                ListElement { name: "media_player" }
+            }
+
+            delegate: AppIcon {
+                id: app
+                active: currentIndex === model.index + 2
+                onActiveChanged: if (active) root.currentItem = app
+                source: "images/%1_app_icon.png".arg(model.name)
+                onClicked: {
+                    if (currentIndex === 1) {
+                        execscript.execute("./switch_off_navi.sh")
+                    }
+                    System.activeApp = model.name
+                    currentIndex = model.index + 2
+                }
+
+                Rectangle {
+                    x: -15.5
+                    y: -15
+                    height: 123
+                    width: 1
+                    color: "black"
+                }
+            }
+        }
+
+        AppIcon {
+            id: launcher
+            active: currentIndex === applicationModel.count + 2
+            onActiveChanged: if (active) root.currentItem = launcher
+            source: "images/application_grid.png"
+            onClicked: {
+                if (currentIndex === 1) {
+                    execscript.execute("./switch_off_navi.sh")
+                }
+                System.activeApp = "appgrid"
+                currentIndex = applicationModel.count + 2
+            }
+        }
+    }
+
+    property int __appCount: applicationModel.count + 3
+
+    function left() {
+        root.currentIndex = (root.currentIndex + root.__appCount - 1) % root.__appCount
+    }
+
+    function right() {
+        root.currentIndex = (root.currentIndex + 1) % root.__appCount
+    }
+
+    function click() {
+        currentItem.click()
+    }
+
+    function home() {
+        homeScreen.click()
+    }
+
+    ExecScript { id: execscript }
+}
diff --git a/doc/VolumeControl.qml b/doc/VolumeControl.qml
new file mode 100755 (executable)
index 0000000..56540a8
--- /dev/null
@@ -0,0 +1,97 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Item {
+    height: 100
+    width: childrenRect.width
+
+    property alias value: shader.value
+
+    FontLoader {
+        source: "fontawesome-webfont.ttf"
+    }
+
+    Row {
+        spacing: 28
+
+        Text {
+            anchors.verticalCenter: parent.verticalCenter
+            font.family: "FontAwesome"
+            font.pixelSize: 30
+            color: "white"
+            text: "\uf068"
+
+            MouseArea {
+                anchors.fill: parent
+                onClicked: shader.value = Math.max(shader.value - 0.1, 0.0)
+            }
+        }
+
+        ShaderEffect {
+            id: shader
+            width: 85
+            height: 100
+
+            property color bgColor: "#333"
+            property color fgColor: "#b2f0ff"
+            property real value: 0.5
+
+            fragmentShader: "
+uniform lowp float qt_Opacity;
+uniform lowp float value;
+uniform lowp vec4 bgColor;
+uniform lowp vec4 fgColor;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+    lowp float x = min(qt_TexCoord0.x, 1.0 - qt_TexCoord0.x);
+    lowp float y = min(qt_TexCoord0.y, 1.0 - qt_TexCoord0.y);
+    lowp float c = y - 0.5 * (0.5 - x);
+    lowp float outside = smoothstep(0.0, 0.01, c);
+    lowp float rim = smoothstep(0.1, 0.11, c - step(x, 0.101));
+    lowp float inside = smoothstep(0.125, 0.135, c - step(x, 0.125));
+
+    lowp vec4 color = mix(bgColor, fgColor, step(qt_TexCoord0.x, value));
+    color = mix(color, bgColor, inside * 0.8);
+    color = mix(color, vec4(1.0), (rim - inside) * 0.6);
+
+    gl_FragColor = mix(vec4(0.0), color, outside) * qt_Opacity;
+}
+            "
+
+            MouseArea {
+                anchors.fill: parent
+                onPositionChanged: {
+                    shader.value = Math.min(Math.max(mouse.x / width, 0.0), 1.0)
+                }
+            }
+
+            Text {
+                anchors.centerIn: parent
+                font.family: "Source Sans Pro"
+                font.weight: Font.Bold
+                font.pixelSize: 30
+                color: "white"
+                text: Math.round(shader.value * 100)
+            }
+        }
+
+        Text {
+            anchors.verticalCenter: parent.verticalCenter
+            font.family: "FontAwesome"
+            font.pixelSize: 30
+            color: "white"
+            text: "\uf067"
+
+            MouseArea {
+                anchors.fill: parent
+                onClicked: shader.value = Math.min(shader.value + 0.1, 1.0)
+            }
+        }
+    }
+}
diff --git a/doc/images/AGL-Logo.png b/doc/images/AGL-Logo.png
new file mode 100755 (executable)
index 0000000..e869d7f
Binary files /dev/null and b/doc/images/AGL-Logo.png differ
diff --git a/doc/images/AppHex.png b/doc/images/AppHex.png
new file mode 100755 (executable)
index 0000000..6c9aa68
Binary files /dev/null and b/doc/images/AppHex.png differ
diff --git a/doc/images/Hex-Background.jpg b/doc/images/Hex-Background.jpg
new file mode 100755 (executable)
index 0000000..ac9bae0
Binary files /dev/null and b/doc/images/Hex-Background.jpg differ
diff --git a/doc/images/JLR-Logo.png b/doc/images/JLR-Logo.png
new file mode 100755 (executable)
index 0000000..50887d1
Binary files /dev/null and b/doc/images/JLR-Logo.png differ
diff --git a/doc/images/agl_icon.png b/doc/images/agl_icon.png
new file mode 100755 (executable)
index 0000000..ad36a0d
Binary files /dev/null and b/doc/images/agl_icon.png differ
diff --git a/doc/images/application_grid.png b/doc/images/application_grid.png
new file mode 100755 (executable)
index 0000000..0cc5b2b
Binary files /dev/null and b/doc/images/application_grid.png differ
diff --git a/doc/images/backspace_icon.png b/doc/images/backspace_icon.png
new file mode 100755 (executable)
index 0000000..6bc0f20
Binary files /dev/null and b/doc/images/backspace_icon.png differ
diff --git a/doc/images/blank_hexagon.png b/doc/images/blank_hexagon.png
new file mode 100755 (executable)
index 0000000..afeb31f
Binary files /dev/null and b/doc/images/blank_hexagon.png differ
diff --git a/doc/images/browser_app_icon.png b/doc/images/browser_app_icon.png
new file mode 100755 (executable)
index 0000000..9c6ec36
Binary files /dev/null and b/doc/images/browser_app_icon.png differ
diff --git a/doc/images/browser_app_icon.svg b/doc/images/browser_app_icon.svg
new file mode 100755 (executable)
index 0000000..14d0ae6
--- /dev/null
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="Browser_Icon">\r
+       <g id="world">\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <path style="fill:#FFFFFF;" d="M36,6C19.431,6,6,19.431,6,36c0,16.568,13.431,30,30,30c16.568,0,30-13.432,30-30\r
+                               C66,19.431,52.568,6,36,6z M62.082,35.032H50.475c-0.106-4.287-0.871-8.382-2.221-12.132c2.614-1.09,5.028-2.54,7.231-4.252\r
+                               C59.398,23.044,61.849,28.751,62.082,35.032z M34.93,62.076c-3.217-2.68-5.915-6.158-7.89-10.195\r
+                               c2.534-0.795,5.217-1.229,7.992-1.315v11.516C34.998,62.082,34.964,62.076,34.93,62.076z M37.066,9.925\r
+                               c3.652,3.04,6.631,7.109,8.645,11.856c-2.76,0.943-5.693,1.491-8.746,1.588V9.919C37.002,9.921,37.033,9.922,37.066,9.925z\r
+                                M40.291,10.255c5.339,0.888,10.135,3.383,13.864,6.994c-2.024,1.555-4.241,2.871-6.633,3.867\r
+                               C45.76,16.941,43.287,13.25,40.291,10.255z M35.032,9.919v13.45c-3.053-0.1-5.986-0.645-8.743-1.588\r
+                               c2.015-4.747,4.993-8.816,8.642-11.856C34.965,9.922,34.998,9.921,35.032,9.919z M24.476,21.118\r
+                               c-2.391-0.996-4.606-2.313-6.633-3.867c3.729-3.612,8.524-6.106,13.866-6.995C28.708,13.25,26.239,16.941,24.476,21.118z\r
+                                M25.559,23.566c2.982,1.035,6.163,1.639,9.474,1.74v9.726H23.461C23.565,30.979,24.281,27.104,25.559,23.566z M35.032,36.968\r
+                               v11.661c-3.053,0.094-6.003,0.593-8.786,1.488c-1.673-3.989-2.664-8.436-2.785-13.149H35.032z M31.709,61.744\r
+                               c-4.787-0.793-9.133-2.878-12.667-5.906c1.906-1.324,3.967-2.438,6.17-3.291C26.899,56.047,29.108,59.152,31.709,61.744z\r
+                                M36.969,62.082V50.566c2.77,0.09,5.457,0.521,7.992,1.315c-1.979,4.039-4.674,7.516-7.891,10.195\r
+                               C37.039,62.076,37.002,62.082,36.969,62.082z M46.789,52.547c2.199,0.852,4.26,1.973,6.168,3.291\r
+                               c-3.533,3.025-7.881,5.113-12.666,5.906C42.889,59.152,45.098,56.047,46.789,52.547z M45.752,50.117\r
+                               c-2.781-0.896-5.734-1.395-8.783-1.488V36.968h11.57C48.418,41.682,47.429,46.128,45.752,50.117z M36.969,35.032v-9.726\r
+                               c3.307-0.101,6.486-0.703,9.471-1.738c1.276,3.54,1.992,7.414,2.1,11.466h-11.57V35.032z M16.517,18.648\r
+                               c2.203,1.712,4.62,3.162,7.229,4.252c-1.352,3.75-2.114,7.845-2.221,12.132H9.921C10.15,28.751,12.601,23.044,16.517,18.648z\r
+                                M9.921,36.968h11.604c0.119,4.942,1.152,9.616,2.907,13.813c-2.452,0.955-4.737,2.23-6.846,3.738\r
+                               C13.043,49.994,10.173,43.813,9.921,36.968z M54.412,54.514c-2.109-1.502-4.394-2.777-6.849-3.733\r
+                               c1.757-4.198,2.79-8.87,2.911-13.814h11.607C61.826,43.813,58.959,49.994,54.412,54.514z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/bt_close.png b/doc/images/bt_close.png
new file mode 100755 (executable)
index 0000000..51ace79
Binary files /dev/null and b/doc/images/bt_close.png differ
diff --git a/doc/images/cameras_app_icon.png b/doc/images/cameras_app_icon.png
new file mode 100755 (executable)
index 0000000..2127f8e
Binary files /dev/null and b/doc/images/cameras_app_icon.png differ
diff --git a/doc/images/cameras_app_icon.svg b/doc/images/cameras_app_icon.svg
new file mode 100755 (executable)
index 0000000..d8d1610
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="Camera_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <path style="fill:#FFFFFF;" d="M18.552,31.609l-7.275-12.6c5.056-7.359,13.07-12.08,21.991-12.885L18.552,31.609z M8.755,23.424\r
+                               C6.926,27.371,6,31.599,6,36.001c0,4.481,1.006,8.901,2.92,12.912h14.553L8.755,23.424z M60.504,18.695\r
+                               C55.33,11.368,47.235,6.79,38.351,6.098l-7.274,12.598H60.504z M11.49,53.304c5.178,7.327,13.276,11.911,22.157,12.599\r
+                               l7.273-12.599H11.49z M38.732,65.879c8.922-0.807,16.935-5.523,21.991-12.887l-7.275-12.6L38.732,65.879z M63.078,23.086H48.525\r
+                               l14.718,25.495C65.073,44.632,66,40.405,66,36.001C66,31.519,64.994,27.101,63.078,23.086z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/dashboard_app_icon.png b/doc/images/dashboard_app_icon.png
new file mode 100755 (executable)
index 0000000..f7085d6
Binary files /dev/null and b/doc/images/dashboard_app_icon.png differ
diff --git a/doc/images/dashboard_app_icon.svg b/doc/images/dashboard_app_icon.svg
new file mode 100755 (executable)
index 0000000..ca1146a
--- /dev/null
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="Dashboard_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,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
+J8AAZyBF33xNeFYAAAAASUVORK5CYII=" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M21.141,9.952c7.143-4.077,15.258-4.9,22.621-2.927C51.176,9.012,57.832,13.827,61.974,21\r
+                                               c0.027,0.046,0.052,0.092,0.075,0.139c4.077,7.144,4.899,15.259,2.926,22.623C62.987,51.177,58.174,57.833,51,61.974\r
+                                               c-0.046,0.027-0.094,0.052-0.141,0.075c-7.143,4.077-15.258,4.899-22.622,2.926C20.824,62.988,14.167,58.174,10.026,51\r
+                                               C10,50.954,9.975,50.906,9.951,50.859c-4.076-7.142-4.898-15.257-2.926-22.622C9.012,20.825,13.827,14.168,21,10.026\r
+                                               C21.046,10,21.094,9.975,21.141,9.952L21.141,9.952z M42.592,11.403c-6.261-1.677-13.156-0.983-19.217,2.476\r
+                                               c-0.035,0.023-0.069,0.044-0.105,0.064c-6.091,3.517-10.178,9.169-11.866,15.465c-1.678,6.262-0.983,13.156,2.474,19.218\r
+                                               c0.023,0.034,0.044,0.069,0.066,0.105c3.517,6.09,9.169,10.178,15.465,11.865c6.262,1.678,13.155,0.982,19.218-2.475\r
+                                               c0.033-0.022,0.069-0.044,0.104-0.066c6.091-3.516,10.179-9.168,11.866-15.464c1.678-6.263,0.982-13.157-2.476-19.218\r
+                                               c-0.023-0.034-0.044-0.07-0.065-0.106C54.54,17.179,48.889,13.091,42.592,11.403L42.592,11.403z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M25.477,17.772c7.013-4.051,15.39-3.602,21.792,0.447l-8.057,6.356\r
+                                               c-2.232-1.233-4.799-1.936-7.531-1.936c-8.618,0-15.606,6.987-15.606,15.606c0,1.651,0.257,3.242,0.733,4.736l0.003,0.012\r
+                                               l-0.549,0.319C12.748,33.865,16.452,22.982,25.477,17.772L25.477,17.772z M53.742,24.679c0.167,0.261,0.329,0.526,0.485,0.798\r
+                                               c2.913,5.044,3.498,10.794,2.092,16.007l-9.053-2.432c0.089-1.771-0.117-3.545-0.621-5.247L53.742,24.679L53.742,24.679z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M50.839,50.84c-1.958,1.96-4.279,3.495-6.816,4.546c-2.529,1.048-5.253,1.602-8.023,1.602\r
+                                               c-2.771,0-5.494-0.554-8.024-1.602c-2.537-1.051-4.858-2.586-6.816-4.546l3.209-3.207c1.551,1.551,3.365,2.757,5.328,3.569\r
+                                               c1.969,0.817,4.109,1.249,6.303,1.249c2.194,0,4.333-0.433,6.302-1.249c1.964-0.813,3.777-2.018,5.329-3.569L50.839,50.84\r
+                                               L50.839,50.84z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M36.586,30.499l12.938-10.204c1.607-1.268,3.395,0.514,2.144,2.124L41.498,35.498\r
+                                               c0.243,2.628-1.428,5.13-4.061,5.845c-2.948,0.801-5.99-0.941-6.791-3.891c-0.8-2.95,0.942-5.99,3.891-6.79\r
+                                               C35.226,30.475,35.917,30.427,36.586,30.499L36.586,30.499z M35.326,33.569c1.345-0.365,2.729,0.428,3.094,1.772\r
+                                               c0.365,1.343-0.428,2.729-1.772,3.093c-1.344,0.364-2.729-0.43-3.092-1.772C33.19,35.319,33.984,33.933,35.326,33.569\r
+                                               L35.326,33.569z"/>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M21.141,9.952c7.143-4.077,15.258-4.9,22.621-2.927C51.176,9.012,57.832,13.827,61.974,21\r
+                                               c0.027,0.046,0.052,0.092,0.075,0.139c4.077,7.144,4.899,15.259,2.926,22.623C62.987,51.177,58.174,57.833,51,61.974\r
+                                               c-0.046,0.027-0.094,0.052-0.141,0.075c-7.143,4.077-15.258,4.899-22.622,2.926C20.824,62.988,14.167,58.174,10.026,51\r
+                                               C10,50.954,9.975,50.906,9.951,50.859c-4.076-7.142-4.898-15.257-2.926-22.622C9.012,20.825,13.827,14.168,21,10.026\r
+                                               C21.046,10,21.094,9.975,21.141,9.952L21.141,9.952z M42.592,11.403c-6.261-1.677-13.156-0.983-19.217,2.476\r
+                                               c-0.035,0.023-0.069,0.044-0.105,0.064c-6.091,3.517-10.178,9.169-11.866,15.465c-1.678,6.262-0.983,13.156,2.474,19.218\r
+                                               c0.023,0.034,0.044,0.069,0.066,0.105c3.517,6.09,9.169,10.178,15.465,11.865c6.262,1.678,13.155,0.982,19.218-2.475\r
+                                               c0.033-0.022,0.069-0.044,0.104-0.066c6.091-3.516,10.179-9.168,11.866-15.464c1.678-6.263,0.982-13.157-2.476-19.218\r
+                                               c-0.023-0.034-0.044-0.07-0.065-0.106C54.54,17.179,48.889,13.091,42.592,11.403L42.592,11.403z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M25.477,17.772c7.013-4.051,15.39-3.602,21.792,0.447l-8.057,6.356\r
+                                               c-2.232-1.233-4.799-1.936-7.531-1.936c-8.618,0-15.606,6.987-15.606,15.606c0,1.651,0.257,3.242,0.733,4.736l0.003,0.012\r
+                                               l-0.549,0.319C12.748,33.865,16.452,22.982,25.477,17.772L25.477,17.772z M53.742,24.679c0.167,0.261,0.329,0.526,0.485,0.798\r
+                                               c2.913,5.044,3.498,10.794,2.092,16.007l-9.053-2.432c0.089-1.771-0.117-3.545-0.621-5.247L53.742,24.679L53.742,24.679z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M50.839,50.84c-1.958,1.96-4.279,3.495-6.816,4.546c-2.529,1.048-5.253,1.602-8.023,1.602\r
+                                               c-2.771,0-5.494-0.554-8.024-1.602c-2.537-1.051-4.858-2.586-6.816-4.546l3.209-3.207c1.551,1.551,3.365,2.757,5.328,3.569\r
+                                               c1.969,0.817,4.109,1.249,6.303,1.249c2.194,0,4.333-0.433,6.302-1.249c1.964-0.813,3.777-2.018,5.329-3.569L50.839,50.84\r
+                                               L50.839,50.84z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M36.586,30.499l12.938-10.204c1.607-1.268,3.395,0.514,2.144,2.124L41.498,35.498\r
+                                               c0.243,2.628-1.428,5.13-4.061,5.845c-2.948,0.801-5.99-0.941-6.791-3.891c-0.8-2.95,0.942-5.99,3.891-6.79\r
+                                               C35.226,30.475,35.917,30.427,36.586,30.499L36.586,30.499z M35.326,33.569c1.345-0.365,2.729,0.428,3.094,1.772\r
+                                               c0.365,1.343-0.428,2.729-1.772,3.093c-1.344,0.364-2.729-0.43-3.092-1.772C33.19,35.319,33.984,33.933,35.326,33.569\r
+                                               L35.326,33.569z"/>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/fingerprint_app_icon.png b/doc/images/fingerprint_app_icon.png
new file mode 100755 (executable)
index 0000000..abea688
Binary files /dev/null and b/doc/images/fingerprint_app_icon.png differ
diff --git a/doc/images/fmradio_app_icon.png b/doc/images/fmradio_app_icon.png
new file mode 100755 (executable)
index 0000000..b781d31
Binary files /dev/null and b/doc/images/fmradio_app_icon.png differ
diff --git a/doc/images/fmradio_app_icon.svg b/doc/images/fmradio_app_icon.svg
new file mode 100755 (executable)
index 0000000..5442afe
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 71.04 72.48" style="enable-background:new 0 0 71.04 72.48;" xml:space="preserve">\r
+<g id="FM_Radio_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="71" height="73" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 0.5 -0.52)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <path style="fill:#FFFFFF;" d="M12.492,23.967h6.384c0.729,0,1.324-0.596,1.324-1.325v-1.873c0-0.731-0.595-1.326-1.324-1.326\r
+                                       H17.19v-4.776c0.256-0.092-0.449,0.346,0.754-0.349c1.202-0.692,2.9-4.012,1.652-6.173c-1.246-2.161-4.01-2.901-6.171-1.654\r
+                                       c-2.162,1.248-2.903,4.013-1.656,6.173c0.563,0.972,1.431,1.656,2.409,2.002v4.777h-1.686c-0.731,0-1.325,0.595-1.325,1.326\r
+                                       v1.873C11.167,23.372,11.762,23.967,12.492,23.967z"/>\r
+                               <path style="fill:#FFFFFF;" d="M24.538,23.966h1.865c0.731,0,1.327-0.596,1.327-1.325v-0.368c0-0.73,0.594-1.325,1.325-1.325\r
+                                       h19.937c0.73,0,1.325,0.595,1.325,1.325v0.368c0,0.729,0.596,1.325,1.326,1.325h1.865c0.729,0,1.325-0.596,1.325-1.325v-0.909\r
+                                       c0-2.921-2.38-5.302-5.3-5.304c-7.324,0-13.696,0-21.022,0c-2.92,0-5.3,2.383-5.3,5.304v0.909\r
+                                       C23.213,23.371,23.81,23.966,24.538,23.966z"/>\r
+                               <circle style="fill:#FFFFFF;" cx="23.213" cy="43.543" r="4.495"/>\r
+                               <path style="fill:#FFFFFF;" d="M52.725,26.973h-39.45v0.001c-3.649,0-6.626,2.978-6.626,6.629v19.885\r
+                                       c0,3.65,2.979,6.628,6.626,6.628h39.45c3.649,0,6.627-2.978,6.627-6.628V33.601C59.352,29.952,56.374,26.973,52.725,26.973z\r
+                                        M44.296,34.326c0-0.732,0.593-1.325,1.325-1.325h0.359c0.73,0,1.326,0.597,1.326,1.325v0.361c0,0.73-0.596,1.326-1.326,1.326\r
+                                       h-0.359c-0.732,0-1.325-0.596-1.325-1.326V34.326z M38.271,34.326c0-0.732,0.597-1.325,1.326-1.325h0.36\r
+                                       c0.729,0,1.325,0.597,1.325,1.325v0.361c0,0.73-0.597,1.326-1.325,1.326h-0.36c-0.729,0-1.326-0.596-1.326-1.326V34.326z\r
+                                        M23.213,54.09c-5.819,0-10.54-4.721-10.54-10.545c0-5.822,4.721-10.544,10.54-10.544c5.82,0,10.541,4.72,10.541,10.544\r
+                                       S29.033,54.09,23.213,54.09z M53.329,52.764c0,0.73-0.597,1.325-1.326,1.325H39.598c-0.729,0-1.326-0.597-1.326-1.325v-0.362\r
+                                       c0-0.729,0.597-1.325,1.326-1.325h12.405c0.729,0,1.326,0.597,1.326,1.325V52.764z M53.329,46.738\r
+                                       c0,0.729-0.597,1.325-1.326,1.325H39.598c-0.729,0-1.326-0.597-1.326-1.325v-0.361c0-0.729,0.597-1.325,1.326-1.325h12.405\r
+                                       c0.729,0,1.326,0.597,1.326,1.325V46.738z M53.329,40.711c0,0.732-0.597,1.326-1.326,1.326H39.598\r
+                                       c-0.729,0-1.326-0.595-1.326-1.326v-0.36c0-0.729,0.597-1.325,1.326-1.325h12.405c0.729,0,1.326,0.596,1.326,1.325V40.711z\r
+                                        M53.329,34.688c0,0.73-0.597,1.326-1.326,1.326h-0.358c-0.73,0-1.326-0.596-1.326-1.326v-0.361\r
+                                       c0-0.732,0.596-1.325,1.326-1.325h0.358c0.729,0,1.326,0.597,1.326,1.325V34.688z"/>\r
+                       </g>\r
+                       <g>\r
+                               <path style="fill:#FFFFFF;" d="M12.492,23.967h6.384c0.729,0,1.324-0.596,1.324-1.325v-1.873c0-0.731-0.595-1.326-1.324-1.326\r
+                                       H17.19v-4.776c0.256-0.092-0.449,0.346,0.754-0.349c1.202-0.692,2.9-4.012,1.652-6.173c-1.246-2.161-4.01-2.901-6.171-1.654\r
+                                       c-2.162,1.248-2.903,4.013-1.656,6.173c0.563,0.972,1.431,1.656,2.409,2.002v4.777h-1.686c-0.731,0-1.325,0.595-1.325,1.326\r
+                                       v1.873C11.167,23.372,11.762,23.967,12.492,23.967z"/>\r
+                               <path style="fill:#FFFFFF;" d="M24.538,23.966h1.865c0.731,0,1.327-0.596,1.327-1.325v-0.368c0-0.73,0.594-1.325,1.325-1.325\r
+                                       h19.937c0.73,0,1.325,0.595,1.325,1.325v0.368c0,0.729,0.596,1.325,1.326,1.325h1.865c0.729,0,1.325-0.596,1.325-1.325v-0.909\r
+                                       c0-2.921-2.38-5.302-5.3-5.304c-7.324,0-13.696,0-21.022,0c-2.92,0-5.3,2.383-5.3,5.304v0.909\r
+                                       C23.213,23.371,23.81,23.966,24.538,23.966z"/>\r
+                               <circle style="fill:#FFFFFF;" cx="23.213" cy="43.543" r="4.495"/>\r
+                               <path style="fill:#FFFFFF;" d="M52.725,26.973h-39.45v0.001c-3.649,0-6.626,2.978-6.626,6.629v19.885\r
+                                       c0,3.65,2.979,6.628,6.626,6.628h39.45c3.649,0,6.627-2.978,6.627-6.628V33.601C59.352,29.952,56.374,26.973,52.725,26.973z\r
+                                        M44.296,34.326c0-0.732,0.593-1.325,1.325-1.325h0.359c0.73,0,1.326,0.597,1.326,1.325v0.361c0,0.73-0.596,1.326-1.326,1.326\r
+                                       h-0.359c-0.732,0-1.325-0.596-1.325-1.326V34.326z M38.271,34.326c0-0.732,0.597-1.325,1.326-1.325h0.36\r
+                                       c0.729,0,1.325,0.597,1.325,1.325v0.361c0,0.73-0.597,1.326-1.325,1.326h-0.36c-0.729,0-1.326-0.596-1.326-1.326V34.326z\r
+                                        M23.213,54.09c-5.819,0-10.54-4.721-10.54-10.545c0-5.822,4.721-10.544,10.54-10.544c5.82,0,10.541,4.72,10.541,10.544\r
+                                       S29.033,54.09,23.213,54.09z M53.329,52.764c0,0.73-0.597,1.325-1.326,1.325H39.598c-0.729,0-1.326-0.597-1.326-1.325v-0.362\r
+                                       c0-0.729,0.597-1.325,1.326-1.325h12.405c0.729,0,1.326,0.597,1.326,1.325V52.764z M53.329,46.738\r
+                                       c0,0.729-0.597,1.325-1.326,1.325H39.598c-0.729,0-1.326-0.597-1.326-1.325v-0.361c0-0.729,0.597-1.325,1.326-1.325h12.405\r
+                                       c0.729,0,1.326,0.597,1.326,1.325V46.738z M53.329,40.711c0,0.732-0.597,1.326-1.326,1.326H39.598\r
+                                       c-0.729,0-1.326-0.595-1.326-1.326v-0.36c0-0.729,0.597-1.325,1.326-1.325h12.405c0.729,0,1.326,0.596,1.326,1.325V40.711z\r
+                                        M53.329,34.688c0,0.73-0.597,1.326-1.326,1.326h-0.358c-0.73,0-1.326-0.596-1.326-1.326v-0.361\r
+                                       c0-0.732,0.596-1.325,1.326-1.325h0.358c0.729,0,1.326,0.597,1.326,1.325V34.688z"/>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/googlemaps_app_icon.png b/doc/images/googlemaps_app_icon.png
new file mode 100755 (executable)
index 0000000..3cb3e8d
Binary files /dev/null and b/doc/images/googlemaps_app_icon.png differ
diff --git a/doc/images/googlemaps_app_icon.svg b/doc/images/googlemaps_app_icon.svg
new file mode 100755 (executable)
index 0000000..425ca66
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 55.2 78.24" style="enable-background:new 0 0 55.2 78.24;" xml:space="preserve">\r
+<g id="Google_Maps_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="57" height="79" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAABPCAYAAABRY21ZAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACV1JREFUeNrsXIly2zgMJSX6zrnd
+dvf/P69HNoedSNa1ygwwfXkBqcNOZ2ennsGoVm2TjwCBRwCKc79fH/Ly/6cB/chxusi//7MgvXFF
+sQCiOON68it8ALgMQGXwPiOgryBauLYAtj2ndv0Zvu8NULkhCB7BNIYw6O4UsOFMmlNgAWQBovcy
++I1XELVIBVKDIODZmg0nag/BLQXQypClfCYHTTYC5NhLaUgl/4dgZ+3XMBMgglsIiHUvm162dN0I
+0IUBshJALyLPdC0EaEVgJwENJwBUra0F0K6XC5KdgFyDNhWkarEQQIde9iQHAVzIYqCpjwYaZgJc
+CsCtgLns5RrkSu7t5DMKUh2QOhwF+SyAnnp57OUBBC3Ay3cmAZ2qSdWgau9KQP3Ry61cb+TeJWhy
+BQ4INYnmqiAf5Lu6OAyyoxh7Fk3yHlwBwFdQn3r5U+STgL0SDW9gogHCSAfetQKT3dN3V+Cw0FQR
+YDsENsww041M4laAfenlr14+gyYvjUnGyEAjGi8j+zinhbHiaNJsp2hSHc0OtPhZAP4t/74FU8MJ
+Ml3TxQsQftSJYdjJ4TsNxVEGO0uTqMVAWrwBkF9EPsle3MqCZBQPa5gQ/m4AVoQkQhcInVQp10nx
+M4zUooLciqZuaS+qme5kgp4mpiGgBpCBtIfeNzMcVAF7twDCUA9pM4x0OOpR1VRvwKOqo9nJZL0M
+XEDs03h3lAllsGg72otI/xoA+Ay/p2RBiUKb8rZhBDflsIEx8YYA5gKwlMncg+xlso18bg2mX8kE
+M7Ac3f8VeF6NoY/y/RcY01GImaTJQJq8FFFXr/EsyIpWstKvE/nRy3e5Psp9BalhqJR7vEcDLOwF
+EAyNvxiaqhjAqea6Ak56QWxmAU7iCCDvevnay7de/pH7tYy7BdAZ7E8MHQuDNm4NPpyljo1hxEkj
+JxKOxBsZiQOQL8Be7kSbd7KnFOQOtLoBeqj7lrfKBhZ5DaeenOY7y1wzOm2gR0Qm0wKLOZLjUU66
+B5CNfH8nnysgNCgvxbHZE+PYszSZAsoHYQ74HBv5vFgDwBKA6X30kp4O4zz+IEBHJ3WXSEJlkdRG
+ZuR1fOK7Y+7zZ3xkXOu7ZkpnKIS4xAR8JEvAZ03cTzWYK+7rNTmSfAB8LAs4aU92ibRhZ5gUk3h0
+/dfiiBoZT0FeQLy9iJw7vbEVukSCa3QI6Sij1lHasImQY4vEP0McVI+K3vWWjmc70GhGp5V2ZDav
+m+p4OG1YU1atMTyhkoZroFwaJpgM3AhIJfc7IBYZgbPGbk49hXButIITwBF4Y2OQ7i2EAi/3Lgxa
+p5kF1eQWzqCc8IqN3Q5lCcJEgCWcBkoaLIDT2QAX1fdK4VpgOFuiahtwPlPGnkXQXQSkpgufIYum
+cW4J2mRyv5HPVqB1ZjJDGT0c9yUC0p0KsgCQeHwqYbActMfHNJxQRnRxGTkoa6LLOmYVp4LsEklg
+Ky+6NfI5GR24G0r3Y3IsN3I5FkCVF1rc2ZkBpmglaFG56BNl15ZEtxAIunofqXxZ1nOg8fZgQRYV
+nMxdmXS/RAa9jID0kOvpEqcdHI+zAbyoB9iTtVEQmqxJFzlZYKb7GgL5OpGrSR0COODzWA8Ekk8s
+J2nSGfvyGUCqXFG2PNCgqUozOzod52CM82Q4u8EsejYCYBdZYaxZPIIZlUYGzQ8cBDCjjmUDawzV
+4igiMAYkAq2NvfJgmFI5gY1YpKOMFH/2EJsrSG+erEmeCDqg/URtDsXjIS3uDYdzNpAfpc1fosU5
+IM+tzQ/X4hSQ59bmL9Oio7rfnK6P3MimrY1sXqx011CG/F7Sl18hX3sHienjrwCJQK10JYNMJYBb
+oouao/0GIH9QieE40pmdDaTV4jKkTW8E/pgWv59Di1P3pEXccW8+UUFmb7CTNrIXre8/0V5s3MzO
+rDkgXaTmrxNFsXjmEOm3ANZzzHRO98cQr+V+nAMdbmsxWeaoeEZ9MrzpbA3OAenJ6Xg6ZaD5FSBY
+/g6RtMbBvW1M4pqIB6trKWV6FpCxtD/WJ6y+uVhTYEaL8QKCJXf03B2U6Cd3UE5pcckiDQwrSEYt
+qRzeUvGndj+7qkow54JKdprarOF9LOc62Jk1tnTHwJZQQltTfRHbWxiotoyVpEEEqL0EHSSrS+r8
+sBLc7ZyegVgn5IoKNdgdqdXgNaQWca/qRApjD7YAygFYLPsVYNbcQeliQMMIgFjAYVlHwK4gQaye
+10PxtQBPegCQOSSYN+5t/x3nXhdy9UZeqkuBjLWZYUMEdj8idcM9mgkYDfROJqv3sdyuJwzVhlpN
+LPWiMXVBVDFa+ElpcuHeNgveQNLqIlFmQ7qmQb+QzyLIPR2jKqCamI918Js7cnCcBGuHNGk17a6h
+jnhLhZmle9tU1FCRB/txlrDyDR3T2FwX7m3fHVa4NlTa6wzv/a4NLQy0tWDvzo372SC4hoErOE1g
+fQJrltxAcaR6SgWmuqIqGfbaofV0tF9LI8GVNFfu3cHW6x0E6CMAPFD6vjUaGzKidJh50yJQBbEP
+NbuA3+tgoQ7ufY+7m+J4QuScmINpcOoCaRkuWk4mhvFOGU5NJb+VwYD0c2uqhFkl+ME4aXV9ZIZH
+syrRVj8Olgz4oRcuS7SRtImPzCdLJLBHFWGtp3AcFW5yMssWHFKbcO84QSQd3M7tXfyJoHZqEZYT
+TDXxzA2RZkcdH528t57lsCZhNUOtgFisjDBSEfM5Do0TRtY+DsBEHHlXBdlByLAeR2qM0h0//rSg
+wuwSmJOGGWZLg7WRMKK6fIAijpogt2Dn8JmlEbu4U8MbpxpuA80NgNhmek/1kWjVOURKdQgSz4qY
+QrQYDz7csiCwMZDBqFCrA6md/aDMI+SDYiC7IXNtgWti05Ca8Ba4q9Wx6AyPyE8TxDw154Gw++MZ
+mNLeKOW1Y83V0eo5YzWxY2MVSSRz9bhN7Enr83gC4SwCdoGUQ6W8lCZT+3Tt3vefWq6fjz+xnoFY
+FvDo3j+RUNAhunID3Vl+QmYgBxBLwwsuImbrIt0ZVusmmyl3YiHRqFy8z280yBTzsZ56tRxIqnzu
+E40Y6LCqhKceJAJjQPKKx6herNGXS+apcrozMuwIKAWsGwPAzQBrdRd7g0eOGcMq6VnXbgq4OSBT
+gBn83N/uEqmM2X9/4Bx/TCH1lyH8DIDW++5cEzz36xRN/n5Nff0rwABZ9yN41tubHQAAAABJRU5E
+rkJggg==" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <g>\r
+                                               <path style="fill:#FFFFFF;" d="M31.942,51.883l-1.188,2.441c6.396,0.812,10.263,2.856,10.263,4.371\r
+                                                       c0,1.931-6.239,4.733-16.017,4.733c-9.778,0-16.015-2.803-16.015-4.733c0-1.791,5.389-4.327,13.99-4.683l2.021,4.086\r
+                                                       l13.887-28.053h-0.016c1.368-2.364,2.164-5.094,2.164-8.016C41.031,13.178,33.854,6,25.004,6\r
+                                                       C16.151,6,8.972,13.178,8.972,22.03c0,2.921,0.796,5.654,2.16,8.016h-0.013L21.732,51.5C13.68,52.02,6.41,54.469,6.41,58.695\r
+                                                       C6.41,63.493,15.761,66,25,66c9.24,0,18.59-2.507,18.59-7.305C43.592,55.126,38.408,52.827,31.942,51.883z M18.268,20.055\r
+                                                       c0-3.721,3.015-6.736,6.734-6.736c3.725,0,6.734,3.015,6.734,6.736c0,3.717-3.01,6.732-6.734,6.732\r
+                                                       C21.283,26.787,18.268,23.772,18.268,20.055z"/>\r
+                                       </g>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <g>\r
+                                               <path style="fill:#FFFFFF;" d="M31.942,51.883l-1.188,2.441c6.396,0.812,10.263,2.856,10.263,4.371\r
+                                                       c0,1.931-6.239,4.733-16.017,4.733c-9.778,0-16.015-2.803-16.015-4.733c0-1.791,5.389-4.327,13.99-4.683l2.021,4.086\r
+                                                       l13.887-28.053h-0.016c1.368-2.364,2.164-5.094,2.164-8.016C41.031,13.178,33.854,6,25.004,6\r
+                                                       C16.151,6,8.972,13.178,8.972,22.03c0,2.921,0.796,5.654,2.16,8.016h-0.013L21.732,51.5C13.68,52.02,6.41,54.469,6.41,58.695\r
+                                                       C6.41,63.493,15.761,66,25,66c9.24,0,18.59-2.507,18.59-7.305C43.592,55.126,38.408,52.827,31.942,51.883z M18.268,20.055\r
+                                                       c0-3.721,3.015-6.736,6.734-6.736c3.725,0,6.734,3.015,6.734,6.736c0,3.717-3.01,6.732-6.734,6.732\r
+                                                       C21.283,26.787,18.268,23.772,18.268,20.055z"/>\r
+                                       </g>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/homescreen_icon.png b/doc/images/homescreen_icon.png
new file mode 100755 (executable)
index 0000000..d736310
Binary files /dev/null and b/doc/images/homescreen_icon.png differ
diff --git a/doc/images/hvac_app_icon.png b/doc/images/hvac_app_icon.png
new file mode 100755 (executable)
index 0000000..27df1a0
Binary files /dev/null and b/doc/images/hvac_app_icon.png differ
diff --git a/doc/images/hvac_app_icon.svg b/doc/images/hvac_app_icon.svg
new file mode 100755 (executable)
index 0000000..6626041
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="HVAC_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,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
+YII=" transform="matrix(1 0 0 1 0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <path style="fill:#FFFFFF;" d="M63.767,50.996c3.637-6.108,4.753-11.601,0.466-17.058c-4.386-2.455-10.646-2.62-16.574-1.51\r
+                                       c-0.228-0.682-0.52-1.337-0.869-1.955l16.978-9.657c-3.634-6.213-7.976-9.951-14.993-9.061\r
+                                       c-4.346,2.471-7.599,7.653-9.581,13.217c-0.711-0.142-1.44-0.219-2.192-0.219h-0.004L37.002,6\r
+                                       c-7.273,0-12.728,1.813-15.456,8.154c0,4.882,2.944,10.187,6.86,14.6c-0.458,0.542-0.867,1.13-1.217,1.754l-16.957-9.504\r
+                                       c-3.639,6.11-4.751,11.601-0.46,17.057c4.377,2.464,10.639,2.63,16.569,1.52c0.227,0.682,0.518,1.333,0.867,1.949l-16.977,9.654\r
+                                       c3.635,6.214,7.974,9.951,14.993,9.062c4.341-2.466,7.593-7.649,9.574-13.212c0.709,0.142,1.445,0.218,2.197,0.218L37.002,66\r
+                                       c7.269,0,12.722-1.813,15.449-8.151c0-4.876-2.945-10.179-6.86-14.593c0.456-0.543,0.864-1.129,1.216-1.754L63.767,50.996z\r
+                                        M42.625,36.003c0,3.105-2.521,5.625-5.625,5.625c-3.106,0-5.625-2.52-5.625-5.625c0-3.106,2.519-5.625,5.625-5.625\r
+                                       C40.104,30.377,42.625,32.897,42.625,36.003z"/>\r
+                       </g>\r
+                       <g>\r
+                               <path style="fill:#FFFFFF;" d="M63.767,50.996c3.637-6.108,4.753-11.601,0.466-17.058c-4.386-2.455-10.646-2.62-16.574-1.51\r
+                                       c-0.228-0.682-0.52-1.337-0.869-1.955l16.978-9.657c-3.634-6.213-7.976-9.951-14.993-9.061\r
+                                       c-4.346,2.471-7.599,7.653-9.581,13.217c-0.711-0.142-1.44-0.219-2.192-0.219h-0.004L37.002,6\r
+                                       c-7.273,0-12.728,1.813-15.456,8.154c0,4.882,2.944,10.187,6.86,14.6c-0.458,0.542-0.867,1.13-1.217,1.754l-16.957-9.504\r
+                                       c-3.639,6.11-4.751,11.601-0.46,17.057c4.377,2.464,10.639,2.63,16.569,1.52c0.227,0.682,0.518,1.333,0.867,1.949l-16.977,9.654\r
+                                       c3.635,6.214,7.974,9.951,14.993,9.062c4.341-2.466,7.593-7.649,9.574-13.212c0.709,0.142,1.445,0.218,2.197,0.218L37.002,66\r
+                                       c7.269,0,12.722-1.813,15.449-8.151c0-4.876-2.945-10.179-6.86-14.593c0.456-0.543,0.864-1.129,1.216-1.754L63.767,50.996z\r
+                                        M42.625,36.003c0,3.105-2.521,5.625-5.625,5.625c-3.106,0-5.625-2.52-5.625-5.625c0-3.106,2.519-5.625,5.625-5.625\r
+                                       C40.104,30.377,42.625,32.897,42.625,36.003z"/>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/icon_apps_blue.png b/doc/images/icon_apps_blue.png
new file mode 100755 (executable)
index 0000000..95b534b
Binary files /dev/null and b/doc/images/icon_apps_blue.png differ
diff --git a/doc/images/icongear.png b/doc/images/icongear.png
new file mode 100755 (executable)
index 0000000..fa619aa
Binary files /dev/null and b/doc/images/icongear.png differ
diff --git a/doc/images/media_player_app_icon.png b/doc/images/media_player_app_icon.png
new file mode 100755 (executable)
index 0000000..2495afd
Binary files /dev/null and b/doc/images/media_player_app_icon.png differ
diff --git a/doc/images/media_player_app_icon.svg b/doc/images/media_player_app_icon.svg
new file mode 100755 (executable)
index 0000000..1bae4ed
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="Media_Player_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAABPCAYAAACqNJiGAAAACXBIWXMAAAsSAAALEgHS3X78AAAA
+GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAC/1JREFUeNrsXIty2soS3JUWA8bO
+SfL/n3jvtWMbm4eQbqjaqdNuenYlwE7OqVA1xcNYSK159sxuCH8eZz/iP+Tchj/g1X9fvWfgau//
+teBF8ToWXjNAQ+H1p4OZPhm0SNI4r6MAD6V3Xn8qiPGTAWuEtM7nDF4v5OB8PhQ087fWPAYNQTJJ
+znMLYCrwDiCd83wgUD9MG9MHAIegISAzRxI8J9JEe6CmdVn28KyEgby6FsYPAq0BMI7A3GSZg9hn
+MwFeC8cz8zsI8I6yy7IFsc/28P2+4B9/meZ5oBk4iwzWMr9ewGesgWy2kQIDAohadgRsA/IGnxmQ
+DOLFWhiv8L/o0xA0A+s2yxJkDlrXOkGjFjAMyD1o3hvIaxYDE0E8XAPEdAUzbck8EbBVFnu/AOAS
++bZYSZbtt/BiDYAOANwAcOssN/l9S+YcLvGF6UIzRW1bZK06gnQHwsAl8GkD+SLPJ6nc0FxEBH+6
+zACilrOLeMsA2/EO52pguhC4GZw0gnafn03r7OQbAK0Ds+so1UAAWctbCkac/tg5oW/FAIURfUsR
+fRKA6QLg7G6beR4B+5LFgFvk75mm9eDsdySYYvQCvIZSnhsS9p8JgJyTu+CgtDsHwHM0D+/uKgN1
+BOyvLPf58zmYVU+O3aIiphcMXg+/2wjwEJSF8KeoiQhwEom4qpevBp4yVTPTryAIXJtPZE+OHCPi
+BvKyPUXCwfl9DE5z8LVLcB/o5+YAJifiHsHQjwExTTTXBGnIXda0I2jf8msDrskgWPpgUe+FACwB
+N1SC1IwCBfpdi/JLALGlBDwIcqGfUhOnM4BbgI8z8P7KJ23AdVmrjoA9g6wBvK0opfrCXVd1spnw
+K6RIGzi2BZ9FPv8FAdc7vz2M8X9pgp9LYK734OMsQNiJdRmcI1hPP+UHgPdKF9c5Jz5UcssIOVsC
+t8AlWgcALgHAIIgGVQsXNa8doXVmIqhxZqpfM3gL0Lg3AO3hpzzm1y8OeH0BwKHA5alqo3P8ZiSz
+RZ/XF9iYs8FrhJ9D4L5l4Jb5OAcA7jED95Dfv4CpdiKXU1WFOvGhQI4qE+wp3WlFtB0EYzOKiWlH
+RFcDbpXB+gZ+7jZrZZ816tkBzgr0g8jdVC075VHTygGUgRPqSNrHyXox6tbAM627Ba0zsQARska9
+CODWWePMeXPETE7SGs8kLkqRE6+pFWUigqdorFHgRUqGl5AIKz+3z77sB4CHprqHyNUSt7eg5JWJ
+gikgDo42BuH3kqN9SHUhgJPAa+FCbykt+SLMFf0cBgczVQRuAW4ASQMG0NPCOEELgyjzWmKvWwEe
+554yeLSFQDGD3AnLL0xLdhmoHxBVLSXZAu0T6XhGHtwD8+LVnuFCMy5VKUnU3TuH+zsBsK2UYWiy
+Vn7d5h/l6PoIfm5L5oq+EysTTLCRfeFeRgz1BnkJwEhBIxGD3QDTsxeVTz9G87xAgcnwPH9vL7QO
+IyumCQmIBAs837NgabccAeAUbYyOL0/UAsCcDwmMnWB63AqDyzGmfhIQiFi3csl1EKxIC6Z7BwDe
+5c8PkO6YNq/y62dgh7l6OBTKKczh9nDOxjKbv23hJt8IFoZ7Km55psBDMtPUm3sGW6Hmiq6fQ8Jt
+Wmc+1FKep/z3RwgsT/l/X4mN6SAN6h1qvSeTxPO+pbbAjHosyctD00jmgn3DHhorb3QhTGR6NTIC
+uMp/w7r4nhjpFQSkdaVOHhwN7ESzaAPa1zjXrTp6RbNtRWswipPYOpGp1DBC+t4C0jz/3xZAYzEA
+nwDEN8GkqPIKE2F17j3V8jOgsmTQShUWhQ8Sqd3n0ec1UlVRXEsgF1ZA79+J1OauAOLOYaTZ//E1
+9MQ+z0Q6M8psVT7UiFKG+bhBpAc1Xg5BnAH/ht04BvEBAF5CpE/ZnKNoL/LkwV4kwuzvvYg/ymxb
+h7buz+DAovCBqlkeaTQDK5IVmfCKmugt/Y6alhoK5865YHuO2TYO/6VY2HPnP6Jjytb7SKInvBQT
+CHNyK4PoBysAe4f3q137CXil4UNFGymSMpwJnHIXQbAvM9LIG5Hg8gwLpjGhcO6DuJEqOcfzHlIl
+G69Na4Zwvamj2o1TWoAVAY5ZWNIuk9tCkycWrh+/M5TM1tOOMILtDVcCMYj2YE8VwLwyEVAjWWu9
+kmIZ2FzhQj/qoaj2Q0UmtQ4vPf80UZtiRS4FS9HqnTBN6wE/5+cXUV93lTamJ8NYLU0jmFhv6Kah
+52toWA/k6UHUo2tgco653v9+yn/y8yNxifvC9IE6/zgioARFDAwU5tUwYShEpGai9g3iuSeGhLXN
+NA3p/iNo/83PDwDgW6HWLp1/gEBUna5PhSaKauU1Irl1M3BHw4KTb3WCtUETRdL1geQH9E1eqenE
+eZx3/pGAq04xJOcCvT5mCO/njlOFNh9rpnvSFNS2J9C2R9AwZK8RtI1gWTzgUJpCG1JWT8kBrg+n
+I/t2gIbKqZnTSK6BdyDTtMcuA/EsQDMtU6TA1iEFSjT8DXF5HKS8SfpitD042frNCMa1KSTNgyAm
+bVZ4C32RZwgKDzS2UWJSvGkEnoDwGPKhUKWMMts+6AlOuwPMhMyp78AUfBCuwLRtnf+3o77Ik/Bp
+U4nQodBamFPfGNsLXThdx9HXehjDCNLwQD3dBbEadjEN8Wjs3zYZpGX+zkv+zkZEVA4GG4eA9Vgd
+NSaH60JuoJ4+FEjeYarZ4hisAWPFOE/A4yCPWvOFwK0zIG1+n4iC/wHyAto2pfmjph9wqQOCh+2F
+rXODJpvtDnoVdkBc8mQs8Gvwp6Awgu0AIAMMW5lvYLZsop4Zleb5FOGKa0SMgI0EHPrSUWZbcurW
+rrNWnYV3A8+7Ux1pnkXSlD97A/Z4T23BkonWmJzSRKux0Su4FmxqjS7zkpP5s396g4MuQftsUnRX
+6LD3AKRpXsjfXTsms6mkHmPqb9S4ZXi/3OEeJhQitVI5XxyV5wXHRzFXhoM5s/z+4ORFAZorffh7
+vYNpYStSBF5oV/NrNeB4hhrBm0EpiNfIjaRhCqsyOH5vDc52Dj1YpLTVVFEHN2QL4EVoZ/Ii5KkU
+v+rM8azN1/B+aj9Svrl2/N3oKalaj4HbctwgKjETnAp1VJoVM/oRoDXUVMe5wu/h/YhcKyK8lXuv
+YLaT5vNK4HFPAXu6XqPEa770hS7cFBP1lnTZNNY3ENO6BHnlCwH3AqzMoXQD2wlMq+osMTmg2nRx
+BEM8hHGbKjAX15J/Q+BQ4xC4WT7WNujZwnUGtQtnziR74IXgb7jAAF46GhYrTaGWyi3L4XBi/zv5
+uRmQD0xzecPnZ4NXalozt9cEvUtFK1jbJvgT8U2le8atyAUkvV/IVM3Hscatw/t1Io9krlWtK6Uq
+Ku+zXEjth4KgGkmwCqcbNVhB7hX2Y9eeeVp3F94vXbWJgiSAewzvhzJVeXkReJz32Qyd6l2gzzKm
+4lY48yXVqttwumC5tN5W3Qxckn8Pcyw2OmY5JgKn+h5dKa87BzzWPq9th+sfVsBWLKgwNyLhVVQS
+akSMNW4WTpeM3pIsgMDoALgnMtUnCBC7KVo3VfO4bCsRCl14v2A5hb+XWWG5hFt3qH1QeHJJEZlq
+OXwLgWELwKnI+lYrwy4FDwE8jOx77EkLIlyYXfSetI7NFwObyi95UxueIdwQpY/c4Fr0Oz5kpbcH
+4OAwxVbyeHsNzAjEA/UNkKuLIkiotCjA/yFTbS1LprmQ4J0M3DngMYA18Kwm5qXrbSFnq/k8BmwA
+s+Ml+WuYKMAOm2KAPmVfFRVEuNfLF8HzdDfU8ovhdMwrEHhRUFzoY3lQ+1Vwg5swYmXPR4MXBF83
+FLpjuEEM7kJxE05H9UsjHlEQtrtwumsGTrp7m0BcPBp3jSknb08pbE/yNh4MngIwUM9VAafAU7uZ
+deGKe0hdEzxVBahKQG0mw7RWaVwjViitnRO5Jy9//xXgeTRW47AwM1EL14aF1EA2d/cVYL/15oM1
+EKOoiZk8wEARR/jYQzgdyGEN+xDQPho8BWJptq/GAQaHUPWWxX/4ZqufAV4JyBDO21PAGyT/FMB+
+FXg1knXMOZV25x5+5UX8Do+pGzH8efxTH/8XYACFYNx2lyiIBQAAAABJRU5ErkJggg==" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <g>\r
+                                               <path style="fill:#FFFFFF;" d="M8.61,35.999c0-15.105,12.288-27.39,27.39-27.39c15.103,0,27.392,12.285,27.392,27.39\r
+                                                       c0,15.104-12.289,27.39-27.392,27.39C20.898,63.389,8.61,51.103,8.61,35.999z M36,66c16.543,0,29.998-13.461,29.998-30.001\r
+                                                       C65.998,19.458,52.543,6,36,6S6.002,19.458,6.002,35.999C6.002,52.539,19.457,66,36,66z"/>\r
+                                       </g>\r
+                                       <g>\r
+                                               <polygon style="fill:#FFFFFF;" points="49.043,35.999 37.956,42.398 26.867,48.803 26.868,35.999 26.868,23.195 \r
+                                                       37.956,29.599                                           "/>\r
+                                       </g>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <g>\r
+                                               <path style="fill:#FFFFFF;" d="M8.61,35.999c0-15.105,12.288-27.39,27.39-27.39c15.103,0,27.392,12.285,27.392,27.39\r
+                                                       c0,15.104-12.289,27.39-27.392,27.39C20.898,63.389,8.61,51.103,8.61,35.999z M36,66c16.543,0,29.998-13.461,29.998-30.001\r
+                                                       C65.998,19.458,52.543,6,36,6S6.002,19.458,6.002,35.999C6.002,52.539,19.457,66,36,66z"/>\r
+                                       </g>\r
+                                       <g>\r
+                                               <polygon style="fill:#FFFFFF;" points="49.043,35.999 37.956,42.398 26.867,48.803 26.868,35.999 26.868,23.195 \r
+                                                       37.956,29.599                                           "/>\r
+                                       </g>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/news_app_icon.png b/doc/images/news_app_icon.png
new file mode 100755 (executable)
index 0000000..33752f4
Binary files /dev/null and b/doc/images/news_app_icon.png differ
diff --git a/doc/images/news_app_icon.svg b/doc/images/news_app_icon.svg
new file mode 100755 (executable)
index 0000000..e30ffe2
--- /dev/null
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 75.36 64.32" style="enable-background:new 0 0 75.36 64.32;" xml:space="preserve">\r
+<g id="News_Icon">\r
+       <g id="news_1_">\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="75" height="65" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 0.5 -0.68)">\r
+               </image>\r
+               <g>\r
+                       <path style="fill:#FFFFFF;" d="M13.625,20.097H49.25v-3.563H13.625V20.097z M33.218,41.468h12.468v-3.561H33.218V41.468z\r
+                                M33.218,34.344H49.25V30.78H33.218V34.344z M33.218,27.222H49.25v-3.564H33.218V27.222z M13.625,41.468h16.031v-17.81H13.625\r
+                               V41.468z M56.375,12.971V5.845H6.5v39.186c0,0,0,7.124,7.125,7.124h44.532c0,0,5.343-0.11,5.343-7.124v-32.06H56.375z\r
+                                M13.625,48.596c-3.564,0-3.564-3.564-3.564-3.564V9.408h42.752v35.623c0,1.643,0.506,2.776,1.202,3.564H13.625z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/nfc_app_icon.png b/doc/images/nfc_app_icon.png
new file mode 100755 (executable)
index 0000000..43c3a87
Binary files /dev/null and b/doc/images/nfc_app_icon.png differ
diff --git a/doc/images/nfc_app_icon.svg b/doc/images/nfc_app_icon.svg
new file mode 100755 (executable)
index 0000000..a104c0f
--- /dev/null
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 69.6" style="enable-background:new 0 0 78.24 69.6;" xml:space="preserve">\r
+<g id="NFC_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="71" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 0.5 -1.4)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M62.626,7.539c-0.705-1.833-2.619-2.71-4.154-1.998c-1.531,0.714-2.18,2.586-1.552,4.217\r
+                                               c5.278,13.664,5.278,28.823,0,42.485c-0.628,1.632,0.019,3.503,1.552,4.217c1.535,0.714,3.449-0.165,4.154-1.998\r
+                                               C68.458,39.368,68.458,22.63,62.626,7.539z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M46.469,12.375c-1.53,0.72-2.175,2.593-1.582,4.226c3.561,9.746,3.561,19.037,0,28.783\r
+                                               c-0.593,1.634,0.052,3.506,1.582,4.225c1.53,0.719,3.47-0.204,4.165-2.113c4.059-11.106,4.059-21.898,0-33.006\r
+                                               C49.938,12.581,47.999,11.658,46.469,12.375z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M34.51,17.5c-1.531,0.729-2.165,2.602-1.64,4.24c1.523,4.68,1.843,9.932,0.961,14.733\r
+                                               L13.844,21.396c-0.464-0.367-1-0.576-1.548-0.636c-1.401-0.237-2.969,0.759-3.548,2.535c-2.331,7.162-2.331,9.976,0,17.14\r
+                                               c0.667,2.053,2.659,3.065,4.182,2.335c1.529-0.728,2.167-2.601,1.64-4.239c-1.46-4.486-1.815-6.209-1.064-9.596l20.061,15.14\r
+                                               c0.507,0.399,1.099,0.609,1.695,0.648c1.369,0.162,2.872-0.829,3.429-2.554c2.33-7.162,2.33-15.17,0-22.333\r
+                                               C38.026,17.784,36.032,16.771,34.51,17.5z"/>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M62.626,7.539c-0.705-1.833-2.619-2.71-4.154-1.998c-1.531,0.714-2.18,2.586-1.552,4.217\r
+                                               c5.278,13.664,5.278,28.823,0,42.485c-0.628,1.632,0.019,3.503,1.552,4.217c1.535,0.714,3.449-0.165,4.154-1.998\r
+                                               C68.458,39.368,68.458,22.63,62.626,7.539z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M46.469,12.375c-1.53,0.72-2.175,2.593-1.582,4.226c3.561,9.746,3.561,19.037,0,28.783\r
+                                               c-0.593,1.634,0.052,3.506,1.582,4.225c1.53,0.719,3.47-0.204,4.165-2.113c4.059-11.106,4.059-21.898,0-33.006\r
+                                               C49.938,12.581,47.999,11.658,46.469,12.375z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M34.51,17.5c-1.531,0.729-2.165,2.602-1.64,4.24c1.523,4.68,1.843,9.932,0.961,14.733\r
+                                               L13.844,21.396c-0.464-0.367-1-0.576-1.548-0.636c-1.401-0.237-2.969,0.759-3.548,2.535c-2.331,7.162-2.331,9.976,0,17.14\r
+                                               c0.667,2.053,2.659,3.065,4.182,2.335c1.529-0.728,2.167-2.601,1.64-4.239c-1.46-4.486-1.815-6.209-1.064-9.596l20.061,15.14\r
+                                               c0.507,0.399,1.099,0.609,1.695,0.648c1.369,0.162,2.872-0.829,3.429-2.554c2.33-7.162,2.33-15.17,0-22.333\r
+                                               C38.026,17.784,36.032,16.771,34.51,17.5z"/>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/phone_app_icon.png b/doc/images/phone_app_icon.png
new file mode 100755 (executable)
index 0000000..3e3c9ac
Binary files /dev/null and b/doc/images/phone_app_icon.png differ
diff --git a/doc/images/phone_app_icon.svg b/doc/images/phone_app_icon.svg
new file mode 100755 (executable)
index 0000000..606dde9
--- /dev/null
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 74.4" style="enable-background:new 0 0 78.24 74.4;" xml:space="preserve">\r
+<g id="Phone_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="75" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 0.5 -0.6)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M7.276,22.697c-0.316,0.817-0.354,1.583-0.146,2.278c-0.217,1.8-1.238,15.551,16.188,28.336\r
+                                               c17.688,12.981,30.171,8.167,31.923,6.938c0.713-0.019,1.418-0.286,2.091-0.822c1.34-1.073,3.564-3.578,4.377-4.938\r
+                                               c1.153-1.918,0.583-3.096-1.205-3.985l-12.772-6.396c-1.279-0.637-2.803-0.146-3.422,1.04l-2.447,4.706\r
+                                               c-0.146,0.282-0.214,0.594-0.217,0.906c-0.373,0.288-3.991,2.76-12.199-3.465c-8.431-6.395-9.651-9.922-9.137-12.253\r
+                                               c0.276-0.096,0.53-0.25,0.74-0.46l3.752-3.748c0.947-0.946,0.959-2.546-0.031-3.577l-9.934-10.265\r
+                                               c-1.387-1.438-2.68-1.631-4.163,0.046C9.618,18.226,7.9,21.099,7.276,22.697z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M29.384,17.6l1.581,2.58c0,0,0.442,0.653,0.716,0.796c0.437,0.228,0.91,0.216,1.399,0.226\r
+                                               c3.904,0.071,7.727,1.322,10.943,3.685c3.565,2.617,6.053,6.28,7.165,10.432c0.12,0.443,0.146,0.706,0.592,1.191\r
+                                               c0.217,0.238,0.741,0.438,0.741,0.438l3.105,0.861c0,0,0.477,0.086,0.791-0.11c0.316-0.197,0.538-0.547,0.459-1.068\r
+                                               c-0.965-6.403-4.395-12.125-9.71-16.025c-4.953-3.636-11.02-5.241-17.046-4.601c0,0-0.715,0.047-0.893,0.761\r
+                                               C29.093,17.295,29.384,17.6,29.384,17.6z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M62.088,39.265c0.317,0.417,0.893,0.53,0.893,0.53l2.952,0.836c0,0,0.322,0.062,0.576-0.057\r
+                                               C66.807,40.434,67,39.949,67,39.453C67,20.93,51.902,5.859,33.379,5.859c-2.939,0-5.863,0.394-8.679,1.147\r
+                                               c-0.51,0.136-0.833,0.439-0.932,0.838c-0.079,0.319,0.096,0.727,0.096,0.727l1.494,2.451c0,0,0.398,0.587,0.701,0.707\r
+                                               c0.49,0.197,1.004,0.147,1.529,0.04c1.92-0.394,3.92-0.597,5.87-0.597c15.201,0,27.74,12.052,28.366,27.103\r
+                                               C61.823,38.274,61.771,38.851,62.088,39.265z"/>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M7.276,22.697c-0.316,0.817-0.354,1.583-0.146,2.278c-0.217,1.8-1.238,15.551,16.188,28.336\r
+                                               c17.688,12.981,30.171,8.167,31.923,6.938c0.713-0.019,1.418-0.286,2.091-0.822c1.34-1.073,3.564-3.578,4.377-4.938\r
+                                               c1.153-1.918,0.583-3.096-1.205-3.985l-12.772-6.396c-1.279-0.637-2.803-0.146-3.422,1.04l-2.447,4.706\r
+                                               c-0.146,0.282-0.214,0.594-0.217,0.906c-0.373,0.288-3.991,2.76-12.199-3.465c-8.431-6.395-9.651-9.922-9.137-12.253\r
+                                               c0.276-0.096,0.53-0.25,0.74-0.46l3.752-3.748c0.947-0.946,0.959-2.546-0.031-3.577l-9.934-10.265\r
+                                               c-1.387-1.438-2.68-1.631-4.163,0.046C9.618,18.226,7.9,21.099,7.276,22.697z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M29.384,17.6l1.581,2.58c0,0,0.442,0.653,0.716,0.796c0.437,0.228,0.91,0.216,1.399,0.226\r
+                                               c3.904,0.071,7.727,1.322,10.943,3.685c3.565,2.617,6.053,6.28,7.165,10.432c0.12,0.443,0.146,0.706,0.592,1.191\r
+                                               c0.217,0.238,0.741,0.438,0.741,0.438l3.105,0.861c0,0,0.477,0.086,0.791-0.11c0.316-0.197,0.538-0.547,0.459-1.068\r
+                                               c-0.965-6.403-4.395-12.125-9.71-16.025c-4.953-3.636-11.02-5.241-17.046-4.601c0,0-0.715,0.047-0.893,0.761\r
+                                               C29.093,17.295,29.384,17.6,29.384,17.6z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M62.088,39.265c0.317,0.417,0.893,0.53,0.893,0.53l2.952,0.836c0,0,0.322,0.062,0.576-0.057\r
+                                               C66.807,40.434,67,39.949,67,39.453C67,20.93,51.902,5.859,33.379,5.859c-2.939,0-5.863,0.394-8.679,1.147\r
+                                               c-0.51,0.136-0.833,0.439-0.932,0.838c-0.079,0.319,0.096,0.727,0.096,0.727l1.494,2.451c0,0,0.398,0.587,0.701,0.707\r
+                                               c0.49,0.197,1.004,0.147,1.529,0.04c1.92-0.394,3.92-0.597,5.87-0.597c15.201,0,27.74,12.052,28.366,27.103\r
+                                               C61.823,38.274,61.771,38.851,62.088,39.265z"/>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/settings_icon.png b/doc/images/settings_icon.png
new file mode 100755 (executable)
index 0000000..44fb3d8
Binary files /dev/null and b/doc/images/settings_icon.png differ
diff --git a/doc/images/shift_off_icon.png b/doc/images/shift_off_icon.png
new file mode 100755 (executable)
index 0000000..720a69a
Binary files /dev/null and b/doc/images/shift_off_icon.png differ
diff --git a/doc/images/shift_on_icon.png b/doc/images/shift_on_icon.png
new file mode 100755 (executable)
index 0000000..503ff24
Binary files /dev/null and b/doc/images/shift_on_icon.png differ
diff --git a/doc/images/space_bar_icon.png b/doc/images/space_bar_icon.png
new file mode 100755 (executable)
index 0000000..2b5c2fa
Binary files /dev/null and b/doc/images/space_bar_icon.png differ
diff --git a/doc/images/switchcontrol.png b/doc/images/switchcontrol.png
new file mode 100755 (executable)
index 0000000..1c350b5
Binary files /dev/null and b/doc/images/switchcontrol.png differ
diff --git a/doc/images/switchplate_off.png b/doc/images/switchplate_off.png
new file mode 100755 (executable)
index 0000000..16250c5
Binary files /dev/null and b/doc/images/switchplate_off.png differ
diff --git a/doc/images/switchplate_on.png b/doc/images/switchplate_on.png
new file mode 100755 (executable)
index 0000000..43bb554
Binary files /dev/null and b/doc/images/switchplate_on.png differ
diff --git a/doc/images/symbols_icon.png b/doc/images/symbols_icon.png
new file mode 100755 (executable)
index 0000000..07e1deb
Binary files /dev/null and b/doc/images/symbols_icon.png differ
diff --git a/doc/images/symbols_off_icon.png b/doc/images/symbols_off_icon.png
new file mode 100755 (executable)
index 0000000..59cd170
Binary files /dev/null and b/doc/images/symbols_off_icon.png differ
diff --git a/doc/images/tizen.png b/doc/images/tizen.png
new file mode 100755 (executable)
index 0000000..c6674d6
Binary files /dev/null and b/doc/images/tizen.png differ
diff --git a/doc/images/weather_app_icon.png b/doc/images/weather_app_icon.png
new file mode 100755 (executable)
index 0000000..dcb46ee
Binary files /dev/null and b/doc/images/weather_app_icon.png differ
diff --git a/doc/images/weather_app_icon.svg b/doc/images/weather_app_icon.svg
new file mode 100755 (executable)
index 0000000..d1fb79c
--- /dev/null
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="iso-8859-1"?>\r
+<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 78.24 78.24" style="enable-background:new 0 0 78.24 78.24;" xml:space="preserve">\r
+<g id="Weather_Icon">\r
+       <g>\r
+               \r
+                       <image style="overflow:visible;opacity:0.5;" width="79" height="79" xlink:href="data:image/png;base64,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" transform="matrix(1 0 0 1 -0.5 -0.76)">\r
+               </image>\r
+               <g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M51.748,36.001c0,8.65-7.016,15.662-15.664,15.662c-8.653,0-15.665-7.012-15.665-15.662\r
+                                               c0-8.649,7.012-15.665,15.665-15.665C44.732,20.336,51.748,27.352,51.748,36.001z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M39.317,13.745c0,1.831-1.484,3.313-3.317,3.313c-1.83,0-3.313-1.482-3.313-3.313\r
+                                               c0-1.83,1.484-7.744,3.313-7.744C37.833,6.001,39.317,11.915,39.317,13.745z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M32.687,58.256c0-1.829,1.484-3.313,3.313-3.313c1.833,0,3.317,1.484,3.317,3.313\r
+                                               c0,1.83-1.484,7.743-3.317,7.743C34.17,65.999,32.687,60.086,32.687,58.256z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M54.081,22.608c-1.296,1.294-3.391,1.294-4.686,0c-1.299-1.295-1.299-3.395,0-4.689\r
+                                               c1.295-1.295,6.523-4.426,7.818-3.131C58.508,16.083,55.376,21.313,54.081,22.608z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M17.919,49.395c1.298-1.293,3.394-1.293,4.689,0c1.296,1.297,1.296,3.39,0,4.687\r
+                                               c-1.294,1.296-6.523,4.429-7.819,3.133C13.493,55.92,16.625,50.691,17.919,49.395z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M58.257,39.316c-1.831,0-3.317-1.485-3.317-3.316c0-1.83,1.486-3.313,3.317-3.313\r
+                                               C60.086,32.688,66,34.17,66,36C66,37.831,60.086,39.316,58.257,39.316z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M13.744,32.688c1.832,0,3.318,1.483,3.318,3.313c0,1.831-1.486,3.316-3.318,3.316\r
+                                               C11.916,39.316,6,37.831,6,36C6,34.17,11.916,32.688,13.744,32.688z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M49.396,54.081c-1.299-1.297-1.299-3.39,0-4.687c1.295-1.293,3.39-1.293,4.686,0\r
+                                               c1.295,1.297,4.427,6.525,3.133,7.819C55.919,58.51,50.69,55.377,49.396,54.081z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M22.607,17.919c1.296,1.294,1.296,3.394,0,4.689c-1.294,1.294-3.391,1.294-4.689,0\r
+                                               c-1.294-1.295-4.425-6.525-3.13-7.82C16.084,13.493,21.313,16.624,22.607,17.919z"/>\r
+                               </g>\r
+                       </g>\r
+                       <g>\r
+                               <g>\r
+                                       <path style="fill:#FFFFFF;" d="M51.748,36.001c0,8.65-7.016,15.662-15.664,15.662c-8.653,0-15.665-7.012-15.665-15.662\r
+                                               c0-8.649,7.012-15.665,15.665-15.665C44.732,20.336,51.748,27.352,51.748,36.001z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M39.317,13.745c0,1.831-1.484,3.313-3.317,3.313c-1.83,0-3.313-1.482-3.313-3.313\r
+                                               c0-1.83,1.484-7.744,3.313-7.744C37.833,6.001,39.317,11.915,39.317,13.745z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M32.687,58.256c0-1.829,1.484-3.313,3.313-3.313c1.833,0,3.317,1.484,3.317,3.313\r
+                                               c0,1.83-1.484,7.743-3.317,7.743C34.17,65.999,32.687,60.086,32.687,58.256z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M54.081,22.608c-1.296,1.294-3.391,1.294-4.686,0c-1.299-1.295-1.299-3.395,0-4.689\r
+                                               c1.295-1.295,6.523-4.426,7.818-3.131C58.508,16.083,55.376,21.313,54.081,22.608z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M17.919,49.395c1.298-1.293,3.394-1.293,4.689,0c1.296,1.297,1.296,3.39,0,4.687\r
+                                               c-1.294,1.296-6.523,4.429-7.819,3.133C13.493,55.92,16.625,50.691,17.919,49.395z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M58.257,39.316c-1.831,0-3.317-1.485-3.317-3.316c0-1.83,1.486-3.313,3.317-3.313\r
+                                               C60.086,32.688,66,34.17,66,36C66,37.831,60.086,39.316,58.257,39.316z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M13.744,32.688c1.832,0,3.318,1.483,3.318,3.313c0,1.831-1.486,3.316-3.318,3.316\r
+                                               C11.916,39.316,6,37.831,6,36C6,34.17,11.916,32.688,13.744,32.688z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M49.396,54.081c-1.299-1.297-1.299-3.39,0-4.687c1.295-1.293,3.39-1.293,4.686,0\r
+                                               c1.295,1.297,4.427,6.525,3.133,7.819C55.919,58.51,50.69,55.377,49.396,54.081z"/>\r
+                                       <path style="fill:#FFFFFF;" d="M22.607,17.919c1.296,1.294,1.296,3.394,0,4.689c-1.294,1.294-3.391,1.294-4.689,0\r
+                                               c-1.294-1.295-4.425-6.525-3.13-7.82C16.084,13.493,21.313,16.624,22.607,17.919z"/>\r
+                               </g>\r
+                       </g>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_1">\r
+</g>\r
+</svg>\r
diff --git a/doc/images/white_return.png b/doc/images/white_return.png
new file mode 100755 (executable)
index 0000000..0385846
Binary files /dev/null and b/doc/images/white_return.png differ
diff --git a/export.map b/export.map
new file mode 100755 (executable)
index 0000000..0ef1ac7
--- /dev/null
@@ -0,0 +1 @@
+{ global: afbBindingV1Register; local: *; };
diff --git a/icon_wifi_128.png b/icon_wifi_128.png
new file mode 100755 (executable)
index 0000000..4651b61
Binary files /dev/null and b/icon_wifi_128.png differ
diff --git a/imports/components/AwesomeIcon.qml b/imports/components/AwesomeIcon.qml
new file mode 100755 (executable)
index 0000000..542fb0f
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.\r
+ *\r
+ * This Source Code Form is subject to the terms of the Mozilla Public\r
+ * License, v. 2.0. If a copy of the MPL was not distributed with this\r
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
+\r
+import QtQuick 2.0\r
+import system 1.0\r
+import components 1.0\r
+import utils 1.0\r
+\r
+Item {\r
+    height: icon.height\r
+    width: icon.height\r
+\r
+    property alias iconSize: icon.font.pixelSize\r
+    property alias ucKey: icon.text\r
+    property alias iconColor: icon.color\r
+\r
+    Text {\r
+        id: icon\r
+        font.family: "FontAwesome"\r
+        color: "white"\r
+    }\r
+}\r
+\r
diff --git a/imports/components/Box.qml b/imports/components/Box.qml
new file mode 100755 (executable)
index 0000000..a2f2ae0
--- /dev/null
@@ -0,0 +1,49 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import utils 1.0
+
+Item {
+    id: root
+
+    opacity: 0.8
+    property color color: Style.grey
+    property color border: color
+    property string shadow: ""
+
+    OutShadow {
+        color: root.color
+        visible: root.shadow === "out"
+    }
+
+    Rectangle {
+        id: rect
+        anchors.fill: parent
+        color: Style.black
+        border.width: 1
+        border.color: root.border
+    }
+
+    InsetShadow {
+        color: root.color
+        visible: root.shadow === "fill"
+    }
+
+    InShadow {
+        color: root.color
+        visible: root.shadow === "in"
+    }
+
+    Rectangle {
+        visible: root.shadow === "fill"
+        anchors.fill: parent
+        color: "transparent"
+        border.width: 1
+        border.color: root.border
+    }
+
+}
diff --git a/imports/components/BoxButton.qml b/imports/components/BoxButton.qml
new file mode 100755 (executable)
index 0000000..0969f46
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import components 1.0
+
+Item {
+    id: root
+
+    property alias shadow: box.shadow
+    property alias color: box.color
+    property alias text: textItem.text
+
+    signal clicked()
+
+    Box {
+        id: box
+        anchors.fill: parent
+
+        Text {
+            id: textItem
+            anchors.centerIn: parent
+            horizontalAlignment: Text.AlignHCenter
+            font.pixelSize: 28
+            color: "white"
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: root.clicked()
+        }
+    }
+}
diff --git a/imports/components/BoxHeading.qml b/imports/components/BoxHeading.qml
new file mode 100755 (executable)
index 0000000..bb2c62a
--- /dev/null
@@ -0,0 +1,37 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import utils 1.0
+
+Row {
+    id: root
+
+    property color color: Style.blueViv
+    property alias fontSize: headingText.font.pixelSize
+    property alias text: headingText.text
+    property alias boxWidth: box.width
+    property alias boxHeight: box.height
+
+    spacing: 10
+
+    Rectangle {
+        id: box
+        anchors.bottom: headingText.baseline
+        anchors.bottomMargin: 0
+        width: 100
+        height: 16
+        color: root.color
+    }
+
+    Text {
+        id: headingText
+        font.family: "Source Sans Pro"
+        font.pixelSize: 22
+        font.weight: Font.Bold
+        color: root.color
+    }
+}
diff --git a/imports/components/Button.qml b/imports/components/Button.qml
new file mode 100755 (executable)
index 0000000..9d5c495
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Rectangle {
+    id: root
+    border.color: "#cccccc"
+    color:"#222"
+    border.width: 2
+    height: pairText.height + 20
+    width: pairText.width + 20
+
+    property string buttonText
+
+
+    Text {
+        id: pairText
+        anchors.centerIn: parent
+        font.family: "Source Sans Pro"
+        font.pixelSize: 48
+        font.weight: Font.Bold
+        color: "white"
+        font.capitalization: Font.AllUppercase
+        text: buttonText
+    }
+}
diff --git a/imports/components/DateTime.qml b/imports/components/DateTime.qml
new file mode 100755 (executable)
index 0000000..6203712
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.\r
+ *\r
+ * This Source Code Form is subject to the terms of the Mozilla Public\r
+ * License, v. 2.0. If a copy of the MPL was not distributed with this\r
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
+\r
+import QtQuick 2.0\r
+import utils 1.0\r
+\r
+Item {\r
+    id: dateTime\r
+    anchors.left: parent.left\r
+    anchors.right: parent.right\r
+    height: 120\r
+    property var timeStamp: new Date()\r
+\r
+    Timer {\r
+        interval: 1000\r
+        running: true\r
+        repeat: true\r
+        onTriggered: timeStamp = new Date()\r
+    }\r
+\r
+    Label {\r
+        fontColor: Style.grey\r
+        text: Qt.formatDate(timeStamp, "ddd MMM d")\r
+    }\r
+\r
+    Label {\r
+        anchors.right: parent.right\r
+        fontColor: Style.grey\r
+        text: Qt.formatTime(timeStamp, "h:mm AP")\r
+    }\r
+}\r
+\r
diff --git a/imports/components/HexGrid.qml b/imports/components/HexGrid.qml
new file mode 100755 (executable)
index 0000000..b81a09a
--- /dev/null
@@ -0,0 +1,32 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+import QtQuick 2.0
+
+Item {
+    property real spacing: 0
+    property int columns: 3
+
+    width: childrenRect.width
+    height: childrenRect.height
+
+    Component.onCompleted: {
+        var sizeX = childrenRect.height
+        var sizeY = childrenRect.width
+        var column = 0
+        var row = 0
+
+        for (var n = 0; n < children.length; n++) {
+            children[n].x = column * (sizeX + spacing)
+            children[n].y = row * (0.5 * sizeY + spacing)
+            column += 2
+            if (column >= columns) {
+                row++
+                column = row % 2
+            }
+        }
+    }
+}
diff --git a/imports/components/HexSwitch.qml b/imports/components/HexSwitch.qml
new file mode 100755 (executable)
index 0000000..cce82b3
--- /dev/null
@@ -0,0 +1,80 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import QtGraphicalEffects 1.0
+
+Item {
+    width: 170 * height / 80
+    height: 80
+
+    property bool value
+    property bool showLabels: false
+
+    Image {
+        anchors.fill: parent
+        source: "../../doc/images/switchplate_" + (value ? "on" : "off") + ".png"
+    }
+
+    Item {
+        id: shadowTarget
+        x: value ? parent.width * 0.375 : -11
+        width: parent.width * 0.7
+        height: parent.height
+
+        Image {
+            id: control
+            anchors.centerIn: parent
+            width: parent.height * 0.9
+            fillMode: Image.PreserveAspectFit
+            source: "../../doc/images/switchcontrol.png"
+        }
+    }
+
+    DropShadow {
+        anchors.fill: shadowTarget
+        cached: true
+        horizontalOffset: parent.height * 0.05
+        verticalOffset: parent.height * 0.05
+        radius: 16
+        samples: 32
+        color: Qt.rgba(0, 0, 0, 0.35)
+        smooth: true
+        source: shadowTarget
+    }
+
+    Text {
+        text: qsTr("OFF")
+        font.family: "Source Sans Pro"
+        anchors.right: parent.left
+        anchors.rightMargin: 30
+        anchors.verticalCenter: parent.verticalCenter
+        font.pointSize: 25
+        font.letterSpacing: -0.5
+        font.weight: value ? Font.Normal : Font.Bold
+        color: value ? "#C4C4C4" : "#FE9C00"
+        visible: showLabels
+    }
+
+    Text {
+        id: onText
+        text: qsTr("ON")
+        font.family: "Source Sans Pro"
+        anchors.left: parent.right
+        anchors.leftMargin: 30
+        font.pointSize: 25
+        anchors.verticalCenter: parent.verticalCenter
+        font.letterSpacing: -0.5
+        font.weight: value ? Font.Bold : Font.Normal
+        color: value ? "#59FF00" : "#C4C4C4"
+        visible: showLabels
+    }
+
+    MouseArea {
+        anchors.fill: parent
+        onClicked: value = !value
+    }
+}
diff --git a/imports/components/InShadow.qml b/imports/components/InShadow.qml
new file mode 100755 (executable)
index 0000000..2d64c2a
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0    
+
+ShaderEffect {
+    anchors.fill: parent
+    property color color
+    property real radius: 16
+
+    fragmentShader: "
+uniform lowp float radius;
+uniform lowp float height;
+uniform lowp float width;
+uniform lowp float qt_Opacity;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+    lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0);
+    // Border shadow
+    lowp float xval = smoothstep(0.0, radius, dist.x * width);
+    lowp float yval = smoothstep(0.0, radius, dist.y * height);
+    lowp float borderVal = sqrt(yval * xval) * 0.5 + 0.5;
+
+    lowp vec4 borderColor = mix(color, vec4(0.0, 0.0, 0.0, 1.0), borderVal);
+    gl_FragColor = borderColor * qt_Opacity;
+}
+    "
+}
diff --git a/imports/components/InsetShadow.qml b/imports/components/InsetShadow.qml
new file mode 100755 (executable)
index 0000000..6ad17cd
--- /dev/null
@@ -0,0 +1,40 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0    
+
+ShaderEffect {
+    anchors.fill: parent
+    property color color
+    property real radius: 100
+    property real border: 20
+
+    fragmentShader: "
+uniform lowp float radius;
+uniform lowp float border;
+uniform lowp float height;
+uniform lowp float width;
+uniform lowp float qt_Opacity;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+    lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0);
+    // Border shadow
+    lowp float xval = smoothstep(0.0, border, dist.x * width);
+    lowp float yval = smoothstep(0.0, border, dist.y * height);
+    lowp float borderVal = sqrt(yval * xval) * 0.5 + 0.5;
+    // Inner shadow
+    xval = smoothstep(0.0, radius, dist.x * width);
+    yval = smoothstep(0.0, radius, dist.y * width);
+    lowp float innerVal = sqrt(yval * xval) * 0.5 + 0.5;
+
+    lowp vec4 innerColor = mix(vec4(0.0, 0.0, 0.0, 0.5), color, innerVal);
+    lowp vec4 borderColor = mix(vec4(0.0, 0.0, 0.0, 1.0), innerColor, borderVal);
+    gl_FragColor = borderColor * qt_Opacity;
+}
+    "
+}
diff --git a/imports/components/Label.qml b/imports/components/Label.qml
new file mode 100755 (executable)
index 0000000..e1e0b30
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.\r
+ *\r
+ * This Source Code Form is subject to the terms of the Mozilla Public\r
+ * License, v. 2.0. If a copy of the MPL was not distributed with this\r
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
+\r
+import QtQuick 2.0\r
+import utils 1.0\r
+\r
+Item {\r
+    // Tracer {}\r
+    width: childrenRect.width\r
+    height: childrenRect.height\r
+    property alias text: text.text\r
+    property alias label: text\r
+    property alias fontSize: text.font.pixelSize\r
+    property alias fontColor: text.color\r
+\r
+    Text {\r
+        id: text\r
+        color: "#ddd"\r
+        font.family: "Source Sans Pro"\r
+        font.pixelSize: 40\r
+        font.capitalization: Font.AllUppercase\r
+        font.weight: Font.Bold\r
+     }\r
+}\r
diff --git a/imports/components/NumberPad.qml b/imports/components/NumberPad.qml
new file mode 100755 (executable)
index 0000000..b7763ca
--- /dev/null
@@ -0,0 +1,101 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.\r
+ *\r
+ * This Source Code Form is subject to the terms of the Mozilla Public\r
+ * License, v. 2.0. If a copy of the MPL was not distributed with this\r
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\r
+\r
+import QtQuick 2.0\r
+import utils 1.0\r
+\r
+Item {\r
+    id: root\r
+    height: childrenRect.height\r
+    property var letters: ["","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]\r
+    property var bottomRow: ["*","0","#"]\r
+\r
+    signal number(string number)\r
+\r
+    Grid {\r
+        id: numberGrid\r
+        columns: 3\r
+        spacing: 20\r
+\r
+        Repeater {\r
+            model: 9\r
+            delegate: Item {\r
+                id: numberKey\r
+                width: (root.width - ( numberGrid.spacing*(numberGrid.columns-1)))/numberGrid.columns\r
+                height: numberKey.width * 0.8\r
+                anchors.margins: 10\r
+\r
+                Rectangle {\r
+                    id: shadowTarget\r
+                    anchors.fill: parent\r
+                    border.width: 1\r
+                    border.color: "white"\r
+                    color: "#6653b5ce"\r
+                }\r
+\r
+                Item {\r
+                    height: childrenRect.height\r
+                    width: parent.width\r
+                    anchors.centerIn: parent\r
+\r
+                    Label {\r
+                        anchors.horizontalCenter: parent.horizontalCenter\r
+                        id: keypadNumber\r
+                        text: index + 1\r
+                    }\r
+\r
+                    Label {\r
+                        anchors.horizontalCenter: parent.horizontalCenter\r
+                        id: keypadLetters\r
+                        anchors.top: keypadNumber.bottom\r
+                        fontSize: 30\r
+                        fontColor: "#53b5ce"\r
+                        text: letters[index]\r
+                    }\r
+                }\r
+\r
+                MouseArea {\r
+                    anchors.fill: parent\r
+                    onClicked: root.number(keypadNumber.text)\r
+                }\r
+            }\r
+        }\r
+\r
+        Repeater {\r
+            model: 3\r
+            delegate: Item {\r
+                width: (root.width - ( numberGrid.spacing*(numberGrid.columns-1)))/numberGrid.columns\r
+                height: width * 0.8\r
+                anchors.margins: 10\r
+\r
+                Rectangle {\r
+                    id: shadowTarget\r
+                    anchors.fill: parent\r
+                    border.width: 1\r
+                    border.color: "white"\r
+                    color: "#6653b5ce"\r
+                }\r
+\r
+                Item {\r
+                    height: childrenRect.height\r
+                    width: parent.width\r
+                    anchors.centerIn: parent\r
+\r
+                    Label {\r
+                        anchors.horizontalCenter: parent.horizontalCenter\r
+                        id: keypadNumber\r
+                        text: bottomRow[index]\r
+                    }\r
+                }\r
+\r
+                MouseArea {\r
+                    anchors.fill: parent\r
+                    onClicked: root.number(keypadNumber.text)\r
+                }\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/imports/components/OutShadow.qml b/imports/components/OutShadow.qml
new file mode 100755 (executable)
index 0000000..f4d8407
--- /dev/null
@@ -0,0 +1,41 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0    
+import QtGraphicalEffects 1.0
+
+Item {
+    id: root
+
+    anchors.fill: parent
+    property alias color: shadow.color
+    property alias radius: shadow.radius
+
+    Item {
+        id: shadowTarget
+        x: -radius
+        y: -radius
+        width: parent.width + 2 * radius
+        height: parent.height + 2 * radius
+
+        Rectangle {
+            anchors.centerIn: parent
+            width: root.width
+            height: root.height
+            color: "black"
+        }
+    }
+
+    DropShadow {
+        id: shadow
+        anchors.fill: shadowTarget
+        horizontalOffset: 0
+        verticalOffset: 0
+        radius: 16
+        samples: 32
+        source: shadowTarget
+    }
+}
diff --git a/imports/components/Switch.qml b/imports/components/Switch.qml
new file mode 100755 (executable)
index 0000000..6cd50c7
--- /dev/null
@@ -0,0 +1,13 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+
+Switch {
+    width: 100
+    height: 62
+}
+
diff --git a/imports/components/qmldir b/imports/components/qmldir
new file mode 100755 (executable)
index 0000000..57e4d2d
--- /dev/null
@@ -0,0 +1,16 @@
+#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+# *
+# * This Source Code Form is subject to the terms of the Mozilla Public
+# * License, v. 2.0. If a copy of the MPL was not distributed with this
+# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+AwesomeIcon 1.0 AwesomeIcon.qml
+Box 1.0 Box.qml
+BoxButton 1.0 BoxButton.qml
+BoxHeading 1.0 BoxHeading.qml
+DateTime 1.0 DateTime.qml
+HexGrid 1.0 HexGrid.qml
+HexSwitch 1.0 HexSwitch.qml
+Label 1.0 Label.qml
+NumberPad 1.0 NumberPad.qml
+Button 1.0 Button.qml
diff --git a/imports/radio/Radio.qml b/imports/radio/Radio.qml
new file mode 100755 (executable)
index 0000000..cea2e1a
--- /dev/null
@@ -0,0 +1,6 @@
+import QtQuick 2.0
+
+Item {
+    signal stopped
+    signal playing
+}
diff --git a/imports/radio/qmldir b/imports/radio/qmldir
new file mode 100755 (executable)
index 0000000..e334188
--- /dev/null
@@ -0,0 +1,2 @@
+Radio 1.0 Radio.qml
+RadioPropertyItem 1.0 Radio.qml
diff --git a/imports/system/App.qml b/imports/system/App.qml
new file mode 100755 (executable)
index 0000000..d7da73c
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+import QtQuick 2.0
+import system 1.0
+
+FocusScope {
+    id: root
+    property string appId
+    anchors.fill: parent
+    visible: System.activeApp === appId
+    property bool hasKeyFocus: false
+    focus: visible
+    onFocusChanged: if (focus) hasKeyFocus = true
+
+    Keys.onPressed: {
+        switch (event.key) {
+        case Qt.Key_Left:
+        case Qt.Key_Right:
+            root.hasKeyFocus = false
+            break
+        default:
+            break
+        }
+    }
+}
diff --git a/imports/system/System.qml b/imports/system/System.qml
new file mode 100755 (executable)
index 0000000..8e155fd
--- /dev/null
@@ -0,0 +1,15 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+import QtQuick 2.0
+
+Item {
+    property string activeApp: "home"
+    property string activeSetting: "settings"
+    property bool showKeyboard: false
+    property bool showSettings: false
+}
diff --git a/imports/system/qmldir b/imports/system/qmldir
new file mode 100755 (executable)
index 0000000..afa0f56
--- /dev/null
@@ -0,0 +1,8 @@
+#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+# *
+# * This Source Code Form is subject to the terms of the Mozilla Public
+# * License, v. 2.0. If a copy of the MPL was not distributed with this
+# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+singleton System 1.0 System.qml
+App 1.0 App.qml
diff --git a/imports/utils/Marker.qml b/imports/utils/Marker.qml
new file mode 100755 (executable)
index 0000000..c7a377e
--- /dev/null
@@ -0,0 +1,60 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import QtQuick 2.0
+import utils 1.0
+
+Item {
+    id: root
+    width: 120
+    height: 120
+    property string text
+    signal clicked()
+    property alias pressed: area.pressed
+    property alias color: background.color
+    property alias fontSize: label.font.pixelSize
+    property bool fill: false
+
+    Rectangle {
+        id: background
+        anchors.fill: parent
+        color: Style.backgroundColor
+        opacity: root.fill ? 1.0: 0.2
+    }
+
+    Rectangle {
+        id: frame
+        anchors.fill: parent
+        color: 'transparent'
+        border.color: Qt.darker(background.color, 1.4)
+        border.width: 2
+        opacity: 1.0
+    }
+
+
+    Rectangle {
+        anchors.fill: label
+        anchors.margins: -2
+        color: Style.backgroundColor
+        opacity: root.text ? 1.0 : 0.0
+    }
+
+    Text {
+        id: label
+        anchors.centerIn: parent
+        font.pixelSize: 14
+        color: Style.greyDarkColor
+        opacity: 0.75
+        text: root.text
+    }
+    MouseArea {
+        id: area
+        anchors.fill: parent
+        onClicked: root.clicked()
+        onPressed: background.color = Qt.darker(background.color, 1.5)
+        onReleased:  background.color = Qt.lighter(background.color, 1.5)
+    }
+}
diff --git a/imports/utils/Style.qml b/imports/utils/Style.qml
new file mode 100755 (executable)
index 0000000..ef544a6
--- /dev/null
@@ -0,0 +1,37 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+import QtQuick 2.2
+
+QtObject {
+    property bool debugMode: false
+    property bool debugFill: false
+
+    // Primary colors
+    property color orangeLt: "#ffd38c"
+    property color orangeViv: "#fe9c00"
+    property color blueLt: "#b2f0ff"
+    property color blueViv: "#53b5ce"
+    // Secondary colors
+    property color yellowLt: "#ffffb2"
+    property color yellowViv: "#ffff00"
+    property color greenLt: "#cdffb2"
+    property color greenViv: "#59ff00"
+    // Neutral colors
+    property color white: "#ffffff"
+    property color grey: "#c4c4c4"
+    property color black: "#000000"
+    property color overlay: Qt.rgba(0, 0, 0, 0.8)
+
+    function getGfxPath() {
+        return Qt.resolvedUrl("../assets/")
+    }
+
+    function gfx(name) {
+        return Qt.resolvedUrl("../../doc/images/" + name )
+    }
+}
diff --git a/imports/utils/qmldir b/imports/utils/qmldir
new file mode 100755 (executable)
index 0000000..c2df9de
--- /dev/null
@@ -0,0 +1,8 @@
+#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+# *
+# * This Source Code Form is subject to the terms of the Mozilla Public
+# * License, v. 2.0. If a copy of the MPL was not distributed with this
+# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+singleton Style 1.0 Style.qml
+Marker 1.0 Marker.qml
diff --git a/imports/vehicle/ClimateModel.qml b/imports/vehicle/ClimateModel.qml
new file mode 100755 (executable)
index 0000000..9633f16
--- /dev/null
@@ -0,0 +1,44 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+
+import QtQuick 2.0
+import Automotive.ClimateControl 1.0
+
+Item {
+    property real fanStepSize:1/255 //Represents the stepSize for a given Climate control.
+    property alias fanSpeed: fanControl.fanSpeedLevel
+
+    property real temperatureStepSize:1/15 //0== 15c, 15 == 30c
+
+    property alias leftTemp: leftFront.targetTemperature
+    property alias rightTemp: rightFront.targetTemperature
+
+    ClimateControlItem {
+        id:fanControl
+    }
+
+    ClimateControlItem {
+        id: leftFront
+        zone: 9
+    }
+
+    ClimateControlItem {
+        id: rightFront
+        zone: 5
+    }
+
+    function getRangeValue(inputVal,stepSize){
+        if(inputVal > 0){
+            return Math.ceil(inputVal/stepSize);
+        }else{
+            return 0;
+        }
+    }
+
+}
+
diff --git a/imports/vehicle/FuelModel.qml b/imports/vehicle/FuelModel.qml
new file mode 100755 (executable)
index 0000000..fa064e2
--- /dev/null
@@ -0,0 +1,46 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+
+import QtQuick 2.0
+
+Item {
+    property bool metric: false
+
+    function galToL(value) {
+        return (metric ? 3.78541 : 1) * value
+    }
+
+    function mpgToLp100(value) {
+        return metric ? 235.214583571 / value : value
+    }
+
+    property real baseTank: 25
+    property real tankSize: galToL(baseTank)
+    property real level: tankSize * percentage * 0.01
+    property real percentage: 100
+    property real range: metric ? 100 * level / average : level * average
+    property real baseAverage: 20.7
+    property real average: mpgToLp100(baseAverage + mpgDiff)
+    property real mpgDiff: 0
+
+    NumberAnimation on percentage {
+        from: 100
+        to: 0
+        duration: 5000
+        loops: Animation.Infinite
+        easing.type: Easing.CosineCurve
+    }
+
+    NumberAnimation on mpgDiff {
+        from: -2
+        to: 2
+        duration: 11200
+        loops: Animation.Infinite
+        easing.type: Easing.CosineCurve
+    }
+}
diff --git a/imports/vehicle/PositionModel.qml b/imports/vehicle/PositionModel.qml
new file mode 100755 (executable)
index 0000000..00956aa
--- /dev/null
@@ -0,0 +1,33 @@
+/* Copyright (C) 2015, Jaguar Land Rover, IoT.bzh. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+
+import QtQuick 2.0
+import amb 0.1
+
+Item {
+    property string nmeaString: nmea.value
+    property real satellites: satsUsed.value
+
+    AutomotivePropertyItem {
+        id: nmea
+
+        objectName: "GpsNmea"
+        propertyName: "Nmea"
+
+        Component.onCompleted: nmea.connect();
+    }
+
+    AutomotivePropertyItem {
+        id: satsUsed
+
+        objectName: "GpsSatsUsed"
+        propertyName: "SatsUsed"
+
+        Component.onCompleted: satsUsed.connect();
+    }
+}
diff --git a/imports/vehicle/SpeedModel.qml b/imports/vehicle/SpeedModel.qml
new file mode 100755 (executable)
index 0000000..03422b0
--- /dev/null
@@ -0,0 +1,38 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+
+import QtQuick 2.0
+import amb 0.1
+
+Item {
+    property bool metric: false
+
+    function mphToKph(value) {
+        return (metric ? 1.60934 : 1 ) * value
+    }
+
+    property real max:Math.ceil(mphToKph(baseMaxSpeed)/30)*30
+    property real baseMaxSpeed: 255
+    property real textSpeed: prop.value
+    property real percentage: textSpeed / max * 100
+
+    AutomotivePropertyItem {
+        id: prop
+
+        objectName: "VehicleSpeed"
+        propertyName: "Speed"
+
+        Component.onCompleted: prop.connect();
+    }
+
+    Behavior on percentage {
+        SmoothedAnimation {
+            velocity: 100
+        }
+    }
+}
diff --git a/imports/vehicle/TemperatureModel.qml b/imports/vehicle/TemperatureModel.qml
new file mode 100755 (executable)
index 0000000..2bfbbf4
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+pragma Singleton
+
+import QtQuick 2.0
+
+Item {
+    property bool metric: true
+
+    function unit(value) {
+        return celsiusToFahrenheit(value).toFixed(1) + "\u00b0" + (metric ? "C" : "F")
+    }
+
+    function celsiusToFahrenheit(value) {
+        return (metric ? value : 1.8 * value + 32)
+    }
+
+    property real indoor: 20.4
+    property string indoorString: unit(indoor)
+    property real outdoor: 28.9
+    property string outdoorString: unit(outdoor)
+}
diff --git a/imports/vehicle/qmldir b/imports/vehicle/qmldir
new file mode 100755 (executable)
index 0000000..6538e95
--- /dev/null
@@ -0,0 +1,11 @@
+#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved.
+# *
+# * This Source Code Form is subject to the terms of the Mozilla Public
+# * License, v. 2.0. If a copy of the MPL was not distributed with this
+# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+singleton FuelModel 1.0 FuelModel.qml
+singleton SpeedModel 1.0 SpeedModel.qml
+singleton TemperatureModel 1.0 TemperatureModel.qml
+singleton PositionModel 1.0 PositionModel.qml
+singleton ClimateModel 1.0 ClimateModel.qml
diff --git a/oe-sdk_crosscompile.cmake b/oe-sdk_crosscompile.cmake
new file mode 100755 (executable)
index 0000000..9669344
--- /dev/null
@@ -0,0 +1,20 @@
+# this toolchain file comes from gnuradio project
+# https://raw.githubusercontent.com/intel-iot-devkit/upm/master/cmake/Toolchains/oe-sdk_cross.cmake
+
+set( CMAKE_SYSTEM_NAME Linux )
+#set( CMAKE_C_COMPILER  $ENV{CC} )
+#set( CMAKE_CXX_COMPILER  $ENV{CXX} )
+string(REGEX MATCH "sysroots/([a-zA-Z0-9]+)" CMAKE_SYSTEM_PROCESSOR $ENV{SDKTARGETSYSROOT})
+string(REGEX REPLACE "sysroots/" "" CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR})
+set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS}  CACHE STRING "" FORCE )
+set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING "" FORCE ) #same flags for C sources
+set( CMAKE_LDFLAGS_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "" FORCE ) #same flags for C sources
+set( CMAKE_LIBRARY_PATH ${OECORE_TARGET_SYSROOT}/usr/lib )
+set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} $ENV{OECORE_NATIVE_SYSROOT} )
+set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+set( CMAKE_INSTALL_PREFIX $ENV{OECORE_TARGET_SYSROOT}/usr CACHE STRING "" FORCE)
+set( ORC_INCLUDE_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/include/orc-0.4 )
+set( ORC_LIBRARY_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/lib )
+
diff --git a/qml/wifi-settings/components/images/back.png b/qml/wifi-settings/components/images/back.png
new file mode 100755 (executable)
index 0000000..5cbf54c
Binary files /dev/null and b/qml/wifi-settings/components/images/back.png differ
diff --git a/qml/wifi-settings/components/images/wifi1-lock.png b/qml/wifi-settings/components/images/wifi1-lock.png
new file mode 100755 (executable)
index 0000000..e452041
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi1-lock.png differ
diff --git a/qml/wifi-settings/components/images/wifi1.png b/qml/wifi-settings/components/images/wifi1.png
new file mode 100755 (executable)
index 0000000..a680f54
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi1.png differ
diff --git a/qml/wifi-settings/components/images/wifi2-lock.png b/qml/wifi-settings/components/images/wifi2-lock.png
new file mode 100755 (executable)
index 0000000..3557341
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi2-lock.png differ
diff --git a/qml/wifi-settings/components/images/wifi2.png b/qml/wifi-settings/components/images/wifi2.png
new file mode 100755 (executable)
index 0000000..8299111
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi2.png differ
diff --git a/qml/wifi-settings/components/images/wifi3-lock.png b/qml/wifi-settings/components/images/wifi3-lock.png
new file mode 100755 (executable)
index 0000000..eefbc64
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi3-lock.png differ
diff --git a/qml/wifi-settings/components/images/wifi3.png b/qml/wifi-settings/components/images/wifi3.png
new file mode 100755 (executable)
index 0000000..35cb8a6
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi3.png differ
diff --git a/qml/wifi-settings/components/images/wifi4-lock.png b/qml/wifi-settings/components/images/wifi4-lock.png
new file mode 100755 (executable)
index 0000000..551ec76
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi4-lock.png differ
diff --git a/qml/wifi-settings/components/images/wifi4.png b/qml/wifi-settings/components/images/wifi4.png
new file mode 100755 (executable)
index 0000000..baced2e
Binary files /dev/null and b/qml/wifi-settings/components/images/wifi4.png differ
diff --git a/qml/wifi-settings/wifi-settings-app.qml b/qml/wifi-settings/wifi-settings-app.qml
new file mode 100755 (executable)
index 0000000..c25934d
--- /dev/null
@@ -0,0 +1,625 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   Licensed under the Apache License, Version 2.0 (the "License");
+*   you may not use this file except in compliance with the License.
+*   You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+*   Unless required by applicable law or agreed to in writing, software
+*   distributed under the License is distributed on an "AS IS" BASIS,
+*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*   See the License for the specific language governing permissions and
+*   limitations under the License.
+*/
+
+import QtQuick 2.0
+import QtQuick.Layouts 1.1
+import QtQuick.Dialogs 1.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+import system 1.0
+
+import "../../doc/"
+import "../../imports/system/"
+
+ApplicationWindow {
+
+    visible: true
+    //width: 768
+    //height: 1024
+    width: 1080
+    height: 1920
+    property string protocol: 'http://'
+    property string ipAddress: '127.0.0.1'
+    property string portNumber: Qt.application.arguments[1]
+    property string tokenString: Qt.application.arguments[2]
+    property string wifiAPI: '/api/wifi-manager/'
+
+    property string wifiAPIpath: protocol + ipAddress + ':' + portNumber + wifiAPI
+
+    function showRequestInfo(text) {
+        log.text = log.text + "\n" + text
+        console.log(text)
+    }
+
+    Text {
+        id: log
+        anchors.fill: parent
+        anchors.margins: 10
+        horizontalAlignment: Text.AlignHCenter
+        verticalAlignment: Text.AlignVCenter
+        //text: "log"
+    }
+
+    GridLayout {
+        ExclusiveGroup {
+            id: wifiPowerGroup
+        }
+        visible: true
+
+        id: seekDeviceType
+        //x: 400
+        //y: 105
+        anchors.top: parent.top
+        anchors.topMargin: 30
+
+        //anchors.bottomMargin: -30 //-20
+        anchors.horizontalCenter: parent.horizontalCenter
+        //visible: !tuningMethodManualSwitchButton.checked
+
+        //anchors.top:  functionalityCheckBoxGrid.bottom
+        columns: 13
+        rows: 1
+
+        columnSpacing: 60
+
+        Text {
+            text: qsTr("WiFi power")
+        }
+
+        RadioButton {
+            id: wifiPowerOFF
+            exclusiveGroup: wifiPowerGroup
+            checked: true
+            onClicked: {
+
+                console.log("OFF")
+
+                request(wifiAPIpath + 'deactivate', function (o) {
+
+                    // log the json response
+                    showRequestInfo(o.responseText)
+                    console.log(o.responseText)
+                })
+            }
+            Text {
+                text: qsTr("OFF")
+                anchors.left: parent.left
+                anchors.leftMargin: 30
+            }
+        }
+
+        RadioButton {
+            id: wifiPowerON
+            exclusiveGroup: wifiPowerGroup
+            onClicked: {
+
+                console.log("ON")
+
+                request(wifiAPIpath + 'activate', function (o) {
+
+                    // log the json response
+                    showRequestInfo(o.responseText)
+                    console.log(o.responseText)
+                })
+                periodicRefresh.start()
+            }
+
+            Text {
+                text: qsTr("ON")
+                anchors.left: parent.left
+                anchors.leftMargin: 30
+                //color: checkBoxTextStyleBands.fontColor
+                //font.pixelSize: checkBoxTextStyleBands.fontSize
+            }
+        }
+    }
+
+
+    //    onTechnologyEnabledChanged: {
+    //        console.log("Wifi set to", technologyEnabled)
+
+    //        if (technologyEnabled == true) {
+
+    //            //start periodic refresh, only for now
+    //            periodicRefresh.start()
+
+    //            request(wifiAPIpath + 'activate', function (o) {
+
+    //                // log the json response
+    //                showRequestInfo(o.responseText)
+    //                console.log(o.responseText)
+    //            })
+    //        } else {
+
+    //            //console.log(networkPath)
+    //            networkList.clear()
+
+    //            request(wifiAPIpath + 'deactivate', function (o) {
+
+    //                // log the json response
+    //                showRequestInfo(o.responseText)
+    //                console.log(o.responseText)
+    //            })
+    //        }
+    //    }
+    Text {
+        anchors.centerIn: parent
+        font.pixelSize: 40
+        color: "white"
+        visible: false
+        text: "Wifi TB by ALCZ"
+    }
+
+    function listWifiNetworks() {
+        console.log("test #4")
+    }
+
+    ListModel {
+        id: networkList
+    }
+
+    Rectangle {
+        id: buttonNetworkList
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.bottom: parent.bottom
+
+        anchors.margins: 10
+        width: buttonNetworkListText.width + 10
+        height: buttonScanText.height + 10
+        border.width: buttonNetworkListMouseArea.pressed ? 2 : 1
+        radius: 5
+        antialiasing: true
+        color: "#222"
+        border.color: "white"
+
+        Text {
+            color: "white"
+            id: buttonNetworkListText
+            anchors.centerIn: parent
+            text: "GET NETWORK LIST"
+            font.pixelSize: 40
+        }
+
+        ListModel {
+            id: listModel
+        }
+
+        MouseArea {
+            id: buttonNetworkListMouseArea
+            anchors.fill: parent
+
+            onClicked: {
+                log.text = ""
+                console.log("\n")
+
+                networkList.clear()
+
+                request(wifiAPIpath + 'scan_result', function (o) {
+
+                    // log the json response
+                    console.log(o.responseText)
+
+                    // translate response into object
+                    var jsonObject = eval('(' + o.responseText + ')')
+
+                    var jsonObjectNetworks = eval(
+                                '(' + JSON.stringify(jsonObject.response) + ')')
+
+                    //console.log(jsonObject.response)
+                    for (var i = 0; i < jsonObjectNetworks.length; i++) {
+
+                        networkList.append({
+                                               number: jsonObjectNetworks[i].Number,
+                                               name: jsonObjectNetworks[i].ESSID,
+                                               strength: jsonObjectNetworks[i].Strength,
+                                               serviceState: jsonObjectNetworks[i].State,
+                                               security: jsonObjectNetworks[i].Security,
+                                               address: jsonObjectNetworks[i].IPAddress
+                                           })
+                        console.log(jsonObjectNetworks[i].Number,
+                                    jsonObjectNetworks[i].ESSID,
+                                    jsonObjectNetworks[i].Strength,
+                                    jsonObjectNetworks[i].State,
+                                    jsonObjectNetworks[i].Security,
+                                    jsonObjectNetworks[i].IPAddress)
+                    }
+                })
+            }
+        }
+    }
+
+    Rectangle {
+        id: buttonScan
+        anchors.horizontalCenter: parent.horizontalCenter
+        anchors.bottom: parent.bottom
+        anchors.margins: 80
+        width: buttonScanText.width + 10
+        height: buttonScanText.height + 10
+        border.width: mouseArea.pressed ? 2 : 1
+        //radius: 5
+        //antialiasing: true
+        //color: "black"
+        color: "#222"
+        border.color: "white"
+
+        Text {
+            id: buttonScanText
+            anchors.centerIn: parent
+            text: "SCAN"
+            color: "white"
+            font.pixelSize: 40
+        }
+
+        MouseArea {
+            id: mouseArea
+            anchors.fill: parent
+
+            onClicked: {
+                log.text = ""
+                console.log("\n")
+
+                request(wifiAPIpath + 'scan', function (o) {
+
+                    // log the json response
+                    showRequestInfo(o.responseText)
+                    console.log(o.responseText)
+                })
+            }
+        }
+    }
+
+    function request(url, callback) {
+        var xhr = new XMLHttpRequest()
+        xhr.onreadystatechange = (function (myxhr) {
+
+            return function () {
+
+                if (xhr.readyState == 4 && xhr.status == 200)
+                    callback(myxhr)
+            }
+        })(xhr)
+        xhr.open('GET', url, false)
+        xhr.send('')
+    }
+
+    /* function signalStrength(strength) {
+     if (strength < 30)
+          return "poor"
+      else if (strength >= 30 && strength < 50)
+          return "fair"
+     else if (strength >= 50 && strength < 70)
+          return "good"
+     else
+          return "excellent"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          }*/
+    function securityType(security) {
+
+        //        if ((security === "[ psk ]") || (security === "[ psk wps ]"))
+        //            return "secured"
+        //        else
+        //            return "unsecured"
+        if (security === "Open")
+            return "unsecured"
+        else
+            return "secured"
+    }
+
+    Component {
+        id: wifiDevice
+
+        Rectangle {
+            height: 150
+            width: parent.width
+            color: "#222"
+
+            Image {
+                anchors.top: parent.top
+                anchors.topMargin: 7
+                anchors.left: parent.left
+                width: 70
+                height: 50
+                id: icon
+                source: {
+                    if (securityType(security) === "unsecured") {
+                        if (strength < 30)
+                            source = "components/images/wifi1.png"
+                        else if (strength >= 30 && strength < 50)
+                            source = "components/images/wifi2.png"
+                        else if (strength >= 50 && strength < 70)
+                            source = "components/images/wifi3.png"
+                        else
+                            source = "components/images/wifi4.png"
+                    } else {
+                        if (strength < 30)
+                            source = "components/images/wifi1-lock.png"
+                        else if (strength >= 30 && strength < 50)
+                            source = "components/images/wifi2-lock.png"
+                        else if (strength >= 50 && strength < 70)
+                            source = "components/images/wifi3-lock.png"
+                        else
+                            source = "components/images/wifi4-lock.png"
+                    }
+                }
+            }
+
+            Column {
+                anchors.left: icon.right
+                anchors.leftMargin: 10
+                Text {
+                    text: name
+                    font.pointSize: 20
+                    font.bold: {
+                        if ((serviceState === "ready")
+                                || serviceState === "online")
+                            font.bold = true
+                        else
+                            font.bold = false
+                    }
+
+                    color: {
+                        if ((serviceState === "ready")
+                                || serviceState === "online")
+                            color = "#00ff00"
+                        else
+                            color = "#ffffff"
+                    }
+                }
+
+                Text {
+                    //text: serviceState + ", RSSI: " + strength + security
+                    /* text: {
+                      if ((serviceState === "ready") || serviceState === "online")
+                         text = "signal " + signalStrength(strength) + ", " + "connected" + ", " + address
+                      else
+                      text = "signal " + signalStrength(strength) + ", " + securityType(security) + " network" + ", " + serviceState
+                    }*/
+                    visible: ((serviceState === "ready")
+                              || serviceState === "online") ? true : false
+                    text: "connected, " + address
+                    font.pointSize: 18
+                    color: "#ffffff"
+                    font.italic: true
+                }
+            }
+
+            Button {
+                id: connectButton
+                anchors.top: parent.top
+                anchors.right: parent.right
+                anchors.rightMargin: 5
+
+                width: 250
+
+                //text: ""
+
+                //anchors.rightMargin: 40
+                //buttonText: "Connect"
+                //                style: ButtonStyle {
+                //                label: Text {
+                //                    text: control.text
+                //                    color: "blue"
+                //                    text: control.text
+                //                }
+                //}
+
+                //                buttonText: {
+
+                //                    if ((serviceState === "ready") || serviceState === "online")
+                //                        buttonText = "Forget"
+                //                    else
+                //                        buttonText = "Connect"}
+                MouseArea {
+                    anchors.fill: parent
+
+                    Text {
+                        anchors.fill: parent
+                        id: buttonTextLabel
+                        font.pixelSize: 15
+                        font.bold: true
+                        color: "black"
+                        verticalAlignment: Text.AlignVCenter
+                        horizontalAlignment: Text.AlignHCenter
+                        text: {
+                            if ((serviceState === "ready")
+                                    || serviceState === "online")
+                                text = "Forget"
+                            else
+                                text = "Connect"
+                        }
+                    }
+
+                    onClicked: {
+
+                        //connectButton.border.color = "steelblue"
+                        if ((serviceState === "ready")
+                                || serviceState === "online") {
+
+                            //means we are connected
+                            console.log("Disconnecting from", index, " ,", name)
+                            request(wifiAPIpath + 'disconnect?network=' + index,
+                                    function (o) {
+
+                                        showRequestInfo(o.responseText)
+                                        console.log(o.responseText)
+                                    })
+                        } else {
+                            console.log("Conect to", index, " ,", name)
+
+                            //passwordDialog.open()
+                            request(wifiAPIpath + 'connect?network=' + index,
+                                    function (o) {
+
+                                        // log the json response
+                                        showRequestInfo(o.responseText)
+                                        console.log(o.responseText)
+                                    })
+                        }
+                    }
+                }
+            }
+
+            Button {
+                id: passwordButton
+                anchors.top: parent.top
+                anchors.right: parent.right
+                width: 40
+                visible: (securityType(security) === "unsecured") ? false : true
+
+                //anchors.rightMargin: connectButton.width + 5
+                //buttonText: "Connect"
+                text: {
+                    "Key" //or some icon?
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+
+                    onClicked: {
+
+                        //connectButton.border.color = "steelblue"
+                        passwordInputText.visible = true
+                        connectButton.visible = false
+                        passwordValidateButton.visible = true
+
+                        System.showKeyboard = visible
+
+                        //passwordInputText.o
+                        periodicRefresh.stop()
+
+                        var passkey = passwordInputText.text.valueOf()
+
+                        //var passkey = 'randompassword'
+                        console.log("Disconnecting from", index, " ,", name)
+                    }
+                }
+            }
+
+            Button {
+                id: passwordValidateButton
+                anchors.top: parent.top
+                anchors.right: parent.right
+                anchors.rightMargin: connectButton.width + 5
+                width: 40
+                visible: false
+
+                //anchors.rightMargin: connectButton.width + 5
+                //buttonText: "Connect"
+                text: {
+                    "ok" //or some icon?
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+
+                    onClicked: {
+                        //passwordInputText = ""
+                        var passkey = passwordInputText.text.valueOf()
+                        console.log("Validating", passkey)
+                        System.showKeyboard = false
+
+                        console.log("Passkey is", passkey)
+                        request(wifiAPIpath + 'security?passkey=' + passkey,
+                                function (o) {
+
+                                    showRequestInfo(o.responseText)
+                                    console.log(o.responseText)
+                                })
+                        passwordValidateButton.visible = false
+                        passwordInputText.visible = false
+                        connectButton.visible = true
+
+                        keyboard.currentString = ""
+
+                        periodicRefresh.start()
+                    }
+                }
+            }
+
+            TextInput {
+                id: passwordInputText
+                anchors.top: parent.top
+                anchors.right: parent.right
+                anchors.rightMargin: 5
+
+                font.pointSize: 15
+                color: "#ffffff"
+
+                width: connectButton.width
+                visible: false
+                text: keyboard.currentString
+            }
+        }
+    }
+
+    ListView {
+        width: parent.width
+        anchors.top: parent.top
+        anchors.topMargin: 70
+        anchors.bottom: parent.bottom
+        anchors.bottomMargin: 150
+        model: networkList //WifiList {}
+        delegate: wifiDevice
+        clip: true
+    }
+
+    //Timer for periodic refresh; this is BAD solution, need to figure out how to subscribe for events
+    Timer {
+        id: periodicRefresh
+        interval: 5000 // 5seconds
+        onTriggered: {
+
+            networkList.clear()
+
+            request(wifiAPIpath + 'scan_result', function (o) {
+
+                // log the json response
+                console.log(o.responseText)
+
+                // translate response into object
+                var jsonObject = eval('(' + o.responseText + ')')
+
+                var jsonObjectNetworks = eval('(' + JSON.stringify(
+                                                  jsonObject.response) + ')')
+
+                console.log("WiFi list refreshed")
+
+                //console.log(jsonObject.response)
+                for (var i = 0; i < jsonObjectNetworks.length; i++) {
+
+                    networkList.append({
+                                           number: jsonObjectNetworks[i].Number,
+                                           name: jsonObjectNetworks[i].ESSID,
+                                           strength: jsonObjectNetworks[i].Strength,
+                                           serviceState: jsonObjectNetworks[i].State,
+                                           security: jsonObjectNetworks[i].Security,
+                                           address: jsonObjectNetworks[i].IPAddress
+                                       })
+                    //                    console.log(jsonObjectNetworks[i].Number,
+                    //                                jsonObjectNetworks[i].ESSID,
+                    //                                jsonObjectNetworks[i].Strength,
+                    //                                jsonObjectNetworks[i].State,
+                    //                                jsonObjectNetworks[i].Security)
+                }
+            })
+
+            start()
+        }
+    }
+
+    Keyboard {
+        id: keyboard
+        y: System.showKeyboard ? parent.height - height : parent.height
+        width: parent.width
+    }
+}
diff --git a/wifi-api.c b/wifi-api.c
new file mode 100755 (executable)
index 0000000..2d9748f
--- /dev/null
@@ -0,0 +1,489 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   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.
+*/
+
+/**
+ * file
+ *
+ * \brief Implementation of WiFi Binder for AGL's App Framework
+ *
+ * \author ALPS Electric
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <json-c/json.h>
+#include <afb/afb-binding.h>
+
+#include "wifi-api.h"
+#include "wifi-connman.h"
+
+/*
+ * the interface to afb-daemon
+ */
+const struct afb_binding_interface *afbitf;
+
+static int need_password_flag = 0;
+static int password_not_correct_flag = 0;
+
+char *passkey;
+callback ptr_my_callback;
+
+GSList *wifi_list = NULL;
+
+/**
+ * \brief Read out the passkey from the use and pass it to Agent
+ *
+ * \todo Since I do not know how to subscribe for the events from framework,
+ *  it is necessary first to register the password http://IP_ADDRESS:PORT/api/wifi-manager/security?passkey=mypassword.
+ *  Then this function is called automatically.
+ *
+ *
+ * */
+void passkey_inserted(void) {
+
+       printf("Passkey inserted: %s\n", passkey);
+
+       if (passkey != NULL) {
+
+               registerPasskey(passkey);
+       } else {
+               printf("Please enter the password first\n");
+
+       }
+}
+
+/**
+ * \brief Notify user that password is necessary
+ *
+ * This function is called from the registered agent on RequestInput() call.
+ * \todo Subscribe for this event from GUI.
+ *
+ * */
+void ask_for_passkey(int password_rejected_flag) {
+       //TODO: show network we are asking password for
+       printf("Insert passkey.\n");
+
+       if (!password_rejected_flag) {
+               need_password_flag = 1;
+               password_not_correct_flag = 0;
+               //sleep(1);
+               passkey_inserted();
+
+       }
+
+       else if (password_rejected_flag) {
+               need_password_flag = 1;
+               printf("Password not correct!\n");
+
+       }
+
+}
+
+/**
+ * \brief Insert passkey that will be used for connections to secured AP.
+ *
+ * \TODO Only temporary, user should enter the password on ask_for_passkey() callback
+ *
+ * */
+void wifi_insertpasskey(struct afb_req request) {
+
+       const char *passkey_from_user;
+
+       /* retrieves the argument, expects password string */
+       passkey_from_user = afb_req_value(request, "passkey");
+
+       if (passkey_from_user == NULL) {
+               //TODO:better error message
+               afb_req_fail(request, "failed", "specify a security key");
+
+       } else {
+
+               passkey = g_try_malloc0(256);
+               strcpy(passkey, passkey_from_user);
+               printf("Passkey is %s\n", passkey);
+
+       }
+
+       afb_req_success(request, NULL, NULL);
+}
+
+/**
+ * \brief initialize the binder and activates the WiFi HW, should be called first
+ *
+ * This will fail if
+ *     - agent for handling password requests cannot be registered
+ *     - some error is returned from connman
+ *
+ *
+ * \return result of the request, either "success" or "failed" with description
+ */
+static void wifi_activate(struct afb_req request) /*AFB_SESSION_CHECK*/
+{
+       json_object *jresp;
+       GError *error = NULL;
+
+       if (ptr_my_callback == NULL) {
+
+               printf("Registering callback\n");
+
+               ptr_my_callback = ask_for_passkey;
+               register_callback(ptr_my_callback);
+
+       }
+
+       jresp = json_object_new_object();
+       json_object_object_add(jresp, "activation", json_object_new_string("on"));
+
+       error = do_wifiActivate();
+
+       if (error == NULL) {
+
+               afb_req_success(request, jresp, "Wi-Fi - Activated");
+
+       } else
+
+               afb_req_fail(request, "failed", error->message);
+
+}
+
+/**
+ * \brief deinitialize the binder and activates the WiFi HW
+ *
+ * This will fail if
+ *     - agent for handling password requests cannot be unregistered
+ *     - some error is returned from connman
+ *
+ *
+ * \return result of the request, either "success" or "failed" with description
+ */
+static void wifi_deactivate(struct afb_req request) /*AFB_SESSION_CHECK*/
+{
+
+       json_object *jresp;
+       GError *error = NULL;
+
+       ptr_my_callback = NULL;
+
+       jresp = json_object_new_object();
+       json_object_object_add(jresp, "deactivation", json_object_new_string("on"));
+
+       error = do_wifiDeactivate();
+
+       if (error == NULL) {
+
+               afb_req_success(request, jresp, "Wi-Fi - Activated");
+
+       } else
+
+               afb_req_fail(request, "failed", error->message);
+}
+
+/**
+ * \brief starts scan
+ *
+ * \return result of the request, either "success" or "failed" with description
+ */
+void wifi_scan(struct afb_req request) /*AFB_SESSION_NONE*/
+{
+       GError *error = NULL;
+
+       error = do_wifiScan();
+
+       if (error == NULL) {
+
+               afb_req_success(request, NULL, "Wi-Fi - Scan success");
+
+       } else
+
+               afb_req_fail(request, "failed", error->message);
+
+}
+
+/**
+ * \brief return network list
+ *
+ *
+ * \return result of the request, either "success" or "failed" with description
+ */
+void wifi_scanResult(struct afb_req request) /*AFB_SESSION_CHECK*/
+{
+       struct wifi_profile_info *wifiProfile = NULL;
+       GSList *list = NULL;
+       GSList *holdMe = NULL;
+       wifi_list = NULL;
+       char *essid = NULL;
+       char *address = NULL;
+       char *security = NULL;
+       char *state = NULL;
+       int strength = 0;
+       int number = 0;
+       GError *error = NULL;
+
+       error = do_displayScan(&wifi_list); /*Get wifi scan list*/
+       if (error == NULL) {
+               json_object *my_array = json_object_new_array();
+
+               for (list = wifi_list; list; list = list->next) { /*extract wifi scan result*/
+                       wifiProfile = (struct wifi_profile_info *) list->data;
+                       security = wifiProfile->Security.sec_type;
+                       strength = wifiProfile->Strength;
+                       //if (essid == NULL || security == NULL)
+                       //      continue;
+
+                       essid = wifiProfile->ESSID == NULL ?
+                                       "HiddenSSID" : wifiProfile->ESSID;
+                       address =
+                                       wifiProfile->wifiNetwork.IPaddress == NULL ?
+                                                       "unsigned" : wifiProfile->wifiNetwork.IPaddress;
+                       state = wifiProfile->state;
+                       //TODO: is there a case when security is NULL?
+
+                       json_object *int1 = json_object_new_int(number);
+                       json_object *int2 = json_object_new_int(strength);
+                       json_object *jstring1 = json_object_new_string(essid);
+                       json_object *jstring2 = json_object_new_string(security);
+                       json_object *jstring3 = json_object_new_string(address);
+                       json_object *jstring4 = json_object_new_string(state);
+
+                       json_object *jresp = json_object_new_object();
+                       json_object_object_add(jresp, "Number", int1);
+                       json_object_object_add(jresp, "Strength", int2);
+                       json_object_object_add(jresp, "ESSID", jstring1);
+                       json_object_object_add(jresp, "Security", jstring2);
+                       json_object_object_add(jresp, "IPAddress", jstring3);
+                       json_object_object_add(jresp, "State", jstring4);
+
+                       printf("The object json: %s\n", json_object_to_json_string(jresp));
+                       /*input each scan result into my_array*/
+                       json_object_array_add(my_array, jresp);
+                       number += 1;
+               }
+               while (list != NULL) {
+                       printf("Should be freed");
+                       holdMe = list->next;
+                       g_free(list);
+                       list = holdMe;
+               }
+               afb_req_success(request, my_array, "Wi-Fi - Scan Result is Displayed");
+       } else
+               afb_req_fail(request, "failed", error->message);
+}
+
+/**
+ * \brief connects to network
+ *
+ * \param[in] request number of network to connect to
+ *
+ *      specify number of network to connect to obtained by scan_result() like this,
+ *      http://IP_ADDRESS:PORT/api/wifi-manager/connect?network=1
+ */
+void wifi_connect(struct afb_req request) {
+
+       struct wifi_profile_info *wifiProfileToConnect = NULL;
+
+       const char *network;
+       int network_index = 0;
+       GError *error = NULL;
+       GSList *item = NULL;
+
+       /* retrieves the argument, expects the network number */
+       network = afb_req_value(request, "network");
+
+       if (network == NULL)
+               //TODO:better error message
+               afb_req_fail(request, "failed",
+                               "specify a network number to connect to");
+
+       else {
+               network_index = atoi(network);
+               printf("Joining network number %d\n", network_index);
+
+       }
+
+       //get information about desired network
+       item = g_slist_nth_data(wifi_list, network_index);
+
+       if (item == NULL) {
+               //Index starts from 1
+               printf("Network with number %d not found.\n", network_index + 1);
+               //TODO:better error message
+               afb_req_fail(request, "failed", "bad arguments");
+       }
+
+       else {
+               wifiProfileToConnect = (struct wifi_profile_info *) item;
+               printf("Name: %s, strength: %d, %s\n", wifiProfileToConnect->ESSID,
+                               wifiProfileToConnect->Strength,
+                               wifiProfileToConnect->NetworkPath);
+               //printf ("Connecting to %s\n",  wifiProfileToConnect->NetworkPath);
+       }
+       error = do_connectNetwork(wifiProfileToConnect->NetworkPath);
+
+       if (error == NULL)
+               afb_req_success(request, NULL, NULL);
+
+       else if (password_not_correct_flag) {
+               need_password_flag = 0;
+               password_not_correct_flag = 0;
+               afb_req_fail(request, "password-incorrect", NULL);
+       } else if (need_password_flag) {
+               need_password_flag = 0;
+               afb_req_fail(request, "need-password", NULL);
+
+       } else
+               afb_req_fail(request, "failed", error->message);
+}
+
+/**
+ * \brief disconnect from network
+ *
+ * \param[in] request number of network to disconnect from
+ *
+ *      specify number of network to disconnect from obtained by scan_result() like this,
+ *      http://IP_ADDRESS:PORT/api/wifi-manager/discnnect?network=1
+ */
+void wifi_disconnect(struct afb_req request) {
+
+       struct wifi_profile_info *wifiProfileToConnect = NULL;
+
+       const char *network;
+       int network_index = 0;
+       GError *error = NULL;
+       GSList *item = NULL;
+
+       /* retrieves the argument, expects the network number */
+       network = afb_req_value(request, "network");
+
+       if (network == NULL)
+               //TODO:better error message
+               afb_req_fail(request, "failed",
+                               "specify a network number to disconnect from");
+
+       else {
+               network_index = atoi(network);
+               printf("Joining network number %d\n", network_index);
+
+       }
+
+       //get information about desired network
+       item = g_slist_nth_data(wifi_list, network_index);
+
+       if (item == NULL) {
+               //Index starts from 1
+               printf("Network with number %d not found.\n", network_index + 1);
+               //TODO:better error message
+               afb_req_fail(request, "failed", "bad arguments");
+       }
+
+       else {
+               wifiProfileToConnect = (struct wifi_profile_info *) item;
+               printf("Name: %s, strength: %d, %s\n", wifiProfileToConnect->ESSID,
+                               wifiProfileToConnect->Strength,
+                               wifiProfileToConnect->NetworkPath);
+               //printf ("Connecting to %s\n",  wifiProfileToConnect->NetworkPath);
+       }
+       error = do_disconnectNetwork(wifiProfileToConnect->NetworkPath);
+
+       if (error == NULL)
+               afb_req_success(request, NULL, NULL);
+       else
+               afb_req_fail(request, "failed", error->message);
+}
+
+/**
+ * \brief return  current status of connection
+ *
+ * \return result of the request, either "success" or "failed" with description
+ */
+void wifi_status(struct afb_req request) {
+       int error = 0;
+       wifi_list = NULL;
+       struct wifiStatus *status;
+       json_object *jresp = json_object_new_object();
+
+       status = g_try_malloc0(sizeof(struct wifiStatus));
+       error = wifi_state(status); /*get current status of power and connection*/
+       if (!error) {
+               if (status->state == 0) {/*Wi-Fi is OFF*/
+                       json_object_object_add(jresp, "Power",
+                                       json_object_new_string("OFF"));
+                       //json_object_object_add(jresp, "Connection", json_object_new_string("Disconnected"));
+                       printf("Wi-Fi OFF\n");
+               } else {/*Wi-Fi is ON*/
+                       json_object_object_add(jresp, "Power",
+                                       json_object_new_string("ON"));
+                       if (status->connected == 0) {/*disconnected*/
+                               json_object_object_add(jresp, "Connection",
+                                               json_object_new_string("Disconnected"));
+                               printf("Wi-Fi ON - Disconnected \n");
+                       } else {/*Connected*/
+                               json_object_object_add(jresp, "Connection",
+                                               json_object_new_string("Connected"));
+                               printf("Wi-Fi ON - Connected \n");
+                       }
+               }
+               afb_req_success(request, jresp, "Wi-Fi - Connection Status Checked");
+       } else {
+               afb_req_fail(request, "failed", "Wi-Fi - Connection Status unknown");
+       }
+}
+
+void wifi_reconnect() {
+       /*TBD*/
+}
+
+
+
+/*
+ * array of the verbs exported to afb-daemon
+ */
+static const struct afb_verb_desc_v1 binding_verbs[] = {
+/* VERB'S NAME                         SESSION MANAGEMENT              FUNCTION TO CALL                                        SHORT DESCRIPTION */
+{ .name = "activate",  .session = AFB_SESSION_NONE,            .callback = wifi_activate,                      .info = "Activate Wi-Fi" },
+{ .name = "deactivate", .session = AFB_SESSION_NONE,           .callback = wifi_deactivate,            .info ="Deactivate Wi-Fi" },
+{ .name = "scan",              .session = AFB_SESSION_NONE,            .callback = wifi_scan,                          .info = "Scanning Wi-Fi" },
+{ .name = "scan_result",.session = AFB_SESSION_NONE,           .callback = wifi_scanResult,            .info = "Get scan result Wi-Fi" },
+{ .name = "connect",   .session = AFB_SESSION_NONE,            .callback = wifi_connect,                       .info ="Connecting to Access Point" },
+{ .name = "status",    .session = AFB_SESSION_NONE,            .callback = wifi_status,                        .info ="Check connection status" },
+{ .name = "disconnect", .session = AFB_SESSION_NONE,           .callback = wifi_disconnect,            .info ="Disconnecting connection" },
+{ .name = "reconnect",         .session = AFB_SESSION_NONE,            .callback = wifi_reconnect,             .info ="Reconnecting to Access Point" },
+{ .name = "security",  .session = AFB_SESSION_NONE,            .callback = wifi_insertpasskey,         .info ="Insert passkey" },
+
+{ .name = NULL } /* marker for end of the array */
+};
+
+/*
+ * description of the binding for afb-daemon
+ */
+static const struct afb_binding binding_description = {
+/* description conforms to VERSION 1 */
+.type = AFB_BINDING_VERSION_1, .v1 = { /* fills the v1 field of the union when AFB_BINDING_VERSION_1 */
+.prefix = "wifi-manager", /* the API name (or binding name or prefix) */
+.info = "wifi API", /* short description of of the binding */
+.verbs = binding_verbs /* the array describing the verbs of the API */
+} };
+
+/*
+ * activation function for registering the binding called by afb-daemon
+ */
+const struct afb_binding *afbBindingV1Register(
+               const struct afb_binding_interface *itf) {
+       afbitf = itf;         // records the interface for accessing afb-daemon
+       return &binding_description;  // returns the description of the binding
+}
+
diff --git a/wifi-api.h b/wifi-api.h
new file mode 100755 (executable)
index 0000000..429211b
--- /dev/null
@@ -0,0 +1,38 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   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 WIFI_API_H
+#define WIFI_API_H
+
+/* global plugin handle, should store everything we may need */
+typedef struct {
+  int devCount;
+} pluginHandleT;
+
+/* private client context [will be destroyed when client leaves] */
+typedef struct {
+  unsigned char activate;
+  unsigned char connected;
+} wifiCtxHandleT;
+
+
+struct scan_list_info {
+       int number;
+       char *SSID;
+       char *Security;
+       int Strength;
+};
+
+#endif /* AUDIO_API_H */
diff --git a/wifi-connman.c b/wifi-connman.c
new file mode 100755 (executable)
index 0000000..74d2be7
--- /dev/null
@@ -0,0 +1,354 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <glib.h>
+//#include <dbus/dbus.h>
+#include <gio/gio.h>
+#include <glib-object.h>
+
+#include "wifi-api.h"
+#include "wifi-connman.h"
+
+static __thread struct security_profile Security = { NULL, NULL, NULL, NULL, 0,
+               0 };
+
+int extract_values(GVariantIter *content, struct wifi_profile_info* wifiProfile) {
+       GVariant *var = NULL;
+       GVariant *subvar = NULL;
+       GVariantIter *array;
+       const gchar *key = NULL;
+       const gchar *subkey = NULL;
+       const gchar *value_char = NULL;
+       GVariantIter *content_sub;
+       int value_int;
+       gsize length;
+
+       while (g_variant_iter_loop(content, "{sv}", &key, &var)) {
+               if (g_strcmp0(key, "Name") == 0) {
+                       value_char = g_variant_get_string(var, &length);
+                       wifiProfile->ESSID = (char *) value_char;
+               } else if (g_strcmp0(key, "Security") == 0) {
+                       g_variant_get(var, "as", &content_sub);
+                       while (g_variant_iter_loop(content_sub, "s", &value_char)) {
+                               if (g_strcmp0(value_char, "none") == 0)
+                                       wifiProfile->Security.sec_type = "Open";
+                               else if (g_strcmp0(value_char, "wep") == 0)
+                                       wifiProfile->Security.sec_type = "WEP";
+                               else if (g_strcmp0(value_char, "psk") == 0)
+                                       wifiProfile->Security.sec_type = "WPA-PSK";
+                               else if (g_strcmp0(value_char, "ieee8021x") == 0)
+                                       wifiProfile->Security.sec_type = "ieee8021x";
+                               else if (g_strcmp0(value_char, "wpa") == 0)
+                                       wifiProfile->Security.sec_type = "WPA-PSK";
+                               else if (g_strcmp0(value_char, "rsn") == 0)
+                                       wifiProfile->Security.sec_type = "WPA2-PSK";
+                               else if (g_strcmp0(value_char, "wps") == 0)
+                                       wifiProfile->Security.wps_support = 1;
+                               else
+                                       Security.sec_type = "Open";
+                       }
+               } else if (g_strcmp0(key, "Strength") == 0) {
+                       value_int = (unsigned int) g_variant_get_byte(var);
+                       wifiProfile->Strength = value_int;
+               } else if (g_strcmp0(key, "State") == 0) {
+                       value_char = g_variant_get_string(var, &length);
+                       wifiProfile->state = (char *) value_char;
+               } else if (g_strcmp0(key, "IPv4") == 0) {
+                       g_variant_get(var, "a{sv}", &array);
+                       while (g_variant_iter_loop(array, "{sv}", &subkey, &subvar)) {
+                               if (g_strcmp0(subkey, "Method") == 0) {
+                                       value_char = g_variant_get_string(subvar, &length);
+                                       if (g_strcmp0(value_char, "dhcp") == 0)
+                                               wifiProfile->wifiNetwork.method = "dhcp";
+                                       else if (g_strcmp0(value_char, "manual") == 0)
+                                               wifiProfile->wifiNetwork.method = "manual";
+                                       else if (g_strcmp0(value_char, "fixed") == 0)
+                                               wifiProfile->wifiNetwork.method = "fix";
+                                       else if (g_strcmp0(value_char, "off") == 0)
+                                               wifiProfile->wifiNetwork.method = "off";
+                               } else if (g_strcmp0(subkey, "Address") == 0) {
+                                       value_char = g_variant_get_string(subvar, &length);
+                                       wifiProfile->wifiNetwork.IPaddress = (char *) value_char;
+                               } else if (g_strcmp0(subkey, "Netmask") == 0) {
+                                       value_char = g_variant_get_string(subvar, &length);
+                                       wifiProfile->wifiNetwork.netmask = (char *) value_char;
+                               }
+                       }
+               }
+       }
+       //printf ("SSID= %s, security= %s, Strength= %d, wps support= %d\n", wifiProfile->ESSID, wifiProfile->Security.sec_type, wifiProfile->Strength, wifiProfile->Security.wps_support);
+       return 0;
+}
+
+int wifi_state(struct wifiStatus *status) {
+       GError *error = NULL;
+       GVariant *message = NULL;
+       GVariantIter *array;
+       GDBusConnection *connection;
+       GVariant *var = NULL;
+       const gchar *key = NULL;
+       gboolean value_bool;
+
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (connection == NULL) {
+               printf("GDBusconnection is NULL");
+               return -1;
+       }
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+       CONNMAN_TECHNOLOGY_PATH, CONNMAN_TECHNOLOGY_INTERFACE, "GetProperties",
+                       NULL, NULL, G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT, NULL, &error);
+       if (message == NULL) {
+               printf("message is NULL");
+               return -1;
+       }
+       g_variant_get(message, "(a{sv})", &array);
+       while (g_variant_iter_loop(array, "{sv}", &key, &var)) {
+               if (g_strcmp0(key, "Powered") == 0) {
+                       value_bool = g_variant_get_boolean(var);
+                       if (value_bool)
+                               status->state = 1;
+                       else
+                               status->state = 0;
+               } else if (g_strcmp0(key, "Connected") == 0) {
+                       value_bool = g_variant_get_boolean(var);
+                       if (value_bool)
+                               status->connected = 1;
+                       else
+                               status->connected = 0;
+               }
+       }
+       g_variant_iter_free(array);
+       g_variant_unref(message);
+
+       return 0;
+}
+
+GError* do_wifiActivate() {
+       GVariant *params = NULL;
+       params = g_variant_new("(sv)", "Powered", g_variant_new_boolean(TRUE));
+       GDBusConnection *connection;
+       GError *error = NULL;
+
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+
+       if (connection == NULL) {
+               printf("GDBusconnection is NULL");
+               return error;
+       }
+
+       //create the agent to handle security
+       error = create_agent(connection);
+
+       if (error)
+               //This is fatal error, without agent secured networks can not be handled
+               return error;
+
+       g_dbus_connection_call(connection, CONNMAN_SERVICE,
+       CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "SetProperty",
+                       params, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, &error);
+
+       if (error) {
+               printf("error: %d:%s\n", error->code, error->message);
+
+               return error;
+       }
+
+        else {
+               printf("Power ON succeeded\n");
+               return NULL;
+       }
+
+}
+
+GError*  do_wifiDeactivate() {
+       GVariant *params = NULL;
+       params = g_variant_new("(sv)", "Powered", g_variant_new_boolean(FALSE));
+       GDBusConnection *connection;
+       GError *error = NULL;
+
+       /*connection = gdbus_conn->connection;*/
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (connection == NULL) {
+               printf("GDBusconnection is NULL");
+               return error;
+       }
+
+       //create the agent to handle security
+       error = stop_agent(connection);
+
+       if (error) {
+               printf("Error while unregistering the agent, ignoring.");
+
+       }
+
+       g_dbus_connection_call(connection, CONNMAN_SERVICE,
+       CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "SetProperty",
+                       params, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, &error);
+
+       if (error) {
+               printf("error: %d:%s\n", error->code, error->message);
+
+               return error;
+       }
+
+       else {
+               printf("Power OFF succeeded\n");
+               return NULL;
+       }
+}
+
+GError* do_wifiScan() {
+       GDBusConnection *connection;
+       GError *error = NULL;
+
+       /*connection = gdbus_conn->connection;*/
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (connection == NULL) {
+               printf("GDBusconnection is NULL");
+               return error;
+       }
+
+       g_dbus_connection_call(connection, CONNMAN_SERVICE,
+       CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL,
+                       NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, NULL, &error);
+       if (error) {
+               printf("error: %d:%s\n", error->code, error->message);
+
+               return error;
+       }
+
+       else {
+               printf("Scan succeeded\n");
+               return NULL;
+       }
+}
+
+GError* do_displayScan(GSList **wifi_list) {
+       GError *error = NULL;
+       GVariant *message = NULL;
+       GVariantIter *array;
+       gchar *object;
+       GVariantIter *content = NULL;
+       GDBusConnection *connection;
+       struct wifi_profile_info *wifiProfile = NULL;
+
+       /*connection = gdbus_conn->connection;*/
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       if (connection == NULL) {
+               printf("GDBusconnection is NULL");
+               return error;
+       }
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+       CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "GetServices", NULL, NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT, NULL, &error);
+       if (message == NULL) {
+               printf("message is NULL");
+               return error;
+       }
+       g_variant_get(message, "(a(oa{sv}))", &array);
+       while (g_variant_iter_loop(array, "(oa{sv})", &object, &content)) {
+               if (g_str_has_prefix(object,
+               CONNMAN_WIFI_SERVICE_PROFILE_PREFIX) == TRUE) {
+                       wifiProfile = g_try_malloc0(sizeof(struct wifi_profile_info));
+
+                       extract_values(content, wifiProfile);
+                       wifiProfile->NetworkPath = g_try_malloc0(strlen(object));
+                       strcpy(wifiProfile->NetworkPath, object);
+                       printf(
+                                       "SSID= %s, security= %s, path= %s, Strength= %d, wps support= %d\n",
+                                       wifiProfile->ESSID, wifiProfile->Security.sec_type,
+                                       wifiProfile->NetworkPath, wifiProfile->Strength,
+                                       wifiProfile->Security.wps_support);
+                       printf("method= %s, ip address= %s, netmask= %s\n",
+                                       wifiProfile->wifiNetwork.method,
+                                       wifiProfile->wifiNetwork.IPaddress,
+                                       wifiProfile->wifiNetwork.netmask);
+                       *wifi_list = g_slist_append(*wifi_list,
+                                       (struct wifi_profile_info *) wifiProfile);
+               }
+       }
+       g_variant_iter_free(array);
+
+       return NULL;
+}
+
+GError* do_connectNetwork(gchar *networkPath) {
+
+       printf("Connecting to: %s\n", networkPath);
+
+       GVariant *message = NULL;
+       GError *error = NULL;
+       GDBusConnection *connection;
+
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+                       networkPath, CONNMAN_SERVICE_INTERFACE, "Connect", NULL, NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT_SHORT, NULL, &error);
+
+       //printf("message error %s\n", message);
+       //TODO: do we need retunrn value in message
+
+       if (error) {
+               printf("do_connectNetwork error: %s\n", error->message);
+               return error;
+       } else {
+               printf("Connection succeeded\n");
+               return NULL;
+       }
+
+}
+
+GError* do_disconnectNetwork(gchar *networkPath) {
+
+       printf("Connecting to: %s\n", networkPath);
+
+       GVariant *message = NULL;
+       GError *error = NULL;
+       GDBusConnection *connection;
+
+       connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+
+       message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE,
+                       networkPath, CONNMAN_SERVICE_INTERFACE, "Disconnect", NULL, NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT, NULL, &error);
+
+       //TODO: do we need return value in message
+
+       if (error) {
+               printf("error: %s\n", error->message);
+               return error;
+       } else {
+               printf("Disconnected\n");
+               return NULL;
+       }
+
+}
+
+void registerPasskey(gchar *passkey) {
+
+       printf("Passkey: %s\n", passkey);
+       sendPasskey(passkey);
+
+}
+
diff --git a/wifi-connman.h b/wifi-connman.h
new file mode 100755 (executable)
index 0000000..bd83821
--- /dev/null
@@ -0,0 +1,126 @@
+/*  Copyright 2016 ALPS ELECTRIC CO., LTD.
+*
+*   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 <dlog.h>
+#include <glib.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <glib-object.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Maximum Profile Count */
+#define CONNMAN_MAX_BUFLEN 512
+
+#define CONNMAN_STATE_STRLEN 16
+
+#define CONNMAN_SERVICE                 "net.connman"
+#define CONNMAN_MANAGER_INTERFACE              CONNMAN_SERVICE ".Manager"
+#define CONNMAN_TECHNOLOGY_INTERFACE   CONNMAN_SERVICE ".Technology"
+#define CONNMAN_SERVICE_INTERFACE              CONNMAN_SERVICE ".Service"
+#define CONNMAN_PROFILE_INTERFACE              CONNMAN_SERVICE ".Profile"
+#define CONNMAN_COUNTER_INTERFACE              CONNMAN_SERVICE ".Counter"
+#define CONNMAN_ERROR_INTERFACE                        CONNMAN_SERVICE ".Error"
+#define CONNMAN_AGENT_INTERFACE                        CONNMAN_SERVICE ".Agent"
+
+#define CONNMAN_MANAGER_PATH                   "/"
+#define CONNMAN_PATH                                   "/net/connman"
+#define CONNMAN_TECHNOLOGY_PATH                        "/net/connman/technology/wifi"
+
+/** ConnMan technology and profile prefixes for ConnMan 0.78 */
+
+#define CONNMAN_WIFI_TECHNOLOGY_PREFIX                 CONNMAN_PATH "/technology/wifi"
+#define CONNMAN_WIFI_SERVICE_PROFILE_PREFIX            CONNMAN_PATH "/service/wifi_"
+
+#define WIFI_ESSID_LEN                                         128
+#define WIFI_MAX_WPSPIN_LEN                                    8
+#define WIFI_BSSID_LEN                                         17
+#define WIFI_MAX_PSK_PASSPHRASE_LEN                    65
+#define WIFI_MAX_WEP_KEY_LEN                           26
+
+#define AGENT_PATH "/net/connman/Agent"
+#define AGENT_SERVICE "org.agent"
+
+#define DBUS_REPLY_TIMEOUT (120 * 1000)
+#define DBUS_REPLY_TIMEOUT_SHORT (10 * 1000)
+
+
+struct gdbus_connection_data_s{
+       GDBusConnection *connection;
+       int conn_ref_count;
+       GCancellable *cancellable;
+       void *handle_libnetwork;
+};
+
+
+struct wifiStatus {
+       unsigned int state;
+       unsigned int connected;
+};
+
+struct security_profile{
+       char *sec_type;
+       char *enc_type;
+       char *wepKey;
+       char *pskKey;
+       unsigned int PassphraseRequired;
+       unsigned int wps_support;
+};
+
+struct wifi_net{
+       char *method;
+       char *IPaddress;
+       char *netmask;
+};
+
+struct wifi_profile_info{
+       char *ESSID;
+       char *NetworkPath;
+       char *state;
+       unsigned int Strength;
+       struct security_profile Security;
+       struct wifi_net wifiNetwork;
+};
+
+//typedef void(*callback)(void);
+typedef void(*callback)(int password_rejected_flag);
+void register_callback(callback ptr);
+
+
+int extract_values(GVariantIter *content, struct wifi_profile_info* wifiProfile);
+int wifi_state(struct wifiStatus *status);
+GError* do_wifiActivate();
+GError*  do_wifiDeactivate();
+GError* do_wifiScan();
+GError* do_displayScan(GSList **wifi_list);
+GError* do_connectNetwork(gchar *object);
+GError* do_disconnectNetwork(gchar *object);
+
+GError* create_agent(GDBusConnection *connection);
+GError* stop_agent(GDBusConnection *connection);
+
+
+void registerPasskey(gchar *object);
+GError* sendPasskey(gchar *object);
+
+GError* do_initialize();
+GError* do_initialize();
+
+
+
+
+