[SystemInfo] Fix for systemInfo CameraFlash
[platform/core/api/webapi-plugins.git] / src / systeminfo / systeminfo_api.js
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 var validator_ = xwalk.utils.validator;
18 var privilege_ = xwalk.utils.privilege;
19 var types_ = validator_.Types;
20 var T_ = xwalk.utils.type;
21 var Converter_ = xwalk.utils.converter;
22 var native_ = new xwalk.utils.NativeManager(extension);
23
24 //enumeration SystemInfoPropertyId ////////////////////////////////////////////////////
25 var SystemInfoPropertyId = {
26         BATTERY : 'BATTERY',
27         CPU : 'CPU',
28         STORAGE : 'STORAGE',
29         DISPLAY : 'DISPLAY',
30         DEVICE_ORIENTATION : 'DEVICE_ORIENTATION',
31         BUILD : 'BUILD',
32         LOCALE : 'LOCALE',
33         NETWORK : 'NETWORK',
34         WIFI_NETWORK : 'WIFI_NETWORK',
35         ETHERNET_NETWORK : 'ETHERNET_NETWORK',
36         CELLULAR_NETWORK : 'CELLULAR_NETWORK',
37         SIM : 'SIM',
38         PERIPHERAL : 'PERIPHERAL',
39         MEMORY : 'MEMORY',
40         CAMERA_FLASH : 'CAMERA_FLASH'
41 };
42
43 //class SystemInfoDeviceCapability ////////////////////////////////////////////////////
44 function SystemInfoDeviceCapability(data) {
45     Object.defineProperties(this, {
46         bluetooth : {
47             value : data.bluetooth,
48             writable : false,
49             enumerable : true
50         },
51         nfc : {
52             value : data.nfc,
53             writable : false,
54             enumerable : true
55         },
56         nfcReservedPush : {
57             value : data.nfcReservedPush,
58             writable : false,
59             enumerable : true
60         },
61         multiTouchCount : {
62             value : Converter_.toOctet(data.multiTouchCount),
63             writable : false,
64             enumerable : true
65         },
66         inputKeyboard : {
67             value : data.inputKeyboard,
68             writable : false,
69             enumerable : true
70         },
71         inputKeyboardLayout : {
72             value : data.inputKeyboardLayout,
73             writable : false,
74             enumerable : true
75         },
76         wifi : {
77             value : data.wifi,
78             writable : false,
79             enumerable : true
80         },
81         wifiDirect : {
82             value : data.wifiDirect,
83             writable : false,
84             enumerable : true
85         },
86         opengles : {
87             value : data.opengles,
88             writable : false,
89             enumerable : true
90         },
91         openglestextureFormat : {
92             value : data.openglestextureFormat,
93             writable : false,
94             enumerable : true
95         },
96         openglesVersion1_1 : {
97             value : data.openglesVersion1_1,
98             writable : false,
99             enumerable : true
100         },
101         openglesVersion2_0 : {
102             value : data.openglesVersion2_0,
103             writable : false,
104             enumerable : true
105         },
106         fmRadio : {
107             value : data.fmRadio,
108             writable : false,
109             enumerable : true
110         },
111         platformVersion : {
112             get : function() {
113                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
114                 return data.platformVersion;
115             },
116             set : function() {},
117             enumerable : true
118         },
119         webApiVersion : {
120             get : function() {
121                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
122                 return data.webApiVersion;
123             },
124             set : function() {},
125             enumerable : true
126         },
127         nativeApiVersion : {
128             get : function() {
129                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
130                 return data.nativeApiVersion;
131             },
132             set : function() {},
133             enumerable : true
134         },
135         platformName : {
136             value : data.platformName,
137             writable : false,
138             enumerable : true
139         },
140         camera : {
141             value : data.camera,
142             writable : false,
143             enumerable : true
144         },
145         cameraFront : {
146             value : data.cameraFront,
147             writable : false,
148             enumerable : true
149         },
150         cameraFrontFlash : {
151             value : data.cameraFrontFlash,
152             writable : false,
153             enumerable : true
154         },
155         cameraBack : {
156             value : data.cameraBack,
157             writable : false,
158             enumerable : true
159         },
160         cameraBackFlash : {
161             value : data.cameraBackFlash,
162             writable : false,
163             enumerable : true
164         },
165         location : {
166             value : data.location,
167             writable : false,
168             enumerable : true
169         },
170         locationGps : {
171             value : data.locationGps,
172             writable : false,
173             enumerable : true
174         },
175         locationWps : {
176             value : data.locationWps,
177             writable : false,
178             enumerable : true
179         },
180         microphone : {
181             value : data.microphone,
182             writable : false,
183             enumerable : true
184         },
185         usbHost : {
186             value : data.usbHost,
187             writable : false,
188             enumerable : true
189         },
190         usbAccessory : {
191             value : data.usbAccessory,
192             writable : false,
193             enumerable : true
194         },
195         screenOutputRca : {
196             value : data.screenOutputRca,
197             writable : false,
198             enumerable : true
199         },
200         screenOutputHdmi : {
201             value : data.screenOutputHdmi,
202             writable : false,
203             enumerable : true
204         },
205         platformCoreCpuArch : {
206             value : data.platformCoreCpuArch,
207             writable : false,
208             enumerable : true
209         },
210         platformCoreFpuArch : {
211             value : data.platformCoreFpuArch,
212             writable : false,
213             enumerable : true
214         },
215         sipVoip : {
216             value : data.sipVoip,
217             writable : false,
218             enumerable : true
219         },
220         duid : {
221             value : data.duid,
222             writable : false,
223             enumerable : true
224         },
225         speechRecognition : {
226             value : data.speechRecognition,
227             writable : false,
228             enumerable : true
229         },
230         speechSynthesis : {
231             value : data.speechSynthesis,
232             writable : false,
233             enumerable : true
234         },
235         accelerometer : {
236             value : data.accelerometer,
237             writable : false,
238             enumerable : true
239         },
240         accelerometerWakeup : {
241             value : data.accelerometerWakeup,
242             writable : false,
243             enumerable : true
244         },
245         barometer : {
246             value : data.barometer,
247             writable : false,
248             enumerable : true
249         },
250         barometerWakeup : {
251             value : data.barometerWakeup,
252             writable : false,
253             enumerable : true
254         },
255         gyroscope : {
256             value : data.gyroscope,
257             writable : false,
258             enumerable : true
259         },
260         gyroscopeWakeup : {
261             value : data.gyroscopeWakeup,
262             writable : false,
263             enumerable : true
264         },
265         magnetometer : {
266             value : data.magnetometer,
267             writable : false,
268             enumerable : true
269         },
270         magnetometerWakeup : {
271             value : data.magnetometerWakeup,
272             writable : false,
273             enumerable : true
274         },
275         photometer : {
276             value : data.photometer,
277             writable : false,
278             enumerable : true
279         },
280         photometerWakeup : {
281             value : data.photometerWakeup,
282             writable : false,
283             enumerable : true
284         },
285         proximity : {
286             value : data.proximity,
287             writable : false,
288             enumerable : true
289         },
290         proximityWakeup : {
291             value : data.proximityWakeup,
292             writable : false,
293             enumerable : true
294         },
295         tiltmeter : {
296             value : data.tiltmeter,
297             writable : false,
298             enumerable : true
299         },
300         tiltmeterWakeup : {
301             value : data.tiltmeterWakeup,
302             writable : false,
303             enumerable : true
304         },
305         dataEncryption : {
306             value : data.dataEncryption,
307             writable : false,
308             enumerable : true
309         },
310         graphicsAcceleration : {
311             value : data.graphicsAcceleration,
312             writable : false,
313             enumerable : true
314         },
315         push : {
316             value : data.push,
317             writable : false,
318             enumerable : true
319         },
320         telephony : {
321             value : data.telephony,
322             writable : false,
323             enumerable : true
324         },
325         telephonyMms : {
326             value : data.telephonyMms,
327             writable : false,
328             enumerable : true
329         },
330         telephonySms : {
331             value : data.telephonySms,
332             writable : false,
333             enumerable : true
334         },
335         screenSizeNormal : {
336             value : data.screenSizeNormal,
337             writable : false,
338             enumerable : true
339         },
340         screenSize480_800 : {
341             value : data.screenSize480_800,
342             writable : false,
343             enumerable : true
344         },
345         screenSize720_1280 : {
346             value : data.screenSize720_1280,
347             writable : false,
348             enumerable : true
349         },
350         autoRotation : {
351             value : data.autoRotation,
352             writable : false,
353             enumerable : true
354         },
355         shellAppWidget : {
356             value : data.shellAppWidget,
357             writable : false,
358             enumerable : true
359         },
360         visionImageRecognition : {
361             value : data.visionImageRecognition,
362             writable : false,
363             enumerable : true
364         },
365         visionQrcodeGeneration : {
366             value : data.visionQrcodeGeneration,
367             writable : false,
368             enumerable : true
369         },
370         visionQrcodeRecognition : {
371             value : data.visionQrcodeRecognition,
372             writable : false,
373             enumerable : true
374         },
375         visionFaceRecognition : {
376             value : data.visionFaceRecognition,
377             writable : false,
378             enumerable : true
379         },
380         secureElement : {
381             value : data.secureElement,
382             writable : false,
383             enumerable : true
384         },
385         nativeOspCompatible : {
386             value : data.nativeOspCompatible,
387             writable : false,
388             enumerable : true
389         },
390         profile : {
391             value : data.profile,
392             writable : false,
393             enumerable : true
394         }
395     });
396 }
397
398 //class SystemInfoBattery ////////////////////////////////////////////////////
399 function SystemInfoBattery(data) {
400     Object.defineProperties(this, {
401         level : {
402             value : data.level,
403             writable : false,
404             enumerable : true
405         },
406         isCharging : {
407             value : data.isCharging,
408             writable : false,
409             enumerable : true
410         }
411     });
412 }
413
414 //class SystemInfoCpu ////////////////////////////////////////////////////
415 function SystemInfoCpu(data) {
416     Object.defineProperties(this, {
417         load : {
418             value: data.load,
419             writable: false,
420             enumerable: true
421         }
422     });
423 }
424
425 //class SystemInfoStorageUnit ////////////////////////////////////////////////////
426 function SystemInfoStorageUnit(data) {
427     Object.defineProperties(this, {
428         type : {
429             value: data.type,
430             writable: false,
431             enumerable: true
432         },
433         capacity : {
434             value: Converter_.toUnsignedLongLong(data.capacity),
435             writable: false,
436             enumerable: true
437         },
438         availableCapacity : {
439             value : Converter_.toUnsignedLongLong(data.availableCapacity),
440             writable : false,
441             enumerable : true
442         },
443         isRemovable : {
444             value : data.isRemovable,
445             writable : false,
446             enumerable : true
447         },
448         isRemoveable : {
449             value : data.isRemovable,
450             writable : false,
451             enumerable : true
452         }
453     });
454 }
455
456 //class SystemInfoStorage ////////////////////////////////////////////////////
457 function SystemInfoStorage(data) {
458     var len = data.storages.length;
459     var storageArray = new Array(len);
460     for (var i = 0; i < len; ++i) {
461         storageArray[i] = new SystemInfoStorageUnit(data.storages[i]);
462     }
463     Object.defineProperties(this, {
464         units : {
465             value: storageArray,
466             writable: false,
467             enumerable: true
468         }
469     });
470 }
471
472 //class SystemInfoDisplay ////////////////////////////////////////////////////
473 function SystemInfoDisplay(data) {
474     Object.defineProperties(this, {
475         resolutionWidth : {
476             value: Converter_.toUnsignedLong(data.resolutionWidth),
477             writable: false,
478             enumerable: true
479         },
480         resolutionHeight : {
481             value: Converter_.toUnsignedLong(data.resolutionHeight),
482             writable: false,
483             enumerable: true
484         },
485         dotsPerInchWidth : {
486             value: Converter_.toUnsignedLong(data.dotsPerInchWidth),
487             writable: false,
488             enumerable: true
489         },
490         dotsPerInchHeight : {
491             value: Converter_.toUnsignedLong(data.dotsPerInchHeight),
492             writable: false,
493             enumerable: true
494         },
495         physicalWidth : {
496             value: Number(data.physicalWidth),
497             writable: false,
498             enumerable: true
499         },
500         physicalHeight : {
501             value: Number(data.physicalHeight),
502             writable: false,
503             enumerable: true
504         },
505         brightness : {
506             value: Number(data.brightness),
507             writable: false,
508             enumerable: true
509         }
510     });
511 }
512
513 //class SystemInfoDeviceOrientation ////////////////////////////////////////////////////
514 function SystemInfoDeviceOrientation(data) {
515     Object.defineProperties(this, {
516         status : {value: data.status, writable: false, enumerable: true},
517         isAutoRotation : {value: data.isAutoRotation, writable: false, enumerable: true}
518     });
519 }
520
521 //class SystemInfoBuild ////////////////////////////////////////////////////
522 function SystemInfoBuild(data) {
523     Object.defineProperties(this, {
524         model : {value: data.model, writable: false, enumerable: true},
525         manufacturer : {value: data.manufacturer, writable: false, enumerable: true},
526         buildVersion : {value: data.buildVersion, writable: false, enumerable: true}
527     });
528 }
529
530 //class SystemInfoLocale ////////////////////////////////////////////////////
531 function SystemInfoLocale(data) {
532     Object.defineProperties(this, {
533         language : {value: data.language, writable: false, enumerable: true},
534         country : {value: data.country, writable: false, enumerable: true}
535     });
536 }
537 //class SystemInfoNetwork ////////////////////////////////////////////////////
538 function SystemInfoNetwork(data) {
539     Object.defineProperties(this, {
540         networkType : {value: data.networkType, writable: false, enumerable: true}
541     });
542 }
543
544 //class SystemInfoWifiNetwork ////////////////////////////////////////////////////
545 function SystemInfoWifiNetwork(data) {
546     Object.defineProperties(this, {
547         status : {value: data.status, writable: false, enumerable: true},
548         ssid : {value: data.ssid, writable: false, enumerable: true},
549         ipAddress : {value: data.ipAddress, writable: false, enumerable: true},
550         ipv6Address : {value: data.ipv6Address, writable: false, enumerable: true},
551         macAddress : {value: data.macAddress, writable: false, enumerable: true},
552         signalStrength : {value: Number(data.signalStrength), writable: false, enumerable: true}
553     });
554 }
555
556 //class SystemInfoEthernetNetwork ////////////////////////////////////////////////////
557 function SystemInfoEthernetNetwork(data) {
558     Object.defineProperties(this, {
559         cable : {value: data.cable, writable: false, enumerable: true},
560         status : {value: data.status, writable: false, enumerable: true},
561         ipAddress : {value: data.ipAddress, writable: false, enumerable: true},
562         ipv6Address : {value: data.ipv6Address, writable: false, enumerable: true},
563         macAddress : {value: data.macAddress, writable: false, enumerable: true},
564     });
565 }
566
567 //class SystemInfoCellularNetwork ////////////////////////////////////////////////////
568 function SystemInfoCellularNetwork(data) {
569     Object.defineProperties(this, {
570         status : {value: data.status, writable: false, enumerable: true},
571         apn : {value: data.apn, writable: false, enumerable: true},
572         ipAddress : {value: data.ipAddress, writable: false, enumerable: true},
573         ipv6Address : {value: data.ipv6Address, writable: false, enumerable: true},
574         mcc : {value: Number(data.mcc), writable: false, enumerable: true},
575         mnc : {value: Number(data.mnc), writable: false, enumerable: true},
576         cellId : {value: Number(data.cellId), writable: false, enumerable: true},
577         lac : {value: Number(data.lac), writable: false, enumerable: true},
578         isRoaming : {value: data.isRoaming, writable: false, enumerable: true},
579         isFlightMode : {value: data.isFligthMode, writable: false, enumerable: true},
580         imei : {
581             get: function() {
582                 xwalk.utils.checkPrivilegeAccess4Ver("2.3.1", privilege_.TELEPHONY, privilege_.SYSTEMMANAGER);
583                 return data.imei;
584             },
585             set: function() {},
586             enumerable: true
587         }
588     });
589 }
590
591 //class SystemInfoSIM ////////////////////////////////////////////////////
592 function SystemInfoSIM(data) {
593     Object.defineProperties(this, {
594         state : {
595             get: function() {
596                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
597                 return data.state;
598             },
599             set: function() {},
600             enumerable: true
601         },
602         operatorName : {
603             get: function() {
604                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
605                 return data.operatorName;
606             },
607             set: function() {},
608             enumerable: true
609         },
610         msisdn : {
611             get: function() {
612                 xwalk.utils.checkPrivilegeAccess4Ver("2.3.1", privilege_.TELEPHONY, privilege_.SYSTEMMANAGER);
613                 return data.msisdn;
614             },
615             set: function() {},
616             enumerable: true
617         },
618         iccid : {
619             get: function() {
620                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
621                 return data.iccid;
622             },
623             set: function() {},
624             enumerable: true
625         },
626         mcc : {
627             get: function() {
628                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
629                 return Number(data.mcc);
630             },
631             set: function() {},
632             enumerable: true
633         },
634         mnc : {
635             get: function() {
636                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
637                 return Number(data.mnc);
638             },
639             set: function() {},
640             enumerable: true
641         },
642         msin : {
643             get: function() {
644                 xwalk.utils.checkPrivilegeAccess4Ver("2.3.1", privilege_.TELEPHONY, privilege_.SYSTEMMANAGER);
645                 return data.msin;
646             },
647             set: function() {},
648             enumerable: true
649         },
650         spn : {
651             get: function() {
652                 xwalk.utils.checkPrivilegeAccess(privilege_.SYSTEM);
653                 return data.spn;
654             },
655             set: function() {},
656             enumerable: true
657         },
658     });
659 }
660
661 //class SystemInfoPeripheral ////////////////////////////////////////////////////
662 function SystemInfoPeripheral(data) {
663     Object.defineProperties(this, {
664         isVideoOutputOn : {value: data.isVideoOutputOn, writable: false, enumerable: true}
665     });
666 }
667
668 //class SystemInfoMemory ////////////////////////////////////////////////////
669 function SystemInfoMemory(data) {
670     Object.defineProperties(this, {
671         status : {value: data.state, writable: false, enumerable: true}
672     });
673 }
674
675 function SystemInfoCameraFlash(data) {
676   var getBrightness = function() {
677       xwalk.utils.checkPrivilegeAccess(privilege_.LED);
678
679       var result = native_.callSync('SystemInfo_getBrightness', {});
680       if (native_.isSuccess(result)) {
681         return Converter_.toLong(native_.getResultObject(result)) / this.levels;
682       }
683       return null;
684     };
685
686   var getLevels = function() {
687       xwalk.utils.checkPrivilegeAccess(privilege_.LED);
688
689       var result = native_.callSync('SystemInfo_getMaxBrightness', {});
690       if (native_.isSuccess(result)) {
691         return Converter_.toLong(native_.getResultObject(result));
692       }
693       return null;
694     };
695
696   Object.defineProperties(this, {
697         brightness : {set : function(){}, get: getBrightness, enumerable: true},
698         camera : {value: data.camera, enumerable: true},
699         levels : {get: getLevels, enumerable: true},
700     });
701 }
702
703 SystemInfoCameraFlash.prototype.setBrightness = function(brightness) {
704   xwalk.utils.checkPrivilegeAccess(privilege_.LED);
705
706   var args = validator_.validateArgs(arguments, [
707     {name: 'brightness', type: types_.DOUBLE}
708   ]);
709   args.brightness = args.brightness * this.levels;
710
711   var result = native_.callSync('SystemInfo_setBrightness', args);
712   if (native_.isFailure(result)) {
713     throw native_.getErrorObject(result);
714   }
715   this.brightness = result;
716 };
717
718 //class SystemInfo ////////////////////////////////////////////////////
719 var SystemInfo = function() {
720 };
721
722 SystemInfo.prototype.getCapabilities = function() {
723     var result = native_.callSync('SystemInfo_getCapabilities', {});
724     if (native_.isFailure(result)) {
725         throw native_.getErrorObject(result);
726     }
727     var devCap = new SystemInfoDeviceCapability(native_.getResultObject(result));
728     return devCap;
729 };
730
731 SystemInfo.prototype.getCapability = function() {
732     var args = validator_.validateArgs(arguments, [
733              {
734                  name : 'key',
735                  type : types_.STRING
736              }
737              ]);
738
739     var result = native_.callSync('SystemInfo_getCapability', {key: args.key});
740     if (native_.isFailure(result)) {
741         throw native_.getErrorObject(result);
742     }
743     var res = native_.getResultObject(result);
744     if (res.type === 'int') {
745         return Number(res.value);
746     } else {
747         return res.value;
748     }
749 };
750
751
752 var _createProperty = function (property, data) {
753     if (_propertyContainer[property]){
754         return new _propertyContainer[property].constructor(data);
755     } else {
756         throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Property with id: ' + property + ' is not supported.');
757     }
758 };
759
760 var _createPropertyArray = function (property, data) {
761     var jsonArray = data.array;
762     var propertyArray = [];
763     if (_propertyContainer[property]){
764         var arrayLength = jsonArray.length;
765         for (var i = 0; i < arrayLength; i++) {
766             propertyArray.push(new _propertyContainer[property].constructor(jsonArray[i]));
767         }
768     } else {
769         throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Property with id: ' + property + ' is not supported.');
770     }
771     return propertyArray;
772 };
773
774
775 var getPropertyFunction = function(cppLabel, objectCreateFunction) {
776     return function() {
777         if (arguments[0] === "CELLULAR_NETWORK") {
778             xwalk.utils.checkPrivilegeAccess4Ver("2.4", privilege_.TELEPHONY);
779         }
780
781         var args = validator_.validateArgs(arguments, [
782                  {
783                      name : 'property',
784                      type : types_.ENUM,
785                      values : T_.getValues(SystemInfoPropertyId)
786                  },
787                  {
788                      name : 'successCallback',
789                      type : types_.FUNCTION
790                  },
791                  {
792                      name : 'errorCallback',
793                      type : types_.FUNCTION,
794                      optional : true,
795                      nullable : true
796                  }
797                  ]);
798         var propObject = _propertyContainer[args.property];
799         if (!propObject) {
800             throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Property with id: ' + args.property + ' is not supported.');
801         }
802         var callback = function(result) {
803             if (native_.isFailure(result)) {
804                 setTimeout(function() {
805                     native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
806                 }, 0);
807             } else {
808                 var resultProp = objectCreateFunction(args.property, native_.getResultObject(result));
809                 args.successCallback(resultProp);
810             }
811         };
812         native_.call(cppLabel, {property: args.property}, callback);
813     };
814 }
815
816 SystemInfo.prototype.getPropertyValue =
817     getPropertyFunction('SystemInfo_getPropertyValue', _createProperty);
818
819 SystemInfo.prototype.getPropertyValueArray =
820     getPropertyFunction('SystemInfo_getPropertyValueArray', _createPropertyArray);
821
822
823 //SystemInfo helpers ///////////////////////////////////////////////////
824 var _batteryStr = SystemInfoPropertyId.BATTERY;
825 var _cpuStr = SystemInfoPropertyId.CPU;
826 var _storageStr = SystemInfoPropertyId.STORAGE;
827 var _displayStr = SystemInfoPropertyId.DISPLAY;
828 var _deviceOrientationStr = SystemInfoPropertyId.DEVICE_ORIENTATION;
829 //var _buildStr = SystemInfoPropertyId.BUILD;
830 var _localeStr = SystemInfoPropertyId.LOCALE;
831 var _networkStr = SystemInfoPropertyId.NETWORK;
832 var _wifiNetworkStr = SystemInfoPropertyId.WIFI_NETWORK;
833 var _ethernetNetworkStr = SystemInfoPropertyId.ETHERNET_NETWORK;
834 var _cellularNetworkStr = SystemInfoPropertyId.CELLULAR_NETWORK;
835 var _simStr = SystemInfoPropertyId.SIM;
836 var _peripheralStr = SystemInfoPropertyId.PERIPHERAL;
837 var _memoryStr = SystemInfoPropertyId.MEMORY;
838 var _cameraFlashStr = SystemInfoPropertyId.CAMERA_FLASH;
839
840 var _nextId = 0;
841
842
843 function _systeminfoBatteryListenerCallback(eventObj) {
844     var property = _batteryStr;
845     var callbacks = _propertyContainer[property].callbacks;
846
847     for (var watchId in callbacks) {
848         if (callbacks.hasOwnProperty(watchId)) {
849             var listener = callbacks[watchId];
850             var executeCall = (T_.isUndefined(listener.lowThreshold) ||
851                     (propObj.level <= listener.lowThreshold)) ||
852                     (T_.isUndefined(listener.highThreshold) ||
853                             (propObj.level >= listener.highThreshold));
854             var propObj = !listener.isArrayType ?
855                     _createProperty(property, eventObj.result.array[0]) :
856                         _createPropertyArray(property, eventObj.result);
857             if (executeCall) {
858                 listener.callback(propObj);
859             }
860         }
861     }
862 }
863
864 function _systeminfoCpuListenerCallback(eventObj) {
865     var property = _cpuStr;
866     var callbacks = _propertyContainer[property].callbacks;
867
868     for (var watchId in callbacks) {
869         if (callbacks.hasOwnProperty(watchId)) {
870             var listener = callbacks[watchId];
871             var propObj = !listener.isArrayType ?
872                     _createProperty(property, eventObj.result.array[0]) :
873                         _createPropertyArray(property, eventObj.result);
874             var executeCall = (T_.isUndefined(listener.lowThreshold) ||
875                     (propObj.load <= listener.lowThreshold)) ||
876                     (T_.isUndefined(listener.highThreshold) ||
877                             (propObj.load >= listener.highThreshold));
878             if (executeCall) {
879                 listener.callback(propObj);
880             }
881         }
882     }
883 }
884
885 function _systeminfoStorageListenerCallback(eventObj) {
886     var property = _storageStr;
887     var callbacks = _propertyContainer[property].callbacks;
888
889     for (var watchId in callbacks) {
890         if (callbacks.hasOwnProperty(watchId)) {
891             var listener = callbacks[watchId];
892             var propObj = !listener.isArrayType ?
893                     _createProperty(property, eventObj.result.array[0]) :
894                         _createPropertyArray(property, eventObj.result);
895             callbacks[watchId].callback(propObj);
896         }
897     }
898 }
899
900 function _systeminfoDisplayListenerCallback(eventObj) {
901     var property = _displayStr;
902     var callbacks = _propertyContainer[property].callbacks;
903
904     for (var watchId in callbacks) {
905         if (callbacks.hasOwnProperty(watchId)) {
906             var listener = callbacks[watchId];
907             var propObj = !listener.isArrayType ?
908                     _createProperty(property, eventObj.result.array[0]) :
909                         _createPropertyArray(property, eventObj.result);
910             var executeCall = (T_.isUndefined(listener.lowThreshold) ||
911                     (propObj.brightness <= listener.lowThreshold)) ||
912                     (T_.isUndefined(listener.highThreshold) ||
913                             (propObj.brightness >= listener.highThreshold));
914             if (executeCall) {
915                 listener.callback(propObj);
916             }
917         }
918     }
919 }
920
921 function _systeminfoDeviceOrientationListenerCallback(eventObj) {
922     var property = _deviceOrientationStr;
923     var callbacks = _propertyContainer[property].callbacks;
924
925     for (var watchId in callbacks) {
926         if (callbacks.hasOwnProperty(watchId)) {
927             var listener = callbacks[watchId];
928             var propObj = !listener.isArrayType ?
929                     _createProperty(property, eventObj.result.array[0]) :
930                         _createPropertyArray(property, eventObj.result);
931             callbacks[watchId].callback(propObj);
932         }
933     }
934 }
935
936 function _systeminfoLocaleListenerCallback(eventObj) {
937     var property = _localeStr;
938     var callbacks = _propertyContainer[property].callbacks;
939
940     for (var watchId in callbacks) {
941         if (callbacks.hasOwnProperty(watchId)) {
942             var listener = callbacks[watchId];
943             var propObj = !listener.isArrayType ?
944                     _createProperty(property, eventObj.result.array[0]) :
945                         _createPropertyArray(property, eventObj.result);
946             callbacks[watchId].callback(propObj);
947         }
948     }
949 }
950
951 function _systeminfoNetworkListenerCallback(eventObj) {
952     var property = _networkStr;
953     var callbacks = _propertyContainer[property].callbacks;
954
955     for (var watchId in callbacks) {
956         if (callbacks.hasOwnProperty(watchId)) {
957             var listener = callbacks[watchId];
958             var propObj = !listener.isArrayType ?
959                     _createProperty(property, eventObj.result.array[0]) :
960                         _createPropertyArray(property, eventObj.result);
961             callbacks[watchId].callback(propObj);
962         }
963     }
964 }
965
966 function _systeminfoWifiNetworkListenerCallback(eventObj) {
967     var property = _wifiNetworkStr;
968     var callbacks = _propertyContainer[property].callbacks;
969
970     for (var watchId in callbacks) {
971         if (callbacks.hasOwnProperty(watchId)) {
972             var listener = callbacks[watchId];
973             var propObj = !listener.isArrayType ?
974                     _createProperty(property, eventObj.result.array[0]) :
975                         _createPropertyArray(property, eventObj.result);
976             callbacks[watchId].callback(propObj);
977         }
978     }
979 }
980
981 function _systeminfoEthernetNetworkListenerCallback(eventObj) {
982   var property = _ethernetNetworkStr;
983   var callbacks = _propertyContainer[property].callbacks;
984
985   for (var watchId in callbacks) {
986       if (callbacks.hasOwnProperty(watchId)) {
987           var listener = callbacks[watchId];
988           var propObj = !listener.isArrayType ?
989                   _createProperty(property, eventObj.result.array[0]) :
990                       _createPropertyArray(property, eventObj.result);
991           callbacks[watchId].callback(propObj);
992       }
993   }
994 }
995
996 function _systeminfoCellularNetworkListenerCallback(eventObj) {
997     var property = _cellularNetworkStr;
998     var callbacks = _propertyContainer[property].callbacks;
999
1000     for (var watchId in callbacks) {
1001         if (callbacks.hasOwnProperty(watchId)) {
1002             var listener = callbacks[watchId];
1003             var propObj = !listener.isArrayType ?
1004                     _createProperty(property, eventObj.result.array[0]) :
1005                         _createPropertyArray(property, eventObj.result);
1006             callbacks[watchId].callback(propObj);
1007         }
1008     }
1009 }
1010
1011 function _systeminfoSimListenerCallback(eventObj) {
1012     var property = _simStr;
1013     var callbacks = _propertyContainer[property].callbacks;
1014
1015     for (var watchId in callbacks) {
1016         if (callbacks.hasOwnProperty(watchId)) {
1017             var listener = callbacks[watchId];
1018             var propObj = !listener.isArrayType ?
1019                     _createProperty(property, eventObj.result.array[0]) :
1020                         _createPropertyArray(property, eventObj.result);
1021             callbacks[watchId].callback(propObj);
1022         }
1023     }
1024 }
1025
1026 function _systeminfoPeripheralListenerCallback(eventObj) {
1027     var property = _peripheralStr;
1028     var callbacks = _propertyContainer[property].callbacks;
1029
1030     for (var watchId in callbacks) {
1031         if (callbacks.hasOwnProperty(watchId)) {
1032             var listener = callbacks[watchId];
1033             var propObj = !listener.isArrayType ?
1034                     _createProperty(property, eventObj.result.array[0]) :
1035                         _createPropertyArray(property, eventObj.result);
1036             callbacks[watchId].callback(propObj);
1037         }
1038     }
1039 }
1040
1041 function _systeminfoMemoryListenerCallback(eventObj) {
1042     var property = _memoryStr;
1043     var callbacks = _propertyContainer[property].callbacks;
1044
1045     for (var watchId in callbacks) {
1046         if (callbacks.hasOwnProperty(watchId)) {
1047             var listener = callbacks[watchId];
1048             var propObj = !listener.isArrayType ?
1049                     _createProperty(property, eventObj.result.array[0]) :
1050                         _createPropertyArray(property, eventObj.result);
1051             callbacks[watchId].callback(propObj);
1052         }
1053     }
1054 }
1055
1056 function  _systeminfoCameraFlashListenerCallback(eventObj) {
1057     var property = _cameraFlashStr;
1058     var callbacks = _propertyContainer[property].callbacks;
1059
1060     for (var watchId in callbacks) {
1061         if (callbacks.hasOwnProperty(watchId)) {
1062             var listener = callbacks[watchId];
1063             var propObj = !listener.isArrayType ?
1064                     _createProperty(property, eventObj.result.array[0]) :
1065                         _createPropertyArray(property, eventObj.result);
1066             callbacks[watchId].callback(propObj);
1067         }
1068     }
1069 }
1070
1071 var _propertyContainer = {
1072         'BATTERY' : {
1073             callbacks : {},
1074             constructor : SystemInfoBattery,
1075             broadcastFunction : _systeminfoBatteryListenerCallback,
1076             signalLabel : 'SystemInfoBatteryChangeBroadcast'
1077         },
1078         'CPU' : {
1079             callbacks : {},
1080             constructor : SystemInfoCpu,
1081             broadcastFunction : _systeminfoCpuListenerCallback,
1082             signalLabel : 'SystemInfoCpuChangeBroadcast'
1083         },
1084         'STORAGE' : {
1085             callbacks : {},
1086             constructor : SystemInfoStorage,
1087             broadcastFunction : _systeminfoStorageListenerCallback,
1088             signalLabel : 'SystemInfoStorageChangeBroadcast'
1089         },
1090         'DISPLAY' : {
1091             callbacks : {},
1092             constructor : SystemInfoDisplay,
1093             broadcastFunction : _systeminfoDisplayListenerCallback,
1094             signalLabel : 'SystemInfoDisplayChangeBroadcast'
1095         },
1096         'DEVICE_ORIENTATION' : {
1097             callbacks : {},
1098             constructor : SystemInfoDeviceOrientation,
1099             broadcastFunction : _systeminfoDeviceOrientationListenerCallback,
1100             signalLabel : 'SystemInfoDeviceOrientationChangeBroadcast'
1101         },
1102         'BUILD' : {
1103             callbacks : {}, //adding callbacks for build is not possible
1104             constructor : SystemInfoBuild,
1105             broadcastFunction : function(){},
1106             signalLabel : ''
1107         },
1108         'LOCALE' : {
1109             callbacks : {},
1110             constructor : SystemInfoLocale,
1111             broadcastFunction : _systeminfoLocaleListenerCallback,
1112             signalLabel : 'SystemInfoLocaleChangeBroadcast'
1113         },
1114         'NETWORK' : {
1115             callbacks : {},
1116             constructor : SystemInfoNetwork,
1117             broadcastFunction : _systeminfoNetworkListenerCallback,
1118             signalLabel : 'SystemInfoNetworkChangeBroadcast'
1119         },
1120         'WIFI_NETWORK' : {
1121             callbacks : {},
1122             constructor : SystemInfoWifiNetwork,
1123             broadcastFunction : _systeminfoWifiNetworkListenerCallback,
1124             signalLabel : 'SystemInfoWifiNetworkChangeBroadcast'
1125         },
1126         'ETHERNET_NETWORK' : {
1127             callbacks : {},
1128             constructor : SystemInfoEthernetNetwork,
1129             broadcastFunction : _systeminfoEthernetNetworkListenerCallback,
1130             signalLabel : 'SystemInfoEthernetNetworkChangeBroadcast'
1131         },
1132         'CELLULAR_NETWORK' : {
1133             callbacks : {},
1134             constructor : SystemInfoCellularNetwork,
1135             broadcastFunction : _systeminfoCellularNetworkListenerCallback,
1136             signalLabel : 'SystemInfoCellularNetworkChangeBroadcast'
1137         },
1138         'SIM' : {
1139             callbacks : {},
1140             constructor : SystemInfoSIM,
1141             broadcastFunction : _systeminfoSimListenerCallback,
1142             signalLabel : 'SystemInfoSimChangeBroadcast'
1143         },
1144         'PERIPHERAL' : {
1145             callbacks : {},
1146             constructor : SystemInfoPeripheral,
1147             broadcastFunction : _systeminfoPeripheralListenerCallback,
1148             signalLabel : 'SystemInfoPeripheralChangeBroadcast'
1149         },
1150         'MEMORY' : {
1151             callbacks : {},
1152             constructor : SystemInfoMemory,
1153             broadcastFunction : _systeminfoMemoryListenerCallback,
1154             signalLabel : 'SystemInfoMemoryChangeBroadcast'
1155         },
1156         'CAMERA_FLASH' : {
1157             callbacks : {},
1158             constructor : SystemInfoCameraFlash,
1159             broadcastFunction : _systeminfoCameraFlashListenerCallback,
1160             signalLabel : 'SystemInfoCameraFlashChangeBroadcast'
1161     }
1162 };
1163
1164 /// It common function to be called when listener would be triggered
1165
1166 var _listenerFunction = function(msg) {
1167     var propertyId = msg.propertyId;
1168     if (propertyId) {
1169         _propertyContainer[propertyId].broadcastFunction(msg);
1170     } else {
1171         console.log("No propertyId provided - ignoring");
1172     }
1173 }
1174 native_.addListener("SysteminfoCommonListenerLabel", _listenerFunction);
1175
1176 var _registerListener = function (property, listener, errorCallback) {
1177     var watchId;
1178     var result={};
1179
1180     var propObject = _propertyContainer[property];
1181     if (!propObject) {
1182         throw new WebAPIException(WebAPIException.TYPE_MISMATCH_ERR, 'Property with id: ' + property + ' is not supported.');
1183     }
1184     var callbackBroadcastFunction = propObject.broadcastFunction;
1185     var signalLabel = propObject.signalLabel;
1186     var callbacksMap = propObject.callbacks;
1187
1188     var fail = false;
1189     if (T_.isEmptyObject(callbacksMap)) {
1190         //registration in C++ layer
1191         result = native_.callSync(
1192                 'SystemInfo_addPropertyValueChangeListener',
1193                 {property: Converter_.toString(property)});
1194         fail = native_.isFailure(result);
1195         if (native_.isFailure(result)) {
1196             setTimeout(function() {
1197                 native_.callIfPossible(errorCallback, native_.getErrorObject(result));
1198             }, 0);
1199         }
1200     }
1201     if (!fail){
1202         watchId = ++_nextId;
1203         callbacksMap[watchId] = listener;
1204     }
1205
1206     return Converter_.toUnsignedLong(watchId);
1207 };
1208
1209 var _identifyListener = function (watchId) {
1210     for (var p in _propertyContainer) {
1211         if (_propertyContainer[p].callbacks[watchId]) {
1212             return p;
1213         }
1214     }
1215     throw new WebAPIException(WebAPIException.INVALID_VALUES_ERR, 'Listener with id: ' + watchId + ' does not exist.');
1216 };
1217
1218 var _unregisterListener = function (watchId, isTimeout) {
1219     var property = {};
1220     try {
1221         property = _identifyListener(watchId);
1222     } catch (e) {
1223         // if it is "auto" timeout call it should not throw an exception
1224         if (isTimeout) {
1225             console.log('Listener was already deleted');
1226             return;
1227         }
1228         throw e;
1229     }
1230
1231     var propObject = _propertyContainer[property];
1232     var result={};
1233
1234     var callbackBroadcastFunction = propObject.broadcastFunction;
1235     var signalLabel = propObject.signalLabel;
1236     var callbacksMap = propObject.callbacks;
1237
1238     delete callbacksMap[Number(watchId)];
1239     if (T_.isEmptyObject(callbacksMap)) {
1240         //unregistration in C++ layer
1241         result = native_.callSync(
1242                 'SystemInfo_removePropertyValueChangeListener',
1243                 {property: Converter_.toString(property)});
1244         if (native_.isFailure(result)) {
1245             throw native_.getErrorObject(result);
1246         }
1247     }
1248 };
1249
1250 var getListenerFunction = function (isArray) {
1251     return function() {
1252         if (arguments[0] === "CELLULAR_NETWORK") {
1253             xwalk.utils.checkPrivilegeAccess4Ver("2.4", privilege_.TELEPHONY);
1254         }
1255         var args = validator_.validateArgs(arguments, [
1256                  {
1257                      name : 'property',
1258                      type : types_.ENUM,
1259                      values : T_.getValues(SystemInfoPropertyId)
1260                  },
1261                  {
1262                      name : 'successCallback',
1263                      type : types_.FUNCTION
1264                  },
1265                  {
1266                      name : 'options',
1267                      type : types_.DICTIONARY,
1268                      optional : true,
1269                      nullable : true
1270                  },
1271                  {
1272                      name : 'errorCallback',
1273                      type : types_.FUNCTION,
1274                      optional : true,
1275                      nullable : true
1276                  }
1277                  ]);
1278
1279         var listener = {
1280                 callback      : args.successCallback,
1281                 isArrayType     : isArray,
1282                 highThreshold : !T_.isNullOrUndefined(args.options) ?
1283                         args.options.highThreshold : undefined,
1284                 lowThreshold  : !T_.isNullOrUndefined(args.options) ?
1285                         args.options.lowThreshold : undefined
1286         };
1287         var watchId = _registerListener(args.property, listener, args.errorCallback);
1288
1289         var timeout = !T_.isNullOrUndefined(args.options) ? args.options.timeout : undefined;
1290         if (!T_.isUndefined(timeout) ){
1291             setTimeout(function(){_unregisterListener(watchId, true);}, timeout);
1292         }
1293
1294         return watchId;
1295     };
1296 };
1297
1298 SystemInfo.prototype.addPropertyValueChangeListener = getListenerFunction(false);
1299
1300 SystemInfo.prototype.addPropertyValueArrayChangeListener = getListenerFunction(true);
1301
1302 SystemInfo.prototype.removePropertyValueChangeListener = function() {
1303     var args = validator_.validateArgs(arguments, [
1304              {
1305                  name : 'watchId',
1306                  type : types_.UNSIGNED_LONG
1307              }
1308              ]);
1309
1310     _unregisterListener(args.watchId, false);
1311 };
1312
1313 SystemInfo.prototype.getTotalMemory = function() {
1314     var result = native_.callSync('SystemInfo_getTotalMemory', {});
1315     if (native_.isFailure(result)) {
1316         throw native_.getErrorObject(result);
1317     }
1318     return native_.getResultObject(result).totalMemory;
1319 };
1320
1321 SystemInfo.prototype.getAvailableMemory = function() {
1322     var result = native_.callSync('SystemInfo_getAvailableMemory', {});
1323     if (native_.isFailure(result)) {
1324         throw native_.getErrorObject(result);
1325     }
1326     return native_.getResultObject(result).availableMemory;
1327 };
1328
1329 SystemInfo.prototype.getCount = function() {
1330     var args = validator_.validateArgs(arguments, [
1331              {
1332                  name : 'property',
1333                  type : types_.ENUM,
1334                  values : T_.getValues(SystemInfoPropertyId)
1335              }
1336              ]);
1337
1338     var result = native_.callSync('SystemInfo_getCount', {property: args.property});
1339     if (native_.isFailure(result)) {
1340         throw native_.getErrorObject(result);
1341     }
1342     var res = native_.getResultObject(result);
1343     return Number(res.count);
1344 };
1345
1346 //Exports
1347 exports = new SystemInfo();