blob: bcd86336b1249ea9dda8849afe4a13ea89906b77 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* A service for setting and retrieving browser-local preferences. Preferences
* may be any JSON-serializable type.
*/
angular.module('settings').provider('preferenceService', ['$injector',
function preferenceServiceProvider($injector) {
// Required providers
var localStorageServiceProvider = $injector.get('localStorageServiceProvider');
/**
* Reference to the provider itself.
*
* @type preferenceServiceProvider
*/
var provider = this;
/**
* The storage key of Guacamole preferences within local storage.
*
* @type String
*/
var GUAC_PREFERENCES_STORAGE_KEY = "GUAC_PREFERENCES";
/**
* All valid input method type names.
*
* @type Object.<String, String>
*/
var inputMethods = {
/**
* No input method is used. Keyboard events are generated from a
* physical keyboard.
*
* @constant
* @type String
*/
NONE : 'none',
/**
* Keyboard events will be generated from the Guacamole on-screen
* keyboard.
*
* @constant
* @type String
*/
OSK : 'osk',
/**
* Keyboard events will be generated by inferring the keys necessary to
* produce typed text from an IME (Input Method Editor) such as the
* native on-screen keyboard of a mobile device.
*
* @constant
* @type String
*/
TEXT : 'text'
};
/**
* Returns the key of the language currently in use within the browser.
* This is not necessarily the user's desired language, but is rather the
* language user by the browser's interface.
*
* @returns {String}
* The key of the language currently in use within the browser.
*/
var getDefaultLanguageKey = function getDefaultLanguageKey() {
// Pull browser language, falling back to US English
var language = (navigator.languages && navigator.languages[0])
|| navigator.language
|| navigator.browserLanguage
|| 'en';
// Convert to format used internally
return language.replace(/-/g, '_');
};
/**
* All currently-set preferences, as name/value pairs. Each property name
* corresponds to the name of a preference.
*
* @type Object.<String, Object>
*/
this.preferences = {
/**
* Whether translation of touch to mouse events should emulate an
* absolute pointer device, or a relative pointer device.
*
* @type Boolean
*/
emulateAbsoluteMouse : true,
/**
* The default input method. This may be any of the values defined
* within preferenceService.inputMethods.
*
* @type String
*/
inputMethod : inputMethods.NONE,
/**
* The key of the desired display language.
*
* @type String
*/
language : getDefaultLanguageKey()
};
// Get stored preferences from localStorage
var storedPreferences = localStorageServiceProvider.getItem(GUAC_PREFERENCES_STORAGE_KEY);
if (storedPreferences)
angular.extend(provider.preferences, storedPreferences);
// Factory method required by provider
this.$get = ['$injector', function preferenceServiceFactory($injector) {
// Required services
var $rootScope = $injector.get('$rootScope');
var $window = $injector.get('$window');
var localStorageService = $injector.get('localStorageService');
var service = {};
/**
* All valid input method type names.
*
* @type Object.<String, String>
*/
service.inputMethods = inputMethods;
/**
* All currently-set preferences, as name/value pairs. Each property name
* corresponds to the name of a preference.
*
* @type Object.<String, Object>
*/
service.preferences = provider.preferences;
/**
* Persists the current values of all preferences, if possible.
*/
service.save = function save() {
localStorageService.setItem(GUAC_PREFERENCES_STORAGE_KEY, service.preferences);
};
// Persist settings when window is unloaded
$window.addEventListener('unload', service.save);
// Persist settings upon navigation
$rootScope.$on('$routeChangeSuccess', function handleNavigate() {
service.save();
});
// Persist settings upon logout
$rootScope.$on('guacLogout', function handleLogout() {
service.save();
});
return service;
}];
}]);