Fix N_SE-56436 for Screen lock.
[platform/framework/native/appfw.git] / src / system / FSys_PowerManagerImpl.cpp
index 1aced1c..98bd6d7 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -28,6 +27,7 @@
 #include <runtime_info.h>
 #include <vconf.h>
 
+#include <FIo.h>
 #include <FAppIActiveAppEventListener.h>
 #include <FBaseSysLog.h>
 #include <FBaseColArrayListT.h>
@@ -62,15 +62,17 @@ namespace Tizen { namespace System
 static const int _DEVICE_CPU = 1;
 static const int _DEVICE_POWER_LEVEL_ON = 1;
 static const int _DEVICE_POWER_LEVEL_OFF = 0;
-static const int _APPID_LENGTH = 10;
 static const int _DEACTIVATED_BRIGHTNESS_CONTROL = -1;
 static const float _BRIGHTNESS_RESOLUTION = 10.0;
+static const wchar_t* POWER_MANAGER_SERVICE_ID = L"osp.sys.ipcserver.powermanager";
 
 #ifndef VCONFKEY_SERVICE_READY
-#define VCONFKEY_SERVICE_READY "memory/appservice/serviceready"
+#define VCONFKEY_SERVICE_READY "memory/deviced/boot_power_on"
 #endif
 
 bool _activeApp = false;
+unsigned int _dimmingFlag = GOTO_STATE_NOW;
+unsigned int _screenOnState = LCD_DIM;
 bool _deviceCpuPowerOn = false;
 bool _keepCpuAwake = false;
 bool _keepScreenOnState = false;
@@ -96,11 +98,18 @@ void
 _ActiveEventListener::OnActiveAppChanged(const Tizen::App::AppId& appId)
 {
        int ret = 0;
-       SysLog(NID_SYS, "Active App is %ls.", appId.GetPointer());
+       SysLog(NID_SYS, "Active App is %ls. GetApp id %ls", appId.GetPointer(), _AppInfo::GetApplicationId().GetPointer());
 
        if(appId == _AppInfo::GetApplicationId())
        {
                _activeApp = true;
+               if (_keepScreenOnState == true)
+               {
+                       int ret = -1;
+                       ret = pm_lock_state(_screenOnState, _dimmingFlag, 0);
+                       SysTryReturnVoidResult(NID_SYS, ret == 0,E_SYSTEM, "[E_SYSTEM] It failed to lock the screen state. error code [%d]", ret);
+                       SysLog(NID_SYS, "Screen on state is recoveryed.");
+               }
        }
        else
        {
@@ -110,7 +119,6 @@ _ActiveEventListener::OnActiveAppChanged(const Tizen::App::AppId& appId)
                {
                        ret = pm_unlock_state(LCD_NORMAL, GOTO_STATE_NOW);
                        SysTryReturnVoidResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to unlock the power state");
-                       _keepScreenOnState = false;
                }
 
                if (_keepCpuAwake == true || _deviceCpuPowerOn == true) //In case of CPU power control, it has to be keep despite of deactive state.
@@ -143,13 +151,13 @@ BatteryLevelVConfCallback(keynode_t* node, void* userData)
                                batteryLevel = BATTERY_CRITICAL;
                                break;
                        case VCONFKEY_SYSMAN_BAT_LEVEL_LOW:
-                               batteryLevel = BATTERY_EMPTY;
+                               batteryLevel = BATTERY_LOW;
                                break;
                        case VCONFKEY_SYSMAN_BAT_LEVEL_HIGH:
-                               batteryLevel = BATTERY_EMPTY;
+                               batteryLevel = BATTERY_HIGH;
                                break;
                        case VCONFKEY_SYSMAN_BAT_LEVEL_FULL:
-                               batteryLevel = BATTERY_EMPTY;
+                               batteryLevel = BATTERY_FULL;
                                break;
                        default:
                                SysLogException(NID_SYS, E_SYSTEM, "Unavailable battery level is required.");
@@ -301,6 +309,7 @@ ScreenEventVConfCallback(keynode_t* node, void* userData)
                                SysLogException(NID_SYS, E_SYSTEM, "It failed to get the device max brightness");
                                maxBrightness = 100;
                        }
+                       sysBrightness = (sysBrightness == 0) ? 1 : sysBrightness;
                        brightness = (int)ceil(((_BRIGHTNESS_RESOLUTION / (float) maxBrightness)) * sysBrightness);
                        pIScreenEventListener->OnScreenBrightnessChanged(brightness);
                }
@@ -381,20 +390,27 @@ result
 _PowerManagerImpl::KeepScreenOnState(bool keepOn, bool dimming)
 {
        int ret = -1;
-       unsigned int state = LCD_DIM;
+       unsigned int state = LCD_DIM, flag = GOTO_STATE_NOW;
        _PowerManagerImpl::Init();
+       SysLog(NID_SYS, "Power control option: keep %d, dimming %d", keepOn, dimming);
 
        if (keepOn == true && IsActive() == true)
        {
                if (dimming)
                {
                        state = LCD_DIM;
+                       if(power_get_state() == POWER_STATE_NORMAL)
+                       {
+                               flag = STAY_CUR_STATE;
+                       }
                }
                else
                {
                        state = LCD_NORMAL;
                }
-               ret = pm_lock_state(state, GOTO_STATE_NOW, 0);
+               _dimmingFlag = flag;
+               _screenOnState = state;
+               ret = pm_lock_state(state, flag, 0);
                SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "[E_SYSTEM] It failed to lock the screen state");
                _keepScreenOnState = true;
        }
@@ -439,7 +455,7 @@ _PowerManagerImpl::KeepCpuAwake(bool enable)
 result
 _PowerManagerImpl::InitBatteryEvent(void)
 {
-       int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, BatteryLevelVConfCallback, null); 
+       int ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_BATTERY_LEVEL_STATUS, BatteryLevelVConfCallback, null);
        SysTryReturnResult(NID_SYS, ret == 0, E_SYSTEM, "It failed to set the battery event");
 
        return E_SUCCESS;
@@ -462,37 +478,39 @@ _PowerManagerImpl::RestoreScreenBrightness(void)
 {
        result r = E_SUCCESS;
 
-        ArrayList requestMessage;
-        ArrayList responseMessage;
+       ArrayList requestMessage;
+       ArrayList responseMessage;
 
-        SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
+       SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
 
-        unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
-        SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
+       unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
+       SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
 
-        r = pIpcClient->Construct(_COMMUNICATION_DISPATCHER_IPC_ID);
-        SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
+       SysLog(NID_SYS, "PowerManager is serviced by common-service");
+       r = pIpcClient->Construct(POWER_MANAGER_SERVICE_ID);
+       SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
 
-        requestMessage.Construct();
-        responseMessage.Construct();
+       requestMessage.Construct();
+       responseMessage.Construct();
 
-        String serviceId = _SYSTEM_SERVICE_ID;
-        String commandId = _SYSTEM_COMMAND_RESTORE_BRIGHTNESS;
+       String serviceId = _SYSTEM_SERVICE_ID;
+       String commandId = _SYSTEM_COMMAND_RESTORE_BRIGHTNESS;
 
-        requestMessage.Add(serviceId);
-        requestMessage.Add(commandId);
+       requestMessage.Add(serviceId);
+       requestMessage.Add(commandId);
 
-        unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
-        SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
+       unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
+       SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
 
-        r = pIpcClient->SendRequest(pMsg.get());
-        SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
+       r = pIpcClient->SendRequest(pMsg.get());
+       SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
 
-        unique_ptr<String> pResult((String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA));
+       String* pResult = (String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA);
 
-        SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
-        SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
+       SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
+       SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
 
+       responseMessage.RemoveAll(true);
        return E_SUCCESS;
 }
 
@@ -504,9 +522,8 @@ _PowerManagerImpl::SetScreenBrightness(int brightness)
        int actualBrightness = 0;
        result r = E_SUCCESS;
 
-        SysTryReturn(NID_SYS, IsActive() == true, E_SUCCESS, r, "It is not active app.");
        SysTryReturnResult(NID_SYS, (brightness > 0 && brightness < 11), E_OUT_OF_RANGE,
-                                         "[E_OUT_OF_RANGE] The specified brightness is out of range.");
+                                 "[E_OUT_OF_RANGE] The specified brightness is out of range.");
 
        SysLog(NID_SYS, "Set brightness (%d)", brightness);
 
@@ -515,38 +532,40 @@ _PowerManagerImpl::SetScreenBrightness(int brightness)
 
        actualBrightness = maxBrightness * brightness / _BRIGHTNESS_RESOLUTION;
 
-        ArrayList requestMessage;
-        ArrayList responseMessage;
+       ArrayList requestMessage;
+       ArrayList responseMessage;
 
-        unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
-        SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
+       unique_ptr<_IpcClient> pIpcClient (new (std::nothrow) _IpcClient());
+       SysTryReturn(NID_SYS, pIpcClient != null, E_OUT_OF_MEMORY, r, "It is failed to create IPC instance.");
 
-        r = pIpcClient->Construct(_COMMUNICATION_DISPATCHER_IPC_ID);
-        SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
+       SysLog(NID_SYS, "PowerManager is serviced by common-service");
+       r = pIpcClient->Construct(POWER_MANAGER_SERVICE_ID);
+       SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to create IpcClient", GetErrorMessage(r));
 
-        requestMessage.Construct();
-        responseMessage.Construct();
+       requestMessage.Construct();
+       responseMessage.Construct();
 
-        String serviceId = _SYSTEM_SERVICE_ID;
-        String commandId = _SYSTEM_COMMAND_CHANGE_BRIGHTNESS;
+       String serviceId = _SYSTEM_SERVICE_ID;
+       String commandId = _SYSTEM_COMMAND_CHANGE_BRIGHTNESS;
        String brightnessValue;
        brightnessValue.Append(actualBrightness);
 
-        requestMessage.Add(serviceId);
-        requestMessage.Add(commandId);
-        requestMessage.Add(brightnessValue);
+       requestMessage.Add(serviceId);
+       requestMessage.Add(commandId);
+       requestMessage.Add(brightnessValue);
 
-        unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
-        SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
+       unique_ptr<IoService_Request> pMsg(new (std::nothrow) IoService_Request(requestMessage, &responseMessage));
+       SysTryReturnResult(NID_SYS, pMsg != null, E_OUT_OF_MEMORY, "It is failed to create Ipc message");
 
-        r = pIpcClient->SendRequest(pMsg.get());
-        SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
+       r = pIpcClient->SendRequest(pMsg.get());
+       SysTryReturn(NID_SYS, r == E_SUCCESS, E_SYSTEM, r, "[%s] It failed to ipc message", GetErrorMessage(r));
 
-        unique_ptr<String> pResult((String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA));
+       String* pResult = (String*)responseMessage.GetAt(_SYSTEM_RESPONSE_DATA);
 
-        SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
-        SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
+       SysTryReturnResult(NID_SYS, pResult != null, E_SYSTEM, "It is failed to receive Ipc response.");
+       SysTryReturnResult(NID_SYS, *pResult == _SYSTEM_RESULT_OK, E_SYSTEM, "It is failed to set brightness.");
 
+       responseMessage.RemoveAll(true);
        return E_SUCCESS;
 }
 
@@ -649,10 +668,15 @@ _PowerManagerImpl::AddScreenEventListener(IScreenEventListener& listener, bool i
                pSceenEventList->Construct();
                int errorCode = 0;
                errorCode = vconf_notify_key_changed(VCONFKEY_PM_CURRENT_BRIGHTNESS, ScreenEventVConfCallback, null);
-               SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener.");
+               SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener on VCONFKEY_PM_CURRENT_BRIGHTNESS.");
 
                errorCode = power_set_changed_cb(PowerChangedCallback, null);
-               SysTryReturnResult(NID_SYS, errorCode == 0, E_SYSTEM, "It failed to add ScreenEvent listener.");
+               if(errorCode != POWER_ERROR_NONE)
+               {
+                       SysLogException(NID_SYS, E_SYSTEM, "It is failed to register power callback. So unregister VCONFKEY_PM_CURRENT_BRIGHTNESS also.");
+                       vconf_ignore_key_changed(VCONFKEY_PM_CURRENT_BRIGHTNESS, ScreenEventVConfCallback);
+               }
+               SysTryReturnResult(NID_SYS, errorCode == POWER_ERROR_NONE, E_SYSTEM, "It failed to add ScreenEvent listener.");
                __pSceenEventList = pSceenEventList.release();
                SysLog(NID_SYS,"It successed to register power_set_changed_cb");
        }
@@ -677,13 +701,8 @@ _PowerManagerImpl::RemoveScreenEventListener(IScreenEventListener& listener)
        SysTryReturnResult(NID_SYS,__pSceenEventList != null, E_OBJ_NOT_FOUND, "IScreenEventListener list is empty");
 
        r = __pSceenEventList->Remove(&listener);
-
-       if (__pSceenEventList->GetCount() == 0)
-       {
-               delete __pSceenEventList;
-               __pSceenEventList = null;
-       }
-       return r;
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "listener is not exist.");
+       return E_SUCCESS;
 }
 
 
@@ -709,18 +728,18 @@ _PowerManagerImpl::AddChargingEventListener(IChargingEventListener& listener, bo
 
         if (__pChargingEventList == null)
         {
-                __pChargingEventList = new ArrayListT<IChargingEventListener*>;
-                SysTryReturnResult(NID_SYS, __pChargingEventList, E_SYSTEM, "Memory allocation failed");
-                __pChargingEventList->Construct();
-                int errorCode = 0;
-               errorCode = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, RuntimeInfoChangedCallback, null);
-               if (errorCode != 0)
-                {
-                        SysLog(NID_SYS, "It failed to register battery charging  event");
+                int errorCode = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_BATTERY_IS_CHARGING, RuntimeInfoChangedCallback, null);
+               SysTryReturnResult(NID_SYS, errorCode == RUNTIME_INFO_ERROR_NONE, E_SYSTEM, "It is failed to register RUNTIME_INFO_KEY_BATTERY_IS_CHARGING.");
+
+               __pChargingEventList = new ArrayListT<IChargingEventListener*>;
+               SysTryReturnResult(NID_SYS, __pChargingEventList, E_SYSTEM, "Memory allocation failed");
+               r = __pChargingEventList->Construct();
+               if(r != E_SUCCESS)
+               {
                        delete __pChargingEventList;
                        __pChargingEventList = null;
-                       return E_SYSTEM;
-                }
+               }
+               SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_SYSTEM, "It is failed to construct charging event list.");
         }
 
        if (isSet == false || __pChargingEventList->GetCount() == 0)
@@ -741,15 +760,10 @@ _PowerManagerImpl::RemoveChargingEventListener(IChargingEventListener& listener)
         result r = E_SUCCESS;
 
         SysTryReturnResult(NID_SYS,__pChargingEventList != null, E_OBJ_NOT_FOUND, "__pChargingEventList list is empty");
-
         r = __pChargingEventList->Remove(&listener);
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "listener is not exist.");
 
-        if (__pChargingEventList->GetCount() == 0)
-        {
-                delete __pChargingEventList;
-                __pChargingEventList = null;
-        }
-        return r;
+        return E_SUCCESS;
 }
 
 result
@@ -953,12 +967,7 @@ _PowerManagerImpl::RemoveBootEventListener(IBootEventListener& listener)
        SysTryReturnResult(NID_SYS,__pBootEventList != null, E_OBJ_NOT_FOUND, "IBootEventListener list is empty");
 
        r = __pBootEventList->Remove(&listener);
-
-       if (__pBootEventList->GetCount() == 0)
-       {
-               delete __pBootEventList;
-               __pBootEventList = null;
-       }
+       SysTryReturnResult(NID_SYS, r == E_SUCCESS, E_OBJ_NOT_FOUND, "IBootEventListener list is empty");
 
        return E_SUCCESS;
 }