From 86b8bd4326a9ded79ebf2f814fa6087acc0effda Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 23 Feb 2017 16:56:46 -0500 Subject: [PATCH 01/31] add pincode view-controller --- src/js/controllers/pincode.js | 44 ++++++++++++++++++++++ src/js/routes.js | 16 ++++++++ src/sass/views/pincode.scss | 38 +++++++++++++++++++ src/sass/views/views.scss | 1 + www/views/pincode.html | 69 +++++++++++++++++++++++++++++++++++ www/views/tab-home.html | 4 +- 6 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 src/js/controllers/pincode.js create mode 100644 src/sass/views/pincode.scss create mode 100644 www/views/pincode.html diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js new file mode 100644 index 000000000..dca8f08f4 --- /dev/null +++ b/src/js/controllers/pincode.js @@ -0,0 +1,44 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('pincodeController', function($timeout, $scope, $log, $window) { + + angular.element($window).on('keydown', function(e) { + if (e.which === 8) { // you can add others here inside brackets. + e.preventDefault(); + $scope.delete(); + } + + if (e.key && e.key.match(/^[0-9]$/)) + $scope.add(e.key); + else if (e.key && e.key == 'Enter') + console.log('DONE'); + }); + + $scope.$on('$ionicView.beforeEnter', function(event, data) { + $scope.passcode = ""; + }); + + $scope.add = function(value) { + if (isComplete()) $log.debug("The four digit code was entered"); + else updatePassCode(value); + }; + + $scope.delete = function() { + if ($scope.passcode.length > 0) { + $scope.passcode = $scope.passcode.substring(0, $scope.passcode.length - 1); + updatePassCode(); + } + }; + + function isComplete() { + if ($scope.passcode.length < 4) return false; + else return true; + }; + + function updatePassCode(value) { + if (value) $scope.passcode = $scope.passcode + value; + $timeout(function() { + $scope.$apply(); + }); + }; +}); diff --git a/src/js/routes.js b/src/js/routes.js index 4fc657bd4..b02f18937 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -672,6 +672,22 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) + /* + * + * Pin Code + * + */ + + .state('tabs.home.pincode', { + url: '/pincode', + views: { + 'tab-home@tabs': { + templateUrl: 'views/pincode.html', + controller: 'pincodeController' + } + } + }) + /* * * Paper Wallet diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss new file mode 100644 index 000000000..64a4b8584 --- /dev/null +++ b/src/sass/views/pincode.scss @@ -0,0 +1,38 @@ +.button-stretch { + width: 100%; +} + +.col-offset-15 { + margin-left: 15%; +} + +@mixin centerer { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.content { + position: relative; + width: 100%; + height: 100%; +} + +.block-code { + @include centerer; + top: 20% !important; + width: 50%; + + > .row > .col { + border-bottom: 1px solid #3E3E3E; + padding: 5px; + margin: 10px; + height: 35px; + } +} + +.block-buttons { + @include centerer; + padding: 20px; +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index a4648928f..5516fd9ab 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -46,3 +46,4 @@ @import "includes/accountSelector"; @import "integrations/integrations"; @import "custom-amount"; +@import "pincode"; diff --git a/www/views/pincode.html b/www/views/pincode.html new file mode 100644 index 000000000..7bbf96677 --- /dev/null +++ b/www/views/pincode.html @@ -0,0 +1,69 @@ + +
+
+
+
+ {{passcode.substring(0, 1)}} +
+
+ {{passcode.substring(1, 2)}} +
+
+ {{passcode.substring(2, 3)}} +
+
+ {{passcode.substring(3, 4)}} +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 5e1b1a99c..6f0d57ece 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -66,7 +66,7 @@
Wallets - +
@@ -91,7 +91,7 @@ {{wallet.status.totalBalanceStr ? wallet.status.totalBalanceStr : ( wallet.cachedBalance ? wallet.cachedBalance + (wallet.cachedBalanceUpdatedOn ? ' · ' + ( wallet.cachedBalanceUpdatedOn * 1000 | amTimeAgo) : '') : '' ) }} - + [Balance Hidden] {{wallet.m}}-of-{{wallet.n}} From 1ee75fd4249606dcd80dc02058fdb9e65e53413e Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 24 Feb 2017 14:46:54 -0500 Subject: [PATCH 02/31] use modal - css refactor --- src/js/controllers/pincode.js | 28 +++++++----- src/js/controllers/tab-home.js | 11 +++++ src/js/routes.js | 16 ------- src/js/services/configService.js | 4 ++ src/sass/views/pincode.scss | 68 ++++++++++++++--------------- www/views/{ => modals}/pincode.html | 15 +++---- www/views/tab-home.html | 2 +- 7 files changed, 72 insertions(+), 72 deletions(-) rename www/views/{ => modals}/pincode.html (88%) diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index dca8f08f4..448ed58fa 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,6 +1,7 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($timeout, $scope, $log, $window) { +angular.module('copayApp.controllers').controller('pincodeController', function($timeout, $scope, $log, $window, configService) { + $scope.pincode = ''; angular.element($window).on('keydown', function(e) { if (e.which === 8) { // you can add others here inside brackets. @@ -11,34 +12,39 @@ angular.module('copayApp.controllers').controller('pincodeController', function( if (e.key && e.key.match(/^[0-9]$/)) $scope.add(e.key); else if (e.key && e.key == 'Enter') - console.log('DONE'); - }); - - $scope.$on('$ionicView.beforeEnter', function(event, data) { - $scope.passcode = ""; + checkPasscode(); }); $scope.add = function(value) { - if (isComplete()) $log.debug("The four digit code was entered"); + if (isComplete()) checkPasscode(); else updatePassCode(value); }; $scope.delete = function() { - if ($scope.passcode.length > 0) { - $scope.passcode = $scope.passcode.substring(0, $scope.passcode.length - 1); + if ($scope.pincode.length > 0) { + $scope.pincode = $scope.pincode.substring(0, $scope.pincode.length - 1); updatePassCode(); } }; function isComplete() { - if ($scope.passcode.length < 4) return false; + if ($scope.pincode.length < 4) return false; else return true; }; function updatePassCode(value) { - if (value) $scope.passcode = $scope.passcode + value; + if (value) $scope.pincode = $scope.pincode + value; $timeout(function() { + checkPasscode(); $scope.$apply(); }); }; + + function checkPasscode() { + configService.whenAvailable(function(config) { + var value = '1234'; + if (value != $scope.pincode) return; + console.log('MATCH'); + }); + }; }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 7a3fd83f8..8abcb08d2 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -15,6 +15,17 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.isNW = platformInfo.isNW; $scope.showRateCard = {}; + function openPincodeModal() { + $ionicModal.fromTemplateUrl('views/modals/pincode.html', { + scope: $scope, + backdropClickToClose: false, + hardwareBackButtonClose: false + }).then(function(modal) { + $scope.pincodeModal = modal; + $scope.pincodeModal.show(); + }); + }; + openPincodeModal(); $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); }); diff --git a/src/js/routes.js b/src/js/routes.js index b02f18937..4fc657bd4 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -672,22 +672,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) - /* - * - * Pin Code - * - */ - - .state('tabs.home.pincode', { - url: '/pincode', - views: { - 'tab-home@tabs': { - templateUrl: 'views/pincode.html', - controller: 'pincodeController' - } - } - }) - /* * * Paper Wallet diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 747554ca1..1a16992fb 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -53,6 +53,10 @@ angular.module('copayApp.services').factory('configService', function(storageSer } }, + pincode: { + value: null, + }, + // External services recentTransactions: { enabled: true, diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index 64a4b8584..97413fc47 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -1,38 +1,36 @@ -.button-stretch { +#pin-code { + background-color: #C3C3C3; + + .button-stretch { + width: 100%; + } + .col-offset-15 { + margin-left: 15%; + } + @mixin centerer { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + .content { + position: absolute; width: 100%; -} - -.col-offset-15 { - margin-left: 15%; -} - -@mixin centerer { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.content { - position: relative; - width: 100%; - height: 100%; -} - -.block-code { - @include centerer; - top: 20% !important; - width: 50%; - - > .row > .col { - border-bottom: 1px solid #3E3E3E; - padding: 5px; - margin: 10px; - height: 35px; + height: 100%; + .block-code { + @include centerer; + top: 20% !important; + width: 50%; + > .row > .col { + border-bottom: 1px solid #3E3E3E; + padding: 5px; + margin: 10px; + height: 35px; + } + } + .block-buttons { + @include centerer; + padding: 20px; + } } } - -.block-buttons { - @include centerer; - padding: 20px; -} diff --git a/www/views/pincode.html b/www/views/modals/pincode.html similarity index 88% rename from www/views/pincode.html rename to www/views/modals/pincode.html index 7bbf96677..aeee3a3dc 100644 --- a/www/views/pincode.html +++ b/www/views/modals/pincode.html @@ -1,18 +1,18 @@ - +
- {{passcode.substring(0, 1)}} + {{pincode.substring(0, 1)}}
- {{passcode.substring(1, 2)}} + {{pincode.substring(1, 2)}}
- {{passcode.substring(2, 3)}} + {{pincode.substring(2, 3)}}
- {{passcode.substring(3, 4)}} + {{pincode.substring(3, 4)}}
@@ -63,7 +63,4 @@
- - + diff --git a/www/views/tab-home.html b/www/views/tab-home.html index 6f0d57ece..6d2ec9247 100644 --- a/www/views/tab-home.html +++ b/www/views/tab-home.html @@ -66,7 +66,7 @@
From 82e556b026d3269b0d84937042078130f5049396 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 28 Feb 2017 10:32:10 -0300 Subject: [PATCH 03/31] wip add modal config --- src/js/controllers/advancedSettings.js | 37 +++++++++++++++++++++++--- src/js/controllers/pincode.js | 6 +++++ src/js/controllers/tab-home.js | 2 +- src/js/services/configService.js | 1 + src/sass/views/pincode.scss | 6 ++++- www/views/advancedSettings.html | 8 +++++- www/views/modals/pincode.html | 5 ++-- 7 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index c5cd65103..826ae3c81 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, lodash, configService, uxLanguage, platformInfo, profileService, feeService, storageService, $ionicHistory, $timeout, $ionicScrollDelegate) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $timeout, $ionicScrollDelegate) { var updateConfig = function() { var config = configService.getSync(); @@ -11,10 +11,12 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.recentTransactionsEnabled = { value: config.recentTransactions.enabled }; - $scope.hideNextSteps = { value: config.hideNextSteps.enabled }; + $scope.usePincode = { + value: config.pincode ? config.pincode.enabled : false + }; }; $scope.spendUnconfirmedChange = function() { @@ -31,7 +33,24 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.nextStepsChange = function() { var opts = { hideNextSteps: { - enabled: $scope.hideNextSteps.value + enabled: $scope.hideNextSteps.value + }, + }; + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); + }; + + $scope.savePincodeChanges = function(val) { + if (!val || val.length < 4) { + $scope.usePincode = { + value: false + } + return; + } + var opts = { + usePincode: { + enabled: $scope.usePincode.enabled }, }; configService.set(opts, function(err) { @@ -50,6 +69,18 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; + $scope.showPincodeModal = function() { + $scope.fromSettings = true; + $ionicModal.fromTemplateUrl('views/modals/pincode.html', { + scope: $scope, + backdropClickToClose: false, + hardwareBackButtonClose: false + }).then(function(modal) { + $scope.pincodeModal = modal; + $scope.pincodeModal.show(); + }); + }; + $scope.$on("$ionicView.beforeEnter", function(event, data) { updateConfig(); }); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 448ed58fa..53c3da987 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -41,10 +41,16 @@ angular.module('copayApp.controllers').controller('pincodeController', function( }; function checkPasscode() { + console.log('Checking'); configService.whenAvailable(function(config) { var value = '1234'; if (value != $scope.pincode) return; console.log('MATCH'); }); }; + + $scope.cancel = function() { + $scope.savePincodeChanges(false); + $scope.pincodeModal.hide(); + }; }); diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 8abcb08d2..00566a01f 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -25,7 +25,7 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.pincodeModal.show(); }); }; - openPincodeModal(); + // openPincodeModal(); $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); }); diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 1a16992fb..9e1a54319 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -54,6 +54,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer }, pincode: { + enabled: false, value: null, }, diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index 97413fc47..040d0113a 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -1,6 +1,9 @@ #pin-code { background-color: #C3C3C3; - + .close { + cursor: pointer; + padding: .5rem; + } .button-stretch { width: 100%; } @@ -15,6 +18,7 @@ } .content { position: absolute; + text-align: center; width: 100%; height: 100%; .block-code { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 9905fdec2..26566061b 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -13,7 +13,7 @@
If enabled, wallets will also try to spend unconfirmed funds. This option may cause transaction delays.
- +
@@ -28,6 +28,12 @@ Hide Next Steps Card + +
+ + + Use pin to lock/unlock the app +
diff --git a/www/views/modals/pincode.html b/www/views/modals/pincode.html index aeee3a3dc..ab75264e7 100644 --- a/www/views/modals/pincode.html +++ b/www/views/modals/pincode.html @@ -1,4 +1,5 @@ +
Close
@@ -52,13 +53,13 @@
- +
- +
From 313269a45c9950e477a43af06e97109ba122892d Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 1 Mar 2017 17:29:39 -0300 Subject: [PATCH 04/31] add pincode service - refactor --- src/js/controllers/advancedSettings.js | 44 ++++++++-------------- src/js/controllers/pincode.js | 51 +++++++++++++++++--------- src/js/services/pincodeService.js | 32 ++++++++++++++++ www/views/advancedSettings.html | 2 +- www/views/modals/pincode.html | 4 +- 5 files changed, 85 insertions(+), 48 deletions(-) create mode 100644 src/js/services/pincodeService.js diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 826ae3c81..a34e6b749 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $timeout, $ionicScrollDelegate) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { var updateConfig = function() { var config = configService.getSync(); @@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', value: config.hideNextSteps.enabled }; $scope.usePincode = { - value: config.pincode ? config.pincode.enabled : false + enabled: config.pincode ? config.pincode.enabled : false }; }; @@ -41,23 +41,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.savePincodeChanges = function(val) { - if (!val || val.length < 4) { - $scope.usePincode = { - value: false - } - return; - } - var opts = { - usePincode: { - enabled: $scope.usePincode.enabled - }, - }; - configService.set(opts, function(err) { - if (err) $log.debug(err); - }); - }; - $scope.recentTransactionsChange = function() { var opts = { recentTransactions: { @@ -69,15 +52,20 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.showPincodeModal = function() { - $scope.fromSettings = true; - $ionicModal.fromTemplateUrl('views/modals/pincode.html', { - scope: $scope, - backdropClickToClose: false, - hardwareBackButtonClose: false - }).then(function(modal) { - $scope.pincodeModal = modal; - $scope.pincodeModal.show(); + $scope.usePincodeChange = function() { + var opts = {}; + opts.enabled = $scope.usePincode.enabled; + opts.from = 'settings'; + + pincodeService.lockChange(opts, function(err) { + if (err) { + $log.warn(err); + + // ToDo show error? + $scope.usePincode.enabled = false; + $scope.$apply(); + return; + } }); }; diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 53c3da987..d7beadfa4 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,7 +1,11 @@ 'use strict'; angular.module('copayApp.controllers').controller('pincodeController', function($timeout, $scope, $log, $window, configService) { - $scope.pincode = ''; + var config = configService.getSync(); + $scope.currentPincode = config.pincode ? config.pincode.value : null; + $scope.pincode = $scope.pc1 = $scope.pc2 = ''; + + console.log('#######', $scope.from, $scope.enabled); angular.element($window).on('keydown', function(e) { if (e.which === 8) { // you can add others here inside brackets. @@ -9,15 +13,16 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.delete(); } - if (e.key && e.key.match(/^[0-9]$/)) + if (e && e.key.match(/^[0-9]$/)) $scope.add(e.key); - else if (e.key && e.key == 'Enter') - checkPasscode(); + else if (e && e.keyCode == 27) + $scope.close(false); + else if (e && e.keyCode == 13) + $scope.save(); }); $scope.add = function(value) { - if (isComplete()) checkPasscode(); - else updatePassCode(value); + updatePassCode(value); }; $scope.delete = function() { @@ -33,24 +38,36 @@ angular.module('copayApp.controllers').controller('pincodeController', function( }; function updatePassCode(value) { - if (value) $scope.pincode = $scope.pincode + value; + if (value && $scope.pincode.length < 4) + $scope.pincode = $scope.pincode + value; $timeout(function() { - checkPasscode(); $scope.$apply(); }); }; - function checkPasscode() { - console.log('Checking'); - configService.whenAvailable(function(config) { - var value = '1234'; - if (value != $scope.pincode) return; - console.log('MATCH'); - }); + $scope.save = function() { + if (!$scope.pc1) { + console.log('No pc 1'); + $scope.pc1 = $scope.pincode; + console.log('$scope.pc1', $scope.pc1); + $scope.pincode = ''; + $timeout(function() { + $scope.$apply(); + }); + return; + } else { + $scope.pc2 = $scope.pincode; + console.log('$scope.pc2', $scope.pc2); + } + + if ($scope.pc1 == $scope.pc2) { + $scope.close($scope.pc1); + } else { + $scope.enabled ? pincodeService.lockApp() : pincodeService.unlockApp(); + } }; - $scope.cancel = function() { - $scope.savePincodeChanges(false); + $scope.close = function() { $scope.pincodeModal.hide(); }; }); diff --git a/src/js/services/pincodeService.js b/src/js/services/pincodeService.js new file mode 100644 index 000000000..d6b244e20 --- /dev/null +++ b/src/js/services/pincodeService.js @@ -0,0 +1,32 @@ +'use strict'; + +angular.module('copayApp.services').factory('pincodeService', function($log, $rootScope, $ionicModal, configService) { + var root = {}; + + var openPincodeModal = function(opts) { + var scope = $rootScope.$new(true); + scope.from = opts.from; + scope.enabled = opts.enabled; + $ionicModal.fromTemplateUrl('views/modals/pincode.html', { + scope: scope, + backdropClickToClose: false, + hardwareBackButtonClose: false + }).then(function(modal) { + scope.pincodeModal = modal; + scope.pincodeModal.show(); + }); + }; + + root.lockChange = function(opts, cb) { + if (opts.enabled) console.log('Locking app from service'); + else console.log('Unlocking app from service'); + openPincodeModal(opts); + }; + + root.isLocked = function() { + var config = configService.getSync(); + return config.pincode ? config.pincode.enabled : false; + }; + + return root; +}); diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 26566061b..8a8208587 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -31,7 +31,7 @@
- + Use pin to lock/unlock the app
diff --git a/www/views/modals/pincode.html b/www/views/modals/pincode.html index ab75264e7..8dce84143 100644 --- a/www/views/modals/pincode.html +++ b/www/views/modals/pincode.html @@ -1,5 +1,5 @@ -
Close
+
Close
@@ -53,7 +53,7 @@
- +
From 34413278ec08028214e75759c3f211d1dea39fcb Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 2 Mar 2017 11:25:38 -0300 Subject: [PATCH 05/31] update option if enabled/disabled --- src/js/controllers/advancedSettings.js | 27 +++++++++++++------------- src/js/controllers/pincode.js | 15 ++++++++------ src/js/services/pincodeService.js | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index a34e6b749..e2ac64fab 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $timeout, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { var updateConfig = function() { var config = configService.getSync(); @@ -53,22 +53,21 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }; $scope.usePincodeChange = function() { - var opts = {}; - opts.enabled = $scope.usePincode.enabled; - opts.from = 'settings'; - - pincodeService.lockChange(opts, function(err) { - if (err) { - $log.warn(err); - - // ToDo show error? - $scope.usePincode.enabled = false; - $scope.$apply(); - return; - } + pincodeService.lockChange({ + enabled: $scope.usePincode.enabled, + from: 'settings' }); }; + $rootScope.$on('updatePincodeOption', function(event) { + console.log('ON'); + var config = configService.getSync(); + $scope.usePincode = { + enabled: config.pincode ? config.pincode.enabled : false + }; + $scope.$apply(); + }); + $scope.$on("$ionicView.beforeEnter", function(event, data) { updateConfig(); }); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index d7beadfa4..bf1391b1c 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,14 +1,12 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($timeout, $scope, $log, $window, configService) { +angular.module('copayApp.controllers').controller('pincodeController', function($rootScope, $timeout, $scope, $log, $window, configService) { var config = configService.getSync(); $scope.currentPincode = config.pincode ? config.pincode.value : null; - $scope.pincode = $scope.pc1 = $scope.pc2 = ''; - - console.log('#######', $scope.from, $scope.enabled); + $scope.pincode = $scope.pc1 = $scope.pc2 = null; angular.element($window).on('keydown', function(e) { - if (e.which === 8) { // you can add others here inside brackets. + if (e.which === 8) { e.preventDefault(); $scope.delete(); } @@ -16,7 +14,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( if (e && e.key.match(/^[0-9]$/)) $scope.add(e.key); else if (e && e.keyCode == 27) - $scope.close(false); + $scope.cancel(); else if (e && e.keyCode == 13) $scope.save(); }); @@ -70,4 +68,9 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.close = function() { $scope.pincodeModal.hide(); }; + + $scope.cancel = function() { + $rootScope.$emit('updatePincodeOption', false); + $scope.close(); + }; }); diff --git a/src/js/services/pincodeService.js b/src/js/services/pincodeService.js index d6b244e20..ab69e5e94 100644 --- a/src/js/services/pincodeService.js +++ b/src/js/services/pincodeService.js @@ -17,7 +17,7 @@ angular.module('copayApp.services').factory('pincodeService', function($log, $ro }); }; - root.lockChange = function(opts, cb) { + root.lockChange = function(opts) { if (opts.enabled) console.log('Locking app from service'); else console.log('Unlocking app from service'); openPincodeModal(opts); From e5ecc111f3320fdfbcc8314c600ec369c284623a Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 2 Mar 2017 16:32:08 -0300 Subject: [PATCH 06/31] set lock/unlock properly --- src/js/controllers/advancedSettings.js | 17 ++++--- src/js/controllers/pincode.js | 68 ++++++++++++++------------ src/js/services/configService.js | 2 +- src/js/services/pincodeService.js | 10 +--- www/views/modals/pincode.html | 8 +-- 5 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index e2ac64fab..0a678b27d 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -54,18 +54,19 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.usePincodeChange = function() { pincodeService.lockChange({ - enabled: $scope.usePincode.enabled, - from: 'settings' + from: 'settings', + locking: $scope.usePincode.enabled }); }; $rootScope.$on('updatePincodeOption', function(event) { - console.log('ON'); - var config = configService.getSync(); - $scope.usePincode = { - enabled: config.pincode ? config.pincode.enabled : false - }; - $scope.$apply(); + $timeout(function() { + var config = configService.getSync(); + $scope.usePincode = { + enabled: config.pincode ? config.pincode.enabled : false + }; + $scope.$apply(); + }); }); $scope.$on("$ionicView.beforeEnter", function(event, data) { diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index bf1391b1c..69c1c656c 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,9 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('pincodeController', function($rootScope, $timeout, $scope, $log, $window, configService) { - var config = configService.getSync(); - $scope.currentPincode = config.pincode ? config.pincode.value : null; - $scope.pincode = $scope.pc1 = $scope.pc2 = null; + $scope.currentPincode = $scope.newPincode = ''; angular.element($window).on('keydown', function(e) { if (e.which === 8) { @@ -14,7 +12,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( if (e && e.key.match(/^[0-9]$/)) $scope.add(e.key); else if (e && e.keyCode == 27) - $scope.cancel(); + $scope.close(); else if (e && e.keyCode == 13) $scope.save(); }); @@ -24,53 +22,63 @@ angular.module('copayApp.controllers').controller('pincodeController', function( }; $scope.delete = function() { - if ($scope.pincode.length > 0) { - $scope.pincode = $scope.pincode.substring(0, $scope.pincode.length - 1); + if ($scope.currentPincode.length > 0) { + $scope.currentPincode = $scope.currentPincode.substring(0, $scope.currentPincode.length - 1); updatePassCode(); } }; function isComplete() { - if ($scope.pincode.length < 4) return false; + if ($scope.currentPincode.length < 4) return false; else return true; }; function updatePassCode(value) { - if (value && $scope.pincode.length < 4) - $scope.pincode = $scope.pincode + value; + if (value && $scope.currentPincode.length < 4) + $scope.currentPincode = $scope.currentPincode + value; $timeout(function() { $scope.$apply(); }); }; $scope.save = function() { - if (!$scope.pc1) { - console.log('No pc 1'); - $scope.pc1 = $scope.pincode; - console.log('$scope.pc1', $scope.pc1); - $scope.pincode = ''; - $timeout(function() { - $scope.$apply(); - }); - return; - } else { - $scope.pc2 = $scope.pincode; - console.log('$scope.pc2', $scope.pc2); - } + if (!isComplete()) return; + var config = configService.getSync(); + var match = config.pincode.value == $scope.currentPincode ? true : false; - if ($scope.pc1 == $scope.pc2) { - $scope.close($scope.pc1); + if (!$scope.locking && !match) return; + checkCodes(); + }; + + function checkCodes() { + if (!$scope.newPincode) { + $scope.newPincode = $scope.currentPincode; + $scope.currentPincode = ''; } else { - $scope.enabled ? pincodeService.lockApp() : pincodeService.unlockApp(); + if ($scope.newPincode == $scope.currentPincode) + saveSettings($scope.locking, $scope.newPincode); } + $timeout(function() { + $scope.$apply(); + }); + }; + + function saveSettings(enabled, value) { + var opts = { + pincode: { + enabled: enabled, + value: value + } + }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + $scope.close(); + }); }; $scope.close = function() { + $rootScope.$emit('updatePincodeOption'); $scope.pincodeModal.hide(); }; - - $scope.cancel = function() { - $rootScope.$emit('updatePincodeOption', false); - $scope.close(); - }; }); diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 9e1a54319..30522da04 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -55,7 +55,7 @@ angular.module('copayApp.services').factory('configService', function(storageSer pincode: { enabled: false, - value: null, + value: '', }, // External services diff --git a/src/js/services/pincodeService.js b/src/js/services/pincodeService.js index ab69e5e94..15f20420e 100644 --- a/src/js/services/pincodeService.js +++ b/src/js/services/pincodeService.js @@ -3,10 +3,10 @@ angular.module('copayApp.services').factory('pincodeService', function($log, $rootScope, $ionicModal, configService) { var root = {}; - var openPincodeModal = function(opts) { + root.lockChange = function(opts) { var scope = $rootScope.$new(true); scope.from = opts.from; - scope.enabled = opts.enabled; + scope.locking = opts.locking; $ionicModal.fromTemplateUrl('views/modals/pincode.html', { scope: scope, backdropClickToClose: false, @@ -17,12 +17,6 @@ angular.module('copayApp.services').factory('pincodeService', function($log, $ro }); }; - root.lockChange = function(opts) { - if (opts.enabled) console.log('Locking app from service'); - else console.log('Unlocking app from service'); - openPincodeModal(opts); - }; - root.isLocked = function() { var config = configService.getSync(); return config.pincode ? config.pincode.enabled : false; diff --git a/www/views/modals/pincode.html b/www/views/modals/pincode.html index 8dce84143..78790b052 100644 --- a/www/views/modals/pincode.html +++ b/www/views/modals/pincode.html @@ -4,16 +4,16 @@
- {{pincode.substring(0, 1)}} + {{currentPincode.substring(0, 1)}}
- {{pincode.substring(1, 2)}} + {{currentPincode.substring(1, 2)}}
- {{pincode.substring(2, 3)}} + {{currentPincode.substring(2, 3)}}
- {{pincode.substring(3, 4)}} + {{currentPincode.substring(3, 4)}}
From 6419342c4b877e7894d8d1f3867d9c0b6eff1c2e Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 2 Mar 2017 16:49:07 -0300 Subject: [PATCH 07/31] show lock screen at start --- src/js/controllers/advancedSettings.js | 2 +- src/js/controllers/tab-home.js | 11 ----------- src/js/routes.js | 11 ++++++++++- src/js/services/pincodeService.js | 2 +- www/views/modals/pincode.html | 2 +- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 0a678b27d..60f32b9e9 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -54,7 +54,7 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.usePincodeChange = function() { pincodeService.lockChange({ - from: 'settings', + fromSettings: true, locking: $scope.usePincode.enabled }); }; diff --git a/src/js/controllers/tab-home.js b/src/js/controllers/tab-home.js index 00566a01f..7a3fd83f8 100644 --- a/src/js/controllers/tab-home.js +++ b/src/js/controllers/tab-home.js @@ -15,17 +15,6 @@ angular.module('copayApp.controllers').controller('tabHomeController', $scope.isNW = platformInfo.isNW; $scope.showRateCard = {}; - function openPincodeModal() { - $ionicModal.fromTemplateUrl('views/modals/pincode.html', { - scope: $scope, - backdropClickToClose: false, - hardwareBackButtonClose: false - }).then(function(modal) { - $scope.pincodeModal = modal; - $scope.pincodeModal.show(); - }); - }; - // openPincodeModal(); $scope.$on("$ionicView.afterEnter", function() { startupService.ready(); }); diff --git a/src/js/routes.js b/src/js/routes.js index 4fc657bd4..2f9e02317 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1091,11 +1091,20 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { + .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, pincodeService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { uxLanguage.init(); $ionicPlatform.ready(function() { + configService.whenAvailable(function(config) { + if (config.pincode && config.pincode.enabled) { + pincodeService.lockChange({ + fromSettings: false, + locking: false, + }); + } + }); + if (screen.width < 768 && platformInfo.isCordova) screen.lockOrientation('portrait'); diff --git a/src/js/services/pincodeService.js b/src/js/services/pincodeService.js index 15f20420e..fea790bca 100644 --- a/src/js/services/pincodeService.js +++ b/src/js/services/pincodeService.js @@ -5,7 +5,7 @@ angular.module('copayApp.services').factory('pincodeService', function($log, $ro root.lockChange = function(opts) { var scope = $rootScope.$new(true); - scope.from = opts.from; + scope.fromSettings = opts.fromSettings; scope.locking = opts.locking; $ionicModal.fromTemplateUrl('views/modals/pincode.html', { scope: scope, diff --git a/www/views/modals/pincode.html b/www/views/modals/pincode.html index 78790b052..765d374a7 100644 --- a/www/views/modals/pincode.html +++ b/www/views/modals/pincode.html @@ -1,5 +1,5 @@ -
Close
+
Close
From 0e9b39a5107e788d81c538c94f857551510e0d3b Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 2 Mar 2017 16:54:55 -0300 Subject: [PATCH 08/31] unlock the app with first match --- src/js/controllers/pincode.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 69c1c656c..c676a7d6e 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -46,7 +46,15 @@ angular.module('copayApp.controllers').controller('pincodeController', function( var config = configService.getSync(); var match = config.pincode.value == $scope.currentPincode ? true : false; - if (!$scope.locking && !match) return; + if (!$scope.fromSettings && match) { + $scope.currentPincode = ''; + $scope.close(); + return; + } + if (!$scope.locking) { + if (!match) return; + saveSettings($scope.locking, ''); + } checkCodes(); }; @@ -79,6 +87,6 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.close = function() { $rootScope.$emit('updatePincodeOption'); - $scope.pincodeModal.hide(); + $scope.pincodeModal.remove(); }; }); From 93168cdae69c75ee548cf725dc4bc691c056d886 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 3 Mar 2017 14:18:56 -0300 Subject: [PATCH 09/31] views instead modal --- src/js/controllers/advancedSettings.js | 8 +++-- src/js/controllers/pincode.js | 13 +++++-- src/js/routes.js | 48 +++++++++++++++++++------- www/views/{modals => }/pincode.html | 2 +- 4 files changed, 52 insertions(+), 19 deletions(-) rename www/views/{modals => }/pincode.html (96%) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 60f32b9e9..7b9a201dd 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $timeout, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { var updateConfig = function() { var config = configService.getSync(); @@ -53,7 +53,11 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }; $scope.usePincodeChange = function() { - pincodeService.lockChange({ + // pincodeService.lockChange({ + // fromSettings: true, + // locking: $scope.usePincode.enabled + // }); + $state.go('tabs.pincode', { fromSettings: true, locking: $scope.usePincode.enabled }); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index c676a7d6e..f9d4831b7 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,7 +1,13 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($rootScope, $timeout, $scope, $log, $window, configService) { - $scope.currentPincode = $scope.newPincode = ''; +angular.module('copayApp.controllers').controller('pincodeController', function($rootScope, $state, $timeout, $scope, $log, $window, configService) { + + $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.currentPincode = $scope.newPincode = ''; + $scope.fromSettings = data.stateParams.fromSettings == 'true' ? true : false; + $scope.locking = data.stateParams.locking == 'true' ? true : false; + console.log('### From Settings:', $scope.fromSettings, 'Locking:', $scope.locking); + }); angular.element($window).on('keydown', function(e) { if (e.which === 8) { @@ -87,6 +93,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.close = function() { $rootScope.$emit('updatePincodeOption'); - $scope.pincodeModal.remove(); + if ($scope.fromSettings) $state.go('tabs.advanced'); + else $state.go('tabs.home'); }; }); diff --git a/src/js/routes.js b/src/js/routes.js index 2f9e02317..249d7bd85 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -119,6 +119,18 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) + /* + * + * Pin code + * + */ + + .state('pincode', { + url: '/pincode/:fromSettings/:locking', + controller: 'pincodeController', + templateUrl: 'views/pincode.html' + }) + /* * * URI @@ -439,6 +451,15 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) + .state('tabs.pincode', { + url: '/pincode/:fromSettings/:locking', + views: { + 'tab-settings@tabs': { + controller: 'pincodeController', + templateUrl: 'views/pincode.html', + } + } + }) /* * @@ -1091,20 +1112,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, pincodeService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { + .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { uxLanguage.init(); $ionicPlatform.ready(function() { - configService.whenAvailable(function(config) { - if (config.pincode && config.pincode.enabled) { - pincodeService.lockChange({ - fromSettings: false, - locking: false, - }); - } - }); - if (screen.width < 768 && platformInfo.isCordova) screen.lockOrientation('portrait'); @@ -1205,9 +1217,19 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr disableAnimate: true, historyRoot: true }); - $state.transitionTo('tabs.home').then(function() { - // Clear history - $ionicHistory.clearHistory(); + configService.whenAvailable(function(config) { + console.log('### CONFIG', config.pincode); + if (config.pincode && config.pincode.enabled) { + $state.go('pincode', { + fromSettings: false, + locking: false + }); + } else { + $state.transitionTo('tabs.home').then(function() { + // Clear history + $ionicHistory.clearHistory(); + }); + } }); }); } diff --git a/www/views/modals/pincode.html b/www/views/pincode.html similarity index 96% rename from www/views/modals/pincode.html rename to www/views/pincode.html index 765d374a7..5f8f75a4d 100644 --- a/www/views/modals/pincode.html +++ b/www/views/pincode.html @@ -1,4 +1,4 @@ - +
Close
From e89847af559346438ead2539185056e01d1a12cb Mon Sep 17 00:00:00 2001 From: JDonadio Date: Mon, 6 Mar 2017 12:45:37 -0300 Subject: [PATCH 10/31] refactor - only mobile --- src/js/controllers/advancedSettings.js | 21 ++++----- src/js/controllers/pincode.js | 61 ++++++++++---------------- src/js/routes.js | 17 +++---- www/views/advancedSettings.html | 2 +- www/views/pincode.html | 29 +++++++----- 5 files changed, 58 insertions(+), 72 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 7b9a201dd..934adddfe 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $rootScope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { var updateConfig = function() { var config = configService.getSync(); @@ -53,27 +53,22 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }; $scope.usePincodeChange = function() { - // pincodeService.lockChange({ - // fromSettings: true, - // locking: $scope.usePincode.enabled - // }); $state.go('tabs.pincode', { fromSettings: true, locking: $scope.usePincode.enabled }); }; - $rootScope.$on('updatePincodeOption', function(event) { - $timeout(function() { - var config = configService.getSync(); - $scope.usePincode = { - enabled: config.pincode ? config.pincode.enabled : false - }; - $scope.$apply(); - }); + $scope.$on('updatePincodeOption', function(event) { + var config = configService.getSync(); + $scope.usePincode = { + enabled: config.pincode ? config.pincode.enabled : false + }; + $scope.$apply(); }); $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.isCordova = platformInfo.isCordova; updateConfig(); }); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index f9d4831b7..35c888ed6 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,36 +1,17 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($rootScope, $state, $timeout, $scope, $log, $window, configService) { +angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $timeout, $scope, $log, $window, configService) { - $scope.$on("$ionicView.beforeEnter", function(event, data) { + $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPincode = $scope.newPincode = ''; - $scope.fromSettings = data.stateParams.fromSettings == 'true' ? true : false; - $scope.locking = data.stateParams.locking == 'true' ? true : false; - console.log('### From Settings:', $scope.fromSettings, 'Locking:', $scope.locking); + $scope.fromSettings = $stateParams.fromSettings == 'true' ? true : false; + $scope.locking = $stateParams.locking == 'true' ? true : false; }); - angular.element($window).on('keydown', function(e) { - if (e.which === 8) { - e.preventDefault(); - $scope.delete(); - } - - if (e && e.key.match(/^[0-9]$/)) - $scope.add(e.key); - else if (e && e.keyCode == 27) - $scope.close(); - else if (e && e.keyCode == 13) - $scope.save(); - }); - - $scope.add = function(value) { - updatePassCode(value); - }; - $scope.delete = function() { if ($scope.currentPincode.length > 0) { $scope.currentPincode = $scope.currentPincode.substring(0, $scope.currentPincode.length - 1); - updatePassCode(); + $scope.updatePinCode(); } }; @@ -39,12 +20,18 @@ angular.module('copayApp.controllers').controller('pincodeController', function( else return true; }; - function updatePassCode(value) { - if (value && $scope.currentPincode.length < 4) + $scope.updatePinCode = function(value) { + if (value && !isComplete()) { $scope.currentPincode = $scope.currentPincode + value; + } $timeout(function() { $scope.$apply(); }); + if (!$scope.locking && isComplete()) { + $timeout(function() { + $scope.save(); + }); + } }; $scope.save = function() { @@ -52,29 +39,27 @@ angular.module('copayApp.controllers').controller('pincodeController', function( var config = configService.getSync(); var match = config.pincode.value == $scope.currentPincode ? true : false; - if (!$scope.fromSettings && match) { - $scope.currentPincode = ''; - $scope.close(); - return; - } if (!$scope.locking) { - if (!match) return; - saveSettings($scope.locking, ''); + if (match) { + $scope.fromSettings ? saveSettings($scope.locking, '') : $scope.close(); + return; + } + } else { + checkCodes(); } - checkCodes(); }; function checkCodes() { if (!$scope.newPincode) { $scope.newPincode = $scope.currentPincode; $scope.currentPincode = ''; + $timeout(function() { + $scope.$apply(); + }); } else { if ($scope.newPincode == $scope.currentPincode) saveSettings($scope.locking, $scope.newPincode); } - $timeout(function() { - $scope.$apply(); - }); }; function saveSettings(enabled, value) { @@ -92,7 +77,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( }; $scope.close = function() { - $rootScope.$emit('updatePincodeOption'); + $scope.$emit('updatePincodeOption'); if ($scope.fromSettings) $state.go('tabs.advanced'); else $state.go('tabs.home'); }; diff --git a/src/js/routes.js b/src/js/routes.js index 249d7bd85..31dafd194 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -126,9 +126,9 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr */ .state('pincode', { - url: '/pincode/:fromSettings/:locking', + url: '/pincode/', controller: 'pincodeController', - templateUrl: 'views/pincode.html' + templateUrl: 'views/pincode.html', }) /* @@ -457,6 +457,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr 'tab-settings@tabs': { controller: 'pincodeController', templateUrl: 'views/pincode.html', + cache: false } } }) @@ -1112,7 +1113,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $location, $log, $timeout, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { + .run(function($rootScope, $state, $location, $log, $timeout, startupService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { uxLanguage.init(); @@ -1218,11 +1219,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr historyRoot: true }); configService.whenAvailable(function(config) { - console.log('### CONFIG', config.pincode); - if (config.pincode && config.pincode.enabled) { - $state.go('pincode', { - fromSettings: false, - locking: false + startupService.ready(); + if (platformInfo.isCordova && config.pincode && config.pincode.enabled) { + $state.transitionTo('pincode').then(function() { + // Clear history + $ionicHistory.clearHistory(); }); } else { $state.transitionTo('tabs.home').then(function() { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 8a8208587..861e325a0 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -31,7 +31,7 @@
- + Use pin to lock/unlock the app
diff --git a/www/views/pincode.html b/www/views/pincode.html index 5f8f75a4d..cd8138eaf 100644 --- a/www/views/pincode.html +++ b/www/views/pincode.html @@ -1,4 +1,9 @@ - + + + {{'Pin Code' | translate}} + + +
Close
@@ -20,35 +25,35 @@
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -56,7 +61,7 @@
- +
@@ -64,4 +69,4 @@
- + From 5f08ad236b383477115b8a2904b509dea8793781 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Mon, 6 Mar 2017 16:48:21 -0300 Subject: [PATCH 11/31] remove unnecessary event --- src/js/controllers/advancedSettings.js | 8 -------- src/js/controllers/pincode.js | 1 - 2 files changed, 9 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 934adddfe..a3881b719 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -59,14 +59,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.$on('updatePincodeOption', function(event) { - var config = configService.getSync(); - $scope.usePincode = { - enabled: config.pincode ? config.pincode.enabled : false - }; - $scope.$apply(); - }); - $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isCordova = platformInfo.isCordova; updateConfig(); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 35c888ed6..911c5cd91 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -77,7 +77,6 @@ angular.module('copayApp.controllers').controller('pincodeController', function( }; $scope.close = function() { - $scope.$emit('updatePincodeOption'); if ($scope.fromSettings) $state.go('tabs.advanced'); else $state.go('tabs.home'); }; From a51151b1d4377ba132be09b28deff44e21128489 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 7 Mar 2017 11:33:17 -0300 Subject: [PATCH 12/31] apply mocks styling for both distributions --- src/sass/views/pincode.scss | 86 ++++++++++++++++++++++----------- www/views/advancedSettings.html | 10 ++-- www/views/pincode.html | 75 ++++++++++++++-------------- 3 files changed, 100 insertions(+), 71 deletions(-) diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index 040d0113a..eeb7bd068 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -1,40 +1,70 @@ #pin-code { - background-color: #C3C3C3; - .close { - cursor: pointer; - padding: .5rem; - } - .button-stretch { - width: 100%; - } - .col-offset-15 { - margin-left: 15%; - } - @mixin centerer { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); + background-color: #FAFAFA; + .bar.bar-clear { + background-color: transparent; + border: none; } .content { - position: absolute; text-align: center; width: 100%; height: 100%; - .block-code { - @include centerer; - top: 20% !important; - width: 50%; - > .row > .col { - border-bottom: 1px solid #3E3E3E; - padding: 5px; - margin: 10px; - height: 35px; + .row .col { + margin: 10px; + height: 25px; + } + .app-icon { + margin-top: -55px; + .big-icon-svg { + > .bg { + background-image: url("../img/app/icon.png"); + height: 60px; + width: 60px; + margin: auto; + } } } + .block-text { + align-items: center; + background-color: #F1F1F1; + text-align: center; + height: 30%; + border-bottom: 1px solid #c5c5c5; + span { + width: 60%; + margin: 10% auto; + } + } + .block-code { + width: 300px; + margin: auto; + padding: 0 50px 0 50px; + } .block-buttons { - @include centerer; - padding: 20px; + .row { + padding: 3%; + } + @media (max-height: 480px) { + .row { + padding: 2%; + } + } + cursor: pointer; + position: absolute; + bottom: 3%; + left: 0; + width: 100%; } } + .circle { + border: 1px solid #666666; + border-radius: 50%; + opacity: 0.6; + box-shadow: 0 0 1px 0px rgb( 255, 255, 255); + width: 5px; + height: 5px; + transition: background-color .5s ease-in-out; + } + .filled { + background-color: #666666; + } } diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 861e325a0..251fd9940 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -29,11 +29,13 @@ Hide Next Steps Card -
+
+
- - Use pin to lock/unlock the app - + + Use pin to lock/unlock the app + +
diff --git a/www/views/pincode.html b/www/views/pincode.html index cd8138eaf..9e653e5eb 100644 --- a/www/views/pincode.html +++ b/www/views/pincode.html @@ -1,70 +1,67 @@ - - {{'Pin Code' | translate}} + -
Close
+
Please enter your mobile unlock code
+
Confirm your mobile unlock code
+
+ +
+
+
-
- {{currentPincode.substring(0, 1)}} -
-
- {{currentPincode.substring(1, 2)}} -
-
- {{currentPincode.substring(2, 3)}} -
-
- {{currentPincode.substring(3, 4)}} -
+
+
+
+
-
- +
+
1
-
- +
+
2
-
- +
+
3
-
- +
+
4
-
- +
+
5
-
- +
+
6
-
- +
+
7
-
- +
+
8
-
- +
+
9
-
- +
+
+
+
+
0
- -
-
- +
From 107694cd5863041efe70059fd3d348604f90b4c1 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 7 Mar 2017 15:39:40 -0300 Subject: [PATCH 13/31] reduce fill color time effect - dark back arrow color --- src/js/controllers/pincode.js | 8 ++++---- src/sass/views/pincode.scss | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 911c5cd91..dc83d1c50 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -28,9 +28,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.$apply(); }); if (!$scope.locking && isComplete()) { - $timeout(function() { - $scope.save(); - }); + $scope.save(); } }; @@ -72,7 +70,9 @@ angular.module('copayApp.controllers').controller('pincodeController', function( configService.set(opts, function(err) { if (err) $log.debug(err); - $scope.close(); + $timeout(function() { + $scope.close(); + }); }); }; diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index eeb7bd068..d2a79c659 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -3,6 +3,9 @@ .bar.bar-clear { background-color: transparent; border: none; + .back-button .icon:before { + color: #2d3f50; + } } .content { text-align: center; @@ -62,7 +65,7 @@ box-shadow: 0 0 1px 0px rgb( 255, 255, 255); width: 5px; height: 5px; - transition: background-color .5s ease-in-out; + transition: background-color .1s ease-in-out; } .filled { background-color: #666666; From 015708529bd9050a559ab46aeb04417360441542 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 8 Mar 2017 14:27:43 -0300 Subject: [PATCH 14/31] request pin when resume event is fired --- src/js/routes.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/js/routes.js b/src/js/routes.js index 31dafd194..46f688f0a 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1175,7 +1175,11 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }); $ionicPlatform.on('resume', function() { - // Nothing to do + configService.whenAvailable(function(config) { + if (platformInfo.isCordova && config.pincode && config.pincode.enabled) { + $state.go('pincode'); + } + }); }); $ionicPlatform.on('menubutton', function() { From d4c8576032634c007d19af15bd10062153dc2f9d Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 8 Mar 2017 16:02:34 -0300 Subject: [PATCH 15/31] improve performance and UX - handle history views properly --- src/js/controllers/advancedSettings.js | 2 +- src/js/controllers/pincode.js | 16 +++++++--------- src/js/services/pincodeService.js | 26 -------------------------- src/sass/views/pincode.scss | 24 ++++++++---------------- 4 files changed, 16 insertions(+), 52 deletions(-) delete mode 100644 src/js/services/pincodeService.js diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index a3881b719..a7f6187a8 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate, pincodeService) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate) { var updateConfig = function() { var config = configService.getSync(); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index dc83d1c50..c2ba22363 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $timeout, $scope, $log, $window, configService) { +angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, $window, configService) { $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPincode = $scope.newPincode = ''; @@ -39,8 +39,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( if (!$scope.locking) { if (match) { - $scope.fromSettings ? saveSettings($scope.locking, '') : $scope.close(); - return; + $scope.fromSettings ? saveSettings($scope.locking, '') : $scope.close(150); } } else { checkCodes(); @@ -70,14 +69,13 @@ angular.module('copayApp.controllers').controller('pincodeController', function( configService.set(opts, function(err) { if (err) $log.debug(err); - $timeout(function() { - $scope.close(); - }); + $scope.close(); }); }; - $scope.close = function() { - if ($scope.fromSettings) $state.go('tabs.advanced'); - else $state.go('tabs.home'); + $scope.close = function(delay) { + $timeout(function() { + $ionicHistory.viewHistory().backView ? $ionicHistory.goBack() : $state.go('tabs.home'); + }, delay || 1); }; }); diff --git a/src/js/services/pincodeService.js b/src/js/services/pincodeService.js deleted file mode 100644 index fea790bca..000000000 --- a/src/js/services/pincodeService.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -angular.module('copayApp.services').factory('pincodeService', function($log, $rootScope, $ionicModal, configService) { - var root = {}; - - root.lockChange = function(opts) { - var scope = $rootScope.$new(true); - scope.fromSettings = opts.fromSettings; - scope.locking = opts.locking; - $ionicModal.fromTemplateUrl('views/modals/pincode.html', { - scope: scope, - backdropClickToClose: false, - hardwareBackButtonClose: false - }).then(function(modal) { - scope.pincodeModal = modal; - scope.pincodeModal.show(); - }); - }; - - root.isLocked = function() { - var config = configService.getSync(); - return config.pincode ? config.pincode.enabled : false; - }; - - return root; -}); diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index d2a79c659..272591c21 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -11,10 +11,6 @@ text-align: center; width: 100%; height: 100%; - .row .col { - margin: 10px; - height: 25px; - } .app-icon { margin-top: -55px; .big-icon-svg { @@ -38,18 +34,15 @@ } } .block-code { - width: 300px; + width: 120px; margin: auto; - padding: 0 50px 0 50px; + .row { + height: 35px; + } } .block-buttons { - .row { - padding: 3%; - } - @media (max-height: 480px) { - .row { - padding: 2%; - } + .col { + padding: 5%; } cursor: pointer; position: absolute; @@ -63,9 +56,8 @@ border-radius: 50%; opacity: 0.6; box-shadow: 0 0 1px 0px rgb( 255, 255, 255); - width: 5px; - height: 5px; - transition: background-color .1s ease-in-out; + margin: 2px; + transition: background-color .2s ease-in-out; } .filled { background-color: #666666; From 824362af7cb6af8a4e2925c4fc9e9e4aa5f534b3 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 10 Mar 2017 12:10:00 -0300 Subject: [PATCH 16/31] add fingerprint option - add lock app view and options --- src/js/controllers/advancedSettings.js | 9 +--- src/js/controllers/lockapp.js | 65 ++++++++++++++++++++++++++ src/js/controllers/pincode.js | 15 ++++-- src/js/routes.js | 17 +++++-- src/js/services/configService.js | 11 +++-- www/views/advancedSettings.html | 11 +++-- www/views/lockapp.html | 19 ++++++++ 7 files changed, 121 insertions(+), 26 deletions(-) create mode 100644 src/js/controllers/lockapp.js create mode 100644 www/views/lockapp.html diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index a7f6187a8..8af32de96 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $timeout, $state, $log, $window, $ionicModal, lodash, configService, uxLanguage, platformInfo, pushNotificationsService, profileService, feeService, storageService, $ionicHistory, $ionicScrollDelegate) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo) { var updateConfig = function() { var config = configService.getSync(); @@ -52,13 +52,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.usePincodeChange = function() { - $state.go('tabs.pincode', { - fromSettings: true, - locking: $scope.usePincode.enabled - }); - }; - $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isCordova = platformInfo.isCordova; updateConfig(); diff --git a/src/js/controllers/lockapp.js b/src/js/controllers/lockapp.js new file mode 100644 index 000000000..02f68921c --- /dev/null +++ b/src/js/controllers/lockapp.js @@ -0,0 +1,65 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('lockappController', function($state, $scope, $log, configService, popupService, gettextCatalog, appConfigService) { + + $scope.$on("$ionicView.beforeEnter", function(event) { + var config = configService.getSync(); + $scope.fingerprintAvailable = true; + // $scope.fingerprintAvailable = fingerprintService.isAvailable(); + + $scope.usePincode = { + enabled: config.lockapp ? config.lockapp.pincode.enabled : false + }; + $scope.useFingerprint = { + enabled: config.lockapp ? config.lockapp.fingerprint.enabled : false + }; + }); + + $scope.usePincodeChange = function() { + $state.go('tabs.lockapp.pincode', { + fromSettings: true, + locking: $scope.usePincode.enabled + }); + }; + + $scope.useFingerprintChange = function() { + if ($scope.usePincode.enabled) { + var message = gettextCatalog.getString('{{appName}} is protected by Pin Code. Are you sure you want to disable it?', { + appName: appConfigService.nameCase + }); + var okText = gettextCatalog.getString('Yes'); + var cancelText = gettextCatalog.getString('Cancel'); + popupService.showConfirm(null, message, okText, cancelText, function(ok) { + if (!ok) { + $scope.useFingerprint = { + enabled: false + }; + return; + } + saveConfig(); + }); + } else + saveConfig(); + + function saveConfig() { + $scope.usePincode = { + enabled: false + }; + var opts = { + lockapp: { + pincode: { + enabled: false, + value: '' + }, + fingerprint: { + enabled: $scope.useFingerprint.enabled + } + } + }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); + }; + }; +}); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index c2ba22363..65249208a 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, $window, configService) { +angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService) { $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPincode = $scope.newPincode = ''; @@ -35,7 +35,7 @@ angular.module('copayApp.controllers').controller('pincodeController', function( $scope.save = function() { if (!isComplete()) return; var config = configService.getSync(); - var match = config.pincode.value == $scope.currentPincode ? true : false; + var match = config.lockapp.pincode.value == $scope.currentPincode ? true : false; if (!$scope.locking) { if (match) { @@ -61,9 +61,14 @@ angular.module('copayApp.controllers').controller('pincodeController', function( function saveSettings(enabled, value) { var opts = { - pincode: { - enabled: enabled, - value: value + lockapp: { + pincode: { + enabled: enabled, + value: value + }, + fingerprint: { + enabled: false + } } }; diff --git a/src/js/routes.js b/src/js/routes.js index 46f688f0a..48ce91c04 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -451,11 +451,20 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.pincode', { + .state('tabs.lockapp', { + url: '/lockapp', + views: { + 'tab-settings@tabs': { + controller: 'lockappController', + templateUrl: 'views/lockapp.html', + } + } + }) + .state('tabs.lockapp.pincode', { url: '/pincode/:fromSettings/:locking', views: { 'tab-settings@tabs': { - controller: 'pincodeController', + controller: 'lockappController', templateUrl: 'views/pincode.html', cache: false } @@ -1224,14 +1233,12 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }); configService.whenAvailable(function(config) { startupService.ready(); - if (platformInfo.isCordova && config.pincode && config.pincode.enabled) { + if (platformInfo.isCordova && config.lockapp.pincode && config.lockapp.pincode.enabled) { $state.transitionTo('pincode').then(function() { - // Clear history $ionicHistory.clearHistory(); }); } else { $state.transitionTo('tabs.home').then(function() { - // Clear history $ionicHistory.clearHistory(); }); } diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 30522da04..b4069f092 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -53,9 +53,14 @@ angular.module('copayApp.services').factory('configService', function(storageSer } }, - pincode: { - enabled: false, - value: '', + lockapp: { + pincode: { + enabled: false, + value: '', + }, + fingerprint: { + enabled: false + } }, // External services diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 251fd9940..ee20c46e0 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -29,13 +29,14 @@ Hide Next Steps Card -
+
- - Use pin to lock/unlock the app - -
+ + Lock App + + +
diff --git a/www/views/lockapp.html b/www/views/lockapp.html new file mode 100644 index 000000000..3a2381b5c --- /dev/null +++ b/www/views/lockapp.html @@ -0,0 +1,19 @@ + + + {{'Lock App' | translate}} + + + + + + + Enable Pin Code + + +
+ + Enable Fingerprint + +
+
+
From 014995fd364f85a15dcf5c5f456b05f6d5f08fa9 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 10 Mar 2017 14:17:23 -0300 Subject: [PATCH 17/31] add dead view (wip) - fix last/current state --- src/js/controllers/deadview.js | 13 +++++++ src/js/controllers/lockapp.js | 8 +++- src/js/routes.js | 54 +++++++++++++++++++++------ src/js/services/fingerprintService.js | 5 ++- www/views/deadview.html | 14 +++++++ 5 files changed, 80 insertions(+), 14 deletions(-) create mode 100644 src/js/controllers/deadview.js create mode 100644 www/views/deadview.html diff --git a/src/js/controllers/deadview.js b/src/js/controllers/deadview.js new file mode 100644 index 000000000..41b7b6ce4 --- /dev/null +++ b/src/js/controllers/deadview.js @@ -0,0 +1,13 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('deadviewController', function($state, $scope, $ionicHistory, fingerprintService) { + + $scope.requestFingerprint = function() { + fingerprintService.check('unlockingApp', function(err) { + if (err) return; + $state.transitionTo('tabs.home').then(function() { + $ionicHistory.clearHistory(); + }); + }); + }; +}); diff --git a/src/js/controllers/lockapp.js b/src/js/controllers/lockapp.js index 02f68921c..f7ea02b2f 100644 --- a/src/js/controllers/lockapp.js +++ b/src/js/controllers/lockapp.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('lockappController', function($state, $scope, $log, configService, popupService, gettextCatalog, appConfigService) { +angular.module('copayApp.controllers').controller('lockappController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService) { $scope.$on("$ionicView.beforeEnter", function(event) { var config = configService.getSync(); @@ -34,6 +34,9 @@ angular.module('copayApp.controllers').controller('lockappController', function( $scope.useFingerprint = { enabled: false }; + $timeout(function() { + $scope.$apply(); + }); return; } saveConfig(); @@ -45,6 +48,9 @@ angular.module('copayApp.controllers').controller('lockappController', function( $scope.usePincode = { enabled: false }; + $timeout(function() { + $scope.$apply(); + }); var opts = { lockapp: { pincode: { diff --git a/src/js/routes.js b/src/js/routes.js index 48ce91c04..9f8aecbb4 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -131,6 +131,18 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr templateUrl: 'views/pincode.html', }) + /* + * + * Dead state - locked + * + */ + + .state('deadview', { + url: '/deadview/', + controller: 'deadviewController', + templateUrl: 'views/deadview.html', + }) + /* * * URI @@ -1122,7 +1134,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $location, $log, $timeout, startupService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { + .run(function($rootScope, $state, $location, $log, $timeout, startupService, fingerprintService, $ionicHistory, $ionicPlatform, $window, appConfigService, lodash, platformInfo, profileService, uxLanguage, gettextCatalog, openURLService, storageService, scannerService, configService, /* plugins START HERE => */ coinbaseService, glideraService, amazonService, bitpayCardService) { uxLanguage.init(); @@ -1185,9 +1197,22 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr $ionicPlatform.on('resume', function() { configService.whenAvailable(function(config) { - if (platformInfo.isCordova && config.pincode && config.pincode.enabled) { - $state.go('pincode'); - } + var nextView; + var lockapp = config.lockapp; + if (fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { + fingerprintService.check('unlockingApp', function(err) { + if (err) nextView = 'deadview'; + else nextView = $ionicHistory.currentStateName(); + goTo(nextView); + }); + } else if (platformInfo.isCordova && lockapp.pincode && lockapp.pincode.enabled) { + goTo('pincode'); + } else + goTo('tabs.home'); + + function goTo(nextView) { + $state.go(nextView); + }; }); }); @@ -1232,16 +1257,23 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr historyRoot: true }); configService.whenAvailable(function(config) { + var lockapp = config.lockapp; startupService.ready(); - if (platformInfo.isCordova && config.lockapp.pincode && config.lockapp.pincode.enabled) { - $state.transitionTo('pincode').then(function() { + if (fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { + fingerprintService.check('unlockingApp', function(err) { + if (err) goTo('deadview'); + else goTo('tabs.home'); + }); + } else if (platformInfo.isCordova && lockapp.pincode && lockapp.pincode.enabled) { + goTo('pincode'); + } else + goTo('tabs.home'); + + function goTo(nextView) { + $state.transitionTo(nextView).then(function() { $ionicHistory.clearHistory(); }); - } else { - $state.transitionTo('tabs.home').then(function() { - $ionicHistory.clearHistory(); - }); - } + }; }); }); } diff --git a/src/js/services/fingerprintService.js b/src/js/services/fingerprintService.js index 39e937360..86488a96a 100644 --- a/src/js/services/fingerprintService.js +++ b/src/js/services/fingerprintService.js @@ -14,7 +14,7 @@ angular.module('copayApp.services').factory('fingerprintService', function($log, function(msg) { FingerprintAuth.isAvailable(function(result) { - if (result.isAvailable) + if (result.isAvailable) _isAvailable = 'ANDROID'; }, function() { @@ -71,6 +71,7 @@ angular.module('copayApp.services').factory('fingerprintService', function($log, var isNeeded = function(client) { if (!_isAvailable) return false; + if (client === 'unlockingApp') return true; var config = configService.getSync(); config.touchIdFor = config.touchIdFor || {}; @@ -84,7 +85,7 @@ angular.module('copayApp.services').factory('fingerprintService', function($log, root.check = function(client, cb) { if (isNeeded(client)) { - $log.debug('FingerPrint Service:', _isAvailable); + $log.debug('FingerPrint Service:', _isAvailable); if (_isAvailable == 'IOS') return requestTouchId(cb); else diff --git a/www/views/deadview.html b/www/views/deadview.html new file mode 100644 index 000000000..f68ddce16 --- /dev/null +++ b/www/views/deadview.html @@ -0,0 +1,14 @@ + + + {{'App Locked' | translate}} + + + +
+ APP LOCKED +
+
+ Request Fingerprint Authentication +
+
+
From 1df951ad85352a1df4d720fe0fbb2211df6a4c8e Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 10 Mar 2017 17:04:36 -0300 Subject: [PATCH 18/31] styling dead view --- src/js/controllers/deadview.js | 6 +++- src/js/routes.js | 4 +-- src/sass/views/deadview.scss | 36 ++++++++++++++++++++ src/sass/views/views.scss | 1 + www/img/icon-fingerprint-bitpay.svg | 52 +++++++++++++++++++++++++++++ www/img/icon-fingerprint-copay.svg | 52 +++++++++++++++++++++++++++++ www/views/deadview.html | 16 +++++---- www/views/pincode.html | 2 +- 8 files changed, 159 insertions(+), 10 deletions(-) create mode 100644 src/sass/views/deadview.scss create mode 100644 www/img/icon-fingerprint-bitpay.svg create mode 100644 www/img/icon-fingerprint-copay.svg diff --git a/src/js/controllers/deadview.js b/src/js/controllers/deadview.js index 41b7b6ce4..c16faddd8 100644 --- a/src/js/controllers/deadview.js +++ b/src/js/controllers/deadview.js @@ -1,6 +1,10 @@ 'use strict'; -angular.module('copayApp.controllers').controller('deadviewController', function($state, $scope, $ionicHistory, fingerprintService) { +angular.module('copayApp.controllers').controller('deadviewController', function($state, $scope, $ionicHistory, fingerprintService, appConfigService, gettextCatalog) { + $scope.$on("$ionicView.beforeEnter", function(event) { + $scope.title = appConfigService.nameCase + ' ' + gettextCatalog.getString('is locked'); + $scope.appName = appConfigService.name; + }); $scope.requestFingerprint = function() { fingerprintService.check('unlockingApp', function(err) { diff --git a/src/js/routes.js b/src/js/routes.js index 9f8aecbb4..1c7188c00 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1199,7 +1199,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr configService.whenAvailable(function(config) { var nextView; var lockapp = config.lockapp; - if (fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { + if (platformInfo.isCordova && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { fingerprintService.check('unlockingApp', function(err) { if (err) nextView = 'deadview'; else nextView = $ionicHistory.currentStateName(); @@ -1259,7 +1259,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr configService.whenAvailable(function(config) { var lockapp = config.lockapp; startupService.ready(); - if (fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { + if (platformInfo.isCordova && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { fingerprintService.check('unlockingApp', function(err) { if (err) goTo('deadview'); else goTo('tabs.home'); diff --git a/src/sass/views/deadview.scss b/src/sass/views/deadview.scss new file mode 100644 index 000000000..06c9ee17c --- /dev/null +++ b/src/sass/views/deadview.scss @@ -0,0 +1,36 @@ +#dead-view { + @mixin img-frame { + height: 60px; + width: 60px; + box-shadow: none; + margin: auto; + } + .img-container-copay { + padding: 20%; + .big-icon-svg { + > .bg { + @include img-frame; + background-image: url("../img/icon-fingerprint-copay.svg"); + } + } + } + .img-container-bitpay { + padding: 20%; + .big-icon-svg { + > .bg { + @include img-frame; + background-image: url("../img/icon-fingerprint-bitpay.svg"); + } + } + } + .comments { + text-align: center; + .header { + font-size: 20px; + } + .text-content { + width: 90%; + margin: 5% auto; + } + } +} diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index 5516fd9ab..ac53386d8 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -47,3 +47,4 @@ @import "integrations/integrations"; @import "custom-amount"; @import "pincode"; +@import "deadview"; diff --git a/www/img/icon-fingerprint-bitpay.svg b/www/img/icon-fingerprint-bitpay.svg new file mode 100644 index 000000000..edf9f95da --- /dev/null +++ b/www/img/icon-fingerprint-bitpay.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/img/icon-fingerprint-copay.svg b/www/img/icon-fingerprint-copay.svg new file mode 100644 index 000000000..dcad0d889 --- /dev/null +++ b/www/img/icon-fingerprint-copay.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/views/deadview.html b/www/views/deadview.html index f68ddce16..4716b1292 100644 --- a/www/views/deadview.html +++ b/www/views/deadview.html @@ -1,14 +1,18 @@ - + - {{'App Locked' | translate}} + {{title}} -
- APP LOCKED +
+
-
- Request Fingerprint Authentication +
+
+
+
+
One-touch Sign In
+
Please place your fingertip on the scanner to verify your identity
diff --git a/www/views/pincode.html b/www/views/pincode.html index 9e653e5eb..fe98700b2 100644 --- a/www/views/pincode.html +++ b/www/views/pincode.html @@ -8,7 +8,7 @@
Confirm your mobile unlock code
-
+
From 775b16e0fdd3a5e4e3123493318db24eee54f8ee Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 10 Mar 2017 17:19:32 -0300 Subject: [PATCH 19/31] clean services --- src/js/controllers/advancedSettings.js | 19 ++++++++++++++++++- www/views/advancedSettings.html | 4 ++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 8af32de96..059f00cb0 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -15,7 +15,7 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', value: config.hideNextSteps.enabled }; $scope.usePincode = { - enabled: config.pincode ? config.pincode.enabled : false + value: config.pincode ? config.pincode.enabled : false }; }; @@ -41,6 +41,23 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; + $scope.savePincodeChanges = function(val) { + if (!val || val.length < 4) { + $scope.usePincode = { + value: false + } + return; + } + var opts = { + usePincode: { + enabled: $scope.usePincode.enabled + }, + }; + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); + }; + $scope.recentTransactionsChange = function() { var opts = { recentTransactions: { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index ee20c46e0..ac92e9be0 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -29,14 +29,14 @@ Hide Next Steps Card - +
From dccd14310f6246a18ea80932b3387c0466ea0daa Mon Sep 17 00:00:00 2001 From: JDonadio Date: Mon, 13 Mar 2017 09:56:06 -0300 Subject: [PATCH 20/31] add scan button --- www/views/deadview.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/www/views/deadview.html b/www/views/deadview.html index 4716b1292..a38d5fad4 100644 --- a/www/views/deadview.html +++ b/www/views/deadview.html @@ -14,5 +14,8 @@
One-touch Sign In
Please place your fingertip on the scanner to verify your identity
+ From 47729129c9c9964fff61bb9d10c9d6198ccb15d6 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Fri, 17 Mar 2017 15:52:34 -0300 Subject: [PATCH 21/31] ref styling --- src/js/controllers/pincode.js | 24 ++++++++++++++------- src/sass/views/pincode.scss | 40 ++++++++++++++++++++++------------- www/views/pincode.html | 19 ++++++++++------- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js index 65249208a..74efd43ee 100644 --- a/src/js/controllers/pincode.js +++ b/src/js/controllers/pincode.js @@ -1,13 +1,19 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService) { +angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPincode = $scope.newPincode = ''; $scope.fromSettings = $stateParams.fromSettings == 'true' ? true : false; $scope.locking = $stateParams.locking == 'true' ? true : false; + $scope.match = false; + $scope.appName = appConfigService.name; }); + $scope.getFilledClass = function(limit) { + return $scope.currentPincode.length >= limit ? 'filled-' + $scope.appName : null; + }; + $scope.delete = function() { if ($scope.currentPincode.length > 0) { $scope.currentPincode = $scope.currentPincode.substring(0, $scope.currentPincode.length - 1); @@ -15,30 +21,32 @@ angular.module('copayApp.controllers').controller('pincodeController', function( } }; - function isComplete() { + $scope.isComplete = function() { if ($scope.currentPincode.length < 4) return false; else return true; }; $scope.updatePinCode = function(value) { - if (value && !isComplete()) { + if (value && !$scope.isComplete()) { $scope.currentPincode = $scope.currentPincode + value; } $timeout(function() { $scope.$apply(); }); - if (!$scope.locking && isComplete()) { + if (!$scope.locking && $scope.isComplete()) { $scope.save(); } }; $scope.save = function() { - if (!isComplete()) return; + if (!$scope.isComplete()) return; var config = configService.getSync(); - var match = config.lockapp.pincode.value == $scope.currentPincode ? true : false; - + $scope.match = config.lockapp.pincode.value == $scope.currentPincode ? true : false; + $timeout(function() { + $scope.$apply(); + }); if (!$scope.locking) { - if (match) { + if ($scope.match) { $scope.fromSettings ? saveSettings($scope.locking, '') : $scope.close(150); } } else { diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index 272591c21..f81621c3f 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -34,11 +34,8 @@ } } .block-code { - width: 120px; + width: 50%; margin: auto; - .row { - height: 35px; - } } .block-buttons { .col { @@ -47,19 +44,32 @@ cursor: pointer; position: absolute; bottom: 3%; - left: 0; - width: 100%; + left: 5%; + width: 90%; } } - .circle { - border: 1px solid #666666; - border-radius: 50%; - opacity: 0.6; - box-shadow: 0 0 1px 0px rgb( 255, 255, 255); - margin: 2px; - transition: background-color .2s ease-in-out; + @mixin circle { + border-radius: 50%; + box-shadow: 0 0 1px 0px rgb( 255, 255, 255); + transition: background-color .2s ease-in-out; + padding: 7%; + margin: 5%; } - .filled { - background-color: #666666; + .circle-copay { + @include circle; + border: 1px solid $v-accent-color; + } + .circle-bitpay { + @include circle; + border: 1px solid $v-primary-color; + } + .filled-copay { + background-color: $v-accent-color; + } + .filled-bitpay { + background-color: $v-primary-color; + } + .error { + color: #f13333; } } diff --git a/www/views/pincode.html b/www/views/pincode.html index fe98700b2..b6914478f 100644 --- a/www/views/pincode.html +++ b/www/views/pincode.html @@ -4,8 +4,11 @@
-
Please enter your mobile unlock code
-
Confirm your mobile unlock code
+
+ Please enter your mobile unlock code + Confirm your mobile unlock code + Incorrect code, try again. +
@@ -13,10 +16,10 @@
-
-
-
-
+
+
+
+
@@ -60,8 +63,8 @@
0
-
-
+
+
From 9049c3148d819e01ee656bf2ff602ce8ae23deff Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 23 Mar 2017 11:07:47 -0300 Subject: [PATCH 22/31] improve responsiveness --- src/sass/views/deadview.scss | 6 ++++++ src/sass/views/pincode.scss | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/sass/views/deadview.scss b/src/sass/views/deadview.scss index 06c9ee17c..7fdc3d318 100644 --- a/src/sass/views/deadview.scss +++ b/src/sass/views/deadview.scss @@ -7,6 +7,9 @@ } .img-container-copay { padding: 20%; + @media(min-width: 480px) { + max-height: 150px; + } .big-icon-svg { > .bg { @include img-frame; @@ -16,6 +19,9 @@ } .img-container-bitpay { padding: 20%; + @media(min-width: 480px) { + max-height: 150px; + } .big-icon-svg { > .bg { @include img-frame; diff --git a/src/sass/views/pincode.scss b/src/sass/views/pincode.scss index f81621c3f..6974c2360 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pincode.scss @@ -32,25 +32,42 @@ width: 60%; margin: 10% auto; } + @media(min-width: 480px) { + span { + font-size: 30px; + width: 90%; + } + } } .block-code { width: 50%; margin: auto; + @media(min-width: 480px) { + width: 25%; + } } .block-buttons { .col { padding: 5%; } + color: $v-dark-gray; + font-size: 1.7rem; + font-family: $v-font-family-light; cursor: pointer; position: absolute; bottom: 3%; left: 5%; width: 90%; + @media(min-width: 480px) { + left: 15%; + width: 70%; + max-height: 55%; + } } } @mixin circle { border-radius: 50%; - box-shadow: 0 0 1px 0px rgb( 255, 255, 255); + box-shadow: 0 0 3px 0px #5b5b5b; transition: background-color .2s ease-in-out; padding: 7%; margin: 5%; @@ -67,7 +84,7 @@ background-color: $v-accent-color; } .filled-bitpay { - background-color: $v-primary-color; + background-color: #1f3598; } .error { color: #f13333; From 07be82f9d094d6081dfd795cca32c4f63207544b Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 29 Mar 2017 09:25:18 -0300 Subject: [PATCH 23/31] enable devel mode --- src/js/controllers/advancedSettings.js | 1 + src/js/controllers/lockapp.js | 3 +-- src/js/routes.js | 4 ++-- www/views/advancedSettings.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 059f00cb0..9c616dbc8 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -71,6 +71,7 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isCordova = platformInfo.isCordova; + $scope.isDevel = platformInfo.isDevel; updateConfig(); }); diff --git a/src/js/controllers/lockapp.js b/src/js/controllers/lockapp.js index f7ea02b2f..95b1c0727 100644 --- a/src/js/controllers/lockapp.js +++ b/src/js/controllers/lockapp.js @@ -4,8 +4,7 @@ angular.module('copayApp.controllers').controller('lockappController', function( $scope.$on("$ionicView.beforeEnter", function(event) { var config = configService.getSync(); - $scope.fingerprintAvailable = true; - // $scope.fingerprintAvailable = fingerprintService.isAvailable(); + $scope.fingerprintAvailable = fingerprintService.isAvailable(); $scope.usePincode = { enabled: config.lockapp ? config.lockapp.pincode.enabled : false diff --git a/src/js/routes.js b/src/js/routes.js index 1c7188c00..d0953da02 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1259,12 +1259,12 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr configService.whenAvailable(function(config) { var lockapp = config.lockapp; startupService.ready(); - if (platformInfo.isCordova && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { + if ((platformInfo.isCordova || platformInfo.isDevel) && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { fingerprintService.check('unlockingApp', function(err) { if (err) goTo('deadview'); else goTo('tabs.home'); }); - } else if (platformInfo.isCordova && lockapp.pincode && lockapp.pincode.enabled) { + } else if ((platformInfo.isCordova || platformInfo.isDevel) && lockapp.pincode && lockapp.pincode.enabled) { goTo('pincode'); } else goTo('tabs.home'); diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index ac92e9be0..b129f1d01 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -29,7 +29,7 @@ Hide Next Steps Card -
+
From 5c2b067c8714a643597413a741b17a5cdea9905d Mon Sep 17 00:00:00 2001 From: JDonadio Date: Wed, 29 Mar 2017 11:30:16 -0300 Subject: [PATCH 24/31] refactor --- src/js/controllers/advancedSettings.js | 20 ---- src/js/controllers/{lockapp.js => lock.js} | 29 ++--- .../{deadview.js => lockedView.js} | 2 +- src/js/controllers/pin.js | 98 ++++++++++++++++ src/js/controllers/pincode.js | 94 --------------- src/js/routes.js | 110 +++++++++--------- src/js/services/configService.js | 11 +- .../views/{deadview.scss => lockedView.scss} | 2 +- src/sass/views/{pincode.scss => pin.scss} | 2 +- src/sass/views/views.scss | 4 +- www/views/advancedSettings.html | 2 +- www/views/{lockapp.html => lock.html} | 4 +- www/views/{deadview.html => lockedView.html} | 2 +- www/views/{pincode.html => pin.html} | 32 +++-- 14 files changed, 195 insertions(+), 217 deletions(-) rename src/js/controllers/{lockapp.js => lock.js} (62%) rename src/js/controllers/{deadview.js => lockedView.js} (73%) create mode 100644 src/js/controllers/pin.js delete mode 100644 src/js/controllers/pincode.js rename src/sass/views/{deadview.scss => lockedView.scss} (98%) rename src/sass/views/{pincode.scss => pin.scss} (99%) rename www/views/{lockapp.html => lock.html} (74%) rename www/views/{deadview.html => lockedView.html} (96%) rename www/views/{pincode.html => pin.html} (58%) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 9c616dbc8..1617ef9fe 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -14,9 +14,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', $scope.hideNextSteps = { value: config.hideNextSteps.enabled }; - $scope.usePincode = { - value: config.pincode ? config.pincode.enabled : false - }; }; $scope.spendUnconfirmedChange = function() { @@ -41,23 +38,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }); }; - $scope.savePincodeChanges = function(val) { - if (!val || val.length < 4) { - $scope.usePincode = { - value: false - } - return; - } - var opts = { - usePincode: { - enabled: $scope.usePincode.enabled - }, - }; - configService.set(opts, function(err) { - if (err) $log.debug(err); - }); - }; - $scope.recentTransactionsChange = function() { var opts = { recentTransactions: { diff --git a/src/js/controllers/lockapp.js b/src/js/controllers/lock.js similarity index 62% rename from src/js/controllers/lockapp.js rename to src/js/controllers/lock.js index 95b1c0727..2073ac76e 100644 --- a/src/js/controllers/lockapp.js +++ b/src/js/controllers/lock.js @@ -1,28 +1,28 @@ 'use strict'; -angular.module('copayApp.controllers').controller('lockappController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService) { +angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService) { $scope.$on("$ionicView.beforeEnter", function(event) { var config = configService.getSync(); $scope.fingerprintAvailable = fingerprintService.isAvailable(); - $scope.usePincode = { - enabled: config.lockapp ? config.lockapp.pincode.enabled : false + $scope.usePin = { + enabled: config.lock && config.lock.method == 'pin' ? true : false }; $scope.useFingerprint = { - enabled: config.lockapp ? config.lockapp.fingerprint.enabled : false + enabled: config.lock && config.lock.method == 'fingerprint' ? true : false }; }); - $scope.usePincodeChange = function() { - $state.go('tabs.lockapp.pincode', { + $scope.usePinChange = function() { + $state.go('tabs.lock.pin', { fromSettings: true, - locking: $scope.usePincode.enabled + locking: $scope.usePin.enabled }); }; $scope.useFingerprintChange = function() { - if ($scope.usePincode.enabled) { + if ($scope.usePin.enabled) { var message = gettextCatalog.getString('{{appName}} is protected by Pin Code. Are you sure you want to disable it?', { appName: appConfigService.nameCase }); @@ -44,21 +44,16 @@ angular.module('copayApp.controllers').controller('lockappController', function( saveConfig(); function saveConfig() { - $scope.usePincode = { + $scope.usePin = { enabled: false }; $timeout(function() { $scope.$apply(); }); var opts = { - lockapp: { - pincode: { - enabled: false, - value: '' - }, - fingerprint: { - enabled: $scope.useFingerprint.enabled - } + lock: { + method: $scope.useFingerprint.enabled ? 'fingerprint' : '', + value: '', } }; diff --git a/src/js/controllers/deadview.js b/src/js/controllers/lockedView.js similarity index 73% rename from src/js/controllers/deadview.js rename to src/js/controllers/lockedView.js index c16faddd8..0842c5cf6 100644 --- a/src/js/controllers/deadview.js +++ b/src/js/controllers/lockedView.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('deadviewController', function($state, $scope, $ionicHistory, fingerprintService, appConfigService, gettextCatalog) { +angular.module('copayApp.controllers').controller('lockedViewController', function($state, $scope, $ionicHistory, fingerprintService, appConfigService, gettextCatalog) { $scope.$on("$ionicView.beforeEnter", function(event) { $scope.title = appConfigService.nameCase + ' ' + gettextCatalog.getString('is locked'); $scope.appName = appConfigService.name; diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js new file mode 100644 index 000000000..411683e3e --- /dev/null +++ b/src/js/controllers/pin.js @@ -0,0 +1,98 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('pinController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { + var PIN = 'pin'; + + $scope.$on("$ionicView.beforeEnter", function(event) { + $scope.currentPin = $scope.confirmPin = ''; + $scope.fromSettings = $stateParams.fromSettings == 'true' ? true : false; + $scope.locking = $stateParams.locking == 'true' ? true : false; + $scope.match = false; + $scope.error = false; + $scope.appName = appConfigService.name; + }); + + $scope.getFilledClass = function(limit) { + return $scope.currentPin.length >= limit ? 'filled-' + $scope.appName : null; + }; + + $scope.delete = function() { + if ($scope.currentPin.length > 0) { + $scope.currentPin = $scope.currentPin.substring(0, $scope.currentPin.length - 1); + $scope.error = false; + $scope.updatePin(); + } + }; + + $scope.isComplete = function() { + if ($scope.currentPin.length < 4) return false; + else return true; + }; + + $scope.updatePin = function(value) { + $scope.error = false; + if (value && !$scope.isComplete()) { + $scope.currentPin = $scope.currentPin + value; + $timeout(function() { + $scope.$apply(); + }); + } + $scope.save(); + }; + + $scope.save = function() { + if (!$scope.isComplete()) return; + var config = configService.getSync(); + $scope.match = config.lock && config.lock.method == PIN && config.lock.value == $scope.currentPin ? true : false; + if (!$scope.locking) { + if ($scope.match) { + $scope.fromSettings ? saveSettings() : $scope.close(150); + $scope.error = false; + } else { + $scope.confirmPin = $scope.currentPin = ''; + $scope.error = true; + } + } else { + processCodes(); + } + }; + + function processCodes() { + if (!$scope.confirmPin) { + $scope.confirmPin = $scope.currentPin; + $timeout(function() { + $scope.currentPin = ''; + }, 200); + } else { + if ($scope.confirmPin == $scope.currentPin) + saveSettings(PIN, $scope.confirmPin); + else { + $scope.confirmPin = $scope.currentPin = ''; + $scope.error = true; + } + } + $timeout(function() { + $scope.$apply(); + }); + }; + + function saveSettings(method, value) { + var opts = { + lock: { + method: method || '', + value: value || '', + } + }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + $scope.close(); + }); + }; + + $scope.close = function(delay) { + $timeout(function() { + $ionicHistory.viewHistory().backView ? $ionicHistory.goBack() : $state.go('tabs.home'); + }, delay || 1); + }; +}); diff --git a/src/js/controllers/pincode.js b/src/js/controllers/pincode.js deleted file mode 100644 index 74efd43ee..000000000 --- a/src/js/controllers/pincode.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict'; - -angular.module('copayApp.controllers').controller('pincodeController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { - - $scope.$on("$ionicView.beforeEnter", function(event) { - $scope.currentPincode = $scope.newPincode = ''; - $scope.fromSettings = $stateParams.fromSettings == 'true' ? true : false; - $scope.locking = $stateParams.locking == 'true' ? true : false; - $scope.match = false; - $scope.appName = appConfigService.name; - }); - - $scope.getFilledClass = function(limit) { - return $scope.currentPincode.length >= limit ? 'filled-' + $scope.appName : null; - }; - - $scope.delete = function() { - if ($scope.currentPincode.length > 0) { - $scope.currentPincode = $scope.currentPincode.substring(0, $scope.currentPincode.length - 1); - $scope.updatePinCode(); - } - }; - - $scope.isComplete = function() { - if ($scope.currentPincode.length < 4) return false; - else return true; - }; - - $scope.updatePinCode = function(value) { - if (value && !$scope.isComplete()) { - $scope.currentPincode = $scope.currentPincode + value; - } - $timeout(function() { - $scope.$apply(); - }); - if (!$scope.locking && $scope.isComplete()) { - $scope.save(); - } - }; - - $scope.save = function() { - if (!$scope.isComplete()) return; - var config = configService.getSync(); - $scope.match = config.lockapp.pincode.value == $scope.currentPincode ? true : false; - $timeout(function() { - $scope.$apply(); - }); - if (!$scope.locking) { - if ($scope.match) { - $scope.fromSettings ? saveSettings($scope.locking, '') : $scope.close(150); - } - } else { - checkCodes(); - } - }; - - function checkCodes() { - if (!$scope.newPincode) { - $scope.newPincode = $scope.currentPincode; - $scope.currentPincode = ''; - $timeout(function() { - $scope.$apply(); - }); - } else { - if ($scope.newPincode == $scope.currentPincode) - saveSettings($scope.locking, $scope.newPincode); - } - }; - - function saveSettings(enabled, value) { - var opts = { - lockapp: { - pincode: { - enabled: enabled, - value: value - }, - fingerprint: { - enabled: false - } - } - }; - - configService.set(opts, function(err) { - if (err) $log.debug(err); - $scope.close(); - }); - }; - - $scope.close = function(delay) { - $timeout(function() { - $ionicHistory.viewHistory().backView ? $ionicHistory.goBack() : $state.go('tabs.home'); - }, delay || 1); - }; -}); diff --git a/src/js/routes.js b/src/js/routes.js index d0953da02..6b6f4625d 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -121,26 +121,26 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr /* * - * Pin code + * Pin * */ - .state('pincode', { - url: '/pincode/', - controller: 'pincodeController', - templateUrl: 'views/pincode.html', + .state('pin', { + url: '/pin/', + controller: 'pinController', + templateUrl: 'views/pin.html', }) /* * - * Dead state - locked + * Locked * */ - .state('deadview', { - url: '/deadview/', - controller: 'deadviewController', - templateUrl: 'views/deadview.html', + .state('lockedView', { + url: '/lockedView/', + controller: 'lockedViewController', + templateUrl: 'views/lockedView.html', }) /* @@ -463,21 +463,21 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('tabs.lockapp', { - url: '/lockapp', + .state('tabs.lock', { + url: '/lock', views: { 'tab-settings@tabs': { - controller: 'lockappController', - templateUrl: 'views/lockapp.html', + controller: 'lockController', + templateUrl: 'views/lock.html', } } }) - .state('tabs.lockapp.pincode', { - url: '/pincode/:fromSettings/:locking', + .state('tabs.lock.pin', { + url: '/pin/:fromSettings/:locking', views: { 'tab-settings@tabs': { - controller: 'lockappController', - templateUrl: 'views/pincode.html', + controller: 'pinController', + templateUrl: 'views/pin.html', cache: false } } @@ -1196,24 +1196,28 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }); $ionicPlatform.on('resume', function() { - configService.whenAvailable(function(config) { - var nextView; - var lockapp = config.lockapp; - if (platformInfo.isCordova && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { - fingerprintService.check('unlockingApp', function(err) { - if (err) nextView = 'deadview'; - else nextView = $ionicHistory.currentStateName(); - goTo(nextView); - }); - } else if (platformInfo.isCordova && lockapp.pincode && lockapp.pincode.enabled) { - goTo('pincode'); - } else - goTo('tabs.home'); + if (platformInfo.isCordova || platformInfo.isDevel) { + configService.whenAvailable(function(config) { + var nextView; + var lock = config.lock; + if (lock && lock.method == 'fingerprint' && fingerprintService.isAvailable()) { + fingerprintService.check('unlockingApp', function(err) { + if (err) nextView = 'lockedView'; + else if ($ionicHistory.currentStateName() == 'lockedView') nextView = 'tabs.home'; + else nextView = $ionicHistory.currentStateName(); + goTo(nextView); + }); + } else if (lock && lock.method == 'pin') { + goTo('pin'); + } - function goTo(nextView) { - $state.go(nextView); - }; - }); + function goTo(nextView) { + $state.transitionTo(nextView).then(function() { + if (nextView == 'lockedView') $ionicHistory.clearHistory(); + }); + }; + }); + } }); $ionicPlatform.on('menubutton', function() { @@ -1256,25 +1260,27 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr disableAnimate: true, historyRoot: true }); - configService.whenAvailable(function(config) { - var lockapp = config.lockapp; + if (platformInfo.isCordova || platformInfo.isDevel) { startupService.ready(); - if ((platformInfo.isCordova || platformInfo.isDevel) && fingerprintService.isAvailable() && lockapp.fingerprint && lockapp.fingerprint.enabled) { - fingerprintService.check('unlockingApp', function(err) { - if (err) goTo('deadview'); - else goTo('tabs.home'); - }); - } else if ((platformInfo.isCordova || platformInfo.isDevel) && lockapp.pincode && lockapp.pincode.enabled) { - goTo('pincode'); - } else - goTo('tabs.home'); + configService.whenAvailable(function(config) { + var lock = config.lock; + if (fingerprintService.isAvailable() && lock && lock.method == 'fingerprint') { + fingerprintService.check('unlockingApp', function(err) { + if (err) goTo('lockedView'); + else goTo('tabs.home'); + }); + } else if (lock && lock.method == 'pin') { + goTo('pin'); + } else + goTo('tabs.home'); - function goTo(nextView) { - $state.transitionTo(nextView).then(function() { - $ionicHistory.clearHistory(); - }); - }; - }); + function goTo(nextView) { + $state.transitionTo(nextView).then(function() { + $ionicHistory.clearHistory(); + }); + }; + }); + } }); } diff --git a/src/js/services/configService.js b/src/js/services/configService.js index b4069f092..b60e1cb13 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -53,14 +53,9 @@ angular.module('copayApp.services').factory('configService', function(storageSer } }, - lockapp: { - pincode: { - enabled: false, - value: '', - }, - fingerprint: { - enabled: false - } + lock: { + method: '', + value: '', }, // External services diff --git a/src/sass/views/deadview.scss b/src/sass/views/lockedView.scss similarity index 98% rename from src/sass/views/deadview.scss rename to src/sass/views/lockedView.scss index 7fdc3d318..23fed7a83 100644 --- a/src/sass/views/deadview.scss +++ b/src/sass/views/lockedView.scss @@ -1,4 +1,4 @@ -#dead-view { +#locked-view { @mixin img-frame { height: 60px; width: 60px; diff --git a/src/sass/views/pincode.scss b/src/sass/views/pin.scss similarity index 99% rename from src/sass/views/pincode.scss rename to src/sass/views/pin.scss index 6974c2360..6f3733230 100644 --- a/src/sass/views/pincode.scss +++ b/src/sass/views/pin.scss @@ -1,4 +1,4 @@ -#pin-code { +#pin { background-color: #FAFAFA; .bar.bar-clear { background-color: transparent; diff --git a/src/sass/views/views.scss b/src/sass/views/views.scss index ac53386d8..bd8520c01 100644 --- a/src/sass/views/views.scss +++ b/src/sass/views/views.scss @@ -46,5 +46,5 @@ @import "includes/accountSelector"; @import "integrations/integrations"; @import "custom-amount"; -@import "pincode"; -@import "deadview"; +@import "pin"; +@import "lockedView"; diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index b129f1d01..74cf47341 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -32,7 +32,7 @@
-
+ Lock App diff --git a/www/views/lockapp.html b/www/views/lock.html similarity index 74% rename from www/views/lockapp.html rename to www/views/lock.html index 3a2381b5c..fd416ddb5 100644 --- a/www/views/lockapp.html +++ b/www/views/lock.html @@ -6,8 +6,8 @@ - - Enable Pin Code + + Enable Pin
diff --git a/www/views/deadview.html b/www/views/lockedView.html similarity index 96% rename from www/views/deadview.html rename to www/views/lockedView.html index a38d5fad4..98ca5a986 100644 --- a/www/views/deadview.html +++ b/www/views/lockedView.html @@ -1,4 +1,4 @@ - + {{title}} diff --git a/www/views/pincode.html b/www/views/pin.html similarity index 58% rename from www/views/pincode.html rename to www/views/pin.html index b6914478f..f1c4f6fa0 100644 --- a/www/views/pincode.html +++ b/www/views/pin.html @@ -1,13 +1,13 @@ - +
- Please enter your mobile unlock code - Confirm your mobile unlock code - Incorrect code, try again. + Please enter your mobile unlock code + Confirm your mobile unlock code + Incorrect code, try again.
@@ -24,43 +24,41 @@
-
+
1
-
+
2
-
+
3
-
+
4
-
+
5
-
+
6
-
+
7
-
+
8
-
+
9
-
-
-
-
+
+
0
From c29af5f658ad457e429d5acda62415487f4e22e2 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 30 Mar 2017 11:31:23 -0300 Subject: [PATCH 25/31] attempts limit - remaining time --- src/js/controllers/pin.js | 97 +++++++++++++++++++++++++++++--- src/js/services/configService.js | 2 + src/sass/views/pin.scss | 5 +- www/views/pin.html | 9 ++- 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js index 411683e3e..9d78b9e65 100644 --- a/src/js/controllers/pin.js +++ b/src/js/controllers/pin.js @@ -1,22 +1,93 @@ 'use strict'; -angular.module('copayApp.controllers').controller('pinController', function($state, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { +angular.module('copayApp.controllers').controller('pinController', function($state, $interval, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { var PIN = 'pin'; + var ATTEPMPTS_LIMIT = 3; $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPin = $scope.confirmPin = ''; $scope.fromSettings = $stateParams.fromSettings == 'true' ? true : false; $scope.locking = $stateParams.locking == 'true' ? true : false; - $scope.match = false; - $scope.error = false; + $scope.match = $scope.error = $scope.disableButtons = false; + $scope.currentAttempts = 0; $scope.appName = appConfigService.name; }); + $scope.$on("$ionicView.enter", function(event) { + configService.whenAvailable(function(config) { + $scope.bannedUntil = config.lock.bannedUntil || null; + if ($scope.bannedUntil) { + var now = Math.floor(Date.now() / 1000); + if (now < $scope.bannedUntil) { + $scope.error = $scope.disableButtons = true; + lockTimeControl($scope.bannedUntil); + } + } + }); + }); + + function checkAttempts() { + $scope.currentAttempts += 1; + $log.debug('Attempts to unlock:', $scope.currentAttempts); + if ($scope.currentAttempts === 3) { + $scope.currentAttempts = 0; + var limitTime = Math.floor(Date.now() / 1000) + 5 * 60; + var config = configService.getSync(); + var opts = { + lock: { + method: PIN, + value: config.lock.value, + bannedUntil: limitTime, + attempts: config.lock.attempts + 1, + } + }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + lockTimeControl(limitTime); + }); + } + }; + + function lockTimeControl(limitTime) { + $scope.limitTimeExpired = false; + setExpirationTime(); + + var countDown = $interval(function() { + setExpirationTime(); + }, 1000); + + function setExpirationTime() { + var now = Math.floor(Date.now() / 1000); + if (now > limitTime) { + $scope.limitTimeExpired = true; + if (countDown) reset(); + } else { + $scope.disableButtons = true; + var totalSecs = limitTime - now; + var m = Math.floor(totalSecs / 60); + var s = totalSecs % 60; + $scope.expires = ('0' + m).slice(-2) + ":" + ('0' + s).slice(-2); + } + }; + + function reset() { + $scope.expires = $scope.error = $scope.disableButtons = null; + $scope.currentPin = $scope.confirmPin = ''; + $interval.cancel(countDown); + $timeout(function() { + $scope.$apply(); + }); + return; + }; + }; + $scope.getFilledClass = function(limit) { return $scope.currentPin.length >= limit ? 'filled-' + $scope.appName : null; }; $scope.delete = function() { + if ($scope.disableButtons) return; if ($scope.currentPin.length > 0) { $scope.currentPin = $scope.currentPin.substring(0, $scope.currentPin.length - 1); $scope.error = false; @@ -30,6 +101,7 @@ angular.module('copayApp.controllers').controller('pinController', function($sta }; $scope.updatePin = function(value) { + if ($scope.disableButtons) return; $scope.error = false; if (value && !$scope.isComplete()) { $scope.currentPin = $scope.currentPin + value; @@ -46,11 +118,17 @@ angular.module('copayApp.controllers').controller('pinController', function($sta $scope.match = config.lock && config.lock.method == PIN && config.lock.value == $scope.currentPin ? true : false; if (!$scope.locking) { if ($scope.match) { - $scope.fromSettings ? saveSettings() : $scope.close(150); - $scope.error = false; + if ($scope.fromSettings) saveSettings(); + else { + saveSettings(PIN, $scope.currentPin); + $scope.error = false; + } } else { - $scope.confirmPin = $scope.currentPin = ''; - $scope.error = true; + $timeout(function() { + $scope.confirmPin = $scope.currentPin = ''; + $scope.error = true; + }, 200); + checkAttempts(); } } else { processCodes(); @@ -59,8 +137,8 @@ angular.module('copayApp.controllers').controller('pinController', function($sta function processCodes() { if (!$scope.confirmPin) { - $scope.confirmPin = $scope.currentPin; $timeout(function() { + $scope.confirmPin = $scope.currentPin; $scope.currentPin = ''; }, 200); } else { @@ -77,10 +155,13 @@ angular.module('copayApp.controllers').controller('pinController', function($sta }; function saveSettings(method, value) { + var config = configService.getSync(); var opts = { lock: { method: method || '', value: value || '', + bannedUntil: null, + attempts: config.lock.attempts + 1, } }; diff --git a/src/js/services/configService.js b/src/js/services/configService.js index b60e1cb13..3d979af7f 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -56,6 +56,8 @@ angular.module('copayApp.services').factory('configService', function(storageSer lock: { method: '', value: '', + bannedUntil: null, + attempts: null, }, // External services diff --git a/src/sass/views/pin.scss b/src/sass/views/pin.scss index 6f3733230..3d695f185 100644 --- a/src/sass/views/pin.scss +++ b/src/sass/views/pin.scss @@ -25,9 +25,11 @@ .block-text { align-items: center; background-color: #F1F1F1; - text-align: center; height: 30%; border-bottom: 1px solid #c5c5c5; + .message { + margin: auto; + } span { width: 60%; margin: 10% auto; @@ -88,5 +90,6 @@ } .error { color: #f13333; + max-width: 70%; } } diff --git a/www/views/pin.html b/www/views/pin.html index f1c4f6fa0..613bd3a66 100644 --- a/www/views/pin.html +++ b/www/views/pin.html @@ -5,9 +5,12 @@
- Please enter your mobile unlock code - Confirm your mobile unlock code - Incorrect code, try again. +
Please enter your unlock PIN
+
Confirm your unlock PIN
+
+
Incorrect PIN, try again.
+ +
From 25a5e44b216fb9466098d72f912843c6a02990f2 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Thu, 30 Mar 2017 12:38:23 -0300 Subject: [PATCH 26/31] move to tab-settings --- src/js/controllers/advancedSettings.js | 4 +--- src/js/controllers/tab-settings.js | 5 +++++ www/views/advancedSettings.html | 9 --------- www/views/tab-settings.html | 10 ++++++++++ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/js/controllers/advancedSettings.js b/src/js/controllers/advancedSettings.js index 1617ef9fe..5b213b053 100644 --- a/src/js/controllers/advancedSettings.js +++ b/src/js/controllers/advancedSettings.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService, platformInfo) { +angular.module('copayApp.controllers').controller('advancedSettingsController', function($scope, $log, configService) { var updateConfig = function() { var config = configService.getSync(); @@ -50,8 +50,6 @@ angular.module('copayApp.controllers').controller('advancedSettingsController', }; $scope.$on("$ionicView.beforeEnter", function(event, data) { - $scope.isCordova = platformInfo.isCordova; - $scope.isDevel = platformInfo.isDevel; updateConfig(); }); diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index ca350bc51..00a58359b 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -51,7 +51,12 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct $scope.$on("$ionicView.beforeEnter", function(event, data) { $scope.isCordova = platformInfo.isCordova; + $scope.isDevel = platformInfo.isDevel; $scope.appName = appConfigService.nameCase; + configService.whenAvailable(function(config) { + $scope.locked = config.lock.method == 'fingerprint' || config.lock.value || false; + $scope.method = config.lock.method != '' ? config.lock.method.charAt(0).toUpperCase() + config.lock.method.slice(1) : gettextCatalog.getString('Disabled'); + }); }); $scope.$on("$ionicView.enter", function(event, data) { diff --git a/www/views/advancedSettings.html b/www/views/advancedSettings.html index 74cf47341..7181505f8 100644 --- a/www/views/advancedSettings.html +++ b/www/views/advancedSettings.html @@ -28,15 +28,6 @@ Hide Next Steps Card - -
diff --git a/www/views/tab-settings.html b/www/views/tab-settings.html index b12ab2b5d..e0bbe0e0e 100644 --- a/www/views/tab-settings.html +++ b/www/views/tab-settings.html @@ -89,6 +89,16 @@ + + + + {{'Lock App' | translate}} + + {{method}} + + + +
{{'Wallets & Integrations' | translate}}
Date: Thu, 30 Mar 2017 17:45:57 -0300 Subject: [PATCH 27/31] backup control --- src/js/controllers/lock.js | 35 ++++++++++++++++++++++++++++++----- www/views/lock.html | 12 ++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lock.js index 2073ac76e..4046fd8f3 100644 --- a/src/js/controllers/lock.js +++ b/src/js/controllers/lock.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService) { +angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService, profileService, lodash) { $scope.$on("$ionicView.beforeEnter", function(event) { var config = configService.getSync(); @@ -12,21 +12,46 @@ angular.module('copayApp.controllers').controller('lockController', function($st $scope.useFingerprint = { enabled: config.lock && config.lock.method == 'fingerprint' ? true : false }; + + processWallets(); }); + function processWallets() { + var wallets = profileService.getWallets(); + var singleLivenetWallet = wallets.length == 1 && wallets[0].network == 'livenet' && wallets[0].needsBackup; + var atLeastOneLivenetWallet = lodash.any(wallets, function(w) { + return w.network == 'livenet' && w.needsBackup; + }); + + if (singleLivenetWallet) { + $scope.errorMsg = gettextCatalog.getString('Backup your wallet before using this function'); + } else if (atLeastOneLivenetWallet) { + $scope.errorMsg = gettextCatalog.getString('Backup all livenet wallets before using this function'); + } else $scope.errorMsg = null; + + $timeout(function() { + $scope.$apply(); + }); + }; + $scope.usePinChange = function() { - $state.go('tabs.lock.pin', { + $scope.usePin.enabled = !$scope.usePin.enabled; + $state.transitionTo('tabs.lock.pin', { fromSettings: true, - locking: $scope.usePin.enabled + locking: !$scope.usePin.enabled + }).then(function() { + $timeout(function() { + $scope.usePin.enabled = !$scope.usePin.enabled; + }, 1000); }); }; $scope.useFingerprintChange = function() { if ($scope.usePin.enabled) { - var message = gettextCatalog.getString('{{appName}} is protected by Pin Code. Are you sure you want to disable it?', { + var message = gettextCatalog.getString('{{appName}} is protected by Pin. Are you sure you want to disable it?', { appName: appConfigService.nameCase }); - var okText = gettextCatalog.getString('Yes'); + var okText = gettextCatalog.getString('Continue'); var cancelText = gettextCatalog.getString('Cancel'); popupService.showConfirm(null, message, okText, cancelText, function(ok) { if (!ok) { diff --git a/www/views/lock.html b/www/views/lock.html index fd416ddb5..344889926 100644 --- a/www/views/lock.html +++ b/www/views/lock.html @@ -6,14 +6,18 @@ - - Enable Pin + + Enable Pin
- - Enable Fingerprint + + Enable Fingerprint
+ +
+ {{errorMsg}} +
From b6f80138805889f07c9ceaaf019c57e923e3951b Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 4 Apr 2017 15:14:42 -0300 Subject: [PATCH 28/31] use radio buttons - refactor --- src/js/controllers/lock.js | 137 ++++++++++++++++++++++--------------- www/views/lock.html | 14 ++-- 2 files changed, 86 insertions(+), 65 deletions(-) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lock.js index 4046fd8f3..8932ce8df 100644 --- a/src/js/controllers/lock.js +++ b/src/js/controllers/lock.js @@ -1,18 +1,38 @@ 'use strict'; angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService, profileService, lodash) { + var NONE = 'none'; + var PIN = 'pin'; + var FINGERPRINT = 'fingerprint'; $scope.$on("$ionicView.beforeEnter", function(event) { var config = configService.getSync(); - $scope.fingerprintAvailable = fingerprintService.isAvailable(); + $scope.locking = config.lock.method != PIN; - $scope.usePin = { - enabled: config.lock && config.lock.method == 'pin' ? true : false - }; - $scope.useFingerprint = { - enabled: config.lock && config.lock.method == 'fingerprint' ? true : false - }; + $scope.options = [ + { + method: NONE, + label: gettextCatalog.getString('Disabled'), + value: config.lock.method == '', + }, + { + method: PIN, + label: gettextCatalog.getString('Enable PIN'), + value: config.lock.method == PIN, + needsBackup: null, + }, + ]; + if (fingerprintService.isAvailable()) { + $scope.options.push({ + method: FINGERPRINT, + label: gettextCatalog.getString('Enable Fingerprint'), + value: config.lock.method == FINGERPRINT, + needsBackup: null, + }); + } + + $scope.currentOption = lodash.find($scope.options, 'value'); processWallets(); }); @@ -25,66 +45,73 @@ angular.module('copayApp.controllers').controller('lockController', function($st if (singleLivenetWallet) { $scope.errorMsg = gettextCatalog.getString('Backup your wallet before using this function'); + disableOptsUntilBackup(); } else if (atLeastOneLivenetWallet) { $scope.errorMsg = gettextCatalog.getString('Backup all livenet wallets before using this function'); - } else $scope.errorMsg = null; + disableOptsUntilBackup(); + } else { + enableOptsAfterBackup(); + $scope.errorMsg = null; + } + + function enableOptsAfterBackup() { + $scope.options[1].needsBackup = false; + if ($scope.options[2]) $scope.options[2].needsBackup = false; + }; + + function disableOptsUntilBackup() { + $scope.options[1].needsBackup = true; + if ($scope.options[2]) $scope.options[2].needsBackup = true; + }; $timeout(function() { $scope.$apply(); }); }; - $scope.usePinChange = function() { - $scope.usePin.enabled = !$scope.usePin.enabled; - $state.transitionTo('tabs.lock.pin', { - fromSettings: true, - locking: !$scope.usePin.enabled - }).then(function() { - $timeout(function() { - $scope.usePin.enabled = !$scope.usePin.enabled; - }, 1000); + $scope.select = function(method) { + if (method == NONE) + saveConfig(); + else if (method == FINGERPRINT) { + var config = configService.getSync(); + if (config.lock.method == PIN) { + askForDisablePin(function(disablePin) { + if (disablePin) saveConfig(FINGERPRINT); + }); + } else saveConfig(FINGERPRINT); + } else if (method == PIN) { + $state.transitionTo('tabs.lock.pin', { + fromSettings: true, + locking: $scope.locking + }); + } + $timeout(function() { + $scope.$apply(); }); }; - $scope.useFingerprintChange = function() { - if ($scope.usePin.enabled) { - var message = gettextCatalog.getString('{{appName}} is protected by Pin. Are you sure you want to disable it?', { - appName: appConfigService.nameCase - }); - var okText = gettextCatalog.getString('Continue'); - var cancelText = gettextCatalog.getString('Cancel'); - popupService.showConfirm(null, message, okText, cancelText, function(ok) { - if (!ok) { - $scope.useFingerprint = { - enabled: false - }; - $timeout(function() { - $scope.$apply(); - }); - return; - } - saveConfig(); - }); - } else - saveConfig(); + function askForDisablePin(cb) { + var message = gettextCatalog.getString('{{appName}} is protected by Pin. Are you sure you want to disable it?', { + appName: appConfigService.nameCase + }); + var okText = gettextCatalog.getString('Continue'); + var cancelText = gettextCatalog.getString('Cancel'); + popupService.showConfirm(null, message, okText, cancelText, function(ok) { + if (!ok) return cb(false); + return cb(true); + }); + }; - function saveConfig() { - $scope.usePin = { - enabled: false - }; - $timeout(function() { - $scope.$apply(); - }); - var opts = { - lock: { - method: $scope.useFingerprint.enabled ? 'fingerprint' : '', - value: '', - } - }; - - configService.set(opts, function(err) { - if (err) $log.debug(err); - }); + function saveConfig(method) { + var opts = { + lock: { + method: method || '', + value: '', + } }; + + configService.set(opts, function(err) { + if (err) $log.debug(err); + }); }; }); diff --git a/www/views/lock.html b/www/views/lock.html index 344889926..d0e49e15e 100644 --- a/www/views/lock.html +++ b/www/views/lock.html @@ -6,17 +6,11 @@ - - Enable Pin - + + {{opt.label}} + -
- - Enable Fingerprint - -
- -
+
{{errorMsg}}
From 5b1c84b5f7cb22983209f5c7df4a6c45ee8ff1c2 Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 4 Apr 2017 16:47:36 -0300 Subject: [PATCH 29/31] refresh selected option --- src/js/controllers/lock.js | 7 ++++++- src/js/controllers/tab-settings.js | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lock.js index 8932ce8df..3f64c700f 100644 --- a/src/js/controllers/lock.js +++ b/src/js/controllers/lock.js @@ -5,7 +5,7 @@ angular.module('copayApp.controllers').controller('lockController', function($st var PIN = 'pin'; var FINGERPRINT = 'fingerprint'; - $scope.$on("$ionicView.beforeEnter", function(event) { + function init() { var config = configService.getSync(); $scope.locking = config.lock.method != PIN; @@ -34,6 +34,10 @@ angular.module('copayApp.controllers').controller('lockController', function($st $scope.currentOption = lodash.find($scope.options, 'value'); processWallets(); + }; + + $scope.$on("$ionicView.beforeEnter", function(event) { + init(); }); function processWallets() { @@ -77,6 +81,7 @@ angular.module('copayApp.controllers').controller('lockController', function($st if (config.lock.method == PIN) { askForDisablePin(function(disablePin) { if (disablePin) saveConfig(FINGERPRINT); + else init(); }); } else saveConfig(FINGERPRINT); } else if (method == PIN) { diff --git a/src/js/controllers/tab-settings.js b/src/js/controllers/tab-settings.js index 00a58359b..80152ca61 100644 --- a/src/js/controllers/tab-settings.js +++ b/src/js/controllers/tab-settings.js @@ -54,8 +54,8 @@ angular.module('copayApp.controllers').controller('tabSettingsController', funct $scope.isDevel = platformInfo.isDevel; $scope.appName = appConfigService.nameCase; configService.whenAvailable(function(config) { - $scope.locked = config.lock.method == 'fingerprint' || config.lock.value || false; - $scope.method = config.lock.method != '' ? config.lock.method.charAt(0).toUpperCase() + config.lock.method.slice(1) : gettextCatalog.getString('Disabled'); + $scope.locked = config.lock && config.lock.method != '' ? true : false; + $scope.method = config.lock && config.lock.method != '' ? config.lock.method.charAt(0).toUpperCase() + config.lock.method.slice(1) : gettextCatalog.getString('Disabled'); }); }); From b040204841dbb55006996da951560dbac43cf17f Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 4 Apr 2017 17:21:03 -0300 Subject: [PATCH 30/31] update messages --- www/views/pin.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/www/views/pin.html b/www/views/pin.html index 613bd3a66..34816f2a2 100644 --- a/www/views/pin.html +++ b/www/views/pin.html @@ -5,11 +5,11 @@
-
Please enter your unlock PIN
-
Confirm your unlock PIN
+
Please enter your PIN
+
Confirm your PIN
Incorrect PIN, try again.
- +
From 618ce1468835a884d42bd9baeeeac0e7e69ea04e Mon Sep 17 00:00:00 2001 From: JDonadio Date: Tue, 4 Apr 2017 18:06:11 -0300 Subject: [PATCH 31/31] fix typo and constants --- src/js/controllers/lock.js | 27 ++++++++++++--------------- src/js/controllers/pin.js | 16 ++++++++-------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/js/controllers/lock.js b/src/js/controllers/lock.js index 3f64c700f..13c9fccb7 100644 --- a/src/js/controllers/lock.js +++ b/src/js/controllers/lock.js @@ -1,33 +1,30 @@ 'use strict'; angular.module('copayApp.controllers').controller('lockController', function($state, $scope, $timeout, $log, configService, popupService, gettextCatalog, appConfigService, fingerprintService, profileService, lodash) { - var NONE = 'none'; - var PIN = 'pin'; - var FINGERPRINT = 'fingerprint'; function init() { var config = configService.getSync(); - $scope.locking = config.lock.method != PIN; + $scope.locking = config.lock.method != 'pin'; $scope.options = [ { - method: NONE, + method: 'none', label: gettextCatalog.getString('Disabled'), value: config.lock.method == '', }, { - method: PIN, + method: 'pin', label: gettextCatalog.getString('Enable PIN'), - value: config.lock.method == PIN, + value: config.lock.method == 'pin', needsBackup: null, }, ]; if (fingerprintService.isAvailable()) { $scope.options.push({ - method: FINGERPRINT, + method: 'fingerprint', label: gettextCatalog.getString('Enable Fingerprint'), - value: config.lock.method == FINGERPRINT, + value: config.lock.method == 'fingerprint', needsBackup: null, }); } @@ -74,17 +71,17 @@ angular.module('copayApp.controllers').controller('lockController', function($st }; $scope.select = function(method) { - if (method == NONE) + if (method == 'none') saveConfig(); - else if (method == FINGERPRINT) { + else if (method == 'fingerprint') { var config = configService.getSync(); - if (config.lock.method == PIN) { + if (config.lock.method == 'pin') { askForDisablePin(function(disablePin) { - if (disablePin) saveConfig(FINGERPRINT); + if (disablePin) saveConfig('fingerprint'); else init(); }); - } else saveConfig(FINGERPRINT); - } else if (method == PIN) { + } else saveConfig('fingerprint'); + } else if (method == 'pin') { $state.transitionTo('tabs.lock.pin', { fromSettings: true, locking: $scope.locking diff --git a/src/js/controllers/pin.js b/src/js/controllers/pin.js index 9d78b9e65..94dd15d40 100644 --- a/src/js/controllers/pin.js +++ b/src/js/controllers/pin.js @@ -1,8 +1,8 @@ 'use strict'; angular.module('copayApp.controllers').controller('pinController', function($state, $interval, $stateParams, $ionicHistory, $timeout, $scope, $log, configService, appConfigService) { - var PIN = 'pin'; - var ATTEPMPTS_LIMIT = 3; + var ATTEMPT_LIMIT = 3; + var ATTEMPT_LOCK_OUT_TIME = 5 * 60; $scope.$on("$ionicView.beforeEnter", function(event) { $scope.currentPin = $scope.confirmPin = ''; @@ -29,13 +29,13 @@ angular.module('copayApp.controllers').controller('pinController', function($sta function checkAttempts() { $scope.currentAttempts += 1; $log.debug('Attempts to unlock:', $scope.currentAttempts); - if ($scope.currentAttempts === 3) { + if ($scope.currentAttempts === ATTEMPT_LIMIT) { $scope.currentAttempts = 0; - var limitTime = Math.floor(Date.now() / 1000) + 5 * 60; + var limitTime = Math.floor(Date.now() / 1000) + ATTEMPT_LOCK_OUT_TIME; var config = configService.getSync(); var opts = { lock: { - method: PIN, + method: 'pin', value: config.lock.value, bannedUntil: limitTime, attempts: config.lock.attempts + 1, @@ -115,12 +115,12 @@ angular.module('copayApp.controllers').controller('pinController', function($sta $scope.save = function() { if (!$scope.isComplete()) return; var config = configService.getSync(); - $scope.match = config.lock && config.lock.method == PIN && config.lock.value == $scope.currentPin ? true : false; + $scope.match = config.lock && config.lock.method == 'pin' && config.lock.value == $scope.currentPin ? true : false; if (!$scope.locking) { if ($scope.match) { if ($scope.fromSettings) saveSettings(); else { - saveSettings(PIN, $scope.currentPin); + saveSettings('pin', $scope.currentPin); $scope.error = false; } } else { @@ -143,7 +143,7 @@ angular.module('copayApp.controllers').controller('pinController', function($sta }, 200); } else { if ($scope.confirmPin == $scope.currentPin) - saveSettings(PIN, $scope.confirmPin); + saveSettings('pin', $scope.confirmPin); else { $scope.confirmPin = $scope.currentPin = ''; $scope.error = true;