diff --git a/chrome/.ember-cli b/chrome/.ember-cli index b4934f3..2b62747 100644 --- a/chrome/.ember-cli +++ b/chrome/.ember-cli @@ -6,5 +6,6 @@ Setting `disableAnalytics` to true will prevent any data from being sent. */ "disableAnalytics": true, - "usePods": true + "usePods": true, + "port": 8080 } diff --git a/chrome/app/pods/components/hue-controls/component.js b/chrome/app/pods/components/hue-controls/component.js index 06c01d8..458f03a 100644 --- a/chrome/app/pods/components/hue-controls/component.js +++ b/chrome/app/pods/components/hue-controls/component.js @@ -133,6 +133,9 @@ export default Component.extend({ chrome.storage.local.clear(); location.reload(); chrome.runtime.sendMessage({ action: 'stop-listening' }); + }, + email() { + chrome.tabs.create({ url: 'mailto:contact@nidratech.com' }); } } }); diff --git a/chrome/app/pods/components/hue-controls/template.hbs b/chrome/app/pods/components/hue-controls/template.hbs index aa616b7..fa5cfe4 100644 --- a/chrome/app/pods/components/hue-controls/template.hbs +++ b/chrome/app/pods/components/hue-controls/template.hbs @@ -26,6 +26,10 @@ {{#content.menu-item onClick="clearAllSettings" }} {{paper-icon "settings backup restore" class=dimmerOnClass}} Reset settings {{/content.menu-item}} + + {{#content.menu-item onClick="email" }} + {{paper-icon "email" class=dimmerOnClass}} Contact + {{/content.menu-item}} {{/menu.content}} {{/paper-menu}} diff --git a/chrome/app/pods/components/light-group/component.js b/chrome/app/pods/components/light-group/component.js index 94b4ead..5b88a5a 100644 --- a/chrome/app/pods/components/light-group/component.js +++ b/chrome/app/pods/components/light-group/component.js @@ -106,7 +106,7 @@ export default Component.extend({ case 'HML003': case 'HML004': case 'HML005': - src = 'phoenix_ceiling_pendant_table_wall'; + src = 'phoenix_ceiling'; break; case 'HML006': src = 'phoenix_down'; diff --git a/chrome/package.json b/chrome/package.json index aa20a0d..e11a683 100644 --- a/chrome/package.json +++ b/chrome/package.json @@ -19,10 +19,10 @@ "broccoli-asset-rev": "^2.2.0", "ember-cli": "^2.8.0", "ember-cli-app-version": "^3.0.0", - "ember-cli-babel": "^5.1.5", + "ember-cli-babel": "^6.0.0", "ember-cli-dependency-checker": "^1.2.0", "ember-cli-htmlbars": "^1.0.1", - "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-htmlbars-inline-precompile": "^0.4.0", "ember-cli-inject-live-reload": "^1.3.1", "ember-cli-nouislider": "^0.13.0", "ember-cli-release": "^1.0.0-beta.2", @@ -33,7 +33,7 @@ "ember-export-application-global": "^2.0.0", "ember-inline-svg": "^0.1.7", "ember-load-initializers": "^1.0.0", - "ember-modal-dialog": "^0.9.0", + "ember-modal-dialog": "^1.0.0", "ember-notify": "^5.0.4", "ember-paper": "^1.0.0-alpha.19", "ember-resolver": "^4.0.0", diff --git a/chrome/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg b/chrome/public/assets/images/lights/filled/phoenix_ceiling.svg similarity index 100% rename from chrome/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg rename to chrome/public/assets/images/lights/filled/phoenix_ceiling.svg diff --git a/chrome/public/assets/images/lights/filled/white_and_color_e27_b22.svg b/chrome/public/assets/images/lights/filled/white_and_color_e27.svg similarity index 100% rename from chrome/public/assets/images/lights/filled/white_and_color_e27_b22.svg rename to chrome/public/assets/images/lights/filled/white_and_color_e27.svg diff --git a/chrome/public/assets/images/lights/filled/white_e27_b22.svg b/chrome/public/assets/images/lights/filled/white_e27.svg similarity index 100% rename from chrome/public/assets/images/lights/filled/white_e27_b22.svg rename to chrome/public/assets/images/lights/filled/white_e27.svg diff --git a/chrome/public/background.js b/chrome/public/background.js index dd2bb3f..d8e0235 100644 --- a/chrome/public/background.js +++ b/chrome/public/background.js @@ -9,6 +9,7 @@ let isNone = function (obj) { // the main ember app controls may change these let state = { activeLights: [], + beatDelay: 0, threshold: 0.2, hueRange: [0, 65535], brightnessRange: [1, 254], @@ -25,13 +26,13 @@ let dancer = new window.Dancer(), kick; // initialze the state -chrome.storage.local.get('activeLights', ({activeLights}) => { +chrome.storage.local.get('activeLights', ({ activeLights }) => { if (!isNone(activeLights)) { state.activeLights = activeLights; } }); -chrome.storage.local.get('threshold', ({threshold}) => { +chrome.storage.local.get('threshold', ({ threshold }) => { if (!isNone(threshold)) { state.threshold = threshold; } @@ -48,38 +49,44 @@ chrome.storage.local.get('threshold', ({threshold}) => { kick.on(); }); -chrome.storage.local.get('hueRange', ({hueRange}) => { +chrome.storage.local.get('beatDelay', ({ beatDelay }) => { + if (!isNone(beatDelay)) { + state.beatDelay = beatDelay; + } +}); + +chrome.storage.local.get('hueRange', ({ hueRange }) => { if (!isNone(hueRange)) { state.hueRange = hueRange; } }); -chrome.storage.local.get('brightnessRange', ({brightnessRange}) => { +chrome.storage.local.get('brightnessRange', ({ brightnessRange }) => { if (!isNone(brightnessRange)) { state.brightnessRange = brightnessRange; } }); -chrome.storage.local.get('bridgeIp', ({bridgeIp}) => { +chrome.storage.local.get('bridgeIp', ({ bridgeIp }) => { if (!isNone(bridgeIp)) { state.bridgeIp = bridgeIp; } }); -chrome.storage.local.get('bridgeUsername', ({bridgeUsername}) => { +chrome.storage.local.get('bridgeUsername', ({ bridgeUsername }) => { if (!isNone(bridgeUsername)) { state.bridgeUsername = bridgeUsername; } }); -chrome.storage.local.get('lightsData', ({lightsData}) => { +chrome.storage.local.get('lightsData', ({ lightsData }) => { if (!isNone(lightsData)) { state.lightsData = lightsData; } }); // add listeners for appliation state change -chrome.storage.onChanged.addListener(function ({activeLights, threshold, hueRange, brightnessRange, bridgeIp, bridgeUsername, lightsData}) { +chrome.storage.onChanged.addListener(function ({ activeLights, threshold, beatDelay, hueRange, brightnessRange, bridgeIp, bridgeUsername, lightsData }) { if (activeLights) { state.activeLights = activeLights.newValue; } @@ -89,6 +96,10 @@ chrome.storage.onChanged.addListener(function ({activeLights, threshold, hueRang kick.set({ threshold: state.threshold }); } + if (beatDelay) { + state.beatDelay = beatDelay.newValue; + } + if (hueRange) { state.hueRange = hueRange.newValue; } @@ -140,6 +151,12 @@ let stopListening = function () { } }; +chrome.runtime.onMessageExternal.addListener( + function (request, sender, sendResponse) { + sendResponse({ installed: true }); + } +); + chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if (request.action === 'start-listening') { chrome.tabCapture.capture({ @@ -216,10 +233,12 @@ let simulateKick = (/*mag, ratioKickMag*/) => { color = Math.floor(Math.random() * (state.hueRange[1] - state.hueRange[0] + 1) + state.hueRange[0]); - _stimulateLight(light, state.brightnessRange[1], color); - setTimeout(function () { - _stimulateLight(light, state.brightnessRange[0]) - }, timeToBriOff); + setTimeout(() => { + _stimulateLight(light, state.brightnessRange[1], color); + setTimeout(function () { + _stimulateLight(light, state.brightnessRange[0]) + }, timeToBriOff); + }, state.beatDelay); } state.paused = true; diff --git a/chrome/public/manifest.json b/chrome/public/manifest.json index 0b3b370..b92ed5a 100644 --- a/chrome/public/manifest.json +++ b/chrome/public/manifest.json @@ -3,7 +3,7 @@ "name": "Huegasm for Philips Hue Lights", "short_name": "Huegasm", "description": "Manage and synchronize your Philips Hue lights with the beat of your music.", - "version": "1.0.4", + "version": "1.0.6", "icons": { "16": "16x16.png", "48": "48x48.png", @@ -23,6 +23,11 @@ "default_popup": "index.html", "default_title": "Huegasm" }, + "externally_connectable": { + "matches": [ + "http://www.huegasm.com/*", "http://localhost:*/*" + ] + }, "permissions": [ "activeTab", "tabCapture", diff --git a/mobile/app/pods/components/light-group/component.js b/mobile/app/pods/components/light-group/component.js index d1affab..a77593c 100644 --- a/mobile/app/pods/components/light-group/component.js +++ b/mobile/app/pods/components/light-group/component.js @@ -103,7 +103,7 @@ export default Component.extend({ case 'HML003': case 'HML004': case 'HML005': - src = 'phoenix_ceiling_pendant_table_wall'; + src = 'phoenix_ceiling'; break; case 'HML006': src = 'phoenix_down'; diff --git a/mobile/ember-cordova/cordova/config.xml b/mobile/ember-cordova/cordova/config.xml index d2f543b..1d52f22 100644 --- a/mobile/ember-cordova/cordova/config.xml +++ b/mobile/ember-cordova/cordova/config.xml @@ -1,5 +1,5 @@ - + Huegasm diff --git a/mobile/package.json b/mobile/package.json index 8182899..0a2441f 100644 --- a/mobile/package.json +++ b/mobile/package.json @@ -21,10 +21,10 @@ "broccoli-asset-rev": "^2.2.0", "ember-cli": "^2.11.0", "ember-cli-app-version": "^3.0.0", - "ember-cli-babel": "^5.1.5", + "ember-cli-babel": "^6.0.0", "ember-cli-dependency-checker": "^1.2.0", "ember-cli-htmlbars": "^1.0.1", - "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-htmlbars-inline-precompile": "^0.4.0", "ember-cli-inject-live-reload": "^1.3.1", "ember-cli-nouislider": "^0.13.0", "ember-cli-release": "^1.0.0-beta.2", @@ -36,7 +36,7 @@ "ember-export-application-global": "^2.0.0", "ember-inline-svg": "^0.1.7", "ember-load-initializers": "^1.0.0", - "ember-modal-dialog": "^0.9.0", + "ember-modal-dialog": "^1.0.0", "ember-notify": "^5.0.4", "ember-paper": "^1.0.0-alpha.19", "ember-resolver": "^4.0.0", diff --git a/mobile/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg b/mobile/public/assets/images/lights/filled/phoenix_ceiling.svg similarity index 100% rename from mobile/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg rename to mobile/public/assets/images/lights/filled/phoenix_ceiling.svg diff --git a/mobile/public/assets/images/lights/filled/white_and_color_e27_b22.svg b/mobile/public/assets/images/lights/filled/white_and_color_e27.svg similarity index 100% rename from mobile/public/assets/images/lights/filled/white_and_color_e27_b22.svg rename to mobile/public/assets/images/lights/filled/white_and_color_e27.svg diff --git a/mobile/public/assets/images/lights/filled/white_e27_b22.svg b/mobile/public/assets/images/lights/filled/white_e27.svg similarity index 100% rename from mobile/public/assets/images/lights/filled/white_e27_b22.svg rename to mobile/public/assets/images/lights/filled/white_e27.svg diff --git a/web/app/index.html b/web/app/index.html index c8fc820..fe14ee3 100644 --- a/web/app/index.html +++ b/web/app/index.html @@ -30,6 +30,8 @@ + + diff --git a/web/app/pods/components/hue-controls/component.js b/web/app/pods/components/hue-controls/component.js index 74e8ecd..b8deb25 100644 --- a/web/app/pods/components/hue-controls/component.js +++ b/web/app/pods/components/hue-controls/component.js @@ -1,21 +1,13 @@ import Ember from 'ember'; -const { - A, - Component, - computed, - isEmpty, - isNone, - run: { later, scheduleOnce }, - inject, - $ -} = Ember; +const { A, Component,computed, isEmpty, isNone, run: { later, scheduleOnce }, inject, $, set } = Ember; export default Component.extend({ classNames: ['container-fluid'], elementId: 'hue-controls', lightsData: null, + canTryChrome: false, activeLights: A(), tabList: ["Lights", "Music"], selectedTab: 1, @@ -75,6 +67,8 @@ export default Component.extend({ init() { this._super(...arguments); + let isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor); + if(!this.get('trial')) { this.updateLightData(); setInterval(this.updateLightData.bind(this), 2000); @@ -83,6 +77,20 @@ export default Component.extend({ if (!isNone(this.get('storage').get('huegasm.selectedTab'))) { this.set('selectedTab', this.get('storage').get('huegasm.selectedTab')); } + + if (isChrome && chrome && chrome.runtime && chrome.runtime.sendMessage) { + set(this, 'canTryChrome', true); + + chrome.runtime.sendMessage( + 'mbjanbdhcpohhfecjgbdpcfhnnbofooj', + {}, + (response) => { + if (response && response.installed){ + set(this, 'canTryChrome', false); + } + } + ); + } }, updateLightData(){ @@ -115,7 +123,7 @@ export default Component.extend({ window.open("https://play.google.com/store/apps/details?id=com.hoboman313.huegasm", '_blank'); }, tryExtension() { - window.open("https://chrome.google.com/webstore/detail/huegasm-for-philips-hue-l/mbjanbdhcpohhfecjgbdpcfhnnbofooj", '_blank'); + chrome.webstore.install("https://chrome.google.com/webstore/detail/mbjanbdhcpohhfecjgbdpcfhnnbofooj"); }, changeTab(tabName){ let index = this.get('tabList').indexOf(tabName); @@ -138,6 +146,9 @@ export default Component.extend({ this.get('storage').clear(); location.reload(); }, + email() { + window.open("mailto:contact@nidratech.com", '_blank'); + }, startIntro(){ let intro = introJs(), playerBottom = $('#player-bottom'); diff --git a/web/app/pods/components/hue-controls/template.hbs b/web/app/pods/components/hue-controls/template.hbs index eb4ed3f..a6cb811 100644 --- a/web/app/pods/components/hue-controls/template.hbs +++ b/web/app/pods/components/hue-controls/template.hbs @@ -13,9 +13,11 @@ {{/menu.trigger}} {{#menu.content width=3 as |content|}} - {{#content.menu-item class="hidden-xs" onClick="tryExtension"}} - {{paper-icon "extension" class=dimmerOnClass}} Try the Chrome Extension - {{/content.menu-item}} + {{#if canTryChrome}} + {{#content.menu-item class="hidden-xs" onClick="tryExtension"}} + {{paper-icon "extension" class=dimmerOnClass}} Try the Chrome Extension + {{/content.menu-item}} + {{/if}} {{#content.menu-item class="visible-xs" onClick="tryAndroid"}} {{paper-icon "extension" class=dimmerOnClass}} Try the Android Extension @@ -40,6 +42,10 @@ {{#content.menu-item onClick="clearAllSettings"}} {{paper-icon "settings backup restore" class=dimmerOnClass}} Reset settings {{/content.menu-item}} + + {{#content.menu-item onClick="email"}} + {{paper-icon "email" class=dimmerOnClass}} Contact + {{/content.menu-item}} {{/menu.content}} {{/paper-menu}} diff --git a/web/app/pods/components/light-group/component.js b/web/app/pods/components/light-group/component.js index 115e84f..c3b1a95 100644 --- a/web/app/pods/components/light-group/component.js +++ b/web/app/pods/components/light-group/component.js @@ -106,7 +106,7 @@ export default Component.extend({ case 'HML003': case 'HML004': case 'HML005': - src = 'phoenix_ceiling_pendant_table_wall'; + src = 'phoenix_ceiling'; break; case 'HML006': src = 'phoenix_down'; diff --git a/web/app/pods/components/music-tab/component.js b/web/app/pods/components/music-tab/component.js index b3c4167..4d8eee0 100644 --- a/web/app/pods/components/music-tab/component.js +++ b/web/app/pods/components/music-tab/component.js @@ -2,14 +2,7 @@ import Ember from 'ember'; import helperMixin from './mixins/helpers'; import visualizerMixin from './mixins/visualizer'; -const { - Component, - observer, - isEmpty, - isNone, - $, - run: { later, next } -} = Ember; +const { Component, observer, isEmpty, isNone, $, run: { later, next } } = Ember; export default Component.extend(helperMixin, visualizerMixin, { updatePageTitle: observer('playQueuePointer', function () { @@ -174,8 +167,10 @@ export default Component.extend(helperMixin, visualizerMixin, { timeToBriOff = 80; } - stimulateLight(light, brightnessRange[1], color); - later(this, stimulateLight, light, brightnessRange[0], timeToBriOff); + later(this, () => { + stimulateLight(light, brightnessRange[1], color); + later(this, stimulateLight, light, brightnessRange[0], timeToBriOff); + }, this.get('beatDelay')); } this.set('paused', true); @@ -213,7 +208,7 @@ export default Component.extend(helperMixin, visualizerMixin, { kick: kick }); - ['volume', 'shuffle', 'repeat', 'volumeMuted', 'threshold', 'playerBottomDisplayed', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'flashingTransitions', 'colorloopMode', 'hueRange', 'brightnessRange'].forEach((item) => { + ['volume', 'shuffle', 'repeat', 'volumeMuted', 'threshold', 'playerBottomDisplayed', 'songBeatPreferences', 'firstVisit', 'currentVisName', 'playQueue', 'playQueuePointer', 'flashingTransitions', 'colorloopMode', 'hueRange', 'brightnessRange', 'beatDelay'].forEach((item) => { if (!isNone(storage.get('huegasm.' + item))) { let itemVal = storage.get('huegasm.' + item); diff --git a/web/app/pods/components/music-tab/mixins/helpers.js b/web/app/pods/components/music-tab/mixins/helpers.js index 0d0dae0..45fc533 100644 --- a/web/app/pods/components/music-tab/mixins/helpers.js +++ b/web/app/pods/components/music-tab/mixins/helpers.js @@ -98,6 +98,7 @@ export default Mixin.create({ } }, + beatDelay: 0, threshold: 0.3, hueRange: [0, 65535], brightnessRange: [1, 254], diff --git a/web/config/deploy.js b/web/config/deploy.js new file mode 100644 index 0000000..ee8ff4c --- /dev/null +++ b/web/config/deploy.js @@ -0,0 +1,30 @@ +/* jshint node: true */ + +module.exports = function(deployTarget) { + var ENV = { + build: {}, + git: { + commitMessage: 'Deployed %@' + } + }; + + if (deployTarget === 'development') { + ENV.build.environment = 'development'; + // configure other plugins for development deploy target here + } + + if (deployTarget === 'staging') { + ENV.build.environment = 'production'; + // configure other plugins for staging deploy target here + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + // configure other plugins for production deploy target here + } + + // Note: if you need to build some configuration asynchronously, you can return + // a promise that resolves with the ENV object instead of returning the + // ENV object synchronously. + return ENV; +}; diff --git a/web/package.json b/web/package.json index 187ce86..b6c4802 100644 --- a/web/package.json +++ b/web/package.json @@ -19,10 +19,13 @@ "broccoli-asset-rev": "^2.2.0", "ember-cli": "^2.8.0", "ember-cli-app-version": "^3.0.0", - "ember-cli-babel": "^5.1.5", + "ember-cli-babel": "^6.0.0", "ember-cli-dependency-checker": "^1.2.0", + "ember-cli-deploy": "^1.0.0", + "ember-cli-deploy-build": "^1.0.0", + "ember-cli-deploy-git": "^1.1.0", "ember-cli-htmlbars": "^1.0.1", - "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-htmlbars-inline-precompile": "^0.4.0", "ember-cli-inject-live-reload": "^1.3.1", "ember-cli-nouislider": "^0.13.0", "ember-cli-release": "^1.0.0-beta.2", @@ -33,7 +36,7 @@ "ember-export-application-global": "^2.0.0", "ember-inline-svg": "^0.1.7", "ember-load-initializers": "^1.0.0", - "ember-modal-dialog": "^0.9.0", + "ember-modal-dialog": "^1.0.0", "ember-notify": "^5.0.4", "ember-paper": "^1.0.0-alpha.19", "ember-resolver": "^4.0.0", diff --git a/web/public/.gitignore b/web/public/.gitignore new file mode 100644 index 0000000..dc2b1a3 --- /dev/null +++ b/web/public/.gitignore @@ -0,0 +1,10 @@ +/.idea/ +/app/ +/node_modules/ +/bower_components/ +/tmp/ +/dist/ +/web/ +/mobile/ +/chrome/ +/.vscode/ \ No newline at end of file diff --git a/web/public/BingSiteAuth.xml b/web/public/BingSiteAuth.xml new file mode 100644 index 0000000..2f5b80a --- /dev/null +++ b/web/public/BingSiteAuth.xml @@ -0,0 +1,4 @@ + + + 358DAA5A6687F1E33975112708669D1C + \ No newline at end of file diff --git a/web/public/CNAME b/web/public/CNAME new file mode 100644 index 0000000..3deb9f0 --- /dev/null +++ b/web/public/CNAME @@ -0,0 +1 @@ +www.huegasm.com \ No newline at end of file diff --git a/web/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg b/web/public/assets/images/lights/filled/phoenix_ceiling.svg similarity index 100% rename from web/public/assets/images/lights/filled/phoenix_ceiling_pendant_table_wall.svg rename to web/public/assets/images/lights/filled/phoenix_ceiling.svg diff --git a/web/public/assets/images/lights/filled/white_and_color_e27_b22.svg b/web/public/assets/images/lights/filled/white_and_color_e27.svg similarity index 100% rename from web/public/assets/images/lights/filled/white_and_color_e27_b22.svg rename to web/public/assets/images/lights/filled/white_and_color_e27.svg diff --git a/web/public/assets/images/lights/filled/white_e27_b22.svg b/web/public/assets/images/lights/filled/white_e27.svg similarity index 100% rename from web/public/assets/images/lights/filled/white_e27_b22.svg rename to web/public/assets/images/lights/filled/white_e27.svg