device-status.js
4.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
* ADOBE CONFIDENTIAL
*
* Copyright 2015 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
*/
/* globals Granite */
(function(window, document, $, i18n, dcc) {
'use strict';
var POLLING_INTERVAL = 1000; // ms
var STATUS_ACTIVATOR = '.screens-dcc-actions-Device-status-activator';
var PUSH_FIRMWARE_ACTIVATOR = '.screens-dcc-actions-Device-pushfirmware-activator';
var DEVICE_DASHBOARD_SELECTOR = '.screens-DeviceDashboard';
var STATUS_SELECTOR = '.screens-dashboard-DeviceStatusTile';
var ui = $(window).adaptTo('foundation-ui');
function reloadUI() {
var foundationContent = $('.foundation-content').adaptTo('foundation-content');
return foundationContent.refresh();
}
function getTimestamp() {
var timestamp = $(STATUS_SELECTOR + ' time').attr('datetime');
return timestamp ? new Date(parseInt(timestamp, 10)) : null;
}
function requestStatusInfo(deviceProfilePath) {
return new Promise(function(resolve, reject) {
var url = Granite.HTTP.externalize(deviceProfilePath + '/statusinfo.json');
return $.ajax(url, {
success: function(data) {
resolve(data);
},
error: function(one, two, errorMessage) {
reject(errorMessage);
}
});
});
}
function pollStatusInfo(deviceProfilePath, timestamp) {
return new Promise(function(resolve, reject) {
(function pollScript() {
var now = Date.now();
var pollTimeout;
requestStatusInfo(deviceProfilePath)
.then(function(data) {
var newTimestamp = data.timestamp ? new Date(data.timestamp) : null;
if (newTimestamp && (timestamp ? timestamp.getTime() : 0) < newTimestamp.getTime()) {
resolve(newTimestamp);
} else {
// Make sure that setTimeout is called every "POLLING_INTERVAL" and not earlier.
// Logic is supposed to work similar as to "debounce".
// Info: setTimeout accepts negative numbers and will invoke the function immediately (= as soon as possible).
pollTimeout = window.setTimeout(pollScript, POLLING_INTERVAL - (Date.now() - now));
}
})
.catch(function(error) {
window.clearTimeout(pollTimeout);
reject(error);
});
}());
});
}
$(document).on('click', STATUS_ACTIVATOR, function(ev) {
var $device = $(ev.currentTarget).closest(DEVICE_DASHBOARD_SELECTOR);
var deviceId = $device.find('[data-device-id]').data('deviceId');
ui.wait($(STATUS_SELECTOR).get(0));
return dcc.playerCommands.sendCommandToDevice(deviceId, dcc.playerCommands.COMMANDS.STATUS_INFO)
.then(function(deviceData) {
return pollStatusInfo(deviceData.deviceProfilePath, getTimestamp());
})
.then(reloadUI);
});
$(document).on('click', PUSH_FIRMWARE_ACTIVATOR, function(ev) {
var $device = $(ev.currentTarget).closest(DEVICE_DASHBOARD_SELECTOR);
var deviceId = $device.find('[data-device-id]').data('deviceId');
ui.wait($(STATUS_SELECTOR).get(0));
return dcc.mobileapps.clearAndUpdateConfigs()
.then(function() {
return dcc.playerCommands.sendCommandToDevice(deviceId, dcc.playerCommands.COMMANDS.FIRMWARE_UPDATE);
})
.catch(function(error) {
console.error('Firmware update failed', error);
ui.notify(null, i18n.get('Firmware update failed'), 'error');
})
.then(function(deviceData) {
if (deviceData) {
return pollStatusInfo(deviceData.deviceProfilePath, getTimestamp());
}
})
.then(reloadUI);
});
}(window, document, Granite.$, Granite.I18n, window.CQ.screens.dcc));