1 /*
2 * Copyright (c) 2022 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 #include "dfx_hisysevent.h"
16
17 namespace OHOS {
18 namespace MMI {
19 namespace {
20 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "DfxHisysevent" };
21 constexpr int32_t INVALID_DEVICE_ID = -1;
22 constexpr uint32_t REPORT_DISPATCH_TIMES = 100;
23 constexpr uint32_t REPORT_COMBO_START_TIMES = 100;
24 constexpr uint32_t POINTER_CLEAR_TIMES = 10;
25 constexpr int32_t CONVERSION_US_TO_MS = 1000;
26 constexpr int32_t TIMES_LEVEL1 = 10;
27 constexpr int32_t TIMES_LEVEL2 = 25;
28 constexpr int32_t TIMES_LEVEL3 = 30;
29 constexpr int32_t TIMES_LEVEL4 = 50;
30 } // namespace
31
OnDeviceConnect(int32_t id,OHOS::HiviewDFX::HiSysEvent::EventType type)32 void DfxHisysevent::OnDeviceConnect(int32_t id, OHOS::HiviewDFX::HiSysEvent::EventType type)
33 {
34 std::shared_ptr dev = InputDevMgr->GetInputDevice(id);
35 CHKPV(dev);
36 std::string message;
37 std::string name = "";
38 if (type == OHOS::HiviewDFX::HiSysEvent::EventType::FAULT) {
39 message = "The input_device connection failed for already existing";
40 name = "INPUT_DEV_CONNECTION_FAILURE";
41 } else {
42 message = "The input_device connection succeed";
43 name = "INPUT_DEV_CONNECTION_SUCCESS";
44 }
45 if (id == INT32_MAX) {
46 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
47 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
48 name,
49 type,
50 "MSG", "The input_device connection failed because the nextId_ exceeded the upper limit");
51 if (ret != 0) {
52 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
53 }
54 } else {
55 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
56 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
57 name,
58 type,
59 "DEVICE_ID", id,
60 "DEVICE_PHYS", dev->GetPhys(),
61 "DEVICE_NAME", dev->GetName(),
62 "DEVICE_TYPE", dev->GetType(),
63 "MSG", message);
64 if (ret != 0) {
65 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
66 }
67 }
68 }
69
OnDeviceDisconnect(int32_t id,OHOS::HiviewDFX::HiSysEvent::EventType type)70 void DfxHisysevent::OnDeviceDisconnect(int32_t id, OHOS::HiviewDFX::HiSysEvent::EventType type)
71 {
72 if (id == INVALID_DEVICE_ID) {
73 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
74 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
75 "INPUT_DEV_DISCONNECTION_FAILURE",
76 type,
77 "MSG", "The input device failed to disconnect to server");
78 if (ret != 0) {
79 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
80 }
81 } else {
82 std::shared_ptr dev = InputDevMgr->GetInputDevice(id);
83 CHKPV(dev);
84 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
85 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
86 "INPUT_DEV_DISCONNECTION_SUCCESS",
87 type,
88 "DEVICE_Id", id,
89 "DEVICE_PHYS", dev->GetPhys(),
90 "DEVICE_NAME", dev->GetName(),
91 "DEVICE_TYPE", dev->GetType(),
92 "MSG", "The input device successfully disconnect to server");
93 if (ret != 0) {
94 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
95 }
96 }
97 }
98
OnClientConnect(const ClientConnectData & data,OHOS::HiviewDFX::HiSysEvent::EventType type)99 void DfxHisysevent::OnClientConnect(const ClientConnectData &data, OHOS::HiviewDFX::HiSysEvent::EventType type)
100 {
101 if (type == OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR) {
102 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
103 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
104 "CLIENT_CONNECTION_SUCCESS",
105 type,
106 "PID", data.pid,
107 "UID", data.uid,
108 "MODULE_TYPE", data.moduleType,
109 "SERVER_FD", data.serverFd,
110 "PROGRAMNAME", data.programName,
111 "MSG", "The client successfully connected to the server");
112 if (ret != 0) {
113 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
114 }
115 } else {
116 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
117 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
118 "CLIENT_CONNECTION_FAILURE",
119 type,
120 "PID", data.pid,
121 "UID", data.uid,
122 "MODULE_TYPE", data.moduleType,
123 "PROGRAMNAME", data.programName,
124 "MSG", "The client failed to connect to the server");
125 if (ret != 0) {
126 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
127 }
128 }
129 }
130
OnClientDisconnect(const SessionPtr & secPtr,int32_t fd,OHOS::HiviewDFX::HiSysEvent::EventType type)131 void DfxHisysevent::OnClientDisconnect(const SessionPtr& secPtr, int32_t fd,
132 OHOS::HiviewDFX::HiSysEvent::EventType type)
133 {
134 CHKPV(secPtr);
135 if (type == OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR) {
136 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
137 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
138 "CLIENT_DISCONNECTION_SUCCESS",
139 type,
140 "PID", secPtr->GetPid(),
141 "UID", secPtr->GetUid(),
142 "MODULE_TYPE", secPtr->GetModuleType(),
143 "FD", fd,
144 "PROGRAMNAME", secPtr->GetProgramName(),
145 "MSG", "The client successfully disconnected to the server");
146 if (ret != 0) {
147 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
148 }
149 } else {
150 if (secPtr == nullptr) {
151 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
152 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
153 "CLIENT_DISCONNECTION_FAILURE",
154 type,
155 "MSG", "The client failed to disconnect to the server because secPtr is nullptr");
156 if (ret != 0) {
157 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
158 }
159 } else {
160 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
161 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
162 "CLIENT_DISCONNECTION_FAILURE",
163 type,
164 "MSG", "The client failed to disconnect to the server because close(fd) return error");
165 if (ret != 0) {
166 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
167 }
168 }
169 }
170 }
171
OnUpdateTargetPointer(std::shared_ptr<PointerEvent> pointer,int32_t fd,OHOS::HiviewDFX::HiSysEvent::EventType type)172 void DfxHisysevent::OnUpdateTargetPointer(std::shared_ptr<PointerEvent> pointer, int32_t fd,
173 OHOS::HiviewDFX::HiSysEvent::EventType type)
174 {
175 CHKPV(pointer);
176 if (type == OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR) {
177 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
178 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
179 "TARGET_POINTER_EVENT_SUCCESS",
180 type,
181 "EVENTTYPE", pointer->GetEventType(),
182 "AGENT_WINDOWID", pointer->GetAgentWindowId(),
183 "TARGET_WINDOWID", pointer->GetTargetWindowId(),
184 "PID", WinMgr->GetWindowPid(pointer->GetTargetWindowId()),
185 "FD", fd,
186 "MSG", "The window manager successfully update target pointer");
187 if (ret != 0) {
188 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
189 }
190 } else {
191 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
192 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
193 "TARGET_POINTER_EVENT_FAILURE",
194 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
195 "EVENTTYPE", pointer->GetEventType(),
196 "MSG", "The window manager failed to update target pointer");
197 if (ret != 0) {
198 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
199 }
200 }
201 }
202
OnUpdateTargetKey(std::shared_ptr<KeyEvent> key,int32_t fd,OHOS::HiviewDFX::HiSysEvent::EventType type)203 void DfxHisysevent::OnUpdateTargetKey(std::shared_ptr<KeyEvent> key, int32_t fd,
204 OHOS::HiviewDFX::HiSysEvent::EventType type)
205 {
206 CHKPV(key);
207 if (type == OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR) {
208 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
209 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
210 "TARGET_KEY_EVENT_SUCCESS",
211 type,
212 "EVENTTYPE", key->GetEventType(),
213 "KEYCODE", key->GetKeyCode(),
214 "ACTION", key->GetAction(),
215 "ACTION_TIME", key->GetActionTime(),
216 "ACTION_STARTTIME", key->GetActionStartTime(),
217 "FLAG", key->GetFlag(),
218 "KEYACTION", key->GetKeyAction(),
219 "FD", fd,
220 "AGENT_WINDOWID", key->GetAgentWindowId(),
221 "TARGET_WINDOWID", key->GetTargetWindowId(),
222 "PID", WinMgr->GetWindowPid(key->GetTargetWindowId()),
223 "MSG", "The window manager successfully update target key");
224 if (ret != 0) {
225 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
226 }
227 } else {
228 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
229 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
230 "TARGET_KEY_EVENT_FAILURE",
231 type,
232 "EVENTTYPE", key->GetEventType(),
233 "KEYCODE", key->GetKeyCode(),
234 "ACTION", key->GetAction(),
235 "ACTION_TIME", key->GetActionTime(),
236 "ACTION_STARTTIME", key->GetActionStartTime(),
237 "FLAG", key->GetFlag(),
238 "KEYACTION", key->GetKeyAction(),
239 "MSG", "The window manager failed to update target key");
240 if (ret != 0) {
241 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
242 }
243 }
244 }
245
OnFocusWindowChanged(int32_t oldFocusWindowId,int32_t newFocusWindowId,int32_t oldFocusWindowPid,int32_t newFocusWindowPid)246 void DfxHisysevent::OnFocusWindowChanged(int32_t oldFocusWindowId, int32_t newFocusWindowId,
247 int32_t oldFocusWindowPid, int32_t newFocusWindowPid)
248 {
249 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
250 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
251 "FOCUS_WINDOW_CHANGE",
252 OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
253 "OLD_FOCUS_WINDOWID", oldFocusWindowId,
254 "NEW_FOCUS_WINDOWID", newFocusWindowId,
255 "OLD_FOCUS_WINDOWPID", oldFocusWindowPid,
256 "NEW_FOCUS_WINDOWPID", newFocusWindowPid,
257 "MSG", "The focusWindowId changing succeeded");
258 if (ret != 0) {
259 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
260 }
261 }
262
OnZorderWindowChanged(int32_t oldZorderFirstWindowId,int32_t newZorderFirstWindowId,int32_t oldZorderFirstWindowPid,int32_t newZorderFirstWindowPid)263 void DfxHisysevent::OnZorderWindowChanged(int32_t oldZorderFirstWindowId, int32_t newZorderFirstWindowId,
264 int32_t oldZorderFirstWindowPid, int32_t newZorderFirstWindowPid)
265 {
266 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
267 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
268 "Z_ORDER_WINDOW_CHANGE",
269 OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
270 "OLD_ZORDER_FIRST_WINDOWID", oldZorderFirstWindowId,
271 "NEW_ZORDER_FIRST_WINDOWID", newZorderFirstWindowId,
272 "OLD_ZORDER_FIRST_WINDOWPID", oldZorderFirstWindowPid,
273 "NEW_ZORDER_FIRST_WINDOWPID", newZorderFirstWindowPid,
274 "MSG", "The ZorderFirstWindow changing succeeded");
275 if (ret != 0) {
276 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
277 }
278 }
279
ApplicationBlockInput(const SessionPtr & sess)280 void DfxHisysevent::ApplicationBlockInput(const SessionPtr& sess)
281 {
282 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
283 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
284 "APPLICATION_BLOCK_INPUT",
285 OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
286 "PID", sess->GetPid(),
287 "UID", sess->GetUid(),
288 "PACKAGE_NAME", sess->GetProgramName(),
289 "PROCESS_NAME", sess->GetProgramName(),
290 "MSG", "User input does not respond");
291 if (ret != 0) {
292 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
293 }
294 }
295
CalcKeyDispTimes()296 void DfxHisysevent::CalcKeyDispTimes()
297 {
298 int64_t endTime = GetSysClockTime();
299 dispCastTime_.totalTimes++;
300 int64_t castTime = (endTime - dispatchStartTime_) / CONVERSION_US_TO_MS;
301 if (castTime <= TIMES_LEVEL1) {
302 dispCastTime_.below10msTimes++;
303 } else if (castTime <= TIMES_LEVEL2) {
304 dispCastTime_.below25msTimes++;
305 } else if (castTime <= TIMES_LEVEL4) {
306 dispCastTime_.below50msTimes++;
307 } else {
308 dispCastTime_.above50msTimes++;
309 }
310 }
311
CalcPointerDispTimes()312 void DfxHisysevent::CalcPointerDispTimes()
313 {
314 int64_t endTime = GetSysClockTime();
315 dispCastTime_.sampleCount++;
316 int64_t castTime = (endTime - dispatchStartTime_) / CONVERSION_US_TO_MS;
317 if (dispCastTime_.sampleCount == POINTER_CLEAR_TIMES) {
318 dispCastTime_.sampleCount = 0;
319 dispCastTime_.totalTimes++;
320 if (castTime <= TIMES_LEVEL1) {
321 dispCastTime_.below10msTimes++;
322 } else if (castTime <= TIMES_LEVEL2) {
323 dispCastTime_.below25msTimes++;
324 } else if (castTime <= TIMES_LEVEL4) {
325 dispCastTime_.below50msTimes++;
326 } else {
327 dispCastTime_.above50msTimes++;
328 }
329 }
330 }
331
ReportDispTimes()332 void DfxHisysevent::ReportDispTimes()
333 {
334 if (dispCastTime_.totalTimes >= REPORT_DISPATCH_TIMES) {
335 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
336 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
337 "INPUT_DISPATCH_TIME",
338 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
339 "BELOW10MS", dispCastTime_.below10msTimes,
340 "BELOW25MS", dispCastTime_.below25msTimes,
341 "BELOW50MS", dispCastTime_.below50msTimes,
342 "ABOVE50MS", dispCastTime_.above50msTimes,
343 "MSG", "The costing time to dispatch event");
344 if (ret != 0) {
345 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
346 } else {
347 dispCastTime_.sampleCount = 0;
348 dispCastTime_.totalTimes = 0;
349 dispCastTime_.below10msTimes = 0;
350 dispCastTime_.below25msTimes = 0;
351 dispCastTime_.below50msTimes = 0;
352 dispCastTime_.above50msTimes = 0;
353 }
354 }
355 }
356
CalcComboStartTimes(const int32_t keyDownDuration)357 void DfxHisysevent::CalcComboStartTimes(const int32_t keyDownDuration)
358 {
359 int64_t endTime = GetSysClockTime();
360 comboStartCastTime_.totalTimes++;
361 int64_t castTime = (endTime - comboStartTime_) / CONVERSION_US_TO_MS - keyDownDuration;
362 if (castTime <= TIMES_LEVEL1) {
363 comboStartCastTime_.below10msTimes++;
364 } else if (castTime <= TIMES_LEVEL3) {
365 comboStartCastTime_.below30msTimes++;
366 } else if (castTime <= TIMES_LEVEL4) {
367 comboStartCastTime_.below50msTimes++;
368 } else {
369 comboStartCastTime_.above50msTimes++;
370 }
371 }
372
ReportComboStartTimes()373 void DfxHisysevent::ReportComboStartTimes()
374 {
375 if (comboStartCastTime_.totalTimes >= REPORT_COMBO_START_TIMES) {
376 int32_t ret = OHOS::HiviewDFX::HiSysEvent::Write(
377 OHOS::HiviewDFX::HiSysEvent::Domain::MULTI_MODAL_INPUT,
378 "COMBO_START_TIME",
379 OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
380 "BELOW10MS", comboStartCastTime_.below10msTimes,
381 "BELOW30MS", comboStartCastTime_.below30msTimes,
382 "BELOW50MS", comboStartCastTime_.below50msTimes,
383 "ABOVE50MS", comboStartCastTime_.above50msTimes,
384 "MSG", "The costing time to launch application of combination");
385 if (ret != 0) {
386 MMI_HILOGE("HiviewDFX Write failed, ret:%{public}d", ret);
387 } else {
388 comboStartCastTime_.totalTimes = 0;
389 comboStartCastTime_.below10msTimes = 0;
390 comboStartCastTime_.below30msTimes = 0;
391 comboStartCastTime_.below50msTimes = 0;
392 comboStartCastTime_.above50msTimes = 0;
393 }
394 }
395 }
396 }
397 }
398
399