1 /*
2 * Copyright (c) 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 <dlfcn.h>
17 #include <string>
18 #include "power_log.h"
19 #include "power_utils.h"
20
21 namespace OHOS {
22 namespace PowerMgr {
GetReasonTypeString(StateChangeReason type)23 const std::string PowerUtils::GetReasonTypeString(StateChangeReason type)
24 {
25 switch (type) {
26 case StateChangeReason::STATE_CHANGE_REASON_INIT:
27 return std::string("INIT");
28 case StateChangeReason::STATE_CHANGE_REASON_TIMEOUT:
29 return std::string("TIMEOUT");
30 case StateChangeReason::STATE_CHANGE_REASON_RUNNING_LOCK:
31 return std::string("RUNNING_LOCK");
32 case StateChangeReason::STATE_CHANGE_REASON_BATTERY:
33 return std::string("BATTERY");
34 case StateChangeReason::STATE_CHANGE_REASON_THERMAL:
35 return std::string("THERMAL");
36 case StateChangeReason::STATE_CHANGE_REASON_WORK:
37 return std::string("WORK");
38 case StateChangeReason::STATE_CHANGE_REASON_SYSTEM:
39 return std::string("SYSTEM");
40 case StateChangeReason::STATE_CHANGE_REASON_APPLICATION:
41 return std::string("APPLICATION");
42 case StateChangeReason::STATE_CHANGE_REASON_SETTINGS:
43 return std::string("SETTINGS");
44 case StateChangeReason::STATE_CHANGE_REASON_HARD_KEY:
45 return std::string("HARD_KEY");
46 case StateChangeReason::STATE_CHANGE_REASON_TOUCH:
47 return std::string("TOUCH");
48 case StateChangeReason::STATE_CHANGE_REASON_CABLE:
49 return std::string("CABLE");
50 case StateChangeReason::STATE_CHANGE_REASON_SENSOR:
51 return std::string("SENSOR");
52 case StateChangeReason::STATE_CHANGE_REASON_LID:
53 return std::string("LID");
54 case StateChangeReason::STATE_CHANGE_REASON_CAMERA:
55 return std::string("CAMERA");
56 case StateChangeReason::STATE_CHANGE_REASON_ACCESSIBILITY:
57 return std::string("ACCESS");
58 case StateChangeReason::STATE_CHANGE_REASON_RESET:
59 return std::string("RESET");
60 case StateChangeReason::STATE_CHANGE_REASON_POWER_KEY:
61 return std::string("POWER_KEY");
62 case StateChangeReason::STATE_CHANGE_REASON_KEYBOARD:
63 return std::string("KEYBOARD");
64 case StateChangeReason::STATE_CHANGE_REASON_MOUSE:
65 return std::string("MOUSE");
66 case StateChangeReason::STATE_CHANGE_REASON_DOUBLE_CLICK:
67 return std::string("DOUBLE_CLICK");
68 case StateChangeReason::STATE_CHANGE_REASON_PEN:
69 return std::string("PEN");
70 case StateChangeReason::STATE_CHANGE_REASON_SWITCH:
71 return std::string("SWITCH");
72 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT:
73 return std::string("PRE_BRIGHT");
74 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS:
75 return std::string("PRE_BRIGHT_ATUH_SUCCESS");
76 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON:
77 return std::string("PRE_BRIGHT_ATUH_FAIL_SCREEN_ON");
78 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF:
79 return std::string("PRE_BRIGHT_ATUH_FAIL_SCREEN_OFF");
80 case StateChangeReason::STATE_CHANGE_REASON_AOD_SLIDING:
81 return std::string("AOD_SLIDING");
82 case StateChangeReason::STATE_CHANGE_REASON_REMOTE:
83 return std::string("REMOTE");
84 case StateChangeReason::STATE_CHANGE_REASON_REFRESH:
85 return std::string("REFRESH");
86 case StateChangeReason::STATE_CHANGE_REASON_COORDINATION:
87 return std::string("COORDINATION_OVERRIDE");
88 case StateChangeReason::STATE_CHANGE_REASON_PROXIMITY:
89 return std::string("PROXIMITY");
90 case StateChangeReason::STATE_CHANGE_REASON_INCOMING_CALL:
91 return std::string("INCOMING_CALL");
92 case StateChangeReason::STATE_CHANGE_REASON_SHELL:
93 return std::string("SHELL");
94 case StateChangeReason::STATE_CHANGE_REASON_TIMEOUT_NO_SCREEN_LOCK:
95 return std::string("TIMEOUT_NO_SCREEN_LOCK");
96 case StateChangeReason::STATE_CHANGE_REASON_PICKUP:
97 return std::string("PICKUP");
98 case StateChangeReason::STATE_CHANGE_REASON_SCREEN_CONNECT:
99 return std::string("SCREEN_CONNECT");
100 case StateChangeReason::STATE_CHANGE_REASON_EXIT_SYSTEM_STR:
101 return std::string("EXIT_SYSTEM_STR");
102 case StateChangeReason::STATE_CHANGE_REASON_TP_TOUCH:
103 return std::string("TP_TOUCH");
104 case StateChangeReason::STATE_CHANGE_REASON_TP_COVER:
105 return std::string("TP_COVER");
106 case StateChangeReason::STATE_CHANGE_REASON_EX_SCREEN_INIT:
107 return std::string("EX_SCREEN_INIT");
108 case StateChangeReason::STATE_CHANGE_REASON_ABNORMAL_SCREEN_CONNECT:
109 return std::string("ABNORMAL_SCREEN_CONNECT");
110 case StateChangeReason::STATE_CHANGE_REASON_ROLLBACK_HIBERNATE:
111 return std::string("ROLLBACK_HIBERNATE");
112 case StateChangeReason::STATE_CHANGE_REASON_PLUG_CHANGE:
113 return std::string("PLUG_CHANGE");
114 case StateChangeReason::STATE_CHANGE_REASON_UNKNOWN:
115 return std::string("UNKNOWN");
116 case StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL:
117 return std::string("BLUETOOTH_INCOMING_CALL");
118 default:
119 break;
120 }
121 return std::string("UNKNOWN");
122 }
123
GetPowerStateString(PowerState state)124 const std::string PowerUtils::GetPowerStateString(PowerState state)
125 {
126 switch (state) {
127 case PowerState::AWAKE:
128 return std::string("AWAKE");
129 case PowerState::FREEZE:
130 return std::string("FREEZE");
131 case PowerState::INACTIVE:
132 return std::string("INACTIVE");
133 case PowerState::STAND_BY:
134 return std::string("STAND_BY");
135 case PowerState::DOZE:
136 return std::string("DOZE");
137 case PowerState::SLEEP:
138 return std::string("SLEEP");
139 case PowerState::HIBERNATE:
140 return std::string("HIBERNATE");
141 case PowerState::SHUTDOWN:
142 return std::string("SHUTDOWN");
143 case PowerState::DIM:
144 return std::string("DIM");
145 case PowerState::UNKNOWN:
146 return std::string("UNKNOWN");
147 default:
148 break;
149 }
150 return std::string("UNKNOWN");
151 }
152
GetDisplayStateString(DisplayState state)153 const std::string PowerUtils::GetDisplayStateString(DisplayState state)
154 {
155 switch (state) {
156 case DisplayState::DISPLAY_OFF:
157 return std::string("DISPLAY_OFF");
158 case DisplayState::DISPLAY_DIM:
159 return std::string("DISPLAY_DIM");
160 case DisplayState::DISPLAY_ON:
161 return std::string("DISPLAY_ON");
162 case DisplayState::DISPLAY_SUSPEND:
163 return std::string("DISPLAY_SUSPEND");
164 case DisplayState::DISPLAY_UNKNOWN:
165 return std::string("DISPLAY_UNKNOWN");
166 default:
167 break;
168 }
169 return std::string("DISPLAY_UNKNOWN");
170 }
171
GetRunningLockTypeString(RunningLockType type)172 const std::string PowerUtils::GetRunningLockTypeString(RunningLockType type)
173 {
174 switch (type) {
175 case RunningLockType::RUNNINGLOCK_SCREEN:
176 return "SCREEN";
177 case RunningLockType::RUNNINGLOCK_BACKGROUND:
178 return "BACKGROUND";
179 case RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL:
180 return "PROXIMITY_SCREEN_CONTROL";
181 case RunningLockType::RUNNINGLOCK_COORDINATION:
182 return "RUNNINGLOCK_COORDINATION";
183 case RunningLockType::RUNNINGLOCK_BACKGROUND_PHONE:
184 return "BACKGROUND_PHONE";
185 case RunningLockType::RUNNINGLOCK_BACKGROUND_NOTIFICATION:
186 return "BACKGROUND_NOTIFICATION";
187 case RunningLockType::RUNNINGLOCK_BACKGROUND_AUDIO:
188 return "BACKGROUND_AUDIO";
189 case RunningLockType::RUNNINGLOCK_BACKGROUND_SPORT:
190 return "BACKGROUND_SPORT";
191 case RunningLockType::RUNNINGLOCK_BACKGROUND_NAVIGATION:
192 return "BACKGROUND_NAVIGATION";
193 case RunningLockType::RUNNINGLOCK_BACKGROUND_TASK:
194 return "BACKGROUND_TASK";
195 case RunningLockType::RUNNINGLOCK_BUTT:
196 return "BUTT";
197 default:
198 break;
199 }
200 return "UNKNOWN";
201 }
202
GetDmsReasonByPowerReason(StateChangeReason reason)203 Rosen::PowerStateChangeReason PowerUtils::GetDmsReasonByPowerReason(StateChangeReason reason)
204 {
205 using namespace Rosen;
206 PowerStateChangeReason dmsReason = static_cast<PowerStateChangeReason>(reason);
207 switch (reason) {
208 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT:
209 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT;
210 break;
211 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS:
212 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_SUCCESS;
213 break;
214 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON:
215 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON;
216 break;
217 case StateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF:
218 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF;
219 break;
220 case StateChangeReason::STATE_CHANGE_REASON_POWER_KEY:
221 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_POWER_KEY;
222 break;
223 case StateChangeReason::STATE_CHANGE_REASON_TIMEOUT_NO_SCREEN_LOCK:
224 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_COLLABORATION;
225 break;
226 case StateChangeReason::STATE_CHANGE_REASON_SWITCH:
227 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_SWITCH;
228 break;
229 case StateChangeReason::STATE_CHANGE_REASON_SCREEN_CONNECT:
230 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_SCREEN_CONNECT;
231 break;
232 case StateChangeReason::STATE_CHANGE_REASON_EX_SCREEN_INIT:
233 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_EX_SCREEN_INIT;
234 break;
235 case StateChangeReason::STATE_CHANGE_REASON_HIBERNATE:
236 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_HIBERNATE;
237 break;
238 case StateChangeReason::STATE_CHANGE_REASON_ABNORMAL_SCREEN_CONNECT:
239 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_ABNORMAL_SCREEN_CONNECT;
240 break;
241 case StateChangeReason::STATE_CHANGE_REASON_ROLLBACK_HIBERNATE:
242 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_ROLLBACK_HIBERNATE;
243 break;
244 case StateChangeReason::STATE_CHANGE_REASON_START_DREAM:
245 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_START_DREAM;
246 break;
247 case StateChangeReason::STATE_CHANGE_REASON_END_DREAM:
248 dmsReason = PowerStateChangeReason::STATE_CHANGE_REASON_END_DREAM;
249 break;
250 default:
251 break;
252 }
253 POWER_HILOGI(FEATURE_POWER_STATE, "The reason to DMS is = %{public}d", static_cast<uint32_t>(dmsReason));
254 return dmsReason;
255 }
256
GetReasonByUserActivity(UserActivityType type)257 StateChangeReason PowerUtils::GetReasonByUserActivity(UserActivityType type)
258 {
259 StateChangeReason ret = StateChangeReason::STATE_CHANGE_REASON_UNKNOWN;
260 switch (type) {
261 case UserActivityType::USER_ACTIVITY_TYPE_BUTTON:
262 ret = StateChangeReason::STATE_CHANGE_REASON_HARD_KEY;
263 break;
264 case UserActivityType::USER_ACTIVITY_TYPE_TOUCH:
265 ret = StateChangeReason::STATE_CHANGE_REASON_TOUCH;
266 break;
267 case UserActivityType::USER_ACTIVITY_TYPE_ACCESSIBILITY:
268 ret = StateChangeReason::STATE_CHANGE_REASON_ACCESSIBILITY;
269 break;
270 case UserActivityType::USER_ACTIVITY_TYPE_SOFTWARE:
271 ret = StateChangeReason::STATE_CHANGE_REASON_APPLICATION;
272 break;
273 case UserActivityType::USER_ACTIVITY_TYPE_SWITCH:
274 ret = StateChangeReason::STATE_CHANGE_REASON_SWITCH;
275 break;
276 case UserActivityType::USER_ACTIVITY_TYPE_CABLE:
277 ret = StateChangeReason::STATE_CHANGE_REASON_CABLE;
278 break;
279 case UserActivityType::USER_ACTIVITY_TYPE_ATTENTION: // fall through
280 case UserActivityType::USER_ACTIVITY_TYPE_OTHER: // fall through
281 default:
282 break;
283 }
284 return ret;
285 }
286
ParseWakeupDeviceType(const std::string & details)287 WakeupDeviceType PowerUtils::ParseWakeupDeviceType(const std::string& details)
288 {
289 WakeupDeviceType parsedType = WakeupDeviceType::WAKEUP_DEVICE_APPLICATION;
290
291 if (strcmp(details.c_str(), "pre_bright") == 0) {
292 parsedType = WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT;
293 } else if (strcmp(details.c_str(), "pre_bright_auth_success") == 0) {
294 parsedType = WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT_AUTH_SUCCESS;
295 } else if (strcmp(details.c_str(), "pre_bright_auth_fail_screen_on") == 0) {
296 parsedType = WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON;
297 } else if (strcmp(details.c_str(), "pre_bright_auth_fail_screen_off") == 0) {
298 parsedType = WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF;
299 } else if (strcmp(details.c_str(), "incoming call") == 0) {
300 parsedType = WakeupDeviceType::WAKEUP_DEVICE_INCOMING_CALL;
301 } else if (strcmp(details.c_str(), "fake_str_check_unlock") == 0) {
302 parsedType = WakeupDeviceType::WAKEUP_DEVICE_EXIT_SYSTEM_STR;
303 } else if (strcmp(details.c_str(), "shell") == 0) {
304 parsedType = WakeupDeviceType::WAKEUP_DEVICE_SHELL;
305 } else if (strcmp(details.c_str(), "end_dream") == 0) {
306 parsedType = WakeupDeviceType::WAKEUP_DEVICE_END_DREAM;
307 } else if (strcmp(details.c_str(), "wake up screen:receive bluetooth call") == 0) {
308 parsedType = WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL;
309 }
310
311 if (parsedType != WakeupDeviceType::WAKEUP_DEVICE_APPLICATION) {
312 POWER_HILOGI(FEATURE_WAKEUP, "Parsed wakeup type is %{public}d", static_cast<uint32_t>(parsedType));
313 }
314 return parsedType;
315 }
316
JsonToSimpleStr(const std::string & json)317 const std::string PowerUtils::JsonToSimpleStr(const std::string& json)
318 {
319 std::string str;
320 for (auto ch : json) {
321 if (ch != ' ' && ch != '\n') {
322 str += ch;
323 }
324 }
325 return str;
326 }
327
IsForegroundApplication(const std::string & appName)328 bool PowerUtils::IsForegroundApplication(const std::string& appName)
329 {
330 void* handler = dlopen("libpower_ability.z.so", RTLD_NOW | RTLD_NODELETE);
331 if (handler == nullptr) {
332 POWER_HILOGE(FEATURE_UTIL, "dlopen libpower_ability.z.so failed, reason : %{public}s", dlerror());
333 return false;
334 }
335
336 auto powerIsForegroundApplicationFunc =
337 reinterpret_cast<bool (*)(const std::string&)>(dlsym(handler, "PowerIsForegroundApplication"));
338 if (powerIsForegroundApplicationFunc == nullptr) {
339 POWER_HILOGE(FEATURE_UTIL, "find PowerIsForegroundApplication function failed, reason : %{public}s", dlerror());
340 #ifndef FUZZ_TEST
341 dlclose(handler);
342 #endif
343 handler = nullptr;
344 return false;
345 }
346 bool isForeground = powerIsForegroundApplicationFunc(appName);
347 #ifndef FUZZ_TEST
348 dlclose(handler);
349 #endif
350 handler = nullptr;
351 return isForeground;
352 }
353 } // namespace PowerMgr
354 } // namespace OHOS
355