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 "bytrace_adapter.h"
16
17 #include <string>
18
19 #include "define_multimodal.h"
20 #include "hitrace_meter.h"
21 #include "mmi_log.h"
22
23 namespace OHOS {
24 namespace MMI {
25 namespace {
26 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "BytraceAdapter" };
27 const std::string onKeyEvent { "OnKeyEvent" };
28 const std::string onTouchEvent { "OnTouchEvent" };
29 const std::string onPointerEvent { "OnPointerEvent" };
30 const std::string keyEventDispatch { "KeyEventDispatch" };
31 const std::string touchEventDispatch { "touchEventDispatch" };
32 const std::string pointerEventDispatch { "PointerEventDispatch" };
33 const std::string keyEventSubscribe { "KeyEventSubscribe" };
34 const std::string pointerEventIntercept { "PointerEventIntercept" };
35 const std::string touchEventIntercept { "TouchEventIntercept" };
36 const std::string keyEventIntercept { "KeyEventIntercept" };
37 const std::string startEvent { "StartEvent" };
38 const std::string launchEvent { "LaunchEvent" };
39 const std::string stopEvent { "StopEvent" };
40 constexpr int32_t START_ID = 1;
41 constexpr int32_t LAUNCH_ID = 2;
42 constexpr int32_t STOP_ID = 3;
43 } // namespace
44
StartBytrace(std::shared_ptr<KeyEvent> keyEvent)45 void BytraceAdapter::StartBytrace(std::shared_ptr<KeyEvent> keyEvent)
46 {
47 CHKPV(keyEvent);
48 int32_t keyId = keyEvent->GetId();
49 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onKeyEvent, keyId);
50 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "service report keyId=" + std::to_string(keyId) +
51 " Action: " + GetKeyTraceString(keyEvent));
52 }
53
GetKeyTraceString(std::shared_ptr<KeyEvent> keyEvent)54 std::string BytraceAdapter::GetKeyTraceString(std::shared_ptr<KeyEvent> keyEvent)
55 {
56 CHKPS(keyEvent);
57 std::string traceStr = KeyEvent::ActionToString(keyEvent->GetKeyAction());
58 return traceStr;
59 }
60
GetPointerTraceString(std::shared_ptr<PointerEvent> pointerEvent)61 std::string BytraceAdapter::GetPointerTraceString(std::shared_ptr<PointerEvent> pointerEvent)
62 {
63 CHKPS(pointerEvent);
64 std::vector<PointerEvent::PointerItem> pointerItems;
65 std::vector<int32_t> pointerIds{ pointerEvent->GetPointerIds() };
66 for (const auto &pointerId : pointerIds) {
67 PointerEvent::PointerItem item;
68 if (!pointerEvent->GetPointerItem(pointerId, item)) {
69 MMI_HILOGE("Invalid pointer: %{public}d.", pointerId);
70 return "";
71 }
72 pointerItems.emplace_back(item);
73 }
74 std::string traceStr;
75 for (const auto &item : pointerItems) {
76 auto id = item.GetPointerId();
77 auto displayX = item.GetDisplayX();
78 auto displayY = item.GetDisplayY();
79 traceStr += " [";
80 traceStr += "id: " + std::to_string(id);
81 traceStr += ", x:" + std::to_string(displayX);
82 traceStr += ", y:" + std::to_string(displayY);
83 traceStr += "]";
84 }
85 return traceStr;
86 }
87
StartBytrace(std::shared_ptr<PointerEvent> pointerEvent,TraceBtn traceBtn)88 void BytraceAdapter::StartBytrace(std::shared_ptr<PointerEvent> pointerEvent, TraceBtn traceBtn)
89 {
90 CHKPV(pointerEvent);
91 int32_t eventId = pointerEvent->GetId();
92 if (traceBtn == TRACE_START) {
93 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
94 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onPointerEvent, eventId);
95 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "service report pointerId:" + std::to_string(eventId) +
96 + ", type: " + pointerEvent->DumpPointerAction() + GetPointerTraceString(pointerEvent));
97 } else {
98 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onTouchEvent, eventId);
99 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "service report touchId:" + std::to_string(eventId) +
100 + ", type: " + pointerEvent->DumpPointerAction() + GetPointerTraceString(pointerEvent));
101 }
102 } else {
103 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
104 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onPointerEvent, eventId);
105 } else {
106 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onTouchEvent, eventId);
107 }
108 }
109 }
110
StartBytrace(std::shared_ptr<KeyEvent> key,HandlerType handlerType)111 void BytraceAdapter::StartBytrace(std::shared_ptr<KeyEvent> key, HandlerType handlerType)
112 {
113 CHKPV(key);
114 int32_t keyCode = key->GetKeyCode();
115 std::string checkKeyCode;
116 switch (handlerType) {
117 case KEY_INTERCEPT_EVENT: {
118 checkKeyCode = "Intercept keycode:" + std::to_string(keyCode);
119 break;
120 }
121 case KEY_LAUNCH_EVENT: {
122 checkKeyCode = "Launch keycode:" + std::to_string(keyCode);
123 break;
124 }
125 case KEY_SUBSCRIBE_EVENT: {
126 checkKeyCode = "Subscribe keycode:" + std::to_string(keyCode);
127 break;
128 }
129 case KEY_DISPATCH_EVENT: {
130 checkKeyCode = "Dispatch keycode:" + std::to_string(keyCode);
131 break;
132 }
133 default: {
134 checkKeyCode = "Unknown keycode:" + std::to_string(keyCode);
135 break;
136 }
137 }
138 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, checkKeyCode);
139 int32_t keyId = key->GetId();
140 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, onKeyEvent, keyId);
141 }
142
StartBytrace(std::shared_ptr<KeyEvent> keyEvent,TraceBtn traceBtn,HandlerType handlerType)143 void BytraceAdapter::StartBytrace(std::shared_ptr<KeyEvent> keyEvent, TraceBtn traceBtn, HandlerType handlerType)
144 {
145 CHKPV(keyEvent);
146 int32_t keyId = keyEvent->GetId();
147 int32_t keyCode = keyEvent->GetKeyCode();
148 if (traceBtn == TRACE_START) {
149 switch (handlerType) {
150 case KEY_INTERCEPT_EVENT: {
151 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventIntercept, keyId);
152 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client Intercept keyCode:" + std::to_string(keyCode));
153 break;
154 }
155 case KEY_SUBSCRIBE_EVENT: {
156 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventSubscribe, keyId);
157 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client subscribe keyCode:" + std::to_string(keyCode));
158 break;
159 }
160 case KEY_DISPATCH_EVENT: {
161 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventDispatch, keyId);
162 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client dispatch keyCode:" + std::to_string(keyCode));
163 break;
164 }
165 default: {
166 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "Unknown keycode:" + std::to_string(keyCode));
167 break;
168 }
169 }
170 } else {
171 switch (handlerType) {
172 case KEY_INTERCEPT_EVENT: {
173 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventIntercept, keyId);
174 break;
175 }
176 case KEY_SUBSCRIBE_EVENT: {
177 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventSubscribe, keyId);
178 break;
179 }
180 case KEY_DISPATCH_EVENT: {
181 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventDispatch, keyId);
182 break;
183 }
184 default: {
185 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "Unknown keycode:" + std::to_string(keyCode));
186 break;
187 }
188 }
189 }
190 }
191
StartBytrace(std::shared_ptr<PointerEvent> pointerEvent,TraceBtn traceBtn,HandlerType handlerType)192 void BytraceAdapter::StartBytrace(
193 std::shared_ptr<PointerEvent> pointerEvent, TraceBtn traceBtn, HandlerType handlerType)
194 {
195 CHKPV(pointerEvent);
196 int32_t eventId = pointerEvent->GetId();
197 if (traceBtn == TRACE_START) {
198 if (handlerType == POINT_DISPATCH_EVENT) {
199 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
200 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, pointerEventDispatch, eventId);
201 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client dispatch pointerId:" + std::to_string(eventId));
202 } else {
203 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, touchEventDispatch, eventId);
204 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client dispatch touchId:" + std::to_string(eventId));
205 }
206 } else {
207 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
208 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, pointerEventIntercept, eventId);
209 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT,
210 "client Intercept pointerId:" + std::to_string(eventId));
211 } else {
212 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, touchEventIntercept, eventId);
213 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, "client Intercept touchId:" + std::to_string(eventId));
214 }
215 }
216 } else {
217 if (handlerType == POINT_DISPATCH_EVENT) {
218 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
219 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, pointerEventDispatch, eventId);
220 } else {
221 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, touchEventDispatch, eventId);
222 }
223 }
224 if (handlerType == POINT_INTERCEPT_EVENT) {
225 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_MOUSE) {
226 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, pointerEventIntercept, eventId);
227 } else {
228 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, touchEventIntercept, eventId);
229 }
230 }
231 }
232 }
233
StartBytrace(TraceBtn traceBtn,EventType eventType)234 void BytraceAdapter::StartBytrace(TraceBtn traceBtn, EventType eventType)
235 {
236 std::string checkKeyCode;
237 if (traceBtn == TRACE_START) {
238 switch (eventType) {
239 case START_EVENT: {
240 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, startEvent, START_ID);
241 checkKeyCode = "crossing startId:" + std::to_string(START_ID);
242 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, checkKeyCode);
243 break;
244 }
245 case LAUNCH_EVENT: {
246 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, launchEvent, LAUNCH_ID);
247 checkKeyCode = "crossing launchId:" + std::to_string(LAUNCH_ID);
248 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, checkKeyCode);
249 break;
250 }
251 case STOP_EVENT: {
252 StartAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, stopEvent, STOP_ID);
253 checkKeyCode = "crossing stopId:" + std::to_string(STOP_ID);
254 HITRACE_METER_NAME(HITRACE_TAG_MULTIMODALINPUT, checkKeyCode);
255 break;
256 }
257 }
258 } else {
259 switch (eventType) {
260 case START_EVENT: {
261 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventIntercept, START_ID);
262 break;
263 }
264 case LAUNCH_EVENT: {
265 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventIntercept, LAUNCH_ID);
266 break;
267 }
268 case STOP_EVENT: {
269 FinishAsyncTrace(HITRACE_TAG_MULTIMODALINPUT, keyEventIntercept, STOP_ID);
270 break;
271 }
272 }
273 }
274 }
275 } // namespace MMI
276 } // namespace OHOS