diff --git a/src/js/controllers/tab-home.controller.js b/src/js/controllers/tab-home.controller.js
index 229848df8..f78f156f1 100644
--- a/src/js/controllers/tab-home.controller.js
+++ b/src/js/controllers/tab-home.controller.js
@@ -43,21 +43,20 @@ angular.module('copayApp.controllers').controller('tabHomeController',
});
}
- if ($scope.isNW) {
- latestReleaseService.checkLatestRelease(function(err, newRelease) {
- if (err) {
- $log.warn(err);
- return;
- }
- if (newRelease) {
- $scope.newRelease = true;
- $scope.updateText = gettextCatalog.getString('There is a new version of {{appName}} available', {
- appName: $scope.name
- });
- }
- });
- }
- };
+ latestReleaseService.checkLatestRelease(function(err, newReleaseData) {
+ if (err) {
+ $log.warn(err);
+ return;
+ }
+ if (newReleaseData) {
+ $scope.newRelease = true;
+ $scope.newReleaseText = gettextCatalog.getString('There is a new version of {{appName}} available', {
+ appName: $scope.name
+ });
+ $scope.newReleaseNotes = newReleaseData.releaseNotes;
+ }
+ });
+ }
function onEnter(event, data) {
$ionicNavBarDelegate.showBar(true);
@@ -109,13 +108,13 @@ angular.module('copayApp.controllers').controller('tabHomeController',
$scope.$apply();
}, 10);
});
- };
+ }
function onLeave (event, data) {
lodash.each(listeners, function(x) {
x();
});
- };
+ }
$scope.createdWithinPastDay = function(time) {
return timeService.withinPastDay(time);
@@ -125,14 +124,8 @@ angular.module('copayApp.controllers').controller('tabHomeController',
sendFlowService.start();
}
- $scope.openExternalLink = function() {
- var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest';
- var optIn = true;
- var title = gettextCatalog.getString('Update Available');
- var message = gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.');
- var okText = gettextCatalog.getString('View Update');
- var cancelText = gettextCatalog.getString('Go Back');
- externalLinkService.open(url, optIn, title, message, okText, cancelText);
+ $scope.showUpdatePopup = function() {
+ latestReleaseService.showUpdatePopup();
};
$scope.openBannerUrl = function() {
diff --git a/src/js/services/latest-release.service.js b/src/js/services/latest-release.service.js
new file mode 100644
index 000000000..85c50bb03
--- /dev/null
+++ b/src/js/services/latest-release.service.js
@@ -0,0 +1,180 @@
+'use strict';
+
+(function() {
+
+ angular
+ .module('bitcoincom.services')
+ .factory('latestReleaseService', latestReleaseService);
+
+ function latestReleaseService($log, $http, $ionicPopup, configService, externalLinkService, gettextCatalog, platformInfo) {
+
+ var service = {
+ // Functions
+ checkLatestRelease: checkLatestRelease,
+ requestLatestRelease: requestLatestRelease,
+ showUpdatePopup: showUpdatePopup
+ };
+
+ return service;
+
+ function checkLatestRelease(cb) {
+ var releaseURL = configService.getDefaults().release.url;
+
+ requestLatestRelease(releaseURL, function (err, releaseData) {
+ if (err) return cb(err);
+ var currentVersion = window.version;
+ var latestVersion = releaseData.tag_name;
+
+ if (!verifyTagFormat(currentVersion))
+ return cb('Cannot verify the format of version tag: ' + currentVersion);
+ if (!verifyTagFormat(latestVersion))
+ return cb('Cannot verify the format of latest release tag: ' + latestVersion);
+
+ var current = formatTagNumber(currentVersion);
+ var latest = formatTagNumber(latestVersion);
+
+ if (latest.major < current.major || (latest.major === current.major && latest.minor <= current.minor)) {
+ return cb(null, false);
+ }
+
+ var releaseSearchTerm = "";
+ if (platformInfo.isNW) { // XX SP: DESKTOP: Check if the latest release is already available for current OS
+ var platform = process.platform;
+ if (platform === "darwin") {
+ releaseSearchTerm = "osx";
+ } else if (platform === "win32") {
+ releaseSearchTerm = "win";
+ } else if (platform === "linux") {
+ releaseSearchTerm = "linux";
+ }
+ var foundNewVersion = false;
+ for (var i in releaseData.assets) {
+ if (releaseData.assets[i].name.indexOf(releaseSearchTerm) !== -1) {
+ foundNewVersion = true;
+ break;
+ }
+ }
+ }
+
+ $log.debug('A new version is available: ' + latestVersion);
+
+ var releaseNotes = false;
+ if (releaseData.body) {
+ var releaseLines = releaseData.body.split('\n');
+ for (var lineNum in releaseLines) {
+ if (releaseLines[lineNum].substring(0, 2) === "# ") {
+ releaseLines[lineNum] = "" + releaseLines[lineNum].substring(2) + "";
+ } else if (releaseLines[lineNum].substring(0, 2) === "- ") {
+ releaseLines[lineNum] = "• " + releaseLines[lineNum].substring(2);
+ }
+ }
+ releaseNotes = releaseLines.join('\n');
+ }
+
+ return cb(null, {latestVersion: latestVersion, releaseNotes: releaseNotes});
+ });
+
+ function verifyTagFormat(tag) {
+ var regex = /^v?\d+\.\d+(\.\d+)?(-rc\d)?$/i;
+ return regex.exec(tag);
+ }
+
+ function formatTagNumber(tag) {
+ var label = false;
+ if (tag.split("-")[1]) { // Move postfixes like "-rc2" to a variable
+ label = tag.split("-")[1];
+ tag = tag.split("-")[0];
+ }
+
+ var formattedNumber = tag.replace(/^v/i, '').split('.');
+ return {
+ major: +(formattedNumber[0] ? +formattedNumber[0] : 0),
+ minor: +(formattedNumber[1] ? +formattedNumber[1] : 0),
+ patch: +(formattedNumber[2] ? +formattedNumber[2] : 0),
+ label: label /* XX SP: Maybe we can use this in a later stage (with for example 1.0.0-rc2 the value will be "rc2" and false if there is no label) */
+ };
+ }
+ }
+
+ function requestLatestRelease(releaseURL, cb) {
+ $log.debug('Retrieving latest release information...');
+
+ var request = {
+ url: releaseURL,
+ method: 'GET',
+ json: true
+ };
+
+ $http(request).then(function (release) {
+ $log.debug('Latest release: ' + release.data.name);
+ return cb(null, release.data);
+ }, function (err) {
+ return cb('Cannot get the release information: ' + err);
+ });
+ }
+
+ function showUpdatePopup() {
+ var buttons = [];
+
+ if (!platformInfo.isIOS) { // There is no GitHub-release for iPhone
+ buttons.push({
+ text: "GitHub",
+ type: 'button-positive',
+ onTap: function () {
+ var url = 'https://github.com/Bitcoin-com/Wallet/releases/latest';
+ externalLinkService.open(url, false);
+ }
+ });
+ }
+ if (platformInfo.isAndroid) {
+ buttons.unshift({
+ text: "Google Play Store",
+ type: 'button-positive',
+ onTap: function () {
+ var url = 'https://play.google.com/store/apps/details?id=com.bitcoin.mwallet';
+ externalLinkService.open(url, false);
+ }
+ });
+ }
+ if (platformInfo.isIOS) {
+ buttons.unshift({
+ text: "App Store",
+ type: 'button-positive',
+ onTap: function () {
+ var url = 'https://itunes.apple.com/app/id1252903728';
+ externalLinkService.open(url, false);
+ }
+ });
+ } else if (platformInfo.isNW) {
+ if (process.platform === 'darwin') {
+ buttons.unshift({
+ text: "Mac App Store",
+ type: 'button-positive',
+ onTap: function () {
+ var url = 'https://itunes.apple.com/app/bitcoin-com-wallet/id1383072453';
+ externalLinkService.open(url, false);
+ }
+ });
+ }
+ }
+
+ if (buttons.length === 1) { // There is only one source to download (probably on desktop, so open GitHub release page..)
+ buttons[0].onTap();
+ } else {
+ buttons.push({
+ text: gettextCatalog.getString('Go Back'),
+ type: 'button-positive',
+ onTap: function () {
+ return true;
+ }
+ });
+ $ionicPopup.show({
+ title: gettextCatalog.getString('Update Available'),
+ subTitle: gettextCatalog.getString('An update to this app is available. For your security, please update to the latest version.'),
+ cssClass: 'popup-update',
+ buttons: buttons
+ });
+ }
+ }
+ }
+})();
\ No newline at end of file
diff --git a/src/js/services/latestReleaseService.js b/src/js/services/latestReleaseService.js
deleted file mode 100644
index 87aace87f..000000000
--- a/src/js/services/latestReleaseService.js
+++ /dev/null
@@ -1,63 +0,0 @@
-'use strict';
-angular.module('copayApp.services')
- .factory('latestReleaseService', function latestReleaseServiceFactory($log, $http, configService) {
-
- var root = {};
-
- root.checkLatestRelease = function(cb) {
- var releaseURL = configService.getDefaults().release.url;
-
- requestLatestRelease(releaseURL, function(err, release) {
- if (err) return cb(err);
- var currentVersion = window.version;
- var latestVersion = release.data.tag_name;
-
- if (!verifyTagFormat(currentVersion))
- return cb('Cannot verify the format of version tag: ' + currentVersion);
- if (!verifyTagFormat(latestVersion))
- return cb('Cannot verify the format of latest release tag: ' + latestVersion);
-
- var current = formatTagNumber(currentVersion);
- var latest = formatTagNumber(latestVersion);
-
- if (latest.major < current.major || (latest.major == current.major && latest.minor <= current.minor))
- return cb(null, false);
-
- $log.debug('A new version is available: ' + latestVersion);
- return cb(null, true);
- });
-
- function verifyTagFormat(tag) {
- var regex = /^v?\d+\.\d+\.\d+$/i;
- return regex.exec(tag);
- };
-
- function formatTagNumber(tag) {
- var formattedNumber = tag.replace(/^v/i, '').split('.');
- return {
- major: +formattedNumber[0],
- minor: +formattedNumber[1],
- patch: +formattedNumber[2]
- };
- };
- };
-
- function requestLatestRelease(releaseURL, cb) {
- $log.debug('Retrieving latest relsease information...');
-
- var request = {
- url: releaseURL,
- method: 'GET',
- json: true
- };
-
- $http(request).then(function(release) {
- $log.debug('Latest release: ' + release.data.name);
- return cb(null, release);
- }, function(err) {
- return cb('Cannot get the release information: ' + err);
- });
- };
-
- return root;
- });
diff --git a/src/sass/views/tab-home.scss b/src/sass/views/tab-home.scss
index 909bc5791..aed37705e 100644
--- a/src/sass/views/tab-home.scss
+++ b/src/sass/views/tab-home.scss
@@ -173,6 +173,11 @@
font-weight: 700;
color: #444;
}
+ .release-notes {
+ white-space: pre;
+ white-space: pre-line;
+ text-align: left;
+ }
.button {
width: 100%;
border: none;
@@ -190,3 +195,13 @@
top:11px;
}
}
+.popup-update {
+ .popup-buttons {
+ display: block;
+ }
+ .popup-buttons .button{
+ display:block;
+ min-width: 100% !important;
+ margin-top: 4px;
+ }
+}
\ No newline at end of file
diff --git a/www/views/tab-home.html b/www/views/tab-home.html
index 8ef922918..7191c1c16 100644
--- a/www/views/tab-home.html
+++ b/www/views/tab-home.html
@@ -15,9 +15,11 @@
-