screenshot.js 4.83 KB
/*
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2016 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 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 navigator */
define('screens/player/command/screenshot', [
    'jquery',
    'underscore',
    'screens/player/command/command',
    'screens/player/shared/serviceadmin',
    'screens/player/store/store',
    'screens/player/firmware/preferences/preferences',
    'screens/player/firmware/network/network',
    'screens/player/firmware/screenshot/screenshot',
    'screens/player/firmware/log/logger',
    'module'
], function($, _, PlayerCommand, ServiceAdmin, Store, Preferences, Network, Screenshot, Logger, mod) {
    'use strict';

    var URL_EXTENSION = '.screenshot.json';

    /**
     * This command handler is able to process the following commands:
     * - "screenshot" creates a screenshot and sends it to the server
     *
     * @class ScreenshotCommand
     * @implements {PlayerCommand}
     */
    var ScreenshotCommand = _.extend({}, PlayerCommand, {

        serviceId: mod.id,

        /**
         * @function ScreenshotCommand#canHandle
         * @inheritdoc
         */
        canHandle: function(cmd) {
            return cmd === 'screenshot';
        },

        /**
         * @function ScreenshotCommand#activate
         * @inheritdoc
         */
        activate: function() {
            return new Promise(function(resolve) {
                ServiceAdmin.onServiceHighestRankedStart(Store.serviceName, function(store) {
                    resolve(store);
                });
            }).then(function() {
                return new Promise(function(resolve) {
                    ServiceAdmin.onServiceHighestRankedStart(Preferences.serviceName, function(preferences) {
                        resolve(preferences);
                    });
                });
            }).then(function() {
                return new Promise(function(resolve) {
                    ServiceAdmin.onServiceHighestRankedStart(Network.serviceName, function(network) {
                        resolve(network);
                    });
                });
            }).then(function() {
                return new Promise(function(resolve) {
                    ServiceAdmin.onServiceHighestRankedStart(Logger.serviceName, function(logger) {
                        resolve(logger);
                    });
                });
            }).then(function() {
                return new Promise(function(resolve) {
                    ServiceAdmin.onServiceHighestRankedStart(Screenshot.serviceName, function(screenshot) {
                        resolve(screenshot);
                    });
                });
            });
        },

        /**
         * @function ScreenshotCommand#handleCommand
         * @inheritdoc
         */
        handleCommand: function(command, payload) {
            var store = ServiceAdmin.getService(Store.serviceName);
            var screenshot = ServiceAdmin.getService(Screenshot.serviceName);
            var preferences = ServiceAdmin.getService(Preferences.serviceName);
            var ajax = ServiceAdmin.getService(Network.serviceName).ajax;
            var logger = ServiceAdmin.getService(Logger.serviceName).getWriter();

            var state = store.getState();
            var statusmodel = state.statusmodel;
            var devicePostUrl = (statusmodel || {}).devicePostUrl;

            if (!devicePostUrl) {
                var error = new Error('Unable to send screenshot. No devicePostUrl.');
                logger.error(error);
                return Promise.reject(error);
            }

            return screenshot.captureScreenshotAsURI()
                .then(function(uri) {
                    logger.log('Sending screenshot for ' + preferences.getPreferences().device);

                    ajax(devicePostUrl + URL_EXTENSION, {
                        method: 'POST',
                        data: {
                            data: uri
                        }
                    });
                })
                .catch(function(err) {
                    logger.error(err);
                    return Promise.reject(err);
                });
        }

    });

    return ScreenshotCommand;
});

/* istanbul ignore next */
require([
    'screens/player/command/screenshot',
    'screens/player/shared/serviceadmin'
], function(Service, ServiceAdmin) {
    'use strict';
    ServiceAdmin.register(Service);
});