From 8627e6010397a4a0c9986180fc6d61d4f4448044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabriel=20Baz=C3=A1n?= Date: Wed, 7 Jun 2017 12:23:07 -0300 Subject: [PATCH] add old scanner for windows platform --- app-template/config-template.xml | 1 + src/js/controllers/join.js | 1 + src/js/controllers/tabsController.js | 21 ++++- src/js/directives/qrScanner.js | 35 ++++++-- src/js/services/scannerService.js | 122 +++++++++++++++------------ www/views/tab-home.html | 1 + www/views/tabs.html | 2 +- 7 files changed, 121 insertions(+), 62 deletions(-) diff --git a/app-template/config-template.xml b/app-template/config-template.xml index b8019530a..d0dec21e9 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -60,6 +60,7 @@ + diff --git a/src/js/controllers/join.js b/src/js/controllers/join.js index 0acc5556b..b17236d5b 100644 --- a/src/js/controllers/join.js +++ b/src/js/controllers/join.js @@ -50,6 +50,7 @@ angular.module('copayApp.controllers').controller('joinController', $scope.onQrCodeScannedJoin = function(data) { $scope.formData.secret = data; + $scope.$apply(); }; if ($stateParams.url) { diff --git a/src/js/controllers/tabsController.js b/src/js/controllers/tabsController.js index 42899e13e..ef4dd8299 100644 --- a/src/js/controllers/tabsController.js +++ b/src/js/controllers/tabsController.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, incomingData, lodash, popupService, gettextCatalog) { +angular.module('copayApp.controllers').controller('tabsController', function($rootScope, $log, $scope, $state, $stateParams, $timeout, platformInfo, incomingData, lodash, popupService, gettextCatalog, scannerService) { $scope.onScan = function(data) { if (!incomingData.redir(data)) { @@ -22,6 +22,25 @@ angular.module('copayApp.controllers').controller('tabsController', function($ro }, 1); }; + $scope.chooseScanner = function() { + + var isWindowsPhoneApp = platformInfo.isWP && platformInfo.isCordova; + + if (!isWindowsPhoneApp) { + $state.go('tabs.scan'); + return; + } + + scannerService.useOldScanner(function(err, contents) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + incomingData.redir(contents); + }); + + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { $rootScope.hideTabs = ''; }); diff --git a/src/js/directives/qrScanner.js b/src/js/directives/qrScanner.js index 8a144bc2b..cd1759e56 100644 --- a/src/js/directives/qrScanner.js +++ b/src/js/directives/qrScanner.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.directives') - .directive('qrScanner', function($state, $rootScope, $log, $ionicHistory) { + .directive('qrScanner', function($state, $rootScope, $log, $ionicHistory, platformInfo, scannerService) { return { restrict: 'E', @@ -9,26 +9,49 @@ angular.module('copayApp.directives') onScan: "&" }, replace: true, - template: '', + template: '', link: function(scope, el, attrs) { + scope.chooseScanner = function() { + var isWindowsPhoneApp = platformInfo.isWP && platformInfo.isCordova; + + if (!isWindowsPhoneApp) { + scope.openScanner(); + return; + } + + scannerService.useOldScanner(function(err, contents) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return; + } + scope.onScan({ + data: contents + }); + }); + }; + scope.openScanner = function() { $log.debug('Opening scanner by directive...'); $ionicHistory.nextViewOptions({ disableAnimate: true }); - $state.go('scanner', { passthroughMode: 1 }); + $state.go('scanner', { + passthroughMode: 1 + }); }; var afterEnter = $rootScope.$on('$ionicView.afterEnter', function() { - if($rootScope.scanResult) { - scope.onScan({ data: $rootScope.scanResult }); + if ($rootScope.scanResult) { + scope.onScan({ + data: $rootScope.scanResult + }); $rootScope.scanResult = null; } }); // Destroy event - scope.$on('$destroy', function(){ + scope.$on('$destroy', function() { afterEnter(); }); } diff --git a/src/js/services/scannerService.js b/src/js/services/scannerService.js index 0c3f28916..ddf62895d 100644 --- a/src/js/services/scannerService.js +++ b/src/js/services/scannerService.js @@ -17,27 +17,27 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti var canChangeCamera = false; var canOpenSettings = false; - function _checkCapabilities(status){ + function _checkCapabilities(status) { $log.debug('scannerService is reviewing platform capabilities...'); // Permission can be assumed on the desktop builds - hasPermission = (isDesktop || status.authorized)? true: false; - isDenied = status.denied? true : false; - isRestricted = status.restricted? true : false; - canEnableLight = status.canEnableLight? true : false; - canChangeCamera = status.canChangeCamera? true : false; - canOpenSettings = status.canOpenSettings? true : false; + hasPermission = (isDesktop || status.authorized) ? true : false; + isDenied = status.denied ? true : false; + isRestricted = status.restricted ? true : false; + canEnableLight = status.canEnableLight ? true : false; + canChangeCamera = status.canChangeCamera ? true : false; + canOpenSettings = status.canOpenSettings ? true : false; _logCapabilities(); } - function _logCapabilities(){ - function _orIsNot(bool){ - return bool? '' : 'not '; + function _logCapabilities() { + function _orIsNot(bool) { + return bool ? '' : 'not '; } $log.debug('A camera is ' + _orIsNot(isAvailable) + 'available to this app.'); var access = 'not authorized'; - if(hasPermission) access = 'authorized'; - if(isDenied) access = 'denied'; - if(isRestricted) access = 'restricted'; + if (hasPermission) access = 'authorized'; + if (isDenied) access = 'denied'; + if (isRestricted) access = 'restricted'; $log.debug('Camera access is ' + access + '.'); $log.debug('Support for opening device settings is ' + _orIsNot(canOpenSettings) + 'available on this platform.'); $log.debug('A light is ' + _orIsNot(canEnableLight) + 'available on this platform.'); @@ -47,7 +47,7 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti /** * Immediately return known capabilities of the current platform. */ - this.getCapabilities = function(){ + this.getCapabilities = function() { return { isAvailable: isAvailable, hasPermission: hasPermission, @@ -68,18 +68,18 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti * The `status` of QRScanner is returned to the callback. */ this.gentleInitialize = function(callback) { - if(initializeStarted && !isDesktop){ - QRScanner.getStatus(function(status){ + if (initializeStarted && !isDesktop) { + QRScanner.getStatus(function(status) { _completeInitialization(status, callback); }); return; } initializeStarted = true; $log.debug('Trying to pre-initialize QRScanner.'); - if(!isDesktop){ - QRScanner.getStatus(function(status){ + if (!isDesktop) { + QRScanner.getStatus(function(status) { _checkCapabilities(status); - if(status.authorized){ + if (status.authorized) { $log.debug('Camera permission already granted.'); initialize(callback); } else { @@ -92,14 +92,14 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti } }; - function initialize(callback){ + function initialize(callback) { $log.debug('Initializing scanner...'); - QRScanner.prepare(function(err, status){ - if(err){ + QRScanner.prepare(function(err, status) { + if (err) { isAvailable = false; $log.error(err); // does not return `status` if there is an error - QRScanner.getStatus(function(status){ + QRScanner.getStatus(function(status) { _completeInitialization(status, callback); }); } else { @@ -112,18 +112,19 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti // This could be much cleaner with a Promise API // (needs a polyfill for some platforms) var initializeCompleted = false; - function _completeInitialization(status, callback){ + + function _completeInitialization(status, callback) { _checkCapabilities(status); initializeCompleted = true; $rootScope.$emit('scannerServiceInitialized'); - if(typeof callback === "function"){ + if (typeof callback === "function") { callback(status); } } - this.isInitialized = function(){ + this.isInitialized = function() { return initializeCompleted; }; - this.initializeStarted = function(){ + this.initializeStarted = function() { return initializeStarted; }; @@ -140,21 +141,21 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti */ this.activate = function(callback) { $log.debug('Activating scanner...'); - QRScanner.show(function(status){ - initializeCompleted = true; - _checkCapabilities(status); - if(typeof callback === "function"){ - callback(status); - } - }); - if(nextHide !== null){ - $timeout.cancel(nextHide); - nextHide = null; - } - if(nextDestroy !== null){ - $timeout.cancel(nextDestroy); - nextDestroy = null; + QRScanner.show(function(status) { + initializeCompleted = true; + _checkCapabilities(status); + if (typeof callback === "function") { + callback(status); } + }); + if (nextHide !== null) { + $timeout.cancel(nextHide); + nextHide = null; + } + if (nextDestroy !== null) { + $timeout.cancel(nextDestroy); + nextDestroy = null; + } }; /** @@ -193,18 +194,18 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti // Natively hide the QRScanner's preview // On mobile platforms, this can reduce GPU/power usage // On desktop, this fully turns off the camera (and any associated privacy lights) - function _hide(){ + function _hide() { $log.debug('Scanner not in use for ' + hideAfterSeconds + ' seconds, hiding...'); QRScanner.hide(); } // Reduce QRScanner power/processing consumption by the maximum amount - function _destroy(){ + function _destroy() { $log.debug('Scanner not in use for ' + destroyAfterSeconds + ' seconds, destroying...'); QRScanner.destroy(); } - this.reinitialize = function(callback){ + this.reinitialize = function(callback) { initializeCompleted = false; QRScanner.destroy(); initialize(callback); @@ -217,17 +218,18 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti */ this.toggleLight = function(callback) { $log.debug('Toggling light...'); - if(lightEnabled){ + if (lightEnabled) { QRScanner.disableLight(_handleResponse); } else { QRScanner.enableLight(_handleResponse); } - function _handleResponse(err, status){ - if(err){ + + function _handleResponse(err, status) { + if (err) { $log.error(err); } else { lightEnabled = status.lightEnabled; - var state = lightEnabled? 'enabled' : 'disabled'; + var state = lightEnabled ? 'enabled' : 'disabled'; $log.debug('Light ' + state + '.'); } callback(lightEnabled); @@ -241,16 +243,17 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti * is complete. */ this.toggleCamera = function(callback) { - var nextCamera = backCamera? 1 : 0; - function cameraToString(index){ - return index === 1? 'front' : 'back'; // front = 1, back = 0 + var nextCamera = backCamera ? 1 : 0; + + function cameraToString(index) { + return index === 1 ? 'front' : 'back'; // front = 1, back = 0 } $log.debug('Toggling to the ' + cameraToString(nextCamera) + ' camera...'); - QRScanner.useCamera(nextCamera, function(err, status){ - if(err){ + QRScanner.useCamera(nextCamera, function(err, status) { + if (err) { $log.error(err); } - backCamera = status.currentCamera === 1? false : true; + backCamera = status.currentCamera === 1 ? false : true; $log.debug('Camera toggled. Now using the ' + cameraToString(backCamera) + ' camera.'); callback(status); }); @@ -260,4 +263,15 @@ angular.module('copayApp.services').service('scannerService', function($log, $ti $log.debug('Attempting to open device settings...'); QRScanner.openSettings(); }; + + this.useOldScanner = function(callback) { + cordova.plugins.barcodeScanner.scan( + function(result) { + callback(null, result.text); + }, + function(error) { + callback(error); + } + ); + } }); diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 6d2ec9247..c27fa4f1b 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -10,6 +10,7 @@ spinner="ios-small" on-refresh="onRefresh()"> +
diff --git a/www/views/tabs.html b/www/views/tabs.html index 6673b416a..69cf93309 100644 --- a/www/views/tabs.html +++ b/www/views/tabs.html @@ -8,7 +8,7 @@ - +