Fix the boiler plate codes
[platform/framework/native/appfw.git] / src / system / FSys_PowerManagerImpl.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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 /**
18  * @file                FSys_PowerManagerImpl.cpp
19  * @brief               This is the implementation file for _PowerManagerImpl class.
20  */
21
22 #include <unique_ptr.h>
23
24 #include <pmapi.h>
25 #include <power.h>
26 #include <device.h>
27 #include <runtime_info.h>
28 #include <vconf.h>
29
30 #include <FAppIActiveAppEventListener.h>
31 #include <FBaseSysLog.h>
32 #include <FBaseColArrayListT.h>
33 #include <FBaseColIMapEnumerator.h>
34 #include <FSysIBatteryEventListener.h>
35 #include <FSysIChargingEventListener.h>
36 #include <FSysIScreenEventListener.h>
37 #include <FSysIBootEventListener.h>
38 #include <FSys_IPowerManagerEventListener.h>
39
40 #include <FApp_AppImpl.h>
41 #include <FApp_AppInfo.h>
42 #include <FApp_AppManagerImpl.h>
43 #include <FBase_NativeError.h>
44 #include <FIo_AppServiceIpcMessages.h>
45 #include <FIo_IpcClient.h>
46 #include <FSys_Types.h>
47 #include <FSys_BatteryImpl.h>
48 #include <FSys_DeviceManagerImpl.h>
49 #include <FSys_PowerManagerImpl.h>
50
51 using namespace std;
52
53 using namespace Tizen::App;
54 using namespace Tizen::Base;
55 using namespace Tizen::Base::Collection;
56 using namespace Tizen::Io;
57
58 namespace Tizen { namespace System
59 {
60
61 static const int _DEVICE_CPU = 1;
62 static const int _DEVICE_POWER_LEVEL_ON = 1;
63 static const int _DEVICE_POWER_LEVEL_OFF = 0;
64 static const int _APPID_LENGTH = 10;
65 static const int _DEACTIVATED_BRIGHTNESS_CONTROL = -1;
66 static const float _BRIGHTNESS_RESOLUTION = 10.0;
67
68 #ifndef VCONFKEY_SERVICE_READY
69 #define VCONFKEY_SERVICE_READY  "memory/appservice/serviceready"
70 #endif
71
72 bool _activeApp = false;
73 bool _deviceCpuPowerOn = false;
74 bool _keepCpuAwake = false;
75 bool _keepScreenOnState = false;
76
77 IBatteryEventListener* pIBatteryEventListener = null;
78
79 ArrayListT<IScreenEventListener*>*      __pSceenEventList = null;
80 ArrayListT<IChargingEventListener*>*    __pChargingEventList = null;
81 ArrayListT<_IPowerManagerEventListener*>        __powerEventList;
82 ArrayListT<IBootEventListener*>*        __pBootEventList = null;
83
84 bool _PowerManagerImpl::_InitPowerManager = false;
85
86
87 class _ActiveEventListener
88         : public IActiveAppEventListener
89 {
90 public:
91         virtual void OnActiveAppChanged(const Tizen::App::AppId& appId);
92 };
93
94 void
95 _ActiveEventListener::OnActiveAppChanged(const Tizen::App::AppId& appId)
96 {
97         int ret = 0;
98         SysLog(NID_SYS, "Active App is %ls.", appId.GetPointer());
99
100         if(appId == _AppInfo::GetApplicationId())
101         {
102                 _activeApp = true;
103         }
104         else
105         {
106                 _activeApp = false;
107
108                 if (_keepScreenOnState == true) //In case of Screen power control, it has to be released automatically, when application goes deactive state.
109                 {
110                         ret = pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW);
111                         SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
112                         _keepScreenOnState = false;
113                 }
114
115                 if (_keepCpuAwake == true || _deviceCpuPowerOn == true) //In case of CPU power control, it has to be keep despite of deactive state.
116                 {
117                         ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
118                         SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
119                 }
120         }
121 }
122
123  _ActiveEventListener* pActiveEventListener = null;
124
125 void
126 BatteryLevelVConfCallback(keynode_t* node, void* userData)
127 {
128         SysLog(NID_SYS, "Battery Warn Level is changed");
129         BatteryLevel    batteryLevel;
130
131         if (strcmp(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, vconf_keynode_get_name(node)) == 0)
132         {
133                 int level = 0;
134                 if(vconf_get_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, &level) >= 0)
135                 {
136                         switch(level)
137                         {
138                         case VCONFKEY_SYSMAN_BAT_LEVEL_EMPTY:
139                                 batteryLevel = BATTERY_EMPTY;
140                                 break;
141                         case VCONFKEY_SYSMAN_BAT_LEVEL_CRITICAL:
142                                 batteryLevel = BATTERY_CRITICAL;
143                                 break;
144                         case VCONFKEY_SYSMAN_BAT_LEVEL_LOW:
145                                 batteryLevel = BATTERY_LOW;
146                                 break;
147                         case VCONFKEY_SYSMAN_BAT_LEVEL_HIGH:
148                                 batteryLevel = BATTERY_HIGH;
149                                 break;
150                         case VCONFKEY_SYSMAN_BAT_LEVEL_FULL:
151                                 batteryLevel = BATTERY_FULL;
152                                 break;
153                         default:
154                                 SysLogException(NID_SYS, E_SYSTEM, "Unavailable battery level is required.");
155                                 return;
156                         }
157                         _AppImpl* pAppImpl = _AppImpl::GetInstance();
158                         if(pAppImpl != null)
159                         {
160                                 SysLog(NID_SYS, "Battery Level event is forwarded");
161                                 pAppImpl->OnBatteryLevelChanged(batteryLevel);
162                         }
163                 }
164         }
165 }
166
167 void
168 DeviceBatteryCallback(int percent, void* userData)
169 {
170         SysLog(NID_SYS, "Battery Level is called %d", percent);
171
172         if (pIBatteryEventListener != null)
173         {
174                 pIBatteryEventListener->OnBatteryLevelChangedInPercentage(percent);
175         }
176 }
177
178 void
179 RuntimeInfoChangedCallback(runtime_info_key_e key, void* userData)
180 {
181         int ret = 0;
182
183         if(_AppInfo::GetAppState() == RUNNING)
184         {
185                 if (__pChargingEventList != null)
186                 {
187                         bool charging = false;
188                         ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, &charging);
189                         if (ret == 0)
190                         {
191                                 for(int i = 0; i < __pChargingEventList->GetCount(); i++)
192                                 {
193                                         result r = E_SUCCESS;
194                                         IChargingEventListener* pIChargingEventListener = null;
195
196                                         r = __pChargingEventList->GetAt(i, pIChargingEventListener);
197
198                                         if (IsFailed(r) == false)
199                                         {
200                                                 pIChargingEventListener->OnChargingStateChanged(charging);
201                                         }
202                                 }
203
204                         }
205                 }
206         }
207 }
208
209 void
210 PowerChangedCallback(power_state_e state, void* userData)
211 {
212         std::unique_ptr< IEnumeratorT<_IPowerManagerEventListener*> > pEnumerator(__powerEventList.GetEnumeratorN());
213         _IPowerManagerEventListener* pIPowerManagerEventListener = null;
214
215         if (__pSceenEventList != null)
216         {
217                 if (state == POWER_STATE_SCREEN_OFF)
218                 {
219                         for (int i = 0; i < __pSceenEventList->GetCount(); i++)
220                         {
221                                 IScreenEventListener* pIScreenEventListener = null;
222                                 result r = E_SUCCESS;
223                                 r = __pSceenEventList->GetAt(i, pIScreenEventListener);
224                                 if (IsFailed(r) == false)
225                                 {
226                                         pIScreenEventListener->OnScreenOff();
227                                 }
228                         }
229
230                         if(pEnumerator != null)
231                         {
232                                 while(pEnumerator->MoveNext() == E_SUCCESS)
233                                 {
234                                         pEnumerator->GetCurrent(pIPowerManagerEventListener);
235                                         if(pIPowerManagerEventListener != null)
236                                         {
237                                                 pIPowerManagerEventListener->OnScreenStateChanged(false);
238                                         }
239                                 }
240                         }
241                 }
242                 else if(state == POWER_STATE_NORMAL)
243                 {
244                         for (int i = 0; i < __pSceenEventList->GetCount(); i++)
245                         {
246                                 IScreenEventListener* pIScreenEventListener = null;
247                                 result r = E_SUCCESS;
248                                 r = __pSceenEventList->GetAt(i, pIScreenEventListener);
249                                 if (IsFailed(r) == false)
250                                 {
251                                         pIScreenEventListener->OnScreenOn();
252                                 }
253                         }
254
255                         if(pEnumerator != null)
256                         {
257                                 while(pEnumerator->MoveNext() == E_SUCCESS)
258                                 {
259                                         pEnumerator->GetCurrent(pIPowerManagerEventListener);
260                                         if(pIPowerManagerEventListener != null)
261                                         {
262                                                 pIPowerManagerEventListener->OnScreenStateChanged(true);
263                                         }
264                                 }
265                         }
266                 }
267         }
268 }
269
270 void
271 ScreenEventVConfCallback(keynode_t* node, void* userData)
272 {
273         int errorCode = 0;
274         int sysBrightness = 0;
275
276         if (__pSceenEventList == null)
277         {
278                 SysLogException(NID_SYS, E_SYSTEM, "SceenEventList is not initialized.");
279                 return;
280         }
281         errorCode = vconf_get_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, &sysBrightness);
282
283         if ( errorCode != 0)
284         {
285                 SysLogException(NID_SYS, E_SYSTEM, "It failed to get Screen brightness");
286                 return;
287         }
288
289         for (int i = 0; i < __pSceenEventList->GetCount(); i++)
290         {
291                 IScreenEventListener* pIScreenEventListener = null;
292                 __pSceenEventList->GetAt(i, pIScreenEventListener);
293                 if (pIScreenEventListener != null)
294                 {
295                         int brightness = -1;
296                         int maxBrightness = -1;
297                         int ret = device_get_max_brightness(0, &maxBrightness);
298                         if (ret != 0)
299                         {
300                                 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device max brightness");
301                                 maxBrightness = 100;
302                         }
303                         sysBrightness = (sysBrightness == 0) ? 1 : sysBrightness;
304                         brightness = (int)ceil(((_BRIGHTNESS_RESOLUTION / (float) maxBrightness)) * sysBrightness);
305                         pIScreenEventListener->OnScreenBrightnessChanged(brightness);
306                 }
307         }
308 }
309
310 _PowerManagerImpl::_PowerManagerImpl(void)
311 {
312 }
313
314 _PowerManagerImpl::~_PowerManagerImpl(void)
315 {
316 }
317
318 void
319 _PowerManagerImpl::Init()
320 {
321         if(_InitPowerManager == false)
322         {
323                 __powerEventList.Construct();
324                 pActiveEventListener = new (std::nothrow) _ActiveEventListener();
325                 _AppManagerImpl* pAppManager = _AppManagerImpl::GetInstance();
326                 pAppManager->AddActiveAppEventListener(*pActiveEventListener);
327                 _InitPowerManager = true;
328         }
329 }
330
331 void
332 _PowerManagerImpl::Term()
333 {
334         if(_InitPowerManager == true)
335         {
336                 _AppManagerImpl* pAppManager = _AppManagerImpl::GetInstance();
337                 pAppManager->RemoveActiveAppEventListener(*pActiveEventListener);
338                 delete(pActiveEventListener);
339                 pActiveEventListener = null;
340
341                 _InitPowerManager = false;
342         }
343 }
344
345 bool
346 _PowerManagerImpl::IsActive(void)
347 {
348         AppId appId;
349         result r = E_SUCCESS;
350         _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
351
352         if(pAppManagerImpl == null)
353         {
354                 _activeApp = false;
355         }
356         else
357         {
358                 r = pAppManagerImpl->GetActiveApp(appId);
359
360                 if(r == E_SUCCESS)
361                 {
362                         SysLog(NID_SYS, "current active is:%ls, required:%ls", appId.GetPointer(), _AppInfo::GetApplicationId().GetPointer());
363                         if(appId == _AppInfo::GetApplicationId())
364                         {
365                                 _activeApp = true;
366                         }
367                         else
368                         {
369                                 _activeApp = false;
370                         }
371                 }
372                 else
373                 {
374                         _activeApp = false;
375                 }
376         }
377         return _activeApp;
378 }
379
380 result
381 _PowerManagerImpl::KeepScreenOnState(bool keepOn, bool dimming)
382 {
383         int ret = -1;
384         unsigned int state = LCD_DIM;
385         _PowerManagerImpl::Init();
386
387         if (keepOn == true && IsActive() == true)
388         {
389                 if (dimming)
390                 {
391                         state = LCD_DIM;
392                 }
393                 else
394                 {
395                         state = LCD_NORMAL;
396                 }
397                 ret = pm_lock_state(state, GOTO_STATE_NOW, 0);
398                 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the screen state");
399                 _keepScreenOnState = true;
400         }
401         else
402         {
403                 ret = pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW);
404                 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the screen state");
405                 _keepScreenOnState = false;
406         }
407
408         SysLog(NID_SYS, "change screen power policy: keepOn(%d) and dimming(%d)", keepOn, dimming);
409
410         return E_SUCCESS;
411 }
412
413 result
414 _PowerManagerImpl::KeepCpuAwake(bool enable)
415 {
416         int ret = 0;
417         _PowerManagerImpl::Init();
418
419         if (enable)
420         {
421                 ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
422                 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
423                 _keepCpuAwake = true;
424         }
425         else
426         {
427                  if(_deviceCpuPowerOn == false)
428                 {
429                         ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
430                         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
431                 }
432                 _keepCpuAwake = false;
433         }
434
435         SysLog(NID_SYS, "change cpu power policy: keepAwake(%s)", enable ? "true" : "false");
436         return E_SUCCESS;
437 }
438
439 result
440 _PowerManagerImpl::InitBatteryEvent(void)
441 {
442         int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, BatteryLevelVConfCallback, null); 
443         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to set the battery event");
444
445         return E_SUCCESS;
446 }
447
448 result
449 _PowerManagerImpl::OnForeground(void)
450 {
451         return E_SUCCESS;
452 }
453
454 result
455 _PowerManagerImpl::OnBackground(void)
456 {
457         return E_SUCCESS;
458 }
459
460 result
461 _PowerManagerImpl::RestoreScreenBrightness(void)
462 {
463         result r = E_SUCCESS;
464
465         ArrayList requestMessage;
466         ArrayList responseMessage;
467
468         SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
469
470         unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
471         SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
472
473         r = pIpcClient->Construct(_COMMUNICATION_DISPATCHER_IPC_ID);
474         SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
475
476         requestMessage.Construct();
477         responseMessage.Construct();
478
479         String serviceId = _SYSTEM_SERVICE_ID;
480         String commandId = _SYSTEM_COMMAND_RESTORE_BRIGHTNESS;
481
482         requestMessage.Add(serviceId);
483         requestMessage.Add(commandId);
484
485         unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
486         SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
487
488         r = pIpcClient->SendRequest(pMsg.get());
489         SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
490
491         unique_ptr<String> pResult((String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA));
492
493         SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
494         SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
495
496         return E_SUCCESS;
497 }
498
499 result
500 _PowerManagerImpl::SetScreenBrightness(int brightness)
501 {
502         int ret = 0;
503         int maxBrightness = 0;
504         int actualBrightness = 0;
505         result r = E_SUCCESS;
506
507         SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
508         SysTryReturnResult(NID_SYS, (brightness > 0 && brightness < 11), E_OUT_OF_RANGE,
509                                           "[E_OUT_OF_RANGE] The specified brightness is out of range.");
510
511         SysLog(NID_SYS, "Set brightness (%d)", brightness);
512
513         ret = device_get_max_brightness(0, &maxBrightness);
514         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to get the device max brightness");
515
516         actualBrightness = maxBrightness * brightness / _BRIGHTNESS_RESOLUTION;
517
518         ArrayList requestMessage;
519         ArrayList responseMessage;
520
521         unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
522         SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
523
524         r = pIpcClient->Construct(_COMMUNICATION_DISPATCHER_IPC_ID);
525         SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
526
527         requestMessage.Construct();
528         responseMessage.Construct();
529
530         String serviceId = _SYSTEM_SERVICE_ID;
531         String commandId = _SYSTEM_COMMAND_CHANGE_BRIGHTNESS;
532         String brightnessValue;
533         brightnessValue.Append(actualBrightness);
534
535         requestMessage.Add(serviceId);
536         requestMessage.Add(commandId);
537         requestMessage.Add(brightnessValue);
538
539         unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
540         SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
541
542         r = pIpcClient->SendRequest(pMsg.get());
543         SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
544
545         unique_ptr<String> pResult((String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA));
546
547         SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
548         SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
549
550         return E_SUCCESS;
551 }
552
553 int
554 _PowerManagerImpl::GetScreenBrightness(void)
555 {
556         int ret = 0;
557         int brightness = -1;
558         int maxBrightness = -1;
559
560         ClearLastResult();
561
562         ret = device_get_brightness(0, &brightness);
563         if (ret != 0)
564         {
565                 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device brightness");
566                 SetLastResult(E_SYSTEM);
567                 return _DEACTIVATED_BRIGHTNESS_CONTROL;
568         }
569
570         if (brightness == 0)
571         {
572                 brightness = 1;
573         }
574
575         SysLog(NID_SYS, "System Brightness is %d", brightness);
576         ret = device_get_max_brightness(0, &maxBrightness);
577         if (ret != 0)
578         {
579                 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device max brightness");
580                 SetLastResult(E_SYSTEM);
581                 return _DEACTIVATED_BRIGHTNESS_CONTROL;
582         }
583         return ceil(((_BRIGHTNESS_RESOLUTION / (float) maxBrightness)) * brightness);
584 }
585
586 bool
587 _PowerManagerImpl::IsScreenOn(void)
588 {
589         power_state_e powerState = power_get_state();
590
591         if (powerState == POWER_STATE_SCREEN_OFF)
592         {
593                 return false;
594         }
595         else
596         {
597                 return true;
598         }
599 }
600
601 result
602 _PowerManagerImpl::TurnScreenOn(void)
603 {
604         result r = E_SUCCESS;
605         int ret = power_wakeup(true);
606         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to unlock the normal screen state");
607         ret = pm_change_state(LCD_NORMAL);
608         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to change to the normal screen state");
609
610         return r;
611 }
612
613 result
614 _PowerManagerImpl::TurnScreenOff(void)
615 {
616         result r = E_SUCCESS;
617         int ret = pm_change_state(LCD_OFF);
618
619         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to unlock the screen off screen state");
620
621         return r;
622 }
623
624 void
625 _PowerManagerImpl::SetScreenEventListener(IScreenEventListener& listener)
626 {
627         result r = E_SUCCESS;
628
629         r = AddScreenEventListener(listener, true);
630
631         if (IsFailed(r))
632         {
633                 SysLog(NID_SYS, "It failed to register ScreenEventListener");
634                 return;
635         }
636         SysLog(NID_SYS,"It successed to register ScreenEventListener");
637 }
638
639
640 result
641 _PowerManagerImpl::AddScreenEventListener(IScreenEventListener& listener, bool isSet)
642 {
643         result r = E_SUCCESS;
644
645         if (__pSceenEventList == null)
646         {
647                 std::unique_ptr< ArrayListT<IScreenEventListener*> > pSceenEventList(new ArrayListT<IScreenEventListener*>);
648                 SysTryReturnResult(NID_SYS, pSceenEventList, E_SYSTEM, "Memory allocation failed");
649                 pSceenEventList->Construct();
650                 int errorCode = 0;
651                 errorCode = vconf_notify_key_changed(VCONFKEY_PM_CURRENT_BRIGHTNESS, ScreenEventVConfCallback, null);
652                 SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener.");
653
654                 errorCode = power_set_changed_cb(PowerChangedCallback, null);
655                 SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener.");
656                 __pSceenEventList = pSceenEventList.release();
657                 SysLog(NID_SYS,"It successed to register power_set_changed_cb");
658         }
659
660         if (isSet == true && __pSceenEventList->GetCount() != 0)
661         {
662                 r = __pSceenEventList->SetAt(&listener, 0);
663         }
664         else
665         {
666                 r = __pSceenEventList->Add(&listener);
667         }
668         return r;
669 }
670
671
672 result
673 _PowerManagerImpl::RemoveScreenEventListener(IScreenEventListener& listener)
674 {
675         result r = E_SUCCESS;
676
677         SysTryReturnResult(NID_SYS,__pSceenEventList != null, E_OBJ_NOT_FOUND, "IScreenEventListener list is empty");
678
679         r = __pSceenEventList->Remove(&listener);
680
681         if (__pSceenEventList->GetCount() == 0)
682         {
683                 delete __pSceenEventList;
684                 __pSceenEventList = null;
685         }
686         return r;
687 }
688
689
690 void
691 _PowerManagerImpl::SetChargingEventListener(IChargingEventListener& listener)
692 {
693         result r = E_SUCCESS;
694
695         r = AddChargingEventListener(listener, true);
696
697         if (IsFailed(r))
698         {
699                 SysLog(NID_SYS, "It failed to register battery charging  event");
700                 return;
701         }
702 }
703
704
705 result
706 _PowerManagerImpl::AddChargingEventListener(IChargingEventListener& listener, bool isSet)
707 {
708         result r = E_SUCCESS;
709
710         if (__pChargingEventList == null)
711         {
712                 __pChargingEventList = new ArrayListT<IChargingEventListener*>;
713                 SysTryReturnResult(NID_SYS, __pChargingEventList, E_SYSTEM, "Memory allocation failed");
714                 __pChargingEventList->Construct();
715                 int errorCode = 0;
716                 errorCode = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, RuntimeInfoChangedCallback, null);
717                 if (errorCode != 0)
718                 {
719                         SysLog(NID_SYS, "It failed to register battery charging  event");
720                         delete __pChargingEventList;
721                         __pChargingEventList = null;
722                         return E_SYSTEM;
723                 }
724         }
725
726         if (isSet == false || __pChargingEventList->GetCount() == 0)
727         {
728                 r = __pChargingEventList->Add(&listener);
729         }
730         else
731         {
732                 r = __pChargingEventList->SetAt(&listener, 0);
733         }
734         return r;
735 }
736
737
738 result
739 _PowerManagerImpl::RemoveChargingEventListener(IChargingEventListener& listener)
740 {
741         result r = E_SUCCESS;
742
743         SysTryReturnResult(NID_SYS,__pChargingEventList != null, E_OBJ_NOT_FOUND, "__pChargingEventList list is empty");
744
745         r = __pChargingEventList->Remove(&listener);
746
747         if (__pChargingEventList->GetCount() == 0)
748         {
749                 delete __pChargingEventList;
750                 __pChargingEventList = null;
751         }
752         return r;
753 }
754
755 result
756 _PowerManagerImpl::SetBatteryEventListener(IBatteryEventListener* pListener)
757 {
758         int ret = 0;
759
760         if (pListener != null)
761         {
762
763                 if(pIBatteryEventListener == null)
764                 {
765                         ret = device_battery_set_cb(DeviceBatteryCallback, null);
766                         if (ret != 0)
767                         {
768                                 SysLog(NID_SYS, "It failed to register battery event");
769                         }
770                 }
771                 pIBatteryEventListener = pListener;
772         }
773         else
774         {
775                 pIBatteryEventListener = null;
776                 ret = device_battery_unset_cb();
777                 if (ret != 0)
778                 {
779                         SysLog(NID_SYS, "It failed to unregister battery event");
780                 }
781
782         }
783         return E_SUCCESS;
784 }
785
786 result
787 _PowerManagerImpl::PowerControl(int deviceId, int level)
788 {
789         int ret = 0;
790         if(deviceId == _DEVICE_CPU)
791         {
792                 if(level == _DEVICE_POWER_LEVEL_ON)
793                 {
794                         ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
795                         SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
796                         _deviceCpuPowerOn = true;
797
798                         return E_SUCCESS;
799                 }
800                 else if(level == _DEVICE_POWER_LEVEL_OFF)
801                 {
802                         if(_keepScreenOnState == false)
803                         {
804                                 ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
805                                 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
806                         }
807                         _deviceCpuPowerOn = false;
808                         return E_SUCCESS;
809                 }
810         }
811         return E_SYSTEM;
812 }
813
814 int
815 _PowerManagerImpl::GetCurrentBatteryLevelInPercentage(void)
816 {
817         int ret = 0;
818         int batteryLevel = 0;
819
820         ret = device_battery_get_percent(&batteryLevel);
821         if(ret != 0)
822         {
823                 SetLastResult(E_SYSTEM);
824         }
825
826         return batteryLevel;
827 }
828
829 BatteryLevel
830 _PowerManagerImpl::GetCurrentBatteryLevel(void)
831 {
832         int batteryLevel = 0;
833         BatteryLevel level = BATTERY_EMPTY;
834         int ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, &batteryLevel);
835         if(ret != 0)
836         {
837                 SysLogException(NID_SYS, E_SYSTEM, "It is failed to get battery level.");
838                 return level;
839         }
840
841         switch(batteryLevel)
842         {
843         case VCONFKEY_SYSMAN_BAT_LEVEL_FULL:
844                 level = BATTERY_LEVEL_FULL;
845                 break;
846         case VCONFKEY_SYSMAN_BAT_LEVEL_HIGH:
847                 level = BATTERY_LEVEL_HIGH;
848                 break;
849         case VCONFKEY_SYSMAN_BAT_LEVEL_LOW:
850                 level = BATTERY_LEVEL_LOW;
851                 break;
852         case VCONFKEY_SYSMAN_BAT_LEVEL_CRITICAL:
853                 level = BATTERY_LEVEL_CRITICAL;
854                 break;
855         default:
856                 level = BATTERY_LEVEL_EMPTY;
857                 break;
858         }
859
860         return level;
861 }
862
863 bool
864 _PowerManagerImpl::IsCharging(void)
865 {
866         bool chargeState = false;
867         int ret = 0;
868         ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, &chargeState);
869         if(ret != 0)
870         {
871                 SetLastResult(E_SYSTEM);
872                 return chargeState;
873         }
874
875         return chargeState;
876 }
877
878 result
879 _PowerManagerImpl::Add_IPowerManagerEventListener(_IPowerManagerEventListener* listener)
880 {
881         _PowerManagerImpl::Init();
882         __powerEventList.Add(listener);
883         return E_SUCCESS;
884 }
885
886 result
887 _PowerManagerImpl::Remove_IPowerManagerEventListener(_IPowerManagerEventListener* listener)
888 {
889         _PowerManagerImpl::Init();
890         __powerEventList.Remove(listener);
891         return E_SUCCESS;
892 }
893
894 static void
895 BootEventVconfCallback(keynode_t* node, void* userData)
896 {
897         if (__pBootEventList == null)
898         {
899                 SysLogException(NID_SYS, E_SYSTEM, "BootEventList is not initialized.");
900                 return;
901         }
902
903         int bootReady = -1;
904         const int errorCode = vconf_get_int(VCONFKEY_SERVICE_READY, &bootReady);
905
906         if (errorCode != 0)
907         {
908                 SysLogException(NID_SYS, E_SYSTEM, "It failed to get Boot event status");
909                 return;
910         }
911
912         std::unique_ptr< IEnumeratorT<IBootEventListener*> > pEnum(__pBootEventList->GetEnumeratorN());
913
914         if (pEnum.get())
915         {
916                 while (pEnum->MoveNext() == E_SUCCESS)
917                 {
918                         IBootEventListener* pListener = null;
919                         pEnum->GetCurrent(pListener);
920
921                         pListener->OnBootCompleted();
922                 }
923         }
924
925         SysLog(NID_SYS, "Finished invoking boot complete event listener.");
926 }
927
928 result
929 _PowerManagerImpl::AddBootEventListener(IBootEventListener& listener)
930 {
931         if (__pBootEventList == null)
932         {
933                 std::unique_ptr< ArrayListT<IBootEventListener*> > pBootEventList(new ArrayListT<IBootEventListener*>);
934                 SysTryReturnResult(NID_SYS, pBootEventList, E_SYSTEM, "Memory allocation failed");
935                 pBootEventList->Construct();
936
937                 int errorCode = 0;
938                 errorCode = vconf_notify_key_changed(VCONFKEY_SERVICE_READY, BootEventVconfCallback, null);
939                 SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add BootEvent listener.");
940
941                 __pBootEventList = pBootEventList.release();
942                 SysLog(NID_SYS, "It successed to register boot event listener.");
943         }
944
945         return __pBootEventList->Add(&listener);
946 }
947
948 result
949 _PowerManagerImpl::RemoveBootEventListener(IBootEventListener& listener)
950 {
951         result r = E_SUCCESS;
952
953         SysTryReturnResult(NID_SYS,__pBootEventList != null, E_OBJ_NOT_FOUND, "IBootEventListener list is empty");
954
955         r = __pBootEventList->Remove(&listener);
956
957         if (__pBootEventList->GetCount() == 0)
958         {
959                 delete __pBootEventList;
960                 __pBootEventList = null;
961         }
962
963         return E_SUCCESS;
964 }
965
966 _PowerManagerImpl*
967 _PowerManagerImpl::GetInstance(PowerManager& powerManager)
968 {
969         return powerManager.__pPowerManagerImpl;
970 }
971
972 const _PowerManagerImpl*
973 _PowerManagerImpl::GetInstance(const PowerManager& powerManager)
974 {
975         return powerManager.__pPowerManagerImpl;
976 }
977 } } //Tizen::System