diff --git a/res/.jshintrc b/res/.jshintrc index 343e7140..2ca11a94 100644 --- a/res/.jshintrc +++ b/res/.jshintrc @@ -18,6 +18,7 @@ "laxcomma": true, "laxbreak": true, "browser": true, + "devel": true, "globals": { "describe": false, "it": false, diff --git a/res/app/components/stf/control/storage-service.js b/res/app/components/stf/control/storage-service.js index bbc3d287..3e25f525 100644 --- a/res/app/components/stf/control/storage-service.js +++ b/res/app/components/stf/control/storage-service.js @@ -13,25 +13,33 @@ module.exports = function StorageServiceFactory($http, $upload) { }) } - service.storeFile = function(type, files) { + service.storeFile = function(type, files, options) { var resolver = Promise.defer() + var input = options.filter ? files.filter(options.filter) : files - $upload.upload({ - url: '/api/v1/s/' + type - , method: 'POST' - , file: files - }) - .then( - function(value) { - resolver.resolve(value) - } - , function(err) { - resolver.reject(err) - } - , function(progressEvent) { - resolver.progress(progressEvent) - } - ) + if (input.length) { + $upload.upload({ + url: '/api/v1/s/' + type + , method: 'POST' + , file: input + }) + .then( + function(value) { + resolver.resolve(value) + } + , function(err) { + resolver.reject(err) + } + , function(progressEvent) { + resolver.progress(progressEvent) + } + ) + } + else { + var err = new Error('No input files') + err.code = 'no_input_files' + resolver.reject(err) + } return resolver.promise } diff --git a/res/app/control-panes/control-panes-controller.js b/res/app/control-panes/control-panes-controller.js index 56ee8507..ba98356b 100644 --- a/res/app/control-panes/control-panes-controller.js +++ b/res/app/control-panes/control-panes-controller.js @@ -1,5 +1,15 @@ -module.exports = function ($scope, gettext, $routeParams, $location, DeviceService, GroupService, ControlService, FatalMessageService) { - +module.exports = function ControlPanesController( + $scope +, $http +, gettext +, $routeParams +, $location +, DeviceService +, GroupService +, ControlService +, StorageService +, FatalMessageService +) { var sharedTabs = [ { title: gettext('Screenshots'), @@ -68,30 +78,76 @@ module.exports = function ($scope, gettext, $routeParams, $location, DeviceServi $scope.device = null $scope.control = null - + // @TODO Find a way to reuse this in the upload controller (or the other + // way around) $scope.installFileForced = function ($files) { - $scope.upload = { - progress: 0, - lastData: 'uploading' - } + $scope.$apply(function () { + $scope.upload = { + progress: 0 + , lastData: 'uploading' + } + }) - return $scope.control.uploadFile($files) - .progressed(function (uploadResult) { - $scope.$apply(function () { - $scope.upload = uploadResult - }) - }) - .then(function (uploadResult) { - $scope.$apply(function () { - $scope.upload = uploadResult - }) - if (uploadResult.success) { - return $scope.maybeInstallForced(uploadResult.body) + return StorageService.storeFile('apk', $files, { + filter: function(file) { + return /\.apk$/i.test(file.name) } }) + .progressed(function(e) { + if (e.lengthComputable) { + $scope.$apply(function () { + $scope.upload = { + progress: e.loaded / e.total * 100 + , lastData: 'uploading' + } + }) + } + }) + .then(function(res) { + $scope.$apply(function () { + $scope.upload = { + progress: 100 + , lastData: 'processing' + } + }) + + var href = res.data.resources.file0.href + return $http.get(href + '/manifest') + .then(function(res) { + $scope.upload = { + progress: 100 + , lastData: 'success' + , settled: true + } + + if (res.data.success) { + return $scope.installForced({ + href: href + , launch: true + , manifest: res.data.manifest + }) + } + }) + }) + .catch(function(err) { + $scope.$apply(function () { + if (err.code === 'no_input_files') { + $scope.upload = null + } + else { + console.log('Upload error', err) + $scope.upload = { + progress: 100 + , lastData: 'fail' + , settled: true + , error: err.message + } + } + }) + }) } - $scope.maybeInstallForced = function (options) { + $scope.installForced = function (options) { return $scope.control.install(options) .progressed(function (installResult) { $scope.$apply(function () { @@ -108,7 +164,6 @@ module.exports = function ($scope, gettext, $routeParams, $location, DeviceServi }) } - DeviceService.get($routeParams.serial, $scope) .then(function (device) { return GroupService.invite(device) diff --git a/res/app/control-panes/dashboard/upload/upload-controller.js b/res/app/control-panes/dashboard/upload/upload-controller.js index 4407f5cb..d3f0d71b 100644 --- a/res/app/control-panes/dashboard/upload/upload-controller.js +++ b/res/app/control-panes/dashboard/upload/upload-controller.js @@ -38,25 +38,35 @@ module.exports = function UploadCtrl( } $scope.installFile = function ($files) { - $scope.upload = { - progress: 0 - , lastData: 'uploading' - } + $scope.$apply(function () { + $scope.upload = { + progress: 0 + , lastData: 'uploading' + } + }) - return StorageService.storeFile('apk', $files) + return StorageService.storeFile('apk', $files, { + filter: function(file) { + return /\.apk$/i.test(file.name) + } + }) .progressed(function(e) { if (e.lengthComputable) { - $scope.upload = { - progress: e.loaded / e.total * 100 - , lastData: 'uploading' - } + $scope.$apply(function () { + $scope.upload = { + progress: e.loaded / e.total * 100 + , lastData: 'uploading' + } + }) } }) .then(function(res) { - $scope.upload = { - progress: 100 - , lastData: 'processing' - } + $scope.$apply(function () { + $scope.upload = { + progress: 100 + , lastData: 'processing' + } + }) var href = res.data.resources.file0.href return $http.get(href + '/manifest') @@ -77,12 +87,20 @@ module.exports = function UploadCtrl( }) }) .catch(function(err) { - console.log('Upload error', err) - $scope.upload = { - progress: 100 - , lastData: 'fail' - , settled: true - } + $scope.$apply(function () { + if (err.code === 'no_input_files') { + $scope.upload = null + } + else { + console.log('Upload error', err) + $scope.upload = { + progress: 100 + , lastData: 'fail' + , settled: true + , error: err.message + } + } + }) }) } @@ -103,6 +121,9 @@ module.exports = function UploadCtrl( }) }) } + else { + return Promise.reject(new Error('Installation not enabled')) + } } $scope.uninstall = function (packageName) { @@ -120,14 +141,10 @@ module.exports = function UploadCtrl( $scope.taskFinished = function () { if ($scope.installEnabled) { - if ($scope.upload && $scope.upload.settled && - $scope.installation && $scope.installation.settled) { - return true - } + return $scope.upload && ($scope.upload.error || $scope.upload.settled && + $scope.installation && $scope.installation.settled) } else { - if ($scope.upload && $scope.upload.settled) { - return true - } + return $scope.upload && $scope.upload.settled } return false }