From 5273d4914e3e65adb4a48daa2bd61e2428c0ebad Mon Sep 17 00:00:00 2001 From: "jaekuk, lee" Date: Wed, 22 Nov 2017 01:58:28 +0900 Subject: [PATCH] [WRT][Extension] Update AppManager & app timer Change-Id: Ia52adaafcff85970a14663c36671064a8225038b Signed-off-by: jaekuk, lee --- .../extensions_repo/app_timer/background.js | 51 +++-- .../extensions_repo/app_timer/contentscript.js | 240 ++++++++++++++++----- .../extensions_repo/app_timer/data/timer.json | 0 wrt/wrt_support/extensions_repo/app_timer/icon.png | Bin 7545 -> 484 bytes .../extensions_repo/app_timer/manifest.json | 7 +- .../extensions_repo/app_timer/style.css | 84 +++++++- wrt/wrt_support/sample/wgt/AppManager.wgt | Bin 57858 -> 0 bytes 7 files changed, 317 insertions(+), 65 deletions(-) create mode 100755 wrt/wrt_support/extensions_repo/app_timer/data/timer.json delete mode 100755 wrt/wrt_support/sample/wgt/AppManager.wgt diff --git a/wrt/wrt_support/extensions_repo/app_timer/background.js b/wrt/wrt_support/extensions_repo/app_timer/background.js index 13b3859..c0e1a4f 100755 --- a/wrt/wrt_support/extensions_repo/app_timer/background.js +++ b/wrt/wrt_support/extensions_repo/app_timer/background.js @@ -7,28 +7,47 @@ var TimerState = { time: { hours: 0, minutes: 0, - seconds: 10 + seconds: 10, + }, + displayTime: { + hours: '00', + minutes: '00', + seconds: '10', }, defaultTime: { hours: 0, minutes: 0, - seconds: 10 + seconds: 10, + }, + defaultDisplayTime: { + hours: '00', + minutes: '00', + seconds: '10', } }; var thisclock; chrome.runtime.onConnect.addListener(function(port) { + chrome.pageAction.onClicked.addListener(function(tab) { + console.log('Send page action from background to contentscript!'); + port.postMessage({page_action: 'execute'}); + }); - function init() { + (function () { thisclock = new Clock({ - second: function (clock) { - update(clock); - }, - finish: function (clock) { - port.postMessage({background: "timer-finish"}); - } - }); + second: function (clock) { + update(clock); + }, + finish: function (clock) { + port.postMessage({background: "timer-finish"}); + } + }); +})(); + + + function init() { + port.postMessage({background: "timer-init", value:TimerState}); } function reset() { @@ -40,13 +59,21 @@ chrome.runtime.onConnect.addListener(function(port) { if (time.hours != TimerState.time.hours || time.minutes != TimerState.time.minutes || time.seconds != TimerState.time.seconds) { - TimerState.defaultTime = time; + //TimerState.defaultTime = time; + // TimerState.defaultDisplayTime = _getDisplayableTime(time); } TimerState.time = time; + TimerState.displayTime = _getDisplayableTime(time); + } + + function _getDisplayableTime(time) { + var dh = (time.hours < 10 ? '0' : '') + String(time.hours), + dm = (time.minutes < 10 ? '0' : '') + String(time.minutes), + ds = (time.seconds < 10 ? '0' : '') + String(time.seconds) + return {hours: dh, minutes: dm, seconds: ds}; } function start() { -// alert('start, '+TimerState.time.hours+' : '+TimerState.time.minutes+' : '+TimerState.time.seconds); thisclock.start(TimerState.time.hours, TimerState.time.minutes, TimerState.time.seconds); } diff --git a/wrt/wrt_support/extensions_repo/app_timer/contentscript.js b/wrt/wrt_support/extensions_repo/app_timer/contentscript.js index 4e79c0a..3d8ccb5 100755 --- a/wrt/wrt_support/extensions_repo/app_timer/contentscript.js +++ b/wrt/wrt_support/extensions_repo/app_timer/contentscript.js @@ -4,27 +4,77 @@ const EXIT_HTML = '\ \ \ '; -//" const TIME_HTML = '\
\
\ -00 \ -: \ -00 \ -: \ -00 \ +00 \ +: \ +00 \ +: \ +00 \
\
'; +const SET_HTML = '\ +
\ +
\ +

App Timer

\ +
\ +
\ +
\ +00 \ +: \ +00 \ +: \ +10 \ +
\ + \ +
\ +
\ +
\ +
\ + \ + \ +
\ +
\ +
\ +
'; + +var tmpTime = { + displayTime: { + hours: '00', + minutes: '00', + seconds: '10', + }, + defaultDisplayTime: { + hours: '00', + minutes: '00', + seconds: '10', + } +}; + +var f1Key = false; +const path = require('path'); var jsonfile = require('jsonfile'); -var jsonobj = {timerStart: false, time:{hours: 0, minutes: 0, seconds: 0}}; -var filepath = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('apps_repo'))+'apps_repo/AppManager/data/timer.json'; +var jsonobj = {timerStart: false, time:{hours: 0, minutes: 0, seconds: 10}}; +var filepath = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('apps_repo'))+'extensions/app_timer/data/timer.json'; var app_id = location.href.split('/'); - var port = chrome.runtime.connect({name: "contentscript"}); + port.onMessage.addListener(function(msg) { console.log('from background : ' + msg.background); + + if (msg.page_action === 'execute') { + if (f1Key) { + hideModal(); + f1Key = false; + } else { + showModal(); + f1Key = true; + } + } + if (msg.background == "timer-init") { setTime(msg.value); } @@ -36,32 +86,50 @@ port.onMessage.addListener(function(msg) { jsonfile.writeFile(filepath, jsonobj, function (err) { console.error(err); }); - document.getElementById('hours-digit').innerHTML = jsonobj.time.hours; - document.getElementById('minutes-digit').innerHTML = jsonobj.time.minutes; - document.getElementById('seconds-digit').innerHTML = jsonobj.time.seconds; + document.getElementById('hours-setdigit').innerHTML = jsonobj.time.hours; + document.getElementById('minutes-setdigit').innerHTML = jsonobj.time.minutes; + document.getElementById('seconds-setdigit').innerHTML = jsonobj.time.seconds; + document.getElementById('hours-timedigit').innerHTML = jsonobj.time.hours; + document.getElementById('minutes-timedigit').innerHTML = jsonobj.time.minutes; + document.getElementById('seconds-timedigit').innerHTML = jsonobj.time.seconds; } else if (msg.background == "timer-finish") { + port.postMessage({contentscript: "timer-stop"}); + jsonfile.writeFile(filepath, jsonobj, function (err) { + console.error(err); + }); exitPopup(); } }); +document.body.insertAdjacentHTML('beforeend', EXIT_HTML); +document.body.insertAdjacentHTML('afterbegin', TIME_HTML); +document.body.insertAdjacentHTML('beforeend', SET_HTML); + jsonfile.readFile(filepath, function(err, obj) { - if (app_id[app_id.length - 2] == 'installer' - || app_id[app_id.length - 2] == 'launcher' - || app_id[app_id.length - 2] == 'extensions_settings' - || app_id[app_id.length - 2] == 'AppManager') { + if (app_id[app_id.length - 2] === 'installer' + || app_id[app_id.length - 2] === 'launcher' + || app_id[app_id.length - 2] === 'extensions_settings' + || app_id[app_id.length - 2] === 'AppManager') { console.log('Except for '+app_id[app_id.length - 2]); return; } - if (obj.timerStart==true) { - console.log('exitPopup: '+window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'))); + if ( err ) + console.log('err; '+err); + else jsonobj = obj; - if (obj.time.hours + obj.time.minutes + obj.time.seconds > 0) { - initialize(); - } - else { - exitPopup(); - } + runningMode(); + + tmpTime.displayTime=_getDisplayableTime(jsonobj.time); + setTime(tmpTime); + bindAll(); + + console.log('exitPopup: '+window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'))); + if (jsonobj.time.hours + jsonobj.time.minutes + jsonobj.time.seconds > 0) { + initialize(); + } + else { + exitPopup(); } }); @@ -73,58 +141,132 @@ window.onbeforeunload = function() { console.log('Except for '+app_id[app_id.length - 2]); return; } - stop(); -} - -window.onkeydown = function(event) { - if (app_id[app_id.length - 2] == 'installer' - || app_id[app_id.length - 2] == 'launcher' - || app_id[app_id.length - 2] == 'extensions_settings' - || app_id[app_id.length - 2] == 'AppManager') { - console.log('Except for '+app_id[app_id.length - 2]); - return; - } - if (event.keyCode === 10009){ //esc - stop(); - } + pauseMode(); + port.postMessage({contentscript: "timer-stop"}); } function exitPopup() { - document.body.insertAdjacentHTML('beforeend', EXIT_HTML); - stop(); + document.getElementById('exit-container').style.display = 'block'; document.getElementById('exit-img').onclick= function(event) { console.log('exitPopup: '); + document.getElementById('exit-container').style.display = 'none'; var launcher = require('electron').remote.getCurrentWindow(); launcher.close(); }; } +function _getDisplayableTime(time) { + var dh = (time.hours < 10 ? '0' : '') + String(time.hours), + dm = (time.minutes < 10 ? '0' : '') + String(time.minutes), + ds = (time.seconds < 10 ? '0' : '') + String(time.seconds) + return {hours: dh, minutes: dm, seconds: ds}; +} + function initialize() { port.postMessage({contentscript: "timer-init"}); start(); + document.getElementById('time-container').style.display = 'block'; +} + +function showModal() { + console.log('showModal()'); + document.getElementById('exit-container').style.display = 'none'; + document.getElementById('time-container').style.display = 'none'; + document.getElementById('set-container').style.display = 'block'; +} + +function hideModal() { + console.log('hideModal()'); + if (jsonobj.timerStart === true && jsonobj.time.hours + jsonobj.time.minutes + jsonobj.time.seconds === 0) { + document.getElementById('exit-container').style.display = 'block'; + } + if (jsonobj.timerStart === true && jsonobj.time.hours + jsonobj.time.minutes + jsonobj.time.seconds > 0) { + document.getElementById('time-container').style.display = 'block'; + } + document.getElementById('set-container').style.display = 'none'; +} + +function bindAll() { + document.getElementById('work_time_range_input').addEventListener("input", function(event){ + tmpTime.displayTime.hours = (Math.floor(event.srcElement.value / 3600)).toString(); + tmpTime.displayTime.minutes = (Math.floor(Math.floor(event.srcElement.value % 3600) / 60)).toString(); + tmpTime.displayTime.seconds = (event.srcElement.value % 60).toString(); + if(tmpTime.displayTime.hours .length < 2){ + tmpTime.displayTime.hours = "0" + tmpTime.displayTime.hours ; + }; + if(tmpTime.displayTime.minutes.length < 2){ + tmpTime.displayTime.minutes = "0" + tmpTime.displayTime.minutes; + }; + if(tmpTime.displayTime.seconds.length < 2){ + tmpTime.displayTime.seconds = "0" + tmpTime.displayTime.seconds; + }; + setTime(tmpTime); + }); + document.getElementById('start-button').onclick= function(event) { + if (jsonobj.timerStart === false) { + start(); + } else { + stop(); + } + }; + document.getElementById('reset-button').onclick= function(event) { + if (jsonobj.timerStart === false) { + reset(); + } + }; } function start() { - console.log('start, '+jsonobj.time.hours+' : '+jsonobj.time.minutes+' : '+jsonobj.time.seconds); - document.body.insertAdjacentHTML('afterbegin', TIME_HTML); - port.postMessage({contentscript: "timer-setTime", value:jsonobj.time}); - port.postMessage({contentscript: "timer-start"}); + jsonobj.timerStart = true; + jsonobj.time.hours = Number(document.getElementById('hours-setdigit').innerHTML); + jsonobj.time.minutes = Number(document.getElementById('minutes-setdigit').innerHTML); + jsonobj.time.seconds = Number(document.getElementById('seconds-setdigit').innerHTML); + + if (jsonobj.time.hours + jsonobj.time.minutes + jsonobj.time.seconds > 0) { + runningMode(); + port.postMessage({contentscript: "timer-setTime", value:jsonobj.time}); + port.postMessage({contentscript: "timer-start"}); + } } function reset() { + jsonobj.timerStart = false; + jsonobj.time.hours = 0; + jsonobj.time.minutes = 0; + jsonobj.time.seconds = 10; + tmpTime.displayTime=_getDisplayableTime(jsonobj.time); + setTime(tmpTime); port.postMessage({contentscript: "timer-reset"}); } function stop() { + jsonobj.timerStart = false; + pauseMode(); port.postMessage({contentscript: "timer-stop"}); +} + +function setTime(time) { + console.log('setTime, '+time.displayTime.hours+' : '+time.displayTime.minutes+' : '+time.displayTime.seconds); + document.getElementById('hours-setdigit').innerHTML = time.displayTime.hours; + document.getElementById('minutes-setdigit').innerHTML = time.displayTime.minutes; + document.getElementById('seconds-setdigit').innerHTML = time.displayTime.seconds; + document.getElementById('hours-timedigit').innerHTML = time.displayTime.hours; + document.getElementById('minutes-timedigit').innerHTML = time.displayTime.minutes; + document.getElementById('seconds-timedigit').innerHTML = time.displayTime.seconds; +} + +function runningMode() { + document.getElementById('start-button').innerHTML = 'stop'; + document.getElementById('work_time_range_input').disabled = true; jsonfile.writeFile(filepath, jsonobj, function (err) { console.error(err); }); } -function setTime(time) { - console.log('setTime, '+time.defaultTime.hours+' : '+time.defaultTime.minutes+' : '+time.defaultTime.seconds); - jsonobj.time.hours = time.defaultTime.hours; - jsonobj.time.minutes = time.defaultTime.minutes; - jsonobj.time.seconds = time.defaultTime.seconds; +function pauseMode() { + document.getElementById('start-button').innerHTML = 'start'; + document.getElementById('work_time_range_input').disabled = false; + jsonfile.writeFile(filepath, jsonobj, function (err) { + console.error(err); + }); } diff --git a/wrt/wrt_support/extensions_repo/app_timer/data/timer.json b/wrt/wrt_support/extensions_repo/app_timer/data/timer.json new file mode 100755 index 0000000..e69de29 diff --git a/wrt/wrt_support/extensions_repo/app_timer/icon.png b/wrt/wrt_support/extensions_repo/app_timer/icon.png index 249ab4877522375abae0b924978a70f262ce9157..55153650e7c284e17c293d3a2083ef0fd02a6cf3 100755 GIT binary patch literal 484 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