2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 var validator_ = xwalk.utils.validator;
18 var converter_ = xwalk.utils.converter;
19 var types_ = validator_.Types;
20 var T_ = xwalk.utils.type;
21 var native_ = new xwalk.utils.NativeManager(extension);
26 MAGNETIC : 'MAGNETIC',
27 PRESSURE : 'PRESSURE',
28 PROXIMITY : 'PROXIMITY',
29 ULTRAVIOLET : 'ULTRAVIOLET',
33 var ProximityState = {
38 var MagneticSensorAccuracy = {
39 UNDEFINED : 'ACCURACY_UNDEFINED',
41 NORMAL : 'ACCURACY_NORMAL',
42 GOOD : 'ACCURACY_GOOD',
43 VERYGOOD : 'ACCURACY_VERYGOOD'
46 // helper class for sensor listeners
47 var SensorListener = function (type, constructor) {
48 this.sensorType = type;
49 this.isStarted = false;
50 this.callback = undefined;
51 this.constructor = constructor;
54 SensorListener.prototype.tryCall = function (object) {
56 this.callback(new this.constructor(object));
60 SensorListener.prototype.start = function (successCallback, errorCallback) {
61 if (!this.isStarted) {
63 var thisObject = this;
64 native_.call('Sensor_start', {'sensorType' : thisObject.sensorType},
66 if (native_.isFailure(result)) {
67 if(!T_.isNullOrUndefined(errorCallback)) {
68 errorCallback(native_.getErrorObject(result));
71 thisObject.isStarted = true;
77 // sensor is already started - just call success callback
78 setTimeout(function(){successCallback()}, 0);
82 SensorListener.prototype.stop = function () {
84 var result = native_.callSync('Sensor_stop', {'sensorType' : this.sensorType});
85 if (native_.isFailure(result)) {
86 throw native_.getErrorObject(result);
88 this.isStarted = false;
92 SensorListener.prototype.setListener = function (successCallback) {
94 //call platform only if there was no listener registered
95 var result = native_.callSync('Sensor_setChangeListener', {'sensorType' : this.sensorType});
96 if (native_.isFailure(result)) {
97 throw native_.getErrorObject(result);
100 this.callback = successCallback;
103 SensorListener.prototype.unsetListener = function () {
105 //unregister in platform only if there is callback registered
106 this.callback = undefined;
107 var result = native_.callSync('Sensor_unsetChangeListener', {'sensorType' : this.sensorType});
108 if (native_.isFailure(result)) {
109 throw native_.getErrorObject(result);
114 SensorListener.prototype.getData = function (successCallback, errorCallback) {
116 if (!thisObj.isStarted) {
117 setTimeout(function() {
118 if (!T_.isNullOrUndefined(errorCallback)) {
119 errorCallback(new WebAPIException(
120 WebAPIException.SERVICE_NOT_AVAILABLE_ERR,
121 'Service is not available.'));
125 native_.call('Sensor_getData', { type : thisObj.sensorType },
127 if (native_.isFailure(result)) {
128 if(!T_.isNullOrUndefined(errorCallback)) {
129 errorCallback(native_.getErrorObject(result));
132 successCallback(new thisObj.constructor(result));
138 var _supportedSensors = [];
139 var _isChecked = false;
140 var _sensorListeners = {
149 var _listener = function(object) {
150 _sensorListeners[object.sensorType].tryCall(object);
153 var SENSOR_CHANGED_LISTENER = 'SensorChangedListener';
154 native_.addListener(SENSOR_CHANGED_LISTENER, _listener);
156 function getAvailableSensors() {
157 var result = native_.callSync('SensorService_getAvailableSensors', {});
158 if (native_.isFailure(result)) {
159 throw native_.getErrorObject(result);
161 _supportedSensors = native_.getResultObject(result);
165 function SensorService() {
168 SensorService.prototype.getDefaultSensor = function() {
169 var args = validator_.validateArgs(arguments, [
173 values : T_.getValues(SensorType)
178 getAvailableSensors();
181 var index = _supportedSensors.indexOf(args.type);
183 throw new WebAPIException(WebAPIException.NOT_SUPPORTED_ERR, 'Not supported.');
184 } else if (_supportedSensors[index] === SensorType.LIGHT) {
185 return new LightSensor();
186 } else if (_supportedSensors[index] === SensorType.MAGNETIC) {
187 return new MagneticSensor();
188 } else if (_supportedSensors[index] === SensorType.PRESSURE) {
189 return new PressureSensor();
190 } else if (_supportedSensors[index] === SensorType.PROXIMITY) {
191 return new ProximitySensor();
192 } else if (_supportedSensors[index] === SensorType.ULTRAVIOLET) {
193 return new UltravioletSensor();
194 } else if (_supportedSensors[index] === SensorType.HRM_RAW) {
195 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.HEALTHINFO);
196 return new HRMRawSensor();
200 SensorService.prototype.getAvailableSensors = function() {
202 getAvailableSensors();
205 return _supportedSensors.slice();
208 //////////////////////Sensor classes//////////////////////////////////////////////////////////
209 //// Base Sensor class
210 var Sensor = function (type) {
211 Object.defineProperties(this, {
212 sensorType : {value: type, writable: false, enumerable: true}
216 Sensor.prototype.start = function() {
217 var args = validator_.validateArgs(arguments, [
219 name : 'successCallback',
220 type : types_.FUNCTION
223 name : 'errorCallback',
224 type : types_.FUNCTION,
230 _sensorListeners[this.sensorType].start(args.successCallback, args.errorCallback);
233 Sensor.prototype.stop = function() {
234 _sensorListeners[this.sensorType].stop();
237 Sensor.prototype.setChangeListener = function() {
238 var args = validator_.validateArgs(arguments, [
240 name : 'successCallback',
241 type: types_.FUNCTION
245 _sensorListeners[this.sensorType].setListener(args.successCallback);
248 Sensor.prototype.unsetChangeListener = function() {
249 _sensorListeners[this.sensorType].unsetListener();
253 var LightSensor = function(data) {
254 Sensor.call(this, SensorType.LIGHT);
257 LightSensor.prototype = new Sensor();
259 LightSensor.prototype.constructor = Sensor;
261 LightSensor.prototype.getLightSensorData = function() {
262 var args = validator_.validateArgs(arguments, [
264 name : 'successCallback',
265 type : types_.FUNCTION
268 name : 'errorCallback',
269 type : types_.FUNCTION,
275 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
279 var MagneticSensor = function(data) {
280 Sensor.call(this, SensorType.MAGNETIC);
283 MagneticSensor.prototype = new Sensor();
285 MagneticSensor.prototype.constructor = Sensor;
287 MagneticSensor.prototype.getMagneticSensorData = function() {
288 var args = validator_.validateArgs(arguments, [
290 name : 'successCallback',
291 type : types_.FUNCTION
294 name : 'errorCallback',
295 type : types_.FUNCTION,
301 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
305 var PressureSensor = function(data) {
306 Sensor.call(this, SensorType.PRESSURE);
309 PressureSensor.prototype = new Sensor();
311 PressureSensor.prototype.constructor = Sensor;
313 PressureSensor.prototype.getPressureSensorData = function() {
314 var args = validator_.validateArgs(arguments, [
316 name : 'successCallback',
317 type : types_.FUNCTION
320 name : 'errorCallback',
321 type : types_.FUNCTION,
327 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
331 var ProximitySensor = function(data) {
332 Sensor.call(this, SensorType.PROXIMITY);
335 ProximitySensor.prototype = new Sensor();
337 ProximitySensor.prototype.constructor = Sensor;
339 ProximitySensor.prototype.getProximitySensorData = function() {
340 var args = validator_.validateArgs(arguments, [
342 name : 'successCallback',
343 type : types_.FUNCTION
346 name : 'errorCallback',
347 type : types_.FUNCTION,
353 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
356 //// UltravioletSensor
357 var UltravioletSensor = function(data) {
358 Sensor.call(this, SensorType.ULTRAVIOLET);
361 UltravioletSensor.prototype = new Sensor();
363 UltravioletSensor.prototype.constructor = Sensor;
365 UltravioletSensor.prototype.getUltravioletSensorData = function() {
366 var args = validator_.validateArgs(arguments, [
368 name : 'successCallback',
369 type : types_.FUNCTION
372 name : 'errorCallback',
373 type : types_.FUNCTION,
379 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
383 var HRMRawSensor = function(data) {
384 Sensor.call(this, SensorType.HRM_RAW);
387 HRMRawSensor.prototype = new Sensor();
389 HRMRawSensor.prototype.constructor = Sensor;
391 HRMRawSensor.prototype.getHRMRawSensorData = function() {
392 var args = validator_.validateArgs(arguments, [
394 name : 'successCallback',
395 type : types_.FUNCTION
398 name : 'errorCallback',
399 type : types_.FUNCTION,
405 xwalk.utils.checkPrivilegeAccess(xwalk.utils.privilege.HEALTHINFO);
407 _sensorListeners[this.sensorType].getData(args.successCallback, args.errorCallback);
410 ////////////////////// Sensor Data classes/////////////////////////////////////////////////////
411 ////Base SensorData class
412 var SensorData = function () {
416 var SensorLightData = function(data) {
417 SensorData.call(this);
418 Object.defineProperties(this, {
419 lightLevel : {value: data.lightLevel, writable: false, enumerable: true}
423 SensorLightData.prototype = new SensorData();
425 SensorLightData.prototype.constructor = SensorData;
427 _sensorListeners[SensorType.LIGHT] = new SensorListener(SensorType.LIGHT,
430 //// SensorMagneticData
431 var SensorMagneticData = function(data) {
432 SensorData.call(this);
433 Object.defineProperties(this, {
434 x : {value: data.x, writable: false, enumerable: true},
435 y : {value: data.y, writable: false, enumerable: true},
436 z : {value: data.z, writable: false, enumerable: true},
437 accuracy : {value: data.accuracy, writable: false, enumerable: true}
441 SensorMagneticData.prototype = new SensorData();
443 SensorMagneticData.prototype.constructor = SensorData;
445 _sensorListeners[SensorType.MAGNETIC] = new SensorListener(SensorType.MAGNETIC,
448 //// SensorPressureData
449 var SensorPressureData = function(data) {
450 SensorData.call(this);
451 Object.defineProperties(this, {
452 pressure : {value: data.pressure, writable: false, enumerable: true}
456 SensorPressureData.prototype = new SensorData();
458 SensorPressureData.prototype.constructor = SensorData;
460 _sensorListeners[SensorType.PRESSURE] = new SensorListener(SensorType.PRESSURE,
463 //// SensorProximityData
464 var SensorProximityData = function(data) {
465 SensorData.call(this);
466 Object.defineProperties(this, {
467 proximityState : {value: data.proximityState, writable: false, enumerable: true}
471 SensorProximityData.prototype = new SensorData();
473 SensorProximityData.prototype.constructor = SensorData;
475 _sensorListeners[SensorType.PROXIMITY] = new SensorListener(SensorType.PROXIMITY,
476 SensorProximityData);
478 //// SensorUltravioletData
479 var SensorUltravioletData = function(data) {
480 SensorData.call(this);
481 Object.defineProperties(this, {
482 ultravioletLevel : {value: data.ultravioletLevel, writable: false, enumerable: true}
487 SensorUltravioletData.prototype = new SensorData();
489 SensorUltravioletData.prototype.constructor = SensorData;
491 _sensorListeners[SensorType.ULTRAVIOLET] = new SensorListener(SensorType.ULTRAVIOLET,
492 SensorUltravioletData);
495 var SensorHRMRawData = function(data) {
496 SensorData.call(this);
497 Object.defineProperties(this, {
498 lightType : {value: data.lightType, writable: false, enumerable: true},
499 lightIntensity : {value: data.lightIntensity, writable: false, enumerable: true}
504 SensorHRMRawData.prototype = new SensorData();
506 SensorHRMRawData.prototype.constructor = SensorData;
508 _sensorListeners[SensorType.HRM_RAW] = new SensorListener(SensorType.HRM_RAW,
512 exports = new SensorService();