device-status.js 4.65 KB
/*
 * 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));