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
21namespace OHOS {
22namespace PowerMgr {
23const 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_EXIT_SYSTEM_STR:
99            return std::string("EXIT_SYSTEM_STR");
100        case StateChangeReason::STATE_CHANGE_REASON_UNKNOWN:
101            return std::string("UNKNOWN");
102        default:
103            break;
104    }
105    return std::string("UNKNOWN");
106}
107
108const std::string PowerUtils::GetPowerStateString(PowerState state)
109{
110    switch (state) {
111        case PowerState::AWAKE:
112            return std::string("AWAKE");
113        case PowerState::FREEZE:
114            return std::string("FREEZE");
115        case PowerState::INACTIVE:
116            return std::string("INACTIVE");
117        case PowerState::STAND_BY:
118            return std::string("STAND_BY");
119        case PowerState::DOZE:
120            return std::string("DOZE");
121        case PowerState::SLEEP:
122            return std::string("SLEEP");
123        case PowerState::HIBERNATE:
124            return std::string("HIBERNATE");
125        case PowerState::SHUTDOWN:
126            return std::string("SHUTDOWN");
127        case PowerState::DIM:
128            return std::string("DIM");
129        case PowerState::UNKNOWN:
130            return std::string("UNKNOWN");
131        default:
132            break;
133    }
134    return std::string("UNKNOWN");
135}
136
137const std::string PowerUtils::GetDisplayStateString(DisplayState state)
138{
139    switch (state) {
140        case DisplayState::DISPLAY_OFF:
141            return std::string("DISPLAY_OFF");
142        case DisplayState::DISPLAY_DIM:
143            return std::string("DISPLAY_DIM");
144        case DisplayState::DISPLAY_ON:
145            return std::string("DISPLAY_ON");
146        case DisplayState::DISPLAY_SUSPEND:
147            return std::string("DISPLAY_SUSPEND");
148        case DisplayState::DISPLAY_UNKNOWN:
149            return std::string("DISPLAY_UNKNOWN");
150        default:
151            break;
152    }
153    return std::string("DISPLAY_UNKNOWN");
154}
155
156const std::string PowerUtils::GetRunningLockTypeString(RunningLockType type)
157{
158    switch (type) {
159        case RunningLockType::RUNNINGLOCK_SCREEN:
160            return "SCREEN";
161        case RunningLockType::RUNNINGLOCK_BACKGROUND:
162            return "BACKGROUND";
163        case RunningLockType::RUNNINGLOCK_PROXIMITY_SCREEN_CONTROL:
164            return "PROXIMITY_SCREEN_CONTROL";
165        case RunningLockType::RUNNINGLOCK_COORDINATION:
166            return "RUNNINGLOCK_COORDINATION";
167        case RunningLockType::RUNNINGLOCK_BACKGROUND_PHONE:
168            return "BACKGROUND_PHONE";
169        case RunningLockType::RUNNINGLOCK_BACKGROUND_NOTIFICATION:
170            return "BACKGROUND_NOTIFICATION";
171        case RunningLockType::RUNNINGLOCK_BACKGROUND_AUDIO:
172            return "BACKGROUND_AUDIO";
173        case RunningLockType::RUNNINGLOCK_BACKGROUND_SPORT:
174            return "BACKGROUND_SPORT";
175        case RunningLockType::RUNNINGLOCK_BACKGROUND_NAVIGATION:
176            return "BACKGROUND_NAVIGATION";
177        case RunningLockType::RUNNINGLOCK_BACKGROUND_TASK:
178            return "BACKGROUND_TASK";
179        case RunningLockType::RUNNINGLOCK_BUTT:
180            return "BUTT";
181        default:
182            break;
183    }
184    return "UNKNOWN";
185}
186
187const std::string PowerUtils::JsonToSimpleStr(const std::string& json)
188{
189    std::string str;
190    for (auto ch : json) {
191        if (ch != ' ' && ch != '\n') {
192            str += ch;
193        }
194    }
195    return str;
196}
197
198bool PowerUtils::IsForegroundApplication(const std::string& appName)
199{
200    void* handler = dlopen("libpower_ability.z.so", RTLD_NOW);
201    if (handler == nullptr) {
202        POWER_HILOGE(FEATURE_UTIL, "dlopen libpower_ability.z.so failed, reason : %{public}s", dlerror());
203        return false;
204    }
205
206    auto powerIsForegroundApplicationFunc =
207        reinterpret_cast<bool (*)(const std::string&)>(dlsym(handler, "PowerIsForegroundApplication"));
208    if (powerIsForegroundApplicationFunc == nullptr) {
209        POWER_HILOGE(FEATURE_UTIL, "find PowerIsForegroundApplication function failed, reason : %{public}s", dlerror());
210#ifndef FUZZ_TEST
211        dlclose(handler);
212#endif
213        handler = nullptr;
214        return false;
215    }
216    bool isForeground = powerIsForegroundApplicationFunc(appName);
217#ifndef FUZZ_TEST
218    dlclose(handler);
219#endif
220    handler = nullptr;
221    return isForeground;
222}
223} // namespace PowerMgr
224} // namespace OHOS
225