diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index af458e8a0..842cc04dc 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -13,14 +13,6 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.updatingTxHistory = {}; self.prevState = 'walletHome'; - if (self.usePushNotifications) { - storageService.getDeviceToken(function(err, token) { - $timeout(function() { - if (!token) pushNotificationsService.pushNotificationsInit(); - }, 5000); - }); - } - function strip(number) { return (parseFloat(number.toPrecision(12))); }; @@ -1233,7 +1225,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.updateRemotePreferences({ saveAll: true }, function() { - $log.debug('Remote preferences saved') + $log.debug('Remote preferences saved'); storageService.setRemotePrefsStoredFlag(function() {}); }); }); @@ -1285,21 +1277,16 @@ angular.module('copayApp.controllers').controller('indexController', function($r go.walletHome(); }); - $rootScope.$on('Local/SubscribeNotifications', function(event) { - if (!self.usePushNotifications) return; - - pushNotificationsService.enableNotifications(); - + $rootScope.$on('Local/ProfileCreated', function(event) { + self.updateRemotePreferences({ + saveAll: true + }, function() { + $log.debug('Remote preferences saved'); + }); }); - $rootScope.$on('Local/UnsubscribeNotifications', function(event, walletId, cb) { - if (!self.usePushNotifications) return cb(); - - pushNotificationsService.unsubscribe(walletId, function(err) { - if (err) $log.warn('Subscription error: ' + err.code); - else $log.debug('Unsubscribed from push notifications service'); - return cb(); - }); + $rootScope.$on('Local/pushNotificationsReady', function(event) { + pushNotificationsService.enableNotifications(profileService.walletClients); }); self.debouncedUpdate = lodash.throttle(function() { diff --git a/src/js/controllers/preferencesGlobal.js b/src/js/controllers/preferencesGlobal.js index 5d5a04238..d7ce7bf93 100644 --- a/src/js/controllers/preferencesGlobal.js +++ b/src/js/controllers/preferencesGlobal.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('copayApp.controllers').controller('preferencesGlobalController', - function($scope, $rootScope, $log, configService, uxLanguage, pushNotificationsService) { + function($scope, $rootScope, $log, configService, uxLanguage, pushNotificationsService, profileService) { this.init = function() { var config = configService.getSync(); @@ -39,9 +39,9 @@ angular.module('copayApp.controllers').controller('preferencesGlobalController', }; configService.set(opts, function(err) { if (opts.pushNotifications.enabled) - pushNotificationsService.enableNotifications(); + pushNotificationsService.enableNotifications(profileService.walletClients); else - pushNotificationsService.disableNotifications(); + pushNotificationsService.disableNotifications(profileService.walletClients); if (err) $log.debug(err); }); }); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 37ff6a700..57076382a 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('profileService', function profileServiceFactory($rootScope, $location, $timeout, $filter, $log, lodash, storageService, bwcService, configService, notificationService, isChromeApp, isCordova, gettext, gettextCatalog, nodeWebkit, bwsError, uxLanguage, bitcore) { + .factory('profileService', function profileServiceFactory($rootScope, $location, $timeout, $filter, $log, lodash, storageService, bwcService, configService, notificationService, pushNotificationsService, isChromeApp, isCordova, gettext, gettextCatalog, nodeWebkit, bwsError, uxLanguage, bitcore) { var root = {}; @@ -132,12 +132,15 @@ angular.module('copayApp.services') if (err) return cb(err); root._setFocus(focusedWalletId, function() { $rootScope.$emit('Local/ProfileBound'); - root.isDisclaimerAccepted(function(val) { - if (!val) { - return cb(new Error('NONAGREEDDISCLAIMER: Non agreed disclaimer')); - } else { - return cb(); - } + storageService.getDeviceToken(function(err, token) { + if (!token) pushNotificationsService.pushNotificationsInit(); + root.isDisclaimerAccepted(function(val) { + if (!val) { + return cb(new Error('NONAGREEDDISCLAIMER: Non agreed disclaimer')); + } else { + return cb(); + } + }); }); }); }); @@ -310,7 +313,9 @@ angular.module('copayApp.services') var fc = root.focusedClient; var walletId = fc.credentials.walletId; - $rootScope.$emit('Local/UnsubscribeNotifications', walletId, function() { + pushNotificationsService.unsubscribe(root.getClient(walletId), function(err) { + if (err) $log.warn('Subscription error: ' + err.code); + else $log.debug('Unsubscribed from push notifications service'); $log.debug('Deleting Wallet:', fc.credentials.walletName); @@ -407,8 +412,9 @@ angular.module('copayApp.services') handleImport(function() { root.setAndStoreFocus(walletId, function() { storageService.storeProfile(root.profile, function(err) { + $rootScope.$emit('Local/ProfileCreated'); if (config.pushNotifications.enabled) - $rootScope.$emit('Local/SubscribeNotifications'); + pushNotificationsService.enableNotifications(root.walletClients); return cb(err, walletId); }); }); @@ -636,7 +642,7 @@ angular.module('copayApp.services') root.unlockFC = function(cb) { var fc = root.focusedClient; - if (!fc.isPrivKeyEncrypted()) + if (!fc.isPrivKeyEncrypted()) return cb(); $log.debug('Wallet is encrypted'); diff --git a/src/js/services/pushNotificationsService.js b/src/js/services/pushNotificationsService.js index 128c74dc4..132ccb43d 100644 --- a/src/js/services/pushNotificationsService.js +++ b/src/js/services/pushNotificationsService.js @@ -1,6 +1,6 @@ 'use strict'; angular.module('copayApp.services') - .factory('pushNotificationsService', function($http, $log, isMobile, profileService, storageService, configService, lodash, isCordova) { + .factory('pushNotificationsService', function($http, $rootScope, $log, isMobile, storageService, configService, lodash, isCordova) { var root = {}; var defaults = configService.getDefaults(); var usePushNotifications = isCordova && !isMobile.Windows(); @@ -8,12 +8,15 @@ angular.module('copayApp.services') root.pushNotificationsInit = function() { if (!usePushNotifications) return; + var config = configService.getSync(); + if (!config.pushNotifications.enabled) return; + var push = PushNotification.init(defaults.pushNotifications.config); push.on('registration', function(data) { $log.debug('Starting push notification registration'); storageService.setDeviceToken(data.registrationId, function() { - root.enableNotifications(); + $rootScope.$emit('Local/pushNotificationsReady'); }); }); @@ -33,15 +36,18 @@ angular.module('copayApp.services') }); }; - root.enableNotifications = function() { + root.enableNotifications = function(walletsClients) { if (!usePushNotifications) return; + var config = configService.getSync(); + if (!config.pushNotifications.enabled) return; + storageService.getDeviceToken(function(err, token) { - lodash.forEach(profileService.getWallets(null), function(wallet) { + lodash.forEach(walletsClients, function(walletClient) { var opts = {}; opts.type = isMobile.iOS() ? "ios" : isMobile.Android() ? "android" : null; opts.token = token; - root.subscribe(opts, wallet.id, function(err, response) { + root.subscribe(opts, walletClient, function(err, response) { if (err) $log.warn('Subscription error: ' + err.code); else $log.debug('Subscribed to push notifications service: ' + JSON.stringify(response)); }); @@ -49,29 +55,32 @@ angular.module('copayApp.services') }); } - root.disableNotifications = function() { + root.disableNotifications = function(walletsClients) { if (!usePushNotifications) return; - lodash.forEach(profileService.getWallets(null), function(wallet) { - root.unsubscribe(wallet.id, function(err) { + lodash.forEach(walletsClients, function(walletClient) { + root.unsubscribe(walletClient, function(err) { if (err) $log.warn('Subscription error: ' + err.code); else $log.debug('Unsubscribed from push notifications service'); }); }); } - root.subscribe = function(opts, walletId, cb) { + root.subscribe = function(opts, walletClient, cb) { + if (!usePushNotifications) return; + + var config = configService.getSync(); + if (!config.pushNotifications.enabled) return; - var walletClient = profileService.getClient(walletId); walletClient.pushNotificationsSubscribe(opts, function(err, resp) { if (err) return cb(err); return cb(null, resp); }); } - root.unsubscribe = function(walletId, cb) { + root.unsubscribe = function(walletClient, cb) { + if (!usePushNotifications) return; - var walletClient = profileService.getClient(walletId); walletClient.pushNotificationsUnsubscribe(function(err) { if (err) return cb(err); return cb(null);