Skip to content

Commit 7252c30

Browse files
authored
Merge pull request #755 from mikeller/added_release_checking
Added checking for latest configurator release and update notification.
2 parents a1b9812 + ec8b744 commit 7252c30

File tree

9 files changed

+217
-191
lines changed

9 files changed

+217
-191
lines changed

_locales/en/messages.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
"warningTitle": {
66
"message": "Warning"
77
},
8+
"noticeTitle": {
9+
"message": "Notice"
10+
},
811
"options_title": {
912
"message": "Application Options"
1013
},
11-
"options_receive_app_notifications": {
12-
"message": "Receive desktop <strong>notification</strong> when application updates"
13-
},
1414
"connect": {
1515
"message": "Connect"
1616
},
@@ -35,6 +35,12 @@
3535
"permanentExpertMode": {
3636
"message": "Permanently enable Expert Mode"
3737
},
38+
"checkForConfiguratorUnstableVersions": {
39+
"message": "Show update notifications for unstable versions of the configurator"
40+
},
41+
"configuratorUpdateNotice": {
42+
"message": "You are using an outdated version of the <b>Betaflight Configurator</b>.<br>Version <b>$1</b> is available online, please visit <a href=\"$2\" target=\"_blank\">the release page</a> to download and install the latest version with fixes and improvements.<br>Please close the configurator window before updating."
43+
},
3844
"deviceRebooting": {
3945
"message": "Device - <span style=\"color: red\">Rebooting</span>"
4046
},

eventPage.js

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,18 @@ chrome.runtime.onInstalled.addListener(function (details) {
8484

8585
// only fire up notification sequence when one of the major version numbers changed
8686
if (currentVersionArr[0] > previousVersionArr[0] || currentVersionArr[1] > previousVersionArr[1]) {
87-
chrome.storage.local.get('update_notify', function (result) {
88-
if (result.update_notify === 'undefined' || result.update_notify) {
89-
var manifest = chrome.runtime.getManifest();
90-
var options = {
91-
priority: 0,
92-
type: 'basic',
93-
title: manifest.name,
94-
message: chrome.i18n.getMessage('notifications_app_just_updated_to_version', [getManifestVersion(manifest)]),
95-
iconUrl: '/images/icon_128.png',
96-
buttons: [{'title': chrome.i18n.getMessage('notifications_click_here_to_start_app')}]
97-
};
98-
99-
chrome.notifications.create('baseflight_update', options, function (notificationId) {
100-
// empty
101-
});
102-
}
87+
var manifest = chrome.runtime.getManifest();
88+
var options = {
89+
priority: 0,
90+
type: 'basic',
91+
title: manifest.name,
92+
message: chrome.i18n.getMessage('notifications_app_just_updated_to_version', [getManifestVersion(manifest)]),
93+
iconUrl: '/images/icon_128.png',
94+
buttons: [{'title': chrome.i18n.getMessage('notifications_click_here_to_start_app')}]
95+
};
96+
97+
chrome.notifications.create('baseflight_update', options, function (notificationId) {
98+
// empty
10399
});
104100
}
105101
}

gulpfile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ gulp.task('dist', ['clean-dist'], function () {
202202
'./js/RateCurve.js',
203203
'./js/Features.js',
204204
'./js/Beepers.js',
205+
'./js/release_checker.js',
205206
'./tabs/adjustments.js',
206207
'./tabs/auxiliary.js',
207208
'./tabs/cli.js',

js/gui.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,7 @@ GUI_control.prototype.show_modal = function (title, message) {
325325
var popup = new jBox('Modal', {
326326
title: title,
327327
content: message,
328-
closeButton: 'title',
329-
closeOnClick: 'box'
328+
closeButton: 'title'
330329
});
331330

332331
popup.open();

js/release_checker.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
'use strict;'
2+
3+
var ReleaseChecker = function (releaseName, releaseUrl) {
4+
var self = this;
5+
6+
self._releaseName = releaseName;
7+
self._releaseDataTag = `${self._releaseName}ReleaseData`;
8+
self._releaseLastUpdateTag = `${self._releaseName}ReleaseLastUpdate`
9+
self._releaseUrl = releaseUrl;
10+
11+
12+
}
13+
14+
ReleaseChecker.prototype.loadReleaseData = function (processFunction) {
15+
var self = this;
16+
chrome.storage.local.get([self._releaseLastUpdateTag, self._releaseDataTag], function (result) {
17+
var releaseDataTimestamp = $.now();
18+
var cacheReleaseData = result[self._releaseDataTag];
19+
var cachedReleaseLastUpdate = result[self._releaseLastUpdateTag];
20+
if (!cacheReleaseData || !cachedReleaseLastUpdate || releaseDataTimestamp - cachedReleaseLastUpdate > 3600 * 1000) {
21+
$.get(self._releaseUrl, function (releaseData) {
22+
GUI.log(`Loaded release information for ${self._releaseName} from GitHub.`);
23+
24+
var data = {};
25+
data[self._releaseDataTag] = releaseData
26+
data[self._releaseLastUpdateTag] = releaseDataTimestamp
27+
chrome.storage.local.set(data, function () {});
28+
29+
self._processReleaseData(releaseData, processFunction);
30+
}).fail(function (data) {
31+
var message = '';
32+
if (data['responseJSON']) {
33+
message = data['responseJSON'].message;
34+
}
35+
GUI.log(`<b>GitHub query for ${self._releaseName} releases failed, using cached information. Reason: <code>${message}</code></b>`);
36+
37+
self._processReleaseData(cacheReleaseData, processFunction);
38+
});
39+
} else {
40+
if (cacheReleaseData) {
41+
GUI.log(`Using cached release information for ${self._releaseName} releases.`);
42+
}
43+
44+
self._processReleaseData(cacheReleaseData, processFunction);
45+
}
46+
});
47+
}
48+
49+
50+
ReleaseChecker.prototype._processReleaseData = function (releaseData, processFunction) {
51+
if (releaseData) {
52+
processFunction(releaseData);
53+
} else {
54+
GUI.log(`No release information available for ${self._releaseName}.`);
55+
56+
processFunction();
57+
}
58+
}

main.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
<script type="text/javascript" src="./js/RateCurve.js"></script>
7474
<script type="text/javascript" src="./js/Features.js"></script>
7575
<script type="text/javascript" src="./js/Beepers.js"></script>
76+
<script type="text/javascript" src="./js/release_checker.js"></script>
7677
<script type="text/javascript" src="./main.js"></script>
7778
<script type="text/javascript" src="./tabs/landing.js"></script>
7879
<script type="text/javascript" src="./tabs/setup.js"></script>

main.js

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,7 @@ $(document).ready(function () {
2828
break;
2929
}
3030

31-
// check for newer releases online to inform people in case they are running an old release
32-
33-
chrome.storage.local.get(['lastVersionChecked', 'lastVersionAvailableOnline'], function (result) {
34-
if (typeof result.lastVersionChecked === undefined || ($.now() - result.lastVersionChecked) > 3600 * 1000) {
35-
try {
36-
var url = 'https://api.github.com/repos/betaflight/betaflight-configurator/tags';
37-
$.get(url).done(function (data) {
38-
var versions = data.sort(function (v1, v2) {
39-
try {
40-
return semver.compare(v2.name, v1.name);
41-
} catch (e) {
42-
return false;
43-
}
44-
});
45-
chrome.storage.local.set({
46-
'lastVersionChecked': $.now(),
47-
'lastVersionAvailableOnline': versions[0].name
48-
}, function (result) {
49-
console.log("Latest version available online: " + versions[0].name);
50-
});
51-
notifyOutdatedVersion(versions[0].name);
52-
});
53-
} catch (e) {
54-
// Just to catch and supress warnings if no internet connection is available
55-
}
56-
} else if (result.lastVersionAvailableOnline) {
57-
notifyOutdatedVersion(result.lastVersionAvailableOnline);
58-
}
59-
});
31+
checkForConfiguratorUpdates();
6032

6133
chrome.storage.local.get('logopen', function (result) {
6234
if (result.logopen) {
@@ -212,19 +184,6 @@ $(document).ready(function () {
212184
// translate to user-selected language
213185
localize();
214186

215-
// if notifications are enabled, or wasn't set, check the notifications checkbox
216-
chrome.storage.local.get('update_notify', function (result) {
217-
if (typeof result.update_notify === 'undefined' || result.update_notify) {
218-
$('div.notifications input').prop('checked', true);
219-
}
220-
221-
$('div.notifications input').change(function () {
222-
var check = $(this).is(':checked');
223-
224-
chrome.storage.local.set({'update_notify': check});
225-
});
226-
});
227-
228187
chrome.storage.local.get('permanentExpertMode', function (result) {
229188
if (result.permanentExpertMode) {
230189
$('div.permanentExpertMode input').prop('checked', true);
@@ -243,6 +202,21 @@ $(document).ready(function () {
243202
}).change();
244203
});
245204

205+
chrome.storage.local.get('checkForConfiguratorUnstableVersions', function (result) {
206+
$('div.checkForConfiguratorUnstableVersions input').change(function () {
207+
var checked = $(this).is(':checked');
208+
209+
chrome.storage.local.set({'checkForConfiguratorUnstableVersions': checked});
210+
211+
$('input[name="checkForConfiguratorUnstableVersions"]').prop('checked', checked).change();
212+
checkForConfiguratorUpdates();
213+
});
214+
215+
if (result.checkForConfiguratorUnstableVersions) {
216+
$('div.checkForConfiguratorUnstableVersions input').prop('checked', true);
217+
}
218+
});
219+
246220
function close_and_cleanup(e) {
247221
if (e.type == 'click' && !$.contains($('div#options-window')[0], e.target) || e.type == 'keyup' && e.keyCode == 27) {
248222
$(document).unbind('click keyup', close_and_cleanup);
@@ -377,10 +351,36 @@ $(document).ready(function () {
377351
});
378352
});
379353

380-
function notifyOutdatedVersion(version) {
381-
if (semver.lt(getManifestVersion(), version)) {
382-
GUI.log('You are using an old version of ' + chrome.runtime.getManifest().name + '. Version ' + version + ' is available online with possible improvements and fixes.');
383-
}
354+
function checkForConfiguratorUpdates() {
355+
var releaseChecker = new ReleaseChecker('configurator', 'https://api.github.com/repos/betaflight/betaflight-configurator/releases');
356+
357+
releaseChecker.loadReleaseData(notifyOutdatedVersion);
358+
}
359+
360+
function notifyOutdatedVersion(releaseData) {
361+
chrome.storage.local.get('checkForConfiguratorUnstableVersions', function (result) {
362+
var showUnstableReleases = false;
363+
if (result.checkForConfiguratorUnstableVersions) {
364+
showUnstableReleases = true;
365+
}
366+
var versions = releaseData.filter(function (version) {
367+
var semVerVersion = semver.parse(version.tag_name);
368+
if (semVerVersion && (showUnstableReleases || semVerVersion.prerelease.length === 0)) {
369+
return version;
370+
}
371+
}).sort(function (v1, v2) {
372+
try {
373+
return semver.compare(v2.tag_name, v1.tag_name);
374+
} catch (e) {
375+
return false;
376+
}
377+
});
378+
379+
if (versions.length > 0 && semver.lt(getManifestVersion(), versions[0].tag_name)) {
380+
GUI.show_modal(chrome.i18n.getMessage('noticeTitle'), chrome.i18n.getMessage('configuratorUpdateNotice', [versions[0].tag_name, versions[0].html_url]));
381+
GUI.log(chrome.i18n.getMessage('configuratorUpdateNotice', [versions[0].tag_name, versions[0].html_url]));
382+
}
383+
});
384384
}
385385

386386
function update_packet_error(caller) {

0 commit comments

Comments
 (0)