1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "screen_action.h"
17
18 #include <hisysevent.h>
19 #include <ipc_skeleton.h>
20
21 #include "display_log.h"
22 #include "power_state_machine_info.h"
23 #include "screen_manager.h"
24
25 namespace OHOS {
26 namespace DisplayPowerMgr {
ScreenAction(uint32_t displayId)27 ScreenAction::ScreenAction(uint32_t displayId) : displayId_(displayId)
28 {}
29
GetDefaultDisplayId()30 uint32_t ScreenAction::GetDefaultDisplayId()
31 {
32 std::string identity = IPCSkeleton::ResetCallingIdentity();
33 uint64_t defaultId = Rosen::DisplayManager::GetInstance().GetDefaultDisplayId();
34 IPCSkeleton::SetCallingIdentity(identity);
35 return static_cast<uint32_t>(defaultId);
36 }
37
GetAllDisplayId()38 std::vector<uint32_t> ScreenAction::GetAllDisplayId()
39 {
40 std::string identity = IPCSkeleton::ResetCallingIdentity();
41 std::vector<uint64_t> allIds = Rosen::DisplayManager::GetInstance().GetAllDisplayIds();
42 IPCSkeleton::SetCallingIdentity(identity);
43 std::vector<uint32_t> displayIds;
44 std::transform(allIds.begin(), allIds.end(), back_inserter(displayIds), [](uint64_t id) {
45 return static_cast<uint32_t>(id);
46 });
47 return displayIds;
48 }
49
GetDisplayId()50 uint32_t ScreenAction::GetDisplayId()
51 {
52 return displayId_;
53 }
54
GetDisplayState()55 DisplayState ScreenAction::GetDisplayState()
56 {
57 DisplayState state = DisplayState::DISPLAY_UNKNOWN;
58 Rosen::ScreenPowerState powerState = Rosen::ScreenManager::GetInstance().GetScreenPower(displayId_);
59 DISPLAY_HILOGI(FEAT_STATE, "ScreenPowerState=%{public}d", static_cast<uint32_t>(powerState));
60 switch (powerState) {
61 case Rosen::ScreenPowerState::POWER_ON:
62 state = DisplayState::DISPLAY_ON;
63 break;
64 case Rosen::ScreenPowerState::POWER_STAND_BY:
65 state = DisplayState::DISPLAY_DIM;
66 break;
67 case Rosen::ScreenPowerState::POWER_SUSPEND:
68 state = DisplayState::DISPLAY_SUSPEND;
69 break;
70 case Rosen::ScreenPowerState::POWER_OFF:
71 state = DisplayState::DISPLAY_OFF;
72 break;
73 default:
74 break;
75 }
76 DISPLAY_HILOGI(FEAT_STATE, "state=%{public}u displayId=%{public}u", static_cast<uint32_t>(state), displayId_);
77 return state;
78 }
79
EnableSkipSetDisplayState(uint32_t reason)80 bool ScreenAction::EnableSkipSetDisplayState(uint32_t reason)
81 {
82 if (reason == static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS)) {
83 return true;
84 }
85 return false;
86 }
87
SetDisplayState(DisplayState state,const std::function<void (DisplayState)> & callback)88 bool ScreenAction::SetDisplayState(DisplayState state, const std::function<void(DisplayState)>& callback)
89 {
90 DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState displayId=%{public}u, state=%{public}u", displayId_,
91 static_cast<uint32_t>(state));
92 Rosen::DisplayState rds = Rosen::DisplayState::UNKNOWN;
93 switch (state) {
94 case DisplayState::DISPLAY_ON:
95 rds = Rosen::DisplayState::ON;
96 break;
97 case DisplayState::DISPLAY_OFF:
98 rds = Rosen::DisplayState::OFF;
99 break;
100 default:
101 break;
102 }
103 std::string identity = IPCSkeleton::ResetCallingIdentity();
104 bool ret = Rosen::DisplayManager::GetInstance().SetDisplayState(rds, [callback](Rosen::DisplayState rosenState) {
105 DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState Callback:%{public}d", static_cast<uint32_t>(rosenState));
106 DisplayState state;
107 switch (rosenState) {
108 case Rosen::DisplayState::ON:
109 state = DisplayState::DISPLAY_ON;
110 break;
111 case Rosen::DisplayState::OFF:
112 state = DisplayState::DISPLAY_OFF;
113 break;
114 case Rosen::DisplayState::ON_SUSPEND:
115 state = DisplayState::DISPLAY_SUSPEND;
116 break;
117 default:
118 return;
119 }
120 callback(state);
121 });
122 IPCSkeleton::SetCallingIdentity(identity);
123 // Notify screen state change event to battery statistics
124 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "SCREEN_STATE",
125 HiviewDFX::HiSysEvent::EventType::STATISTIC, "STATE", static_cast<int32_t>(state));
126 DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayState: ret=%{public}d", ret);
127 return ret;
128 }
129
ParseSpecialReason(uint32_t reason)130 Rosen::PowerStateChangeReason ScreenAction::ParseSpecialReason(uint32_t reason)
131 {
132 auto changeReason = Rosen::PowerStateChangeReason::POWER_BUTTON;
133 switch (reason) {
134 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT):
135 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT;
136 break;
137 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON):
138 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON;
139 break;
140 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS):
141 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS;
142 break;
143 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF):
144 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF;
145 break;
146 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_SWITCH):
147 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_SWITCH;
148 break;
149 case static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_POWER_KEY):
150 changeReason = Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_POWER_KEY;
151 break;
152 default:
153 break;
154 }
155 return changeReason;
156 }
157
SetDisplayPower(DisplayState state,uint32_t reason)158 bool ScreenAction::SetDisplayPower(DisplayState state, uint32_t reason)
159 {
160 DISPLAY_HILOGI(FEAT_STATE, "[UL_POWER] SetDisplayPower displayId=%{public}u, state=%{public}u, reason=%{public}u",
161 displayId_, static_cast<uint32_t>(state), reason);
162 Rosen::ScreenPowerState status = Rosen::ScreenPowerState::INVALID_STATE;
163 switch (state) {
164 case DisplayState::DISPLAY_ON:
165 status = Rosen::ScreenPowerState::POWER_ON;
166 break;
167 case DisplayState::DISPLAY_DIM:
168 status = Rosen::ScreenPowerState::POWER_STAND_BY;
169 break;
170 case DisplayState::DISPLAY_SUSPEND:
171 status = Rosen::ScreenPowerState::POWER_SUSPEND;
172 break;
173 case DisplayState::DISPLAY_OFF:
174 status = Rosen::ScreenPowerState::POWER_OFF;
175 break;
176 default:
177 break;
178 }
179
180 bool ret = false;
181 auto changeReason = ParseSpecialReason(reason);
182 if (coordinated_ && reason == static_cast<uint32_t>(PowerMgr::StateChangeReason::STATE_CHANGE_REASON_TIMEOUT)) {
183 ret = Rosen::ScreenManager::GetInstance().SetSpecifiedScreenPower(
184 displayId_, status, Rosen::PowerStateChangeReason::STATE_CHANGE_REASON_COLLABORATION);
185 } else {
186 ret = Rosen::ScreenManager::GetInstance().SetScreenPowerForAll(status, changeReason);
187 }
188 DISPLAY_HILOGI(
189 FEAT_STATE, "[UL_POWER] Set screen power, ret=%{public}d, coordinated=%{public}d", ret, coordinated_);
190 return (state == DisplayState::DISPLAY_DIM || state == DisplayState::DISPLAY_SUSPEND) ? true : ret;
191 }
192
GetBrightness()193 uint32_t ScreenAction::GetBrightness()
194 {
195 std::lock_guard lock(mutexBrightness_);
196 std::string identity = IPCSkeleton::ResetCallingIdentity();
197 brightness_ = Rosen::DisplayManager::GetInstance().GetScreenBrightness(displayId_);
198 IPCSkeleton::SetCallingIdentity(identity);
199 DISPLAY_HILOGD(FEAT_BRIGHTNESS, "displayId=%{public}u, brightness=%{public}u", displayId_, brightness_);
200 return brightness_;
201 }
202
SetBrightness(uint32_t value)203 bool ScreenAction::SetBrightness(uint32_t value)
204 {
205 DISPLAY_HILOGD(FEAT_BRIGHTNESS, "displayId=%{public}u, brightness=%{public}u", displayId_, value);
206 std::string identity = IPCSkeleton::ResetCallingIdentity();
207 bool isSucc = Rosen::DisplayManager::GetInstance().SetScreenBrightness(displayId_, value);
208 IPCSkeleton::SetCallingIdentity(identity);
209 std::lock_guard lock(mutexBrightness_);
210 brightness_ = isSucc ? value : brightness_;
211 return isSucc;
212 }
213
SetCoordinated(bool coordinated)214 void ScreenAction::SetCoordinated(bool coordinated)
215 {
216 coordinated_ = coordinated;
217 }
218 } // namespace DisplayPowerMgr
219 } // namespace OHOS
220