diff --git a/bower.json b/bower.json index 439d65fa..757b4f1a 100644 --- a/bower.json +++ b/bower.json @@ -28,7 +28,8 @@ "angular-growl-v2": "JanStevens/angular-growl-2#~0.6.0", "bluebird": "~1.2.4", "angular-tree-control": "~0.1.5", - "angular-loading-bar": "~0.4.2" + "angular-loading-bar": "~0.4.2", + "underscore.string": "~2.3.3" }, "private": true, "resolutions": { diff --git a/res/app/components/stf/logcat-table/index.js b/res/app/components/stf/logcat-table/index.js index 3364691d..191244f8 100644 --- a/res/app/components/stf/logcat-table/index.js +++ b/res/app/components/stf/logcat-table/index.js @@ -3,5 +3,4 @@ require('./logcat-table.css') module.exports = angular.module('stf.logcat-table', [ ]) - .value('logcatAutoScroll', true) .directive('logcatTable', require('./logcat-table-directive')) diff --git a/res/app/components/stf/logcat-table/logcat-table-directive.js b/res/app/components/stf/logcat-table/logcat-table-directive.js index 1529f325..c3aef3fc 100644 --- a/res/app/components/stf/logcat-table/logcat-table-directive.js +++ b/res/app/components/stf/logcat-table/logcat-table-directive.js @@ -1,14 +1,39 @@ var _ = require('lodash') -module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoScroll) { +module.exports = function logcatTableDirective($rootScope, $timeout, LogcatService) { return { restrict: 'E', replace: true, template: require('./logcat-table.jade'), link: function (scope, element, attrs) { + var autoScroll = true + var autoScrollDependingOnScrollPosition = true + var scrollPosition = 0 + var scrollHeight = 0 var parent = element[0] var body = element.find('tbody')[0] + LogcatService.addEntryListener = function (entry) { + addRow(entry) + } + + function shouldAutoScroll() { + if (autoScrollDependingOnScrollPosition) { + return scrollPosition === scrollHeight + } else { + return true + } + } + + function scrollListener(event) { + scrollPosition = event.target.scrollTop + event.target.clientHeight + scrollHeight = event.target.scrollHeight + } + + var throttledScrollListener = _.throttle(scrollListener, 100) + + parent.addEventListener('scroll', throttledScrollListener, false) + function scrollToBottom() { parent.scrollTop = parent.scrollHeight + 20 $timeout(function () { @@ -19,28 +44,30 @@ module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoS function addRow(data, batchRequest) { var newRow = body.insertRow(-1) -// newRow.insertCell(-1) -// .appendChild($document.createTextNode(DeviceLogService.linesCounter)); -// newRow.insertCell(-1) -// .appendChild($document.createTextNode(data.deviceName)); -// newRow.insertCell(-1) -// .appendChild($document.createTextNode(data.levelName)); -// newRow.insertCell(-1) -// .appendChild($document.createTextNode(data.dateFormatted)); -// if ($rootScope.platform === 'native') { + newRow.classList.add('log-' + data.priorityLabel) + newRow.insertCell(-1) - .appendChild(document.createTextNode(data.pid)) + .appendChild(document.createTextNode(LogcatService.numberOfEntries)) + //newRow.insertCell(-1) + // .appendChild(document.createTextNode(data.deviceLabel)) newRow.insertCell(-1) - .appendChild(document.createTextNode(data.tid)) + .appendChild(document.createTextNode(data.priorityLabel)) newRow.insertCell(-1) - .appendChild(document.createTextNode(data.app)) - newRow.insertCell(-1) - .appendChild(document.createTextNode(data.tag)) -// } + .appendChild(document.createTextNode(data.dateLabel)) + if ($rootScope.platform === 'native') { + newRow.insertCell(-1) + .appendChild(document.createTextNode(data.pid)) + newRow.insertCell(-1) + .appendChild(document.createTextNode(data.tid)) + //newRow.insertCell(-1) + // .appendChild(document.createTextNode(data.app)) + newRow.insertCell(-1) + .appendChild(document.createTextNode(data.tag)) + } newRow.insertCell(-1) .appendChild(document.createTextNode(data.message)) - if (logcatAutoScroll && !batchRequest) { + if (autoScroll && shouldAutoScroll() && !batchRequest) { _.throttle(scrollToBottom, 10)() } } @@ -52,41 +79,51 @@ module.exports = function logcatTableDirective($rootScope, $timeout, logcatAutoS body = newBody } - addRow({ - "serial": "1cd49783", - "date": 1399964036.984, - "pid": 9246, - "tid": 9540, - "priority": 3, - "tag": "MobileDataStateTracker", - "message": "default: setPolicyDataEnable(enabled=true)" - }) - - for (var i = 0; i < 50; i++) { - addRow({ - "serial": "14141cd49783", - "date": 1399964036.984, - "pid": 9246, - "tid": 9540, - "priority": 3, - "tag": "MobileDataStateTracker", - "message": "XXdefault: setPolicyDataEnable(enabled=true)" - }) + scope.clearTable = function () { + LogcatService.clear() + clearTable() } - $timeout(function () { - for (var i = 0; i < 10; i++) { - addRow({ - "serial": "14141cd49783", - "date": 1399964036.984, - "pid": 9246, - "tid": 9540, - "priority": 3, - "tag": "MobileDataStateTracker", - "message": "XXdefault: setPolicyDataEnable(enabled=true)" - }) - } - }, 1000) + scope.$on('$destroy', function () { + parent.removeEventListener('scroll', throttledScrollListener) + }) + + +// addRow({ +// "serial": "1cd49783", +// "date": 1399964036.984, +// "pid": 9246, +// "tid": 9540, +// "priority": 3, +// "tag": "MobileDataStateTracker", +// "message": "default: setPolicyDataEnable(enabled=true)" +// }) +// +// for (var i = 0; i < 50; i++) { +// addRow({ +// "serial": "14141cd49783", +// "date": 1399964036.984, +// "pid": 9246, +// "tid": 9540, +// "priority": 3, +// "tag": "MobileDataStateTracker", +// "message": "XXdefault: setPolicyDataEnable(enabled=true)" +// }) +// } +// +// $timeout(function () { +// for (var i = 0; i < 10; i++) { +// addRow({ +// "serial": "14141cd49783", +// "date": 1399964036.984, +// "pid": 9246, +// "tid": 9540, +// "priority": 3, +// "tag": "MobileDataStateTracker", +// "message": "XXdefault: setPolicyDataEnable(enabled=true)" +// }) +// } +// }, 1000) } diff --git a/res/app/components/stf/logcat-table/logcat-table.css b/res/app/components/stf/logcat-table/logcat-table.css index fc7a642a..c791478e 100644 --- a/res/app/components/stf/logcat-table/logcat-table.css +++ b/res/app/components/stf/logcat-table/logcat-table.css @@ -33,39 +33,45 @@ /*color: rgb(48, 57, 66);*/ } +.stf-logcat-table tr td:first-child { + background: #f3f3f3; + color: #800000; + text-align: right; +} + /** Logging colors */ -.stf-logcat-table .log-unknown { +.stf-logcat-table .log-Unknown { color: bisque; } -.stf-logcat-table .log-default, -.stf-logcat-table .log-silent { +.stf-logcat-table .log-Default, +.stf-logcat-table .log-Silent { color: darkolivegreen; } -.stf-logcat-table .log-verbose { +.stf-logcat-table .log-Verbose { color: blueviolet; } -.stf-logcat-table .log-debug { - color: rgb(48, 57, 66); +.stf-logcat-table .log-Debug { + color: #020c7d; } -.stf-logcat-table .log-info { - color: blue; +.stf-logcat-table .log-Info { + color: #177d1c; } -.stf-logcat-table .log-warn { +.stf-logcat-table .log-Warn { color: coral; } -.stf-logcat-table .log-error { +.stf-logcat-table .log-Error { color: red; } -.stf-logcat-table .log-fatal { +.stf-logcat-table .log-Fatal { color: darkcyan; } diff --git a/res/app/components/stf/logcat-table/logcat-table.jade b/res/app/components/stf/logcat-table/logcat-table.jade index cbbbd84f..25a14dfe 100644 --- a/res/app/components/stf/logcat-table/logcat-table.jade +++ b/res/app/components/stf/logcat-table/logcat-table.jade @@ -1,3 +1,3 @@ .stf-logcat-table.force-gpu - table.console-message-text.tableX.table-condensedX.selectableX + table.console-message-text.tableX.table-condensed.selectable tbody diff --git a/res/app/components/stf/logcat/logcat-service.js b/res/app/components/stf/logcat/logcat-service.js index 85d8b7e6..89d5ad93 100644 --- a/res/app/components/stf/logcat/logcat-service.js +++ b/res/app/components/stf/logcat/logcat-service.js @@ -1,11 +1,56 @@ var _ = require('lodash') +var _s = require('underscore.string') -module.exports = function LogcatServiceFactory(socket) { - var LogcatService = {} +module.exports = function LogcatServiceFactory(socket, DeviceService) { + var service = {} - LogcatService.entries = [] + service.started = false - LogcatService.logLevels = [ + service.maxBuffer = 5000 + + service.numberOfEntries = 0 + + service.filters = { + numberOfEntries: 0, + entries: [ + { + "serial": "1cd49783", + "date": 1399964036.984, + "pid": 9246, + "tid": 9540, + "priority": 3, + "tag": "MobileDataStateTracker", + "message": "default:(enabled=true)" + } + ], + levelNumber: null, + levelNumbers: [] + } + + + service.entries = [ + { + "serial": "1cd49783", + "date": 1399964036.984, + "pid": 9246, + "tid": 9540, + "priority": 3, + "tag": "MobileDataStateTracker", + "message": "default:(enabled=true)" + }, + { + "serial": "1dcvafaasfafcd49783", + "date": 1399964036.984, + "pid": 9246, + "tid": 9540, + "priority": 2, + "tag": "MobileDataStateTracker", + "message": "default: setPolicyDataEnable(enabled=true)" + } + + ] + + service.logLevels = [ 'UNKNOWN', 'DEFAULT', 'VERBOSE', @@ -17,32 +62,48 @@ module.exports = function LogcatServiceFactory(socket) { 'SILENT' ] - var logLevelsLowerCase = _.map(LogcatService.logLevels, function (level) { + var logLevelsLowerCase = _.map(service.logLevels, function (level) { return level.toLowerCase() }) var logLevelsCapitalized = _.map(logLevelsLowerCase, function (level) { - //return _.capitalize(level) + return _s.capitalize(level) }) + for (var i = 2; i < 8; ++i) { + service.filters.levelNumbers.push({number: i, name: logLevelsCapitalized[i]}) + } + function enhanceEntry(data) { - var date = new Date(data.date) -// data.dateFormatted = _.pad(date.getHours(), 2, '0') + ':' + -// _.pad(date.getMinutes(), 2, '0') + ':' + -// _.pad(date.getSeconds(), 2, '0') + '.' + -// _.pad(date.getMilliseconds(), 3, '0') + var date = new Date(data.date * 1000) + data.dateLabel = _s.pad(date.getHours(), 2, '0') + ':' + + _s.pad(date.getMinutes(), 2, '0') + ':' + + _s.pad(date.getSeconds(), 2, '0') + '.' + + _s.pad(date.getMilliseconds(), 3, '0') + + data.deviceLabel = 'Android' + + data.priorityLabel = logLevelsCapitalized[data.priority] return data } socket.on('logcat.entry', function (data) { - LogcatService.entries.push(enhanceEntry(data)) + service.numberOfEntries++ + +// console.log(enhanceEntry(data)) + service.entries.push(enhanceEntry(data)) + + if (true) { + service.addEntryListener(data) + } }) - LogcatService.clear = function () { - LogcatService.entries = [] + service.clear = function () { + service.numberOfEntries = 0 + service.entries = [] } - return LogcatService + return service } diff --git a/res/app/control-panes/device-control/device-control.css b/res/app/control-panes/device-control/device-control.css index 9a30ee87..19a30d0d 100644 --- a/res/app/control-panes/device-control/device-control.css +++ b/res/app/control-panes/device-control/device-control.css @@ -1,3 +1,16 @@ +.enter-fade { + -webkit-transition: 1s linear opacity; + -moz-transition: 1s linear opacity; + -o-transition: 1s linear opacity; + transition: 1s linear opacity; + + opacity: 0; +} + +.enter-fade.enter-fade-active { + opacity: 1; +} + device-screen canvas { transition: width 100ms linear, -webkit-transform 250ms ease-in-out; -webkit-transform-origin: 50% 50%; diff --git a/res/app/control-panes/logs/logs-controller.js b/res/app/control-panes/logs/logs-controller.js index 74141df8..015aa7c5 100644 --- a/res/app/control-panes/logs/logs-controller.js +++ b/res/app/control-panes/logs/logs-controller.js @@ -4,22 +4,44 @@ module.exports = function LogsCtrl($scope, LogcatService) { $scope.logEntries = LogcatService.entries + $scope.filters = LogcatService.filters + + $scope.started = LogcatService.started + + + $scope.$watch('started', function (newValue, oldValue) { if (newValue !== oldValue) { - + LogcatService.started = newValue if (newValue) { $scope.control.startLogcat(filters).then(function (result) { - }) } else { $scope.control.stopLogcat() } - } }) + $scope.$on('$destroy', function () { +// $scope.control.stopLogcat() + }) + $scope.clear = function () { LogcatService.clear() } + + $scope.addFastRow = function (val) { + var e = { + "serial": "1cd49783", + "date": 1399964036.984, + "pid": 9246, + "tid": 9540, + "priority": 3, + "tag": "MobileDataStateTracker", + "message": "default: setPolicyDataEnable(enabled=true)" + } + + //console.log(val) + } } diff --git a/res/app/control-panes/logs/logs.jade b/res/app/control-panes/logs/logs.jade index 7bde4f1a..ba36a9ca 100644 --- a/res/app/control-panes/logs/logs.jade +++ b/res/app/control-panes/logs/logs.jade @@ -41,7 +41,7 @@ select(ng-model='filtering.deviceName', ng-options='d for d in filtering.devicesList') option(value='') {{"Device"|translate}} td(width='6%') - select(ng-model='filtering.levelNumber', ng-options='l.name for l in filtering.levelNumbers') + select(ng-model='filters.levelNumber', ng-options='l.name for l in filters.levelNumbers') option(value='') {{"Level"|translate}} td(width='10%') input(ng-model='filtering.date', type='text', placeholder='{{"Time"|translate}}') @@ -49,18 +49,18 @@ input(ng-model='filtering.pid', type='text', placeholder='{{"PID"|translate}}') td(width='8%', ng-if='$root.platform == "native"') input(ng-model='filtering.tid', type='text', placeholder='{{"TID"|translate}}') - td(width='14%', ng-if='$root.platform == "native"') + //td(width='14%', ng-if='$root.platform == "native"') input(ng-model='filtering.app', type='text', placeholder='{{"App"|translate}}') td(width='14%', ng-if='$root.platform == "native"') input(ng-model='filtering.tag', type='text', placeholder='{{"Tag"|translate}}') td(width='40%') input(ng-model='filtering.message', type='text', placeholder='{{"Text"|translate}}') td(width='0') - button(ng-click='clear()', ng-disabled='false', title='{{"Clear"|translate}}').btn.btn-xs.btn-danger-outline + button(ng-click='clearTable()', ng-disabled='false', title='{{"Clear"|translate}}').btn.btn-xs.btn-danger-outline i.fa.fa-trash-o span(translate) Clear - logcat-table + logcat-table(add-row='lastEntry') //#logcatParent.force-gpu table#logcatTable.console-message-text.tableX.table-condensedX.selectableX //thead