2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
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.
18 * @file FSys_PowerManagerImpl.cpp
19 * @brief This is the implementation file for _PowerManagerImpl class.
22 #include <unique_ptr.h>
27 #include <runtime_info.h>
31 #include <FAppIActiveAppEventListener.h>
32 #include <FBaseSysLog.h>
33 #include <FBaseColArrayListT.h>
34 #include <FBaseColIMapEnumerator.h>
35 #include <FSysIBatteryEventListener.h>
36 #include <FSysIChargingEventListener.h>
37 #include <FSysIScreenEventListener.h>
38 #include <FSysIBootEventListener.h>
39 #include <FSys_IPowerManagerEventListener.h>
41 #include <FApp_AppImpl.h>
42 #include <FApp_AppInfo.h>
43 #include <FApp_AppManagerImpl.h>
44 #include <FBase_NativeError.h>
45 #include <FIo_AppServiceIpcMessages.h>
46 #include <FIo_IpcClient.h>
47 #include <FSys_Types.h>
48 #include <FSys_BatteryImpl.h>
49 #include <FSys_DeviceManagerImpl.h>
50 #include <FSys_PowerManagerImpl.h>
54 using namespace Tizen::App;
55 using namespace Tizen::Base;
56 using namespace Tizen::Base::Collection;
57 using namespace Tizen::Io;
59 namespace Tizen { namespace System
62 static const int _DEVICE_CPU = 1;
63 static const int _DEVICE_POWER_LEVEL_ON = 1;
64 static const int _DEVICE_POWER_LEVEL_OFF = 0;
65 static const int _DEACTIVATED_BRIGHTNESS_CONTROL = -1;
66 static const float _BRIGHTNESS_RESOLUTION = 10.0;
67 static const wchar_t* POWER_MANAGER_SERVICE_ID = L"osp.sys.ipcserver.powermanager";
69 #ifndef VCONFKEY_SERVICE_READY
70 #define VCONFKEY_SERVICE_READY "memory/deviced/boot_power_on"
73 bool _activeApp = false;
74 unsigned int _dimmingFlag = GOTO_STATE_NOW;
75 unsigned int _screenOnState = LCD_DIM;
76 bool _deviceCpuPowerOn = false;
77 bool _keepCpuAwake = false;
78 bool _keepScreenOnState = false;
80 IBatteryEventListener* pIBatteryEventListener = null;
82 ArrayListT<IScreenEventListener*>* __pSceenEventList = null;
83 ArrayListT<IChargingEventListener*>* __pChargingEventList = null;
84 ArrayListT<_IPowerManagerEventListener*> __powerEventList;
85 ArrayListT<IBootEventListener*>* __pBootEventList = null;
87 bool _PowerManagerImpl::_InitPowerManager = false;
90 class _ActiveEventListener
91 : public IActiveAppEventListener
94 virtual void OnActiveAppChanged(const Tizen::App::AppId& appId);
98 _ActiveEventListener::OnActiveAppChanged(const Tizen::App::AppId& appId)
101 SysLog(NID_SYS, "Active App is %ls. GetApp id %ls", appId.GetPointer(), _AppInfo::GetApplicationId().GetPointer());
103 if(appId == _AppInfo::GetApplicationId())
106 if (_keepScreenOnState == true)
109 ret = pm_lock_state(_screenOnState, _dimmingFlag, 0);
110 SysTryReturnVoidResult(NID_SYS, ret == 0,E_SYSTEM, "[E_SYSTEM] It failed to lock the screen state. error code [%d]", ret);
111 SysLog(NID_SYS, "Screen on state is recoveryed.");
118 if (_keepScreenOnState == true) //In case of Screen power control, it has to be released automatically, when application goes deactive state.
120 ret = pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW);
121 SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
124 if (_keepCpuAwake == true || _deviceCpuPowerOn == true) //In case of CPU power control, it has to be keep despite of deactive state.
126 ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
127 SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
132 _ActiveEventListener* pActiveEventListener = null;
135 BatteryLevelVConfCallback(keynode_t* node, void* userData)
137 SysLog(NID_SYS, "Battery Warn Level is changed");
138 BatteryLevel batteryLevel;
140 if (strcmp(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, vconf_keynode_get_name(node)) == 0)
143 if(vconf_get_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, &level) >= 0)
147 case VCONFKEY_SYSMAN_BAT_LEVEL_EMPTY:
148 batteryLevel = BATTERY_EMPTY;
150 case VCONFKEY_SYSMAN_BAT_LEVEL_CRITICAL:
151 batteryLevel = BATTERY_CRITICAL;
153 case VCONFKEY_SYSMAN_BAT_LEVEL_LOW:
154 batteryLevel = BATTERY_LOW;
156 case VCONFKEY_SYSMAN_BAT_LEVEL_HIGH:
157 batteryLevel = BATTERY_HIGH;
159 case VCONFKEY_SYSMAN_BAT_LEVEL_FULL:
160 batteryLevel = BATTERY_FULL;
163 SysLogException(NID_SYS, E_SYSTEM, "Unavailable battery level is required.");
166 _AppImpl* pAppImpl = _AppImpl::GetInstance();
169 SysLog(NID_SYS, "Battery Level event is forwarded");
170 pAppImpl->OnBatteryLevelChanged(batteryLevel);
177 DeviceBatteryCallback(int percent, void* userData)
179 SysLog(NID_SYS, "Battery Level is called %d", percent);
181 if (pIBatteryEventListener != null)
183 pIBatteryEventListener->OnBatteryLevelChangedInPercentage(percent);
188 RuntimeInfoChangedCallback(runtime_info_key_e key, void* userData)
192 if(_AppInfo::GetAppState() == RUNNING)
194 if (__pChargingEventList != null)
196 bool charging = false;
197 ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, &charging);
200 for(int i = 0; i < __pChargingEventList->GetCount(); i++)
202 result r = E_SUCCESS;
203 IChargingEventListener* pIChargingEventListener = null;
205 r = __pChargingEventList->GetAt(i, pIChargingEventListener);
207 if (IsFailed(r) == false)
209 pIChargingEventListener->OnChargingStateChanged(charging);
219 PowerChangedCallback(power_state_e state, void* userData)
221 std::unique_ptr< IEnumeratorT<_IPowerManagerEventListener*> > pEnumerator(__powerEventList.GetEnumeratorN());
222 _IPowerManagerEventListener* pIPowerManagerEventListener = null;
224 if (__pSceenEventList != null)
226 if (state == POWER_STATE_SCREEN_OFF)
228 for (int i = 0; i < __pSceenEventList->GetCount(); i++)
230 IScreenEventListener* pIScreenEventListener = null;
231 result r = E_SUCCESS;
232 r = __pSceenEventList->GetAt(i, pIScreenEventListener);
233 if (IsFailed(r) == false)
235 pIScreenEventListener->OnScreenOff();
239 if(pEnumerator != null)
241 while(pEnumerator->MoveNext() == E_SUCCESS)
243 pEnumerator->GetCurrent(pIPowerManagerEventListener);
244 if(pIPowerManagerEventListener != null)
246 pIPowerManagerEventListener->OnScreenStateChanged(false);
251 else if(state == POWER_STATE_NORMAL)
253 for (int i = 0; i < __pSceenEventList->GetCount(); i++)
255 IScreenEventListener* pIScreenEventListener = null;
256 result r = E_SUCCESS;
257 r = __pSceenEventList->GetAt(i, pIScreenEventListener);
258 if (IsFailed(r) == false)
260 pIScreenEventListener->OnScreenOn();
264 if(pEnumerator != null)
266 while(pEnumerator->MoveNext() == E_SUCCESS)
268 pEnumerator->GetCurrent(pIPowerManagerEventListener);
269 if(pIPowerManagerEventListener != null)
271 pIPowerManagerEventListener->OnScreenStateChanged(true);
280 ScreenEventVConfCallback(keynode_t* node, void* userData)
283 int sysBrightness = 0;
285 if (__pSceenEventList == null)
287 SysLogException(NID_SYS, E_SYSTEM, "SceenEventList is not initialized.");
290 errorCode = vconf_get_int(VCONFKEY_PM_CURRENT_BRIGHTNESS, &sysBrightness);
294 SysLogException(NID_SYS, E_SYSTEM, "It failed to get Screen brightness");
298 for (int i = 0; i < __pSceenEventList->GetCount(); i++)
300 IScreenEventListener* pIScreenEventListener = null;
301 __pSceenEventList->GetAt(i, pIScreenEventListener);
302 if (pIScreenEventListener != null)
305 int maxBrightness = -1;
306 int ret = device_get_max_brightness(0, &maxBrightness);
309 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device max brightness");
312 sysBrightness = (sysBrightness == 0) ? 1 : sysBrightness;
313 brightness = (int)ceil(((_BRIGHTNESS_RESOLUTION / (float) maxBrightness)) * sysBrightness);
314 pIScreenEventListener->OnScreenBrightnessChanged(brightness);
319 _PowerManagerImpl::_PowerManagerImpl(void)
323 _PowerManagerImpl::~_PowerManagerImpl(void)
328 _PowerManagerImpl::Init()
330 if(_InitPowerManager == false)
332 __powerEventList.Construct();
333 pActiveEventListener = new (std::nothrow) _ActiveEventListener();
334 _AppManagerImpl* pAppManager = _AppManagerImpl::GetInstance();
335 pAppManager->AddActiveAppEventListener(*pActiveEventListener);
336 _InitPowerManager = true;
341 _PowerManagerImpl::Term()
343 if(_InitPowerManager == true)
345 _AppManagerImpl* pAppManager = _AppManagerImpl::GetInstance();
346 pAppManager->RemoveActiveAppEventListener(*pActiveEventListener);
347 delete(pActiveEventListener);
348 pActiveEventListener = null;
350 _InitPowerManager = false;
355 _PowerManagerImpl::IsActive(void)
358 result r = E_SUCCESS;
359 _AppManagerImpl* pAppManagerImpl = _AppManagerImpl::GetInstance();
361 if(pAppManagerImpl == null)
367 r = pAppManagerImpl->GetActiveApp(appId);
371 SysLog(NID_SYS, "current active is:%ls, required:%ls", appId.GetPointer(), _AppInfo::GetApplicationId().GetPointer());
372 if(appId == _AppInfo::GetApplicationId())
390 _PowerManagerImpl::KeepScreenOnState(bool keepOn, bool dimming)
393 unsigned int state = LCD_DIM, flag = GOTO_STATE_NOW;
394 _PowerManagerImpl::Init();
395 SysLog(NID_SYS, "Power control option: keep %d, dimming %d", keepOn, dimming);
397 if (keepOn == true && IsActive() == true)
402 if(power_get_state() == POWER_STATE_NORMAL)
404 flag = STAY_CUR_STATE;
412 _screenOnState = state;
413 ret = pm_lock_state(state, flag, 0);
414 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the screen state");
415 _keepScreenOnState = true;
419 ret = pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW);
420 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the screen state");
421 _keepScreenOnState = false;
424 SysLog(NID_SYS, "change screen power policy: keepOn(%d) and dimming(%d)", keepOn, dimming);
430 _PowerManagerImpl::KeepCpuAwake(bool enable)
433 _PowerManagerImpl::Init();
437 ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
438 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
439 _keepCpuAwake = true;
443 if(_deviceCpuPowerOn == false)
445 ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
446 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
448 _keepCpuAwake = false;
451 SysLog(NID_SYS, "change cpu power policy: keepAwake(%s)", enable ? "true" : "false");
456 _PowerManagerImpl::InitBatteryEvent(void)
458 int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, BatteryLevelVConfCallback, null);
459 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to set the battery event");
465 _PowerManagerImpl::OnForeground(void)
471 _PowerManagerImpl::OnBackground(void)
477 _PowerManagerImpl::RestoreScreenBrightness(void)
479 result r = E_SUCCESS;
481 ArrayList requestMessage;
482 ArrayList responseMessage;
484 SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
486 unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
487 SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
489 SysLog(NID_SYS, "PowerManager is serviced by common-service");
490 r = pIpcClient->Construct(POWER_MANAGER_SERVICE_ID);
491 SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
493 requestMessage.Construct();
494 responseMessage.Construct();
496 String serviceId = _SYSTEM_SERVICE_ID;
497 String commandId = _SYSTEM_COMMAND_RESTORE_BRIGHTNESS;
499 requestMessage.Add(serviceId);
500 requestMessage.Add(commandId);
502 unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
503 SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
505 r = pIpcClient->SendRequest(pMsg.get());
506 SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
508 String* pResult = (String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA);
510 SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
511 SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
513 responseMessage.RemoveAll(true);
518 _PowerManagerImpl::SetScreenBrightness(int brightness)
521 int maxBrightness = 0;
522 int actualBrightness = 0;
523 result r = E_SUCCESS;
525 SysTryReturnResult(NID_SYS, (brightness > 0 && brightness < 11), E_OUT_OF_RANGE,
526 "[E_OUT_OF_RANGE] The specified brightness is out of range.");
528 SysLog(NID_SYS, "Set brightness (%d)", brightness);
530 ret = device_get_max_brightness(0, &maxBrightness);
531 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to get the device max brightness");
533 actualBrightness = maxBrightness * brightness / _BRIGHTNESS_RESOLUTION;
535 ArrayList requestMessage;
536 ArrayList responseMessage;
538 unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
539 SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
541 SysLog(NID_SYS, "PowerManager is serviced by common-service");
542 r = pIpcClient->Construct(POWER_MANAGER_SERVICE_ID);
543 SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
545 requestMessage.Construct();
546 responseMessage.Construct();
548 String serviceId = _SYSTEM_SERVICE_ID;
549 String commandId = _SYSTEM_COMMAND_CHANGE_BRIGHTNESS;
550 String brightnessValue;
551 brightnessValue.Append(actualBrightness);
553 requestMessage.Add(serviceId);
554 requestMessage.Add(commandId);
555 requestMessage.Add(brightnessValue);
557 unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
558 SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
560 r = pIpcClient->SendRequest(pMsg.get());
561 SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
563 String* pResult = (String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA);
565 SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
566 SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
568 responseMessage.RemoveAll(true);
573 _PowerManagerImpl::GetScreenBrightness(void)
577 int maxBrightness = -1;
581 ret = device_get_brightness(0, &brightness);
584 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device brightness");
585 SetLastResult(E_SYSTEM);
586 return _DEACTIVATED_BRIGHTNESS_CONTROL;
594 SysLog(NID_SYS, "System Brightness is %d", brightness);
595 ret = device_get_max_brightness(0, &maxBrightness);
598 SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device max brightness");
599 SetLastResult(E_SYSTEM);
600 return _DEACTIVATED_BRIGHTNESS_CONTROL;
602 return ceil(((_BRIGHTNESS_RESOLUTION / (float) maxBrightness)) * brightness);
606 _PowerManagerImpl::IsScreenOn(void)
608 power_state_e powerState = power_get_state();
610 if (powerState == POWER_STATE_SCREEN_OFF)
621 _PowerManagerImpl::TurnScreenOn(void)
623 result r = E_SUCCESS;
624 int ret = power_wakeup(true);
625 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to unlock the normal screen state");
626 ret = pm_change_state(LCD_NORMAL);
627 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to change to the normal screen state");
633 _PowerManagerImpl::TurnScreenOff(void)
635 result r = E_SUCCESS;
636 int ret = pm_change_state(LCD_OFF);
638 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to unlock the screen off screen state");
644 _PowerManagerImpl::SetScreenEventListener(IScreenEventListener& listener)
646 result r = E_SUCCESS;
648 r = AddScreenEventListener(listener, true);
652 SysLog(NID_SYS, "It failed to register ScreenEventListener");
655 SysLog(NID_SYS,"It successed to register ScreenEventListener");
660 _PowerManagerImpl::AddScreenEventListener(IScreenEventListener& listener, bool isSet)
662 result r = E_SUCCESS;
664 if (__pSceenEventList == null)
666 std::unique_ptr< ArrayListT<IScreenEventListener*> > pSceenEventList(new ArrayListT<IScreenEventListener*>);
667 SysTryReturnResult(NID_SYS, pSceenEventList, E_SYSTEM, "Memory allocation failed");
668 pSceenEventList->Construct();
670 errorCode = vconf_notify_key_changed(VCONFKEY_PM_CURRENT_BRIGHTNESS, ScreenEventVConfCallback, null);
671 SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener on VCONFKEY_PM_CURRENT_BRIGHTNESS.");
673 errorCode = power_set_changed_cb(PowerChangedCallback, null);
674 if(errorCode != POWER_ERROR_NONE)
676 SysLogException(NID_SYS, E_SYSTEM, "It is failed to register power callback. So unregister VCONFKEY_PM_CURRENT_BRIGHTNESS also.");
677 vconf_ignore_key_changed(VCONFKEY_PM_CURRENT_BRIGHTNESS, ScreenEventVConfCallback);
679 SysTryReturnResult(NID_SYS, errorCode == POWER_ERROR_NONE, E_SYSTEM, "It failed to add ScreenEvent listener.");
680 __pSceenEventList = pSceenEventList.release();
681 SysLog(NID_SYS,"It successed to register power_set_changed_cb");
684 if (isSet == true && __pSceenEventList->GetCount() != 0)
686 r = __pSceenEventList->SetAt(&listener, 0);
690 r = __pSceenEventList->Add(&listener);
697 _PowerManagerImpl::RemoveScreenEventListener(IScreenEventListener& listener)
699 result r = E_SUCCESS;
701 SysTryReturnResult(NID_SYS,__pSceenEventList != null, E_OBJ_NOT_FOUND, "IScreenEventListener list is empty");
703 r = __pSceenEventList->Remove(&listener);
704 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "listener is not exist.");
710 _PowerManagerImpl::SetChargingEventListener(IChargingEventListener& listener)
712 result r = E_SUCCESS;
714 r = AddChargingEventListener(listener, true);
718 SysLog(NID_SYS, "It failed to register battery charging event");
725 _PowerManagerImpl::AddChargingEventListener(IChargingEventListener& listener, bool isSet)
727 result r = E_SUCCESS;
729 if (__pChargingEventList == null)
731 int errorCode = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, RuntimeInfoChangedCallback, null);
732 SysTryReturnResult(NID_SYS, errorCode == RUNTIME_INFO_ERROR_NONE, E_SYSTEM, "It is failed to register RUNTIME_INFO_KEY_BATTERY_IS_CHARGING.");
734 __pChargingEventList = new ArrayListT<IChargingEventListener*>;
735 SysTryReturnResult(NID_SYS, __pChargingEventList, E_SYSTEM, "Memory allocation failed");
736 r = __pChargingEventList->Construct();
739 delete __pChargingEventList;
740 __pChargingEventList = null;
742 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to construct charging event list.");
745 if (isSet == false || __pChargingEventList->GetCount() == 0)
747 r = __pChargingEventList->Add(&listener);
751 r = __pChargingEventList->SetAt(&listener, 0);
758 _PowerManagerImpl::RemoveChargingEventListener(IChargingEventListener& listener)
760 result r = E_SUCCESS;
762 SysTryReturnResult(NID_SYS,__pChargingEventList != null, E_OBJ_NOT_FOUND, "__pChargingEventList list is empty");
763 r = __pChargingEventList->Remove(&listener);
764 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "listener is not exist.");
770 _PowerManagerImpl::SetBatteryEventListener(IBatteryEventListener* pListener)
774 if (pListener != null)
777 if(pIBatteryEventListener == null)
779 ret = device_battery_set_cb(DeviceBatteryCallback, null);
782 SysLog(NID_SYS, "It failed to register battery event");
785 pIBatteryEventListener = pListener;
789 pIBatteryEventListener = null;
790 ret = device_battery_unset_cb();
793 SysLog(NID_SYS, "It failed to unregister battery event");
801 _PowerManagerImpl::PowerControl(int deviceId, int level)
804 if(deviceId == _DEVICE_CPU)
806 if(level == _DEVICE_POWER_LEVEL_ON)
808 ret = power_lock_state(POWER_STATE_SCREEN_OFF, 0);
809 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the power state");
810 _deviceCpuPowerOn = true;
814 else if(level == _DEVICE_POWER_LEVEL_OFF)
816 if(_keepScreenOnState == false)
818 ret = power_unlock_state(POWER_STATE_SCREEN_OFF);
819 SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
821 _deviceCpuPowerOn = false;
829 _PowerManagerImpl::GetCurrentBatteryLevelInPercentage(void)
832 int batteryLevel = 0;
834 ret = device_battery_get_percent(&batteryLevel);
837 SetLastResult(E_SYSTEM);
844 _PowerManagerImpl::GetCurrentBatteryLevel(void)
846 int batteryLevel = 0;
847 BatteryLevel level = BATTERY_EMPTY;
848 int ret = vconf_get_int(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, &batteryLevel);
851 SysLogException(NID_SYS, E_SYSTEM, "It is failed to get battery level.");
857 case VCONFKEY_SYSMAN_BAT_LEVEL_FULL:
858 level = BATTERY_LEVEL_FULL;
860 case VCONFKEY_SYSMAN_BAT_LEVEL_HIGH:
861 level = BATTERY_LEVEL_HIGH;
863 case VCONFKEY_SYSMAN_BAT_LEVEL_LOW:
864 level = BATTERY_LEVEL_LOW;
866 case VCONFKEY_SYSMAN_BAT_LEVEL_CRITICAL:
867 level = BATTERY_LEVEL_CRITICAL;
870 level = BATTERY_LEVEL_EMPTY;
878 _PowerManagerImpl::IsCharging(void)
880 bool chargeState = false;
882 ret = runtime_info_get_value_bool(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, &chargeState);
885 SetLastResult(E_SYSTEM);
893 _PowerManagerImpl::Add_IPowerManagerEventListener(_IPowerManagerEventListener* listener)
895 _PowerManagerImpl::Init();
896 __powerEventList.Add(listener);
901 _PowerManagerImpl::Remove_IPowerManagerEventListener(_IPowerManagerEventListener* listener)
903 _PowerManagerImpl::Init();
904 __powerEventList.Remove(listener);
909 BootEventVconfCallback(keynode_t* node, void* userData)
911 if (__pBootEventList == null)
913 SysLogException(NID_SYS, E_SYSTEM, "BootEventList is not initialized.");
918 const int errorCode = vconf_get_int(VCONFKEY_SERVICE_READY, &bootReady);
922 SysLogException(NID_SYS, E_SYSTEM, "It failed to get Boot event status");
926 std::unique_ptr< IEnumeratorT<IBootEventListener*> > pEnum(__pBootEventList->GetEnumeratorN());
930 while (pEnum->MoveNext() == E_SUCCESS)
932 IBootEventListener* pListener = null;
933 pEnum->GetCurrent(pListener);
935 pListener->OnBootCompleted();
939 SysLog(NID_SYS, "Finished invoking boot complete event listener.");
943 _PowerManagerImpl::AddBootEventListener(IBootEventListener& listener)
945 if (__pBootEventList == null)
947 std::unique_ptr< ArrayListT<IBootEventListener*> > pBootEventList(new ArrayListT<IBootEventListener*>);
948 SysTryReturnResult(NID_SYS, pBootEventList, E_SYSTEM, "Memory allocation failed");
949 pBootEventList->Construct();
952 errorCode = vconf_notify_key_changed(VCONFKEY_SERVICE_READY, BootEventVconfCallback, null);
953 SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add BootEvent listener.");
955 __pBootEventList = pBootEventList.release();
956 SysLog(NID_SYS, "It successed to register boot event listener.");
959 return __pBootEventList->Add(&listener);
963 _PowerManagerImpl::RemoveBootEventListener(IBootEventListener& listener)
965 result r = E_SUCCESS;
967 SysTryReturnResult(NID_SYS,__pBootEventList != null, E_OBJ_NOT_FOUND, "IBootEventListener list is empty");
969 r = __pBootEventList->Remove(&listener);
970 SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "IBootEventListener list is empty");
976 _PowerManagerImpl::GetInstance(PowerManager& powerManager)
978 return powerManager.__pPowerManagerImpl;
981 const _PowerManagerImpl*
982 _PowerManagerImpl::GetInstance(const PowerManager& powerManager)
984 return powerManager.__pPowerManagerImpl;