diff --git a/public/views/paymentUri.html b/public/views/paymentUri.html index e0d0d337d..73c553a5a 100644 --- a/public/views/paymentUri.html +++ b/public/views/paymentUri.html @@ -5,7 +5,7 @@
-
+

Bitcoin URI is NOT valid!

diff --git a/src/js/controllers/buyCoinbase.js b/src/js/controllers/buyCoinbase.js index 7b40fc26a..e81c12fa5 100644 --- a/src/js/controllers/buyCoinbase.js +++ b/src/js/controllers/buyCoinbase.js @@ -2,8 +2,6 @@ angular.module('copayApp.controllers').controller('buyCoinbaseController', function($scope, $modal, $log, $ionicModal, $timeout, lodash, profileService, coinbaseService, bwsError, addressService) { - - window.ignoreMobilePause = true; var self = this; var fc; diff --git a/src/js/controllers/buyGlidera.js b/src/js/controllers/buyGlidera.js index ef243a9a3..793c0bb51 100644 --- a/src/js/controllers/buyGlidera.js +++ b/src/js/controllers/buyGlidera.js @@ -8,9 +8,6 @@ angular.module('copayApp.controllers').controller('buyGlideraController', this.error = null; this.success = null; this.loading = null; - - window.ignoreMobilePause = true; - var otherWallets = function(testnet) { var network = testnet ? 'testnet' : 'livenet'; return lodash.filter(profileService.getWallets(network), function(w) { diff --git a/src/js/controllers/coinbase.js b/src/js/controllers/coinbase.js index 8d972a0ee..61553b3e9 100644 --- a/src/js/controllers/coinbase.js +++ b/src/js/controllers/coinbase.js @@ -4,7 +4,6 @@ angular.module('copayApp.controllers').controller('coinbaseController', function($rootScope, $scope, $timeout, $modal, $ionicModal, profileService, configService, storageService, coinbaseService, lodash, platformInfo) { var isNW = platformInfo.isNW; - window.ignoreMobilePause = true; this.openAuthenticateWindow = function() { var oauthUrl = this.getAuthenticateUrl(); diff --git a/src/js/controllers/copayers.js b/src/js/controllers/copayers.js index b263a6e29..de9e40172 100644 --- a/src/js/controllers/copayers.js +++ b/src/js/controllers/copayers.js @@ -92,9 +92,6 @@ angular.module('copayApp.controllers').controller('copayersController', self.shareSecret = function(secret) { if (isCordova) { - if (isAndroid || isWP) { - window.ignoreMobilePause = true; - } var message = gettextCatalog.getString('Join my Copay wallet. Here is the invitation code: {{secret}} You can download Copay for your phone or desktop at https://copay.io', { secret: secret }); diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index 289fbf767..d5110de52 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -126,9 +126,6 @@ angular.module('copayApp.controllers').controller('exportController', self.sendWalletBackup = function() { var fc = profileService.focusedClient; - if (isAndroid || isWP) { - window.ignoreMobilePause = true; - } window.plugins.toast.showShortCenter(gettextCatalog.getString('Preparing backup...')); var name = (fc.credentials.walletName || fc.credentials.walletId); if (fc.alias) { diff --git a/src/js/controllers/glideraUri.js b/src/js/controllers/glideraUri.js index a42859e5d..32f13ee6d 100644 --- a/src/js/controllers/glideraUri.js +++ b/src/js/controllers/glideraUri.js @@ -3,6 +3,7 @@ angular.module('copayApp.controllers').controller('glideraUriController', function($scope, $stateParams, $timeout, profileService, configService, glideraService, storageService, go) { this.submitOauthCode = function(code) { +console.log('[glideraUri.js.5:code:]'+code); //TODO var self = this; var glideraTestnet = configService.getSync().glidera.testnet; var network = glideraTestnet ? 'testnet' : 'livenet'; @@ -31,6 +32,7 @@ angular.module('copayApp.controllers').controller('glideraUriController', }; this.checkCode = function() { +console.log('[glideraUri.js.35:$stateParams:]' + JSON.stringify($stateParams)); //TODO this.code = $stateParams.code; this.submitOauthCode(this.code); }; diff --git a/src/js/controllers/import.js b/src/js/controllers/import.js index 010520814..d44b487f1 100644 --- a/src/js/controllers/import.js +++ b/src/js/controllers/import.js @@ -15,14 +15,6 @@ angular.module('copayApp.controllers').controller('importController', $scope.account = 1; self.importErr = false; - window.ignoreMobilePause = true; - $scope.$on('$destroy', function() { - $timeout(function() { - window.ignoreMobilePause = false; - }, 100); - }); - - var updateSeedSourceSelect = function() { self.seedOptions = []; diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index cc78efba0..734105396 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, $ionicScrollDelegate, $ionicPopup, latestReleaseService, feeService, bwcService, pushNotificationsService, lodash, go, profileService, configService, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, addonManager, bwsError, txFormatService, uxLanguage, glideraService, coinbaseService, platformInfo, addressbookService) { +angular.module('copayApp.controllers').controller('indexController', function($rootScope, $scope, $log, $filter, $timeout, $ionicScrollDelegate, $ionicPopup, latestReleaseService, feeService, bwcService, pushNotificationsService, lodash, go, profileService, configService, rateService, storageService, addressService, gettext, gettextCatalog, amMoment, addonManager, bwsError, txFormatService, uxLanguage, glideraService, coinbaseService, platformInfo, addressbookService, openURLService) { var self = this; var SOFT_CONFIRMATION_LIMIT = 12; var errors = bwcService.getErrors(); @@ -289,6 +289,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r initStatusHash = _walletStatusHash(); $log.debug('Updating status until it changes. initStatusHash:' + initStatusHash) } + var get = function(cb) { if (opts.walletStatus) return cb(null, opts.walletStatus); @@ -351,6 +352,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.setPendingTxps(walletStatus.pendingTxps); // Status Shortcuts + self.lastUpdate = Date.now(); self.walletName = walletStatus.wallet.name; self.walletSecret = walletStatus.wallet.secret; self.walletStatus = walletStatus.wallet.status; @@ -1492,59 +1494,105 @@ angular.module('copayApp.controllers').controller('indexController', function($r } }); - self.debouncedUpdate = lodash.throttle(function() { - self.updateAll({ - quiet: true - }); - self.debounceUpdateHistory(); - }, 2000, { - leading: false, - trailing: true - }); + self.debouncedUpdate = function() { + var now = Date.now(); + var oneHr = 1000 * 60 * 60; - $rootScope.$on('Local/Resume', function(event) { - $log.debug('### Resume event'); - profileService.isDisclaimerAccepted(function(v) { - if (!v) { - $log.debug('Disclaimer not accepted, resume to home'); - go.path('disclaimer'); - } - }); - self.debouncedUpdate(); - }); - - $rootScope.$on('Local/BackupDone', function(event, walletId) { - self.needsBackup = false; - $log.debug('Backup done'); - storageService.setBackupFlag(walletId || self.walletId, function(err) { - $log.debug('Backup stored'); - }); - }); - - $rootScope.$on('Local/DeviceError', function(event, err) { - self.showErrorPopup(err, function() { - if (isCordova && navigator && navigator.app) { - navigator.app.exitApp(); - } - }); - }); - - $rootScope.$on('Local/WalletImported', function(event, walletId) { - self.needsBackup = false; - storageService.setBackupFlag(walletId, function() { - $log.debug('Backup done stored'); - addressService.expireAddress(walletId, function(err) { - $timeout(function() { - self.txHistory = self.completeHistory = self.txHistorySearchResults = []; - storageService.removeTxHistory(walletId, function() { - self.startScan(walletId); - }); - }, 500); + if (!self.lastUpdate || (now - self.lastUpdate) > oneHr) { + self.updateAll({ + quiet: true + triggerTxUpdate: true, }); - }); + } }); - $rootScope.$on('NewIncomingTx', function() { +$rootScope.$on('Local/Resume', function(event) { + $log.debug('### Resume event'); + profileService.isDisclaimerAccepted(function(v) { + if (!v) { + $log.debug('Disclaimer not accepted, resume to home'); + go.path('disclaimer'); + } + }); + self.debouncedUpdate(); +}); + +$rootScope.$on('Local/BackupDone', function(event, walletId) { + self.needsBackup = false; + $log.debug('Backup done'); + storageService.setBackupFlag(walletId || self.walletId, function(err) { + $log.debug('Backup stored'); + }); +}); + +$rootScope.$on('Local/DeviceError', function(event, err) { + self.showErrorPopup(err, function() { + if (isCordova && navigator && navigator.app) { + navigator.app.exitApp(); + } + }); +}); + +$rootScope.$on('Local/WalletImported', function(event, walletId) { + self.needsBackup = false; + storageService.setBackupFlag(walletId, function() { + $log.debug('Backup done stored'); + addressService.expireAddress(walletId, function(err) { + $timeout(function() { + self.txHistory = self.completeHistory = self.txHistorySearchResults = []; + storageService.removeTxHistory(walletId, function() { + self.startScan(walletId); + }); + }, 500); + }); + }); +}); + +$rootScope.$on('NewIncomingTx', function() { + self.newTx = true; + self.updateAll({ + walletStatus: null, + untilItChanges: true, + triggerTxUpdate: true, + }); +}); + + +$rootScope.$on('NewBlock', function() { + if (self.glideraEnabled) { + $timeout(function() { + self.updateGlidera(); + }); + } + if (self.coinbaseEnabled) { + $timeout(function() { + self.updateCoinbase(); + }); + } + if (self.pendingAmount) { + self.updateAll({ + walletStatus: null, + untilItChanges: null, + triggerTxUpdate: true, + }); + } else if (self.hasUnsafeConfirmed) { + $log.debug('Wallet has transactions with few confirmations. Updating.') + if (self.network == 'testnet') { + self.throttledUpdateHistory(); + } else { + self.debounceUpdateHistory(); + } + } +}); + +$rootScope.$on('BalanceUpdated', function(e, n) { + self.setBalance(n.data); +}); + + +//untilItChange TRUE +lodash.each(['NewOutgoingTx', 'NewOutgoingTxByThirdParty'], function(eventName) { + $rootScope.$on(eventName, function(event) { self.newTx = true; self.updateAll({ walletStatus: null, @@ -1552,244 +1600,200 @@ angular.module('copayApp.controllers').controller('indexController', function($r triggerTxUpdate: true, }); }); +}); - - $rootScope.$on('NewBlock', function() { - if (self.glideraEnabled) { - $timeout(function() { - self.updateGlidera(); - }); - } - if (self.coinbaseEnabled) { - $timeout(function() { - self.updateCoinbase(); - }); - } - if (self.pendingAmount) { - self.updateAll({ - walletStatus: null, - untilItChanges: null, - triggerTxUpdate: true, - }); - } else if (self.hasUnsafeConfirmed) { - $log.debug('Wallet has transactions with few confirmations. Updating.') - if (self.network == 'testnet') { - self.throttledUpdateHistory(); - } else { - self.debounceUpdateHistory(); - } - } - }); - - $rootScope.$on('BalanceUpdated', function(e, n) { - self.setBalance(n.data); - }); - - - //untilItChange TRUE - lodash.each(['NewOutgoingTx', 'NewOutgoingTxByThirdParty'], function(eventName) { - $rootScope.$on(eventName, function(event) { - self.newTx = true; - self.updateAll({ - walletStatus: null, - untilItChanges: true, - triggerTxUpdate: true, - }); - }); - }); - - //untilItChange FALSE - lodash.each(['NewTxProposal', 'TxProposalFinallyRejected', 'TxProposalRemoved', 'NewOutgoingTxByThirdParty', - 'Local/GlideraTx' - ], function(eventName) { - $rootScope.$on(eventName, function(event) { - self.updateAll({ - walletStatus: null, - untilItChanges: null, - triggerTxUpdate: true, - }); - }); - }); - - - //untilItChange Maybe - $rootScope.$on('Local/TxProposalAction', function(event, untilItChanges) { - self.newTx = untilItChanges; +//untilItChange FALSE +lodash.each(['NewTxProposal', 'TxProposalFinallyRejected', 'TxProposalRemoved', 'NewOutgoingTxByThirdParty', + 'Local/GlideraTx' +], function(eventName) { + $rootScope.$on(eventName, function(event) { self.updateAll({ walletStatus: null, - untilItChanges: untilItChanges, + untilItChanges: null, triggerTxUpdate: true, }); }); +}); - $rootScope.$on('ScanFinished', function() { - $log.debug('Scan Finished. Updating history'); - storageService.removeTxHistory(self.walletId, function() { - self.updateAll({ - walletStatus: null, - triggerTxUpdate: true, - }); + +//untilItChange Maybe +$rootScope.$on('Local/TxProposalAction', function(event, untilItChanges) { + self.newTx = untilItChanges; + self.updateAll({ + walletStatus: null, + untilItChanges: untilItChanges, + triggerTxUpdate: true, + }); +}); + +$rootScope.$on('ScanFinished', function() { + $log.debug('Scan Finished. Updating history'); + storageService.removeTxHistory(self.walletId, function() { + self.updateAll({ + walletStatus: null, + triggerTxUpdate: true, }); }); +}); - lodash.each(['TxProposalRejectedBy', 'TxProposalAcceptedBy'], function(eventName) { - $rootScope.$on(eventName, function() { - var f = function() { - if (self.updatingStatus) { - return $timeout(f, 200); - }; - self.updatePendingTxps(); +lodash.each(['TxProposalRejectedBy', 'TxProposalAcceptedBy'], function(eventName) { + $rootScope.$on(eventName, function() { + var f = function() { + if (self.updatingStatus) { + return $timeout(f, 200); }; - f(); - }); + self.updatePendingTxps(); + }; + f(); }); +}); - $rootScope.$on('Local/NoWallets', function(event) { - $timeout(function() { - self.hasProfile = true; - self.noFocusedWallet = true; - self.isComplete = null; - self.walletName = null; - uxLanguage.update(); - - profileService.isDisclaimerAccepted(function(v) { - if (v) { - go.path('import'); - } - }); - }); - }); - - $rootScope.$on('Local/NewFocusedWallet', function() { +$rootScope.$on('Local/NoWallets', function(event) { + $timeout(function() { + self.hasProfile = true; + self.noFocusedWallet = true; + self.isComplete = null; + self.walletName = null; uxLanguage.update(); - self.setFocusedWallet(); - self.updateHistory(); - storageService.getCleanAndScanAddresses(function(err, walletId) { - if (walletId && profileService.walletClients[walletId]) { - $log.debug('Clear last address cache and Scan ', walletId); - addressService.expireAddress(walletId, function(err) { - self.startScan(walletId); - }); - storageService.removeCleanAndScanAddresses(function() { - $rootScope.$emit('Local/NewFocusedWalletReady'); - }); - } else { - $rootScope.$emit('Local/NewFocusedWalletReady'); + profileService.isDisclaimerAccepted(function(v) { + if (v) { + go.path('import'); } }); }); +}); - $rootScope.$on('Local/SetTab', function(event, tab, reset) { - self.setTab(tab, reset); - }); +$rootScope.$on('Local/NewFocusedWallet', function() { + uxLanguage.update(); + self.setFocusedWallet(); + self.updateHistory(); + storageService.getCleanAndScanAddresses(function(err, walletId) { - $rootScope.$on('Local/NeedsConfirmation', function(event, txp, cb) { - - function openConfirmationPopup(txp, cb) { - - $scope.tx = txFormatService.processTx(txp); - - self.confirmationPopup = $ionicPopup.show({ - templateUrl: 'views/includes/confirm-tx.html', - scope: $scope, + if (walletId && profileService.walletClients[walletId]) { + $log.debug('Clear last address cache and Scan ', walletId); + addressService.expireAddress(walletId, function(err) { + self.startScan(walletId); }); - - $scope.processFee = function(amount, fee) { - var walletSettings = configService.getSync().wallet.settings; - var feeAlternativeIsoCode = walletSettings.alternativeIsoCode; - - $scope.feeLevel = feeService.feeOpts[feeService.getCurrentFeeLevel()]; - $scope.feeAlternativeStr = parseFloat((rateService.toFiat(fee, feeAlternativeIsoCode)).toFixed(2), 10) + ' ' + feeAlternativeIsoCode; - $scope.feeRateStr = (fee / (amount + fee) * 100).toFixed(2) + '%'; - }; - - $scope.cancel = function() { - return cb(); - }; - - $scope.accept = function() { - return cb(true); - }; + storageService.removeCleanAndScanAddresses(function() { + $rootScope.$emit('Local/NewFocusedWalletReady'); + }); + } else { + $rootScope.$emit('Local/NewFocusedWalletReady'); } - - openConfirmationPopup(txp, function(accept) { - self.confirmationPopup.close(); - return cb(accept); - }); }); +}); - $rootScope.$on('Local/NeedsPassword', function(event, isSetup, cb) { +$rootScope.$on('Local/SetTab', function(event, tab, reset) { + self.setTab(tab, reset); +}); - function openPasswordPopup(isSetup, cb) { - $scope.data = {}; - $scope.data.password = null; - $scope.isSetup = isSetup; - $scope.isVerification = false; - $scope.loading = false; - var pass = null; +$rootScope.$on('Local/NeedsConfirmation', function(event, txp, cb) { - self.passwordPopup = $ionicPopup.show({ - templateUrl: 'views/includes/password.html', - scope: $scope, - }); + function openConfirmationPopup(txp, cb) { - $scope.cancel = function() { - return cb('No spending password given'); - }; + $scope.tx = txFormatService.processTx(txp); - $scope.set = function() { - $scope.loading = true; - $scope.error = null; + self.confirmationPopup = $ionicPopup.show({ + templateUrl: 'views/includes/confirm-tx.html', + scope: $scope, + }); - $timeout(function() { - if (isSetup && !$scope.isVerification) { - $scope.loading = false; - $scope.isVerification = true; - pass = $scope.data.password; - $scope.data.password = null; - return; - } - if (isSetup && pass != $scope.data.password) { - $scope.loading = false; - $scope.error = gettext('Spending Passwords do not match'); - $scope.isVerification = false; - $scope.data.password = null; - pass = null; - return; - } - return cb(null, $scope.data.password); - }, 100); - }; + $scope.processFee = function(amount, fee) { + var walletSettings = configService.getSync().wallet.settings; + var feeAlternativeIsoCode = walletSettings.alternativeIsoCode; + + $scope.feeLevel = feeService.feeOpts[feeService.getCurrentFeeLevel()]; + $scope.feeAlternativeStr = parseFloat((rateService.toFiat(fee, feeAlternativeIsoCode)).toFixed(2), 10) + ' ' + feeAlternativeIsoCode; + $scope.feeRateStr = (fee / (amount + fee) * 100).toFixed(2) + '%'; }; - openPasswordPopup(isSetup, function(err, pass) { - self.passwordPopup.close(); - return cb(err, pass); - }); + $scope.cancel = function() { + return cb(); + }; + $scope.accept = function() { + return cb(true); + }; + } + + openConfirmationPopup(txp, function(accept) { + self.confirmationPopup.close(); + return cb(accept); }); - - $rootScope.$on('Local/EmailUpdated', function(event, email) { - self.preferences.email = email; - }); - - lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) { - $rootScope.$on(eventName, function() { - // Re try to open wallet (will triggers) - self.setFocusedWallet(); - }); - }); - - $rootScope.$on('Local/NewEncryptionSetting', function() { - var fc = profileService.focusedClient; - self.isPrivKeyEncrypted = fc.isPrivKeyEncrypted(); - $timeout(function() { - $rootScope.$apply(); - }); - }); - - - /* Start setup */ - lodash.assign(self, vanillaScope); +}); + +$rootScope.$on('Local/NeedsPassword', function(event, isSetup, cb) { + + function openPasswordPopup(isSetup, cb) { + $scope.data = {}; + $scope.data.password = null; + $scope.isSetup = isSetup; + $scope.isVerification = false; + $scope.loading = false; + var pass = null; + + self.passwordPopup = $ionicPopup.show({ + templateUrl: 'views/includes/password.html', + scope: $scope, + }); + + $scope.cancel = function() { + return cb('No spending password given'); + }; + + $scope.set = function() { + $scope.loading = true; + $scope.error = null; + + $timeout(function() { + if (isSetup && !$scope.isVerification) { + $scope.loading = false; + $scope.isVerification = true; + pass = $scope.data.password; + $scope.data.password = null; + return; + } + if (isSetup && pass != $scope.data.password) { + $scope.loading = false; + $scope.error = gettext('Spending Passwords do not match'); + $scope.isVerification = false; + $scope.data.password = null; + pass = null; + return; + } + return cb(null, $scope.data.password); + }, 100); + }; + }; + + openPasswordPopup(isSetup, function(err, pass) { + self.passwordPopup.close(); + return cb(err, pass); + }); + +}); + +$rootScope.$on('Local/EmailUpdated', function(event, email) { + self.preferences.email = email; +}); + +lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) { + $rootScope.$on(eventName, function() { + // Re try to open wallet (will triggers) + self.setFocusedWallet(); + }); +}); + +$rootScope.$on('Local/NewEncryptionSetting', function() { + var fc = profileService.focusedClient; + self.isPrivKeyEncrypted = fc.isPrivKeyEncrypted(); + $timeout(function() { + $rootScope.$apply(); + }); +}); + + +/* Start setup */ +lodash.assign(self, vanillaScope); openURLService.init(); }); diff --git a/src/js/controllers/modals/customAmount.js b/src/js/controllers/modals/customAmount.js index 091394bcc..48db4d9cf 100644 --- a/src/js/controllers/modals/customAmount.js +++ b/src/js/controllers/modals/customAmount.js @@ -69,9 +69,6 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.shareAddress = function(uri) { if (platformInfo.isCordova) { - if (platformInfo.isAndroid || platformInfo.isWP) { - window.ignoreMobilePause = true; - } window.plugins.socialsharing.share(uri, null, null, null); } }; diff --git a/src/js/controllers/paymentUri.js b/src/js/controllers/paymentUri.js index 241d05a46..deaf152a0 100644 --- a/src/js/controllers/paymentUri.js +++ b/src/js/controllers/paymentUri.js @@ -1,20 +1,14 @@ 'use strict'; angular.module('copayApp.controllers').controller('paymentUriController', function($rootScope, $stateParams, $location, $timeout, profileService, configService, lodash, bitcore, go) { - - window.ignoreMobilePause = true; function strip(number) { return (parseFloat(number.toPrecision(12))); }; // Build bitcoinURI with querystring - this.checkBitcoinUri = function() { + this.init = function() { var query = []; - angular.forEach($location.search(), function(value, key) { - query.push(key + "=" + value); - }); - var queryString = query ? query.join("&") : null; - this.bitcoinURI = $stateParams.data + (queryString ? '?' + queryString : ''); + this.bitcoinURI = $stateParams.url; var URI = bitcore.URI; var isUriValid = URI.isValid(this.bitcoinURI); diff --git a/src/js/controllers/preferencesInformation.js b/src/js/controllers/preferencesInformation.js index a3f148c61..8f31255b1 100644 --- a/src/js/controllers/preferencesInformation.js +++ b/src/js/controllers/preferencesInformation.js @@ -46,10 +46,6 @@ angular.module('copayApp.controllers').controller('preferencesInformation', this.sendAddrs = function() { var self = this; - if (platformInfo.isAndroid || platformInfo.isWP) { - window.ignoreMobilePause = true; - } - self.loading = true; function formatDate(ts) { diff --git a/src/js/controllers/sellCoinbase.js b/src/js/controllers/sellCoinbase.js index c94a3304b..679caf9f0 100644 --- a/src/js/controllers/sellCoinbase.js +++ b/src/js/controllers/sellCoinbase.js @@ -3,7 +3,6 @@ angular.module('copayApp.controllers').controller('sellCoinbaseController', function($rootScope, $scope, $modal, $log, $timeout, $ionicModal, lodash, profileService, coinbaseService, bwsError, configService, walletService, fingerprintService) { - window.ignoreMobilePause = true; var self = this; var fc; diff --git a/src/js/controllers/sellGlidera.js b/src/js/controllers/sellGlidera.js index 53321bb80..6804e083f 100644 --- a/src/js/controllers/sellGlidera.js +++ b/src/js/controllers/sellGlidera.js @@ -12,8 +12,6 @@ angular.module('copayApp.controllers').controller('sellGlideraController', this.loading = null; var fc; - window.ignoreMobilePause = true; - var otherWallets = function(testnet) { var network = testnet ? 'testnet' : 'livenet'; return lodash.filter(profileService.getWallets(network), function(w) { diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js index c80f9a1b9..d3bb4f61d 100644 --- a/src/js/controllers/walletHome.js +++ b/src/js/controllers/walletHome.js @@ -8,7 +8,6 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi var isChromeApp = platformInfo.isChromeApp; var self = this; - window.ignoreMobilePause = false; $rootScope.shouldHideMenuBar = false; $rootScope.wpInputFocused = false; var config = configService.getSync(); @@ -217,9 +216,6 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi this.shareAddress = function(addr) { if (isCordova) { - if (isAndroid || isWP) { - window.ignoreMobilePause = true; - } window.plugins.socialsharing.share('bitcoin:' + addr, null, null, null); } }; diff --git a/src/js/directives/qrScanner.js b/src/js/directives/qrScanner.js index cb9bf0b88..a43ca9b1c 100644 --- a/src/js/directives/qrScanner.js +++ b/src/js/directives/qrScanner.js @@ -12,7 +12,6 @@ angular.module('copayApp.directives') var onSuccess = function(result) { $timeout(function() { window.plugins.spinnerDialog.hide(); - window.ignoreMobilePause = false; }, 100); if (isWP && result.cancelled) return; @@ -26,13 +25,11 @@ angular.module('copayApp.directives') var onError = function(error) { $timeout(function() { - window.ignoreMobilePause = false; window.plugins.spinnerDialog.hide(); }, 100); }; $scope.cordovaOpenScanner = function() { - window.ignoreMobilePause = true; window.plugins.spinnerDialog.show(null, gettextCatalog.getString('Preparing camera...'), true); $timeout(function() { if (isIOS) { diff --git a/src/js/init.js b/src/js/init.js index 44392c992..e8141f5c9 100644 --- a/src/js/init.js +++ b/src/js/init.js @@ -7,42 +7,32 @@ angular.element(document).ready(function() { angular.bootstrap(document, ['copayApp']); }; - var handleBitcoinURI = function(url) { - if (!url) return; - console.log('Custom URL:' + url); //TODO - var glidera = 'copay://glidera'; - var coinbase = 'copay://coinbase'; - - if (url.indexOf('bitcoin:') == 0) { - url = '#/uri-payment/' + url; - } else if (url.indexOf(glidera) != -1) { - url = '#/uri-glidera' + url.replace(glidera, ''); - } else if (url.indexOf(coinbase) != -1) { - url = '#/uri-coinbase' + url.replace(coinbase, ''); + function handleOpenURL(url) { + if ('cordova' in window) { + console.log('DEEP LINK:' + url); + cordova.fireDocumentEvent('handleopenurl', { + url: url + }); } else { - console.log('Unknown URL!') - }; - - setTimeout(function() { - window.location = url; - }, 1000); + console.log("ERROR: Cannont handle open URL in non-cordova apps") + } }; - /* Cordova specific Init */ - if (window.cordova !== undefined) { + if ('cordova' in window) { + + window.handleOpenURL = handleOpenURL; + document.addEventListener('deviceready', function() { - window.handleOpenURL = handleBitcoinURI; + + // Create a sticky event for handling the app being opened via a custom URL + cordova.addStickyDocumentEventHandler('handleopenurl'); startAngular(); }, false); } else { - try { - window.handleOpenURL = handleBitcoinURI; - } catch (e) {} - startAngular(); } diff --git a/src/js/routes.js b/src/js/routes.js index 998ac7848..d9400b67e 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -112,8 +112,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } } }) - .state('payment', { - url: '/uri-payment/:data', + .state('uripayment', { + url: '/uri-payment/:url', templateUrl: 'views/paymentUri.html', views: { 'main': { @@ -215,7 +215,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('uriglidera', { - url: '/uri-glidera?code', + url: '/uri-glidera/:code', needProfile: true, views: { 'main': { @@ -284,7 +284,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }) .state('uricoinbase', { - url: '/uri-coinbase?code', + url: '/uri-coinbase/:code', needProfile: true, views: { 'main': { @@ -520,7 +520,7 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } }); }) - .run(function($rootScope, $state, $log, $timeout, $ionicPlatform, uriHandler, platformInfo, profileService, uxLanguage, animationService, go, gettextCatalog) { + .run(function($rootScope, $state, $location, $log, $timeout, $ionicPlatform, uriHandler, platformInfo, profileService, uxLanguage, animationService, go, gettextCatalog) { $ionicPlatform.ready(function() { if (platformInfo.isCordova) { @@ -539,14 +539,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }); $ionicPlatform.on('resume', function() { - if (!window.ignoreMobilePause) { - $rootScope.$emit('Local/Resume'); - } - setTimeout(function() { - var loc = window.location; - var ignoreMobilePause = loc.toString().match(/(buy|sell|buycoinbase|sellcoinbase)/) ? true : false; - window.ignoreMobilePause = ignoreMobilePause; - }, 100); + // Nothing to do + $rootScope.$emit('Local/Resume'); }); $ionicPlatform.on('backbutton', function(event) { @@ -575,10 +569,6 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr }, 100); go.walletHome(); - - setTimeout(function() { - window.ignoreMobilePause = false; - }, 100); }); $ionicPlatform.on('menubutton', function() { @@ -614,6 +604,8 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { $log.debug('Route change from:', fromState.name || '-', ' to:', toState.name); + $log.debug(' toParams:' + JSON.stringify(toParams || {})); + $log.debug(' fromParams:' + JSON.stringify(fromParams || {})); if (!profileService.profile && toState.needProfile) { @@ -640,17 +632,22 @@ angular.module('copayApp').config(function(historicLogProvider, $provide, $logPr } else { if (profileService.focusedClient && !profileService.focusedClient.isComplete() && toState.walletShouldBeComplete) { - $state.transitionTo('copayers'); event.preventDefault(); + $state.transitionTo('copayers'); } } - - if (!animationService.transitionAnimated(fromState, toState)) { - event.preventDefault(); - // Time for the backpane to render - setTimeout(function() { - $state.transitionTo(toState); - }, 50); - } +// event.preventDefault(); +// $state.transitionTo(toState); +// if (!animationService.transitionAnimated(fromState, toState)) { +// +// console.log('[routes.js.649] ANIMATION!'); //TODO +// event.preventDefault(); +// // Time for the backpane to render +// return setTimeout(function() { +// +// console.log('[routes.js.654] TRANSITION'); //TODO +// $state.transitionTo(toState); +// }, 50); +// } }); }); diff --git a/src/js/services/animationService.js b/src/js/services/animationService.js index 7197194cb..6a0c8a5fb 100644 --- a/src/js/services/animationService.js +++ b/src/js/services/animationService.js @@ -60,6 +60,7 @@ angular.module('copayApp.services').factory('animationService', function(platfor }; function cleanUpLater(e, e2) { +console.log('[animationService.js.62:cleanUpLater:]'); //TODO var cleanedUp = false, timeoutID; var cleanUp = function() { diff --git a/src/js/services/configService.js b/src/js/services/configService.js index 9af77287d..9a18c9894 100644 --- a/src/js/services/configService.js +++ b/src/js/services/configService.js @@ -111,11 +111,11 @@ angular.module('copayApp.services').factory('configService', function(storageSer // Glidera // Disabled for testnet - configCache.glidera.testnet = false; + configCache.glidera.testnet = true; // Coinbase // Disabled for testnet - configCache.coinbase.testnet = false; + configCache.coinbase.testnet = true; $log.debug('Preferences read:', configCache) return cb(err, configCache); diff --git a/src/js/services/go.js b/src/js/services/go.js index f30a2b6b7..52f00de33 100644 --- a/src/js/services/go.js +++ b/src/js/services/go.js @@ -48,15 +48,15 @@ angular.module('copayApp.services').factory('go', function($window, $ionicSideMe }; root.addWallet = function() { - $state.go('add'); + $state.transitionTo('add'); }; root.preferences = function() { - $state.go('preferences'); + $state.transitionTo('preferences'); }; root.preferencesGlobal = function() { - $state.go('preferencesGlobal'); + $state.transitionTo('preferencesGlobal'); }; root.reload = function() { diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js new file mode 100644 index 000000000..a7f219a40 --- /dev/null +++ b/src/js/services/openURL.js @@ -0,0 +1,69 @@ +'use strict'; + +angular.module('copayApp.services').factory('openURLService', function($ionicHistory, $document, $log, $state, go) { + var root = {}; + + root.registeredUriHandlers = [{ + name: 'Bitcoin BIP21 URL', + startsWith: 'bitcoin:', + transitionTo: 'uripayment', + }, { + name: 'Glidera Authentication Callback', + startsWith: 'copay://glidera', + transitionTo: 'uriglidera', + }, { + name: 'Coinbase Authentication Callback', + startsWith: 'copay://coinbase', + transitionTo: 'uricoinbase', + }]; + + + var handleOpenURL = function(args) { + $log.info('Handling Open URL: ' + JSON.stringify(args)); + + // Stop it from caching the first view as one to return when the app opens + $ionicHistory.nextViewOptions({ + historyRoot: true, + disableBack: true, + disableAnimation: true + }); + + if (url) { + window.cordova.removeDocumentEventHandler('handleopenurl'); + window.cordova.addStickyDocumentEventHandler('handleopenurl'); + document.removeEventListener('handleopenurl', root.handleOpenUrl); + } + + + var url = args.url; + + lodash.each(root.registeredUriHandlers, function(x) { + if (url.indexOf(x.startWith) == 0) { + $log.debug('openURL GOT ' + x.name + ' URL'); + return $state.transitionTo(x.transitionTo, { + url: url + }); + } + }); + $log.warn('Unknown URL! : ' + url); + }; + + var handleResume = function() { + $log.debug('Handle Resume @ openURL...'); + document.addEventListener('handleopenurl', handleOpenUrl, false); + }; + + root.init = function() { + console.log('[openURL.js.29]'); //TODO + document.addEventListener('handleopenurl', handleOpenURL, false); + document.addEventListener('resume', handleResume, false); + }; + + + root.registerHandler = function(x) { + $log.debug('Registering URL Handler: ' + x.name); + root.registeredUriHandlers.push(x); + }; + + return root; +}); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index bd537977b..1ed664bd0 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -182,7 +182,6 @@ angular.module('copayApp.services') push.on('notification', function(data) { if (!data.additionalData.foreground) { - window.ignoreMobilePause = true; $log.debug('Push notification event: ', data.message); $timeout(function() {