From 823814817d38423bd73d468d93146e6c7efa857d Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 8 Sep 2017 16:55:04 -0300 Subject: [PATCH] Adds bitcoincash URL support --- app-template/config-template.xml | 1 + src/js/controllers/addressbookAdd.js | 2 +- src/js/controllers/customAmount.js | 8 +++- src/js/controllers/tab-receive.js | 4 +- src/js/services/incomingData.js | 55 +++++++++++++++++----------- src/js/services/openURL.js | 5 ++- www/views/customAmount.html | 2 +- www/views/tab-receive.html | 2 +- 8 files changed, 49 insertions(+), 30 deletions(-) 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..92a5a4287 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..4d31f5ea6 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -63,12 +63,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..97303c4ff 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -137,6 +137,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..aa6a264ad 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,38 @@ 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:'); + } +console.log('[incomingData.js:93]', coin, data); //TODO/ + 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..120070e5f 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/www/views/customAmount.html b/www/views/customAmount.html index c05c8d704..1c8bf647f 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..1e0b203e4 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -34,7 +34,7 @@ Show address - +
{{addr}}