• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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