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