diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 86117d6d3..023aa88ec 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -66,6 +66,7 @@ + diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index 7cd72b2f7..267acc154 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -14,7 +14,7 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu $timeout(function() { var form = addressbookForm; if (data && form) { - data = data.replace('bitcoin:', ''); + data = data.replace(/^bitcoin(cash)?:/, ''); form.address.$setViewValue(data); form.address.$isValid = true; form.address.$render(); diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index a57ea8c3b..a58f9767b 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -8,6 +8,10 @@ angular.module('copayApp.controllers').controller('customAmountController', func }); }; + var setProtocolHandler = function() { + $scope.protocolHandler = walletService.getProtocolHandler($scope.wallet); + } + $scope.$on("$ionicView.beforeEnter", function(event, data) { var walletId = data.stateParams.id; @@ -20,6 +24,8 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.wallet = profileService.getWallet(walletId); + setProtocolHandler(); + walletService.getAddress($scope.wallet, false, function(err, addr) { if (!addr) { showErrorAndBack('Error', 'Could not get the address'); @@ -63,12 +69,16 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.shareAddress = function() { if (!platformInfo.isCordova) return; - var data = 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + var data = protocol + ':' + $scope.address + '?amount=' + $scope.amountBtc; window.plugins.socialsharing.share(data, null, null, null); } $scope.copyToClipboard = function() { - return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + return protocol + ':' + $scope.address + '?amount=' + $scope.amountBtc; }; }); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 43785ab8b..6677aa26d 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -124,8 +124,13 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi return wallet; } + var setProtocolHandler = function() { + $scope.protocolHandler = walletService.getProtocolHandler($scope.wallet); + } + $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + setProtocolHandler(); $scope.setAddress(); }; @@ -137,6 +142,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.shareAddress = function() { if (!$scope.isCordova) return; - window.plugins.socialsharing.share('bitcoin:' + $scope.addr, null, null, null); + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + window.plugins.socialsharing.share(protocol + ':' + $scope.addr, null, null, null); } }); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 8e384b051..a805fac29 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -69,8 +69,8 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }, 100); } // data extensions for Payment Protocol with non-backwards-compatible request - if ((/^bitcoin:\?r=[\w+]/).exec(data)) { - data = decodeURIComponent(data.replace('bitcoin:?r=', '')); + if ((/^bitcoin(cash)?:\?r=[\w+]/).exec(data)) { + data = decodeURIComponent(data.replace(/bitcoin(cash)?:\?r=/, '')); $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true @@ -84,27 +84,37 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat data = sanitizeUri(data); - // BIP21 - if (bitcore.URI.isValid(data)) { - var parsed = new bitcore.URI(data); - - var addr = parsed.address ? parsed.address.toString() : ''; - var message = parsed.message; - - var amount = parsed.amount ? parsed.amount : ''; - var coin = parsed.extras && parsed.extras.coin ? parsed.extras.coin : ''; - - if (parsed.r) { - payproService.getPayProDetails(parsed.r, function(err, details) { - if (err) { - if (addr && amount) goSend(addr, amount, message, coin); - else popupService.showAlert(gettextCatalog.getString('Error'), err); - } else handlePayPro(details); - }); - } else { - goSend(addr, amount, message, coin); + // Bitcoin or Bitcoin Cash URL + if ((/^bitcoin(cash)?:/).exec(data)) { + var coin = 'btc'; + if ((/^bitcoincash:/).exec(data)) { + coin = 'bch'; + data = data.replace(/bitcoincash:/, 'bitcoin:'); + } + if (bitcore.URI.isValid(data)) { + var parsed = new bitcore.URI(data); + + var addr = parsed.address ? parsed.address.toString() : ''; + var message = parsed.message; + + var amount = parsed.amount ? parsed.amount : ''; + + if (parsed.r) { + payproService.getPayProDetails(parsed.r, function(err, details) { + if (err) { + if (addr && amount) goSend(addr, amount, message, coin); + else popupService.showAlert(gettextCatalog.getString('Error'), err); + } else handlePayPro(details); + }); + } else { + goSend(addr, amount, message, coin); + } + return true; + + } else { + $log.error('Invalid Bitcoin URL'); + return false; } - return true; // Plain URL } else if (/^https?:\/\//.test(data)) { diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 29bdb248d..b03f4b16a 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -57,10 +57,10 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop // This event is sent to an existent instance of Copay (only for standalone apps) gui.App.on('open', function(pathData) { - if (pathData.indexOf('bitcoin:') != -1) { + if (pathData.indexOf(/^bitcoin(cash)?:/) != -1) { $log.debug('Bitcoin URL found'); handleOpenURL({ - url: pathData.substring(pathData.indexOf('bitcoin:')) + url: pathData.substring(pathData.indexOf(/^bitcoin(cash)?:/)) }); } else if (pathData.indexOf(appConfigService.name + '://') != -1) { $log.debug(appConfigService.name + ' URL found'); @@ -84,6 +84,7 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop if (navigator.registerProtocolHandler) { $log.debug('Registering Browser handlers base:' + base); navigator.registerProtocolHandler('bitcoin', url, 'Copay Bitcoin Handler'); + navigator.registerProtocolHandler('web+bitcoincash', url, 'Copay Bitcoin Cash Handler'); navigator.registerProtocolHandler('web+copay', url, 'Copay Wallet Handler'); navigator.registerProtocolHandler('web+bitpay', url, 'BitPay Wallet Handler'); } diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 1e7eb6dc8..3768cecaa 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -1232,5 +1232,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; + root.getProtocolHandler = function(wallet) { + if (wallet.coin== 'bch') return 'bitcoincash'; + else return 'bitcoin'; + } + return root; }); diff --git a/www/views/customAmount.html b/www/views/customAmount.html index c05c8d704..cd3d9da15 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -21,7 +21,7 @@
- +
diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 95c35b8de..5074da2c0 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -34,7 +34,7 @@ Show address - +
{{addr}}