preferences-service.js 6.64 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 Promise */

define('screens/player/firmware/preferences/impl/preferences-service', [
    'underscore',
    'screens/player/shared/serviceadmin',
    'screens/player/firmware/preferences/spi/storage',
    'screens/player/firmware/preferences/spi/defaults',
    'screens/player/firmware/preferences/spi/urlscheme',
    'screens/player/firmware/preferences/preferences',
    'screens/player/store/store',
    'screens/player/firmware/core/firmware/firmware',
    'module'
], function(_, ServiceAdmin, StorageSpi, DefaultsSpi, URLSchemeSpi, Preferences, Store, Firmware, mod) {
    'use strict';

    var services = null;

    var urlSchemeCallback = null;

    /**
     * Defines the preferences Service
     *
     * @class PreferencesService
     * @implements {Preferences}
     */
    var PreferencesService = {

        serviceId: mod.id,

        /**
         * @memberof PreferencesService
         */
        serviceName: Preferences.serviceName,

        /**
         * Activate method.
         * @returns {*|Promise} Optional a promise that resolves (or rejects) when completed.
         */
        activate: function() {
            var self = this;
            services = Object.create(null);
            return new Promise(function(resolve) {
                    ServiceAdmin.onServiceHighestRankedStart(DefaultsSpi.serviceName, function(defaultsSpi) {
                        services.defaultsSpi = defaultsSpi;
                        resolve();
                    });
                })
                .then(function() {
                    return new Promise(function(resolve) {
                        ServiceAdmin.onServiceHighestRankedStart(StorageSpi.serviceName, function(storageSpi) {
                            services.storageSpi = storageSpi;
                            resolve();
                        });
                    });
                })
                .then(function() {
                    return new Promise(function(resolve) {
                        ServiceAdmin.onServiceHighestRankedStart(Store.serviceName, function(store) {
                            services.store = store;
                            resolve();
                        });
                    });
                }).then(function() {
                    return new Promise(function(resolve) {
                        ServiceAdmin.onServiceHighestRankedStart(URLSchemeSpi.serviceName, function(urlSchemeSpi) {
                            services.urlSchemeSpi = urlSchemeSpi;
                            urlSchemeCallback = function(newPreferences) {
                                var flags = {};
                                flags[Preferences.FLAGS.REBOOT_ON_SAVE] = true;
                                this.save(newPreferences, flags);
                            }.bind(self);
                            services.urlSchemeSpi.on(urlSchemeCallback);
                            resolve();
                        });
                    });
                })
                .then(function() {
                    return services.defaultsSpi.getDefaults();
                })
                .then(function(defaults) {
                    return services.storageSpi.load(defaults);
                })
                .then(function(preferences) {
                    return new Promise(function(resolve) {
                        services.store.dispatch({
                            type: Preferences.ACTIONS.SAVING_DONE,
                            payload: preferences
                        });
                        resolve();
                    });
                })
                .catch(function(e) {
                    console.error('error while reading preferences', e);
                    services.store.dispatch({
                        type: Preferences.ACTIONS.SAVING_ERROR,
                        payload: e
                    });
                });
        },

        /**
         * Called by ServiceAdmin.
         * @method PreferencesService#deactivate
         * @returns {*|Promise} Optional a promise that resolves (or rejects) when completed.
         */
        deactivate: function() {
            if (urlSchemeCallback) {
                services.urlSchemeSpi.off(urlSchemeCallback);
            }
            services = null;
            return Promise.resolve();
        },

        /**
         * @method PreferencesService#getPreferences
         * @inheritdoc
         */
        getPreferences: function() {
            return services.store.getState().preferences || {};
        },

        /**
         * @method PreferencesService#save
         * @inheritdoc
         */
        save: function(preferences, flags) {
            flags = flags || {};

            services.store.dispatch({ type: Preferences.ACTIONS.SAVING });
            services.storageSpi.save(preferences).then(function() {
                services.store.dispatch({
                    type: Preferences.ACTIONS.SAVING_DONE,
                    payload: preferences
                });
            }).then(function() {
                if (flags[Preferences.FLAGS.REBOOT_ON_SAVE]) {
                    ServiceAdmin.onServiceHighestRankedStart(Firmware.serviceName, function(firmware) {
                        firmware.reboot();
                    });
                }
            }).catch(function(error) {
                services.store.dispatch({
                    type: Preferences.ACTIONS.SAVING_ERROR,
                    payload: error
                });
            });
        },

        /**
         * @method PreferencesService#reset
         * @inheritdoc
         */
        reset: function(flags) {
            var self = this;

            services.defaultsSpi.getDefaults().then(function(defaults) {
                self.save(defaults, flags);
            });
        }
    };

    return PreferencesService;

});

require([
    'screens/player/firmware/preferences/impl/preferences-service',
    'screens/player/shared/serviceadmin'
], function(PreferencesService, ServiceAdmin) {
    'use strict';
    ServiceAdmin.register(PreferencesService);
});