From e9b92914fb4953da2a046783e3b670ab3c658225 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Mon, 30 May 2016 10:57:34 +0100 Subject: [PATCH 1/4] feat(Mobile): Add server configuration to user preferences Signed-off-by: Chris Jackson --- Gruntfile.js | 69 ++++++++++++++++++++++++-- package.json | 4 +- src/app/user/userConfig.js | 8 ++- src/app/user/userConfig.tpl.html | 30 ++++++++--- src/languages/en-GB/habmin.lang.json | 2 +- src/languages/en-GB/services.lang.json | 3 +- src/languages/en-GB/user.lang.json | 2 + 7 files changed, 101 insertions(+), 17 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 0ee35130..410acd6a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -8,7 +8,7 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-watch'); +// grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-less'); grunt.loadNpmTasks('grunt-conventional-changelog'); @@ -22,7 +22,8 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-compress'); grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTasks('grunt-shell'); - grunt.loadNpmTasks('grunt-lesslint') + grunt.loadNpmTasks('grunt-lesslint'); + grunt.loadNpmTasks('grunt-string-replace'); /** * Load in our build configuration file. @@ -708,6 +709,62 @@ module.exports = function (grunt) { }, command: 'phonegap build android' } + }, + + /** + * String Replace functions to update android manifest + */ + 'string-replace': { + versionCode: { // update the version code stored in package.json + options: { + replacements: [ + { + pattern: /['"]androidVersionCode['"]:.*?['"](\d*)['"]/ig, + replacement: function (match, p1, offset, string) { + return '"androidVersionCode": "' + (parseInt(p1) + 1) + '"'; + } + } + ] + }, + files: { + 'package.json': 'package.json' + } + }, + + androidVersionCode: { // update the version code stored in AndroidManifest.xml + options: { + replacements: [ + { + pattern: /android:versionCode=['"](\d*)['"]/ig, + replacement: function (match, p1, offset, string) { + var pkg = grunt.file.readJSON('package.json'); + grunt.log.writeln("pkg.androidVersionCode: " + pkg.androidVersionCode); + grunt.log.writeln('Returning: ' + 'android:versionCode="' + pkg.androidVersionCode + '"'); + return 'android:versionCode="' + pkg.androidVersionCode + '"'; + } + } + ] + }, + files: { + 'cordova/platforms/android/AndroidManifest.xml': 'cordova/platforms/android/AndroidManifest.xml' + } + }, + androidVersionName: { // update the version name stored in AndroidManifest.xml + options: { + replacements: [ + { + pattern: /android:versionName=['"]([0-9.]*)['"]/ig, + replacement: function (match, p1, offset, string) { + var pkg = grunt.file.readJSON('package.json'); + return 'android:versionName="' + pkg.version + '"'; + } + } + ] + }, + files: { + 'cordova/platforms/android/AndroidManifest.xml': 'cordova/platforms/android/AndroidManifest.xml' + } + } } }; @@ -820,14 +877,18 @@ module.exports = function (grunt) { * Phonegap compiler - internal... */ grunt.registerTask('build_cordova', [ - 'copy:cordova_build', 'index:cordova', 'shell:build_android', 'copy:cordova_android' + 'copy:cordova_build', 'index:cordova', + 'string-replace:versionCode', 'string-replace:androidVersionCode', 'string-replace:androidVersionName', + 'shell:build_android', 'copy:cordova_android' ]); /** * Phonegap compiler - internal... */ grunt.registerTask('compile_cordova', [ - 'copy:cordova_build', 'index:cordova', 'shell:build_android', 'copy:cordova_android' + 'copy:cordova_build', 'index:cordova', + 'string-replace:versionCode', 'string-replace:androidVersionCode', 'string-replace:androidVersionName', + 'shell:build_android', 'copy:cordova_android' ]); /** diff --git a/package.json b/package.json index 613bc538..ef7d3a0f 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "author": "Chris Jackson", "name": "HABmin2", "version": "0.1.6", + "androidVersionCode": "2", "homepage": "https://github.com/cdjackson/HABmin2", "licenses": { "type": "GPL", @@ -39,6 +40,7 @@ "grunt-contrib-cssmin": "~0.11.0", "grunt-shell": "~1.1.1", "karma-chrome-launcher": "~0.1.8", - "grunt-lesslint": "~1.1.14" + "grunt-lesslint": "~1.1.14", + "grunt-string-replace": "~1.2.1" } } diff --git a/src/app/user/userConfig.js b/src/app/user/userConfig.js index 0be06d6b..864b9d42 100644 --- a/src/app/user/userConfig.js +++ b/src/app/user/userConfig.js @@ -45,8 +45,10 @@ angular.module('User.Config', [ function ($scope, $q, locale, growl, $timeout, $window, $http, $interval, UserService, PersistenceServiceModel, localeSupported) { $scope.panelDisplayed = 'GENERAL'; - $scope.model = {currentLanguage: UserService.getLanguage(), - currentPersistence: UserService.getPersistence() + $scope.model = { + currentLanguage: UserService.getLanguage(), + currentPersistence: UserService.getPersistence(), + serverAddress: UserService.getServer() }; $scope.languages = []; var languageOk = false; @@ -89,6 +91,8 @@ angular.module('User.Config', [ $scope.saveConfig = function () { UserService.setLanguage($scope.model.currentLanguage); UserService.setPersistence($scope.model.currentPersistence.name); + UserService.setServer($scope.model.serverAddress); + $scope.userConfigForm.$setPristine(); }; diff --git a/src/app/user/userConfig.tpl.html b/src/app/user/userConfig.tpl.html index 1d1ccd52..59c3be45 100644 --- a/src/app/user/userConfig.tpl.html +++ b/src/app/user/userConfig.tpl.html @@ -23,8 +23,8 @@
- @@ -32,9 +32,8 @@
- + -
-
- + -
+
+ + +
+ + + + +
+
+
+ + +
diff --git a/src/languages/en-GB/habmin.lang.json b/src/languages/en-GB/habmin.lang.json index 92764d5e..3cfdc867 100644 --- a/src/languages/en-GB/habmin.lang.json +++ b/src/languages/en-GB/habmin.lang.json @@ -30,7 +30,7 @@ "Sitemaps": "Sitemaps", "StatusOffline": "The server is offline!", "StatusOnline": "The server is online.", - "Things": "Thing Configuration", + "Things": "Things", "Tools": "Tools", "UserPreferences": "My Preferences", "Users": "Users", diff --git a/src/languages/en-GB/services.lang.json b/src/languages/en-GB/services.lang.json index 5752652a..8bad7e41 100644 --- a/src/languages/en-GB/services.lang.json +++ b/src/languages/en-GB/services.lang.json @@ -1,4 +1,3 @@ { - "ErrorGettingServices": "Error getting service list", - "Services": "Services" + "ErrorGettingServices": "Error getting service list" } diff --git a/src/languages/en-GB/user.lang.json b/src/languages/en-GB/user.lang.json index 72a9cfa9..e227d583 100644 --- a/src/languages/en-GB/user.lang.json +++ b/src/languages/en-GB/user.lang.json @@ -8,6 +8,8 @@ "Language": "Language", "LanguageSelect": "Select your language...", "Name": "Name", + "ServerAddress": "Address", + "ServerPrefTitle": "Server Settings", "Theme": "Theme", "ThemeSelect": "Select your theme..." } From 7bd10b621bcfecd8910b61724622ec9a7b3b1197 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Fri, 3 Jun 2016 23:47:21 +0100 Subject: [PATCH 2/4] chore(ZWave): Update log viewer Signed-off-by: Chris Jackson --- src/app/tools/zwave/logService.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/tools/zwave/logService.js b/src/app/tools/zwave/logService.js index 5f5ce2d8..d09a5a70 100755 --- a/src/app/tools/zwave/logService.js +++ b/src/app/tools/zwave/logService.js @@ -208,9 +208,9 @@ function ZWaveLogReader() { } }, 0x07: { - name: "GARAGE_DOOR", + name: "SENSOR_NOTIFICATION", specific: { - 1: "SIMPLE_GARAGE_DOOR" + 1: "NOTIFICATION_SENSOR" } }, 0x08: { @@ -3309,20 +3309,20 @@ function ZWaveLogReader() { if (sendData.responseTime != "Unknown") { updateNodeResponse(node, sendData.responseTime); } - sendData.content += "ACK'd by device in " + sendData.responseTime + + sendData.content += "ACK RECEIVED from device in " + sendData.responseTime + "ms"; break; case 1: // COMPLETE_NO_ACK updateNodeResponse(node, -1); setStatus(sendData, WARNING); - sendData.content += "No ACK after " + sendData.responseTime + "ms"; + sendData.content += "NO ACK after " + sendData.responseTime + "ms"; sendData.warnFlag = true; sendData.warnMessage = "No ack received from device"; break; case 2: // COMPLETE_FAIL updateNodeResponse(node, -1); setStatus(sendData, ERROR); - sendData.content += "Failed in " + sendData.responseTime + "ms"; + sendData.content += "FAILED after " + sendData.responseTime + "ms"; break; case 3: // COMPLETE_NOT_IDLE updateNodeResponse(node, -1); From 7ab40c4019fd193eb3a8a0f863c3667c8f7bcc62 Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Sat, 4 Jun 2016 10:35:52 +0100 Subject: [PATCH 3/4] fix(Chart): Fix error message when chart data can't be loaded Fixes #179 Signed-off-by: Chris Jackson --- src/common/habminChart.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/habminChart.js b/src/common/habminChart.js index 5dd1d2ee..b995009e 100644 --- a/src/common/habminChart.js +++ b/src/common/habminChart.js @@ -172,7 +172,7 @@ angular.module('habminChart', [ }, function (reason) { // Handle failure - growl.warning(locale.getString('habmin.chartErrorLoadingItem', itemRef)); + growl.warning(locale.getString('habmin.ErrorLoadingItem', itemRef)); } ); } @@ -426,7 +426,7 @@ angular.module('habminChart', [ }, function (reason) { // Handle failure - growl.warning(locale.getString('habmin.chartErrorLoadingItem', item.item)); + growl.warning(locale.getString('habmin.ErrorLoadingItem', item.item)); cnt--; } ); From 6f21b50efbf4ee2003e26a3ca1175c3ab074e91a Mon Sep 17 00:00:00 2001 From: Chris Jackson Date: Sun, 5 Jun 2016 09:03:17 +0100 Subject: [PATCH 4/4] feat(UI): Add support for binding notifications Signed-off-by: Chris Jackson --- src/app/app.js | 1 + src/app/models/bindingModel.js | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/app/app.js b/src/app/app.js index 2d48b7ee..581a0c2d 100644 --- a/src/app/app.js +++ b/src/app/app.js @@ -462,6 +462,7 @@ angular.module('HABmin', [ }, 100); EventModel.listen(); + BindingModel.listen(); }) .filter('orderObjectBy', function () { diff --git a/src/app/models/bindingModel.js b/src/app/models/bindingModel.js index a2f2eb7e..ccfd6d8c 100644 --- a/src/app/models/bindingModel.js +++ b/src/app/models/bindingModel.js @@ -9,10 +9,11 @@ */ angular.module('HABmin.bindingModel', [ 'HABmin.userModel', - 'HABmin.restModel' + 'HABmin.restModel', + 'angular-growl', ]) - .service('BindingModel', function ($http, $q, UserService, RestService) { + .service('BindingModel', function ($http, $q, UserService, RestService, growl) { var svcBind = "bindings"; var svcDisc = "discovery"; var iconList = { @@ -22,6 +23,28 @@ angular.module('HABmin.bindingModel', [ zwave: {icon: "zwave"} }; var bindingList = []; + var eventSrc; + + var me = this; + + this.listen = function () { + eventSrc = new EventSource("/rest/events?topics=smarthome/binding/*"); + + eventSrc.addEventListener('message', function (event) { + console.log(event.data); + + var evt = angular.fromJson(event.data); + var payload = angular.fromJson(evt.payload); + var topic = evt.topic.split("/"); + + switch (evt.type) { + case 'BindingEvent': + growl.warning(payload.message); + break; + } + }); + }; + this.getList = function () { var tStart = new Date().getTime();