1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include <cassert>
17c29fa5a6Sopenharmony_ci#include <chrono>
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include "axis_event.h"
20c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
21c29fa5a6Sopenharmony_ci#include "input_event.h"
22c29fa5a6Sopenharmony_ci#include "key_event.h"
23c29fa5a6Sopenharmony_ci#include "mmi_log.h"
24c29fa5a6Sopenharmony_ci#include "pointer_event.h"
25c29fa5a6Sopenharmony_ci
26c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
27c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "InputEvent"
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_cinamespace OHOS {
30c29fa5a6Sopenharmony_cinamespace MMI {
31c29fa5a6Sopenharmony_cinamespace {
32c29fa5a6Sopenharmony_ciint64_t g_nextEventId = 1;
33c29fa5a6Sopenharmony_ciconstexpr uint32_t DATA_LENGTH_LIMIT { 1024 }; // 1024: max length
34c29fa5a6Sopenharmony_ci} // namespace
35c29fa5a6Sopenharmony_ci
36c29fa5a6Sopenharmony_cistd::string EventLogHelper::userType_ = "";
37c29fa5a6Sopenharmony_cistd::once_flag EventLogHelper::betaFlag_;
38c29fa5a6Sopenharmony_ci
39c29fa5a6Sopenharmony_ciInputEvent::InputEvent(int32_t eventType) : eventType_(eventType)
40c29fa5a6Sopenharmony_ci{
41c29fa5a6Sopenharmony_ci    Reset();
42c29fa5a6Sopenharmony_ci}
43c29fa5a6Sopenharmony_ci
44c29fa5a6Sopenharmony_ciInputEvent::InputEvent(const InputEvent& other)
45c29fa5a6Sopenharmony_ci    : eventType_(other.eventType_), id_(other.id_), actionTime_(other.actionTime_),
46c29fa5a6Sopenharmony_ci      sensorInputTime_(other.sensorInputTime_), action_(other.action_), actionStartTime_(other.actionStartTime_),
47c29fa5a6Sopenharmony_ci      deviceId_(other.deviceId_), targetDisplayId_(other.targetDisplayId_),
48c29fa5a6Sopenharmony_ci      targetWindowId_(other.targetWindowId_), agentWindowId_(other.agentWindowId_),
49c29fa5a6Sopenharmony_ci      bitwise_(other.bitwise_), markEnabled_(other.markEnabled_),
50c29fa5a6Sopenharmony_ci      extraData_(other.extraData_), extraDataLength_(other.extraDataLength_) {}
51c29fa5a6Sopenharmony_ci
52c29fa5a6Sopenharmony_ciInputEvent::~InputEvent() {}
53c29fa5a6Sopenharmony_ci
54c29fa5a6Sopenharmony_civoid InputEvent::Reset()
55c29fa5a6Sopenharmony_ci{
56c29fa5a6Sopenharmony_ci    struct timespec ts = { 0, 0 };
57c29fa5a6Sopenharmony_ci    if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
58c29fa5a6Sopenharmony_ci        actionTime_ = 0;
59c29fa5a6Sopenharmony_ci    }
60c29fa5a6Sopenharmony_ci    id_ = -1;
61c29fa5a6Sopenharmony_ci    if (!AddInt64(ts.tv_sec * 1000000, ts.tv_nsec / 1000, actionTime_)) {
62c29fa5a6Sopenharmony_ci        MMI_HILOGE("The addition of actionTime_ overflows");
63c29fa5a6Sopenharmony_ci        return;
64c29fa5a6Sopenharmony_ci    }
65c29fa5a6Sopenharmony_ci    action_ = ACTION_UNKNOWN;
66c29fa5a6Sopenharmony_ci    actionStartTime_ = actionTime_;
67c29fa5a6Sopenharmony_ci    deviceId_ = -1;
68c29fa5a6Sopenharmony_ci    targetDisplayId_ = -1;
69c29fa5a6Sopenharmony_ci    targetWindowId_ = -1;
70c29fa5a6Sopenharmony_ci    agentWindowId_ = -1;
71c29fa5a6Sopenharmony_ci    bitwise_ = EVENT_FLAG_NONE;
72c29fa5a6Sopenharmony_ci    markEnabled_ = true;
73c29fa5a6Sopenharmony_ci}
74c29fa5a6Sopenharmony_ci
75c29fa5a6Sopenharmony_cistd::string InputEvent::ToString()
76c29fa5a6Sopenharmony_ci{
77c29fa5a6Sopenharmony_ci    std::string eventStr = "eventType:" + std::to_string(eventType_);
78c29fa5a6Sopenharmony_ci    eventStr += ",actionTime:" + std::to_string(actionTime_);
79c29fa5a6Sopenharmony_ci    eventStr += ",deviceId:" + std::to_string(deviceId_);
80c29fa5a6Sopenharmony_ci    return eventStr;
81c29fa5a6Sopenharmony_ci}
82c29fa5a6Sopenharmony_ci
83c29fa5a6Sopenharmony_cistd::shared_ptr<InputEvent> InputEvent::Create()
84c29fa5a6Sopenharmony_ci{
85c29fa5a6Sopenharmony_ci    auto event = std::shared_ptr<InputEvent>(new (std::nothrow) InputEvent(InputEvent::EVENT_TYPE_BASE));
86c29fa5a6Sopenharmony_ci    CHKPP(event);
87c29fa5a6Sopenharmony_ci    return event;
88c29fa5a6Sopenharmony_ci}
89c29fa5a6Sopenharmony_ci
90c29fa5a6Sopenharmony_ciconst char* InputEvent::EventTypeToString(int32_t eventType)
91c29fa5a6Sopenharmony_ci{
92c29fa5a6Sopenharmony_ci    switch (eventType) {
93c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_BASE: {
94c29fa5a6Sopenharmony_ci            return "base";
95c29fa5a6Sopenharmony_ci        }
96c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_KEY: {
97c29fa5a6Sopenharmony_ci            return "key";
98c29fa5a6Sopenharmony_ci        }
99c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_POINTER: {
100c29fa5a6Sopenharmony_ci            return "pointer";
101c29fa5a6Sopenharmony_ci        }
102c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_AXIS: {
103c29fa5a6Sopenharmony_ci            return "axis";
104c29fa5a6Sopenharmony_ci        }
105c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_FINGERPRINT: {
106c29fa5a6Sopenharmony_ci            return "fingerprint";
107c29fa5a6Sopenharmony_ci        }
108c29fa5a6Sopenharmony_ci        default: {
109c29fa5a6Sopenharmony_ci            MMI_HILOGW("Unknown EVENT_TYPE");
110c29fa5a6Sopenharmony_ci            return "unknown";
111c29fa5a6Sopenharmony_ci        }
112c29fa5a6Sopenharmony_ci    }
113c29fa5a6Sopenharmony_ci}
114c29fa5a6Sopenharmony_ci
115c29fa5a6Sopenharmony_ciint32_t InputEvent::GetId() const
116c29fa5a6Sopenharmony_ci{
117c29fa5a6Sopenharmony_ci    return id_;
118c29fa5a6Sopenharmony_ci}
119c29fa5a6Sopenharmony_ci
120c29fa5a6Sopenharmony_civoid InputEvent::SetId(int32_t id)
121c29fa5a6Sopenharmony_ci{
122c29fa5a6Sopenharmony_ci    id_ = id;
123c29fa5a6Sopenharmony_ci}
124c29fa5a6Sopenharmony_ci
125c29fa5a6Sopenharmony_civoid InputEvent::UpdateId()
126c29fa5a6Sopenharmony_ci{
127c29fa5a6Sopenharmony_ci    id_ = g_nextEventId++;
128c29fa5a6Sopenharmony_ci}
129c29fa5a6Sopenharmony_ci
130c29fa5a6Sopenharmony_ciint64_t InputEvent::GetActionTime() const
131c29fa5a6Sopenharmony_ci{
132c29fa5a6Sopenharmony_ci    return actionTime_;
133c29fa5a6Sopenharmony_ci}
134c29fa5a6Sopenharmony_ci
135c29fa5a6Sopenharmony_civoid InputEvent::SetActionTime(int64_t actionTime)
136c29fa5a6Sopenharmony_ci{
137c29fa5a6Sopenharmony_ci    actionTime_ = actionTime;
138c29fa5a6Sopenharmony_ci}
139c29fa5a6Sopenharmony_ci
140c29fa5a6Sopenharmony_civoid InputEvent::SetSensorInputTime(uint64_t sensorInputTime)
141c29fa5a6Sopenharmony_ci{
142c29fa5a6Sopenharmony_ci    sensorInputTime_ = sensorInputTime;
143c29fa5a6Sopenharmony_ci}
144c29fa5a6Sopenharmony_ci
145c29fa5a6Sopenharmony_ciuint64_t InputEvent::GetSensorInputTime()
146c29fa5a6Sopenharmony_ci{
147c29fa5a6Sopenharmony_ci    return sensorInputTime_;
148c29fa5a6Sopenharmony_ci}
149c29fa5a6Sopenharmony_ci
150c29fa5a6Sopenharmony_ciint32_t InputEvent::GetAction() const
151c29fa5a6Sopenharmony_ci{
152c29fa5a6Sopenharmony_ci    return action_;
153c29fa5a6Sopenharmony_ci}
154c29fa5a6Sopenharmony_ci
155c29fa5a6Sopenharmony_civoid InputEvent::SetAction(int32_t action)
156c29fa5a6Sopenharmony_ci{
157c29fa5a6Sopenharmony_ci    action_ = action;
158c29fa5a6Sopenharmony_ci}
159c29fa5a6Sopenharmony_ci
160c29fa5a6Sopenharmony_ciint64_t InputEvent::GetActionStartTime() const
161c29fa5a6Sopenharmony_ci{
162c29fa5a6Sopenharmony_ci    return actionStartTime_;
163c29fa5a6Sopenharmony_ci}
164c29fa5a6Sopenharmony_ci
165c29fa5a6Sopenharmony_civoid InputEvent::SetActionStartTime(int64_t actionStartTime)
166c29fa5a6Sopenharmony_ci{
167c29fa5a6Sopenharmony_ci    actionStartTime_ = actionStartTime;
168c29fa5a6Sopenharmony_ci}
169c29fa5a6Sopenharmony_ci
170c29fa5a6Sopenharmony_ciint32_t InputEvent::GetDeviceId() const
171c29fa5a6Sopenharmony_ci{
172c29fa5a6Sopenharmony_ci    return deviceId_;
173c29fa5a6Sopenharmony_ci}
174c29fa5a6Sopenharmony_ci
175c29fa5a6Sopenharmony_civoid InputEvent::SetDeviceId(int32_t deviceId)
176c29fa5a6Sopenharmony_ci{
177c29fa5a6Sopenharmony_ci    deviceId_ = deviceId;
178c29fa5a6Sopenharmony_ci}
179c29fa5a6Sopenharmony_ci
180c29fa5a6Sopenharmony_ciint32_t InputEvent::GetTargetDisplayId() const
181c29fa5a6Sopenharmony_ci{
182c29fa5a6Sopenharmony_ci    return targetDisplayId_;
183c29fa5a6Sopenharmony_ci}
184c29fa5a6Sopenharmony_ci
185c29fa5a6Sopenharmony_civoid InputEvent::SetTargetDisplayId(int32_t displayId)
186c29fa5a6Sopenharmony_ci{
187c29fa5a6Sopenharmony_ci    targetDisplayId_ = displayId;
188c29fa5a6Sopenharmony_ci}
189c29fa5a6Sopenharmony_ci
190c29fa5a6Sopenharmony_ciint32_t InputEvent::GetAgentWindowId() const
191c29fa5a6Sopenharmony_ci{
192c29fa5a6Sopenharmony_ci    return agentWindowId_;
193c29fa5a6Sopenharmony_ci}
194c29fa5a6Sopenharmony_ci
195c29fa5a6Sopenharmony_civoid InputEvent::SetAgentWindowId(int32_t windowId)
196c29fa5a6Sopenharmony_ci{
197c29fa5a6Sopenharmony_ci    agentWindowId_ = windowId;
198c29fa5a6Sopenharmony_ci}
199c29fa5a6Sopenharmony_ci
200c29fa5a6Sopenharmony_ciint32_t InputEvent::GetTargetWindowId() const
201c29fa5a6Sopenharmony_ci{
202c29fa5a6Sopenharmony_ci    return targetWindowId_;
203c29fa5a6Sopenharmony_ci}
204c29fa5a6Sopenharmony_ci
205c29fa5a6Sopenharmony_civoid InputEvent::SetTargetWindowId(int32_t windowId)
206c29fa5a6Sopenharmony_ci{
207c29fa5a6Sopenharmony_ci    targetWindowId_ = windowId;
208c29fa5a6Sopenharmony_ci}
209c29fa5a6Sopenharmony_ci
210c29fa5a6Sopenharmony_ciint32_t InputEvent::GetEventType() const
211c29fa5a6Sopenharmony_ci{
212c29fa5a6Sopenharmony_ci    return eventType_;
213c29fa5a6Sopenharmony_ci}
214c29fa5a6Sopenharmony_ci
215c29fa5a6Sopenharmony_ciuint32_t InputEvent::GetFlag() const
216c29fa5a6Sopenharmony_ci{
217c29fa5a6Sopenharmony_ci    return bitwise_;
218c29fa5a6Sopenharmony_ci}
219c29fa5a6Sopenharmony_ci
220c29fa5a6Sopenharmony_cibool InputEvent::HasFlag(uint32_t flag)
221c29fa5a6Sopenharmony_ci{
222c29fa5a6Sopenharmony_ci    return (bitwise_ & flag) != 0;
223c29fa5a6Sopenharmony_ci}
224c29fa5a6Sopenharmony_ci
225c29fa5a6Sopenharmony_civoid InputEvent::AddFlag(uint32_t flag)
226c29fa5a6Sopenharmony_ci{
227c29fa5a6Sopenharmony_ci    bitwise_ |= flag;
228c29fa5a6Sopenharmony_ci}
229c29fa5a6Sopenharmony_ci
230c29fa5a6Sopenharmony_civoid InputEvent::ClearFlag()
231c29fa5a6Sopenharmony_ci{
232c29fa5a6Sopenharmony_ci    bitwise_ = EVENT_FLAG_NONE;
233c29fa5a6Sopenharmony_ci}
234c29fa5a6Sopenharmony_ci
235c29fa5a6Sopenharmony_civoid InputEvent::ClearFlag(uint32_t flag)
236c29fa5a6Sopenharmony_ci{
237c29fa5a6Sopenharmony_ci    bitwise_ &= (~flag);
238c29fa5a6Sopenharmony_ci}
239c29fa5a6Sopenharmony_ci
240c29fa5a6Sopenharmony_cibool InputEvent::IsMarkEnabled() const
241c29fa5a6Sopenharmony_ci{
242c29fa5a6Sopenharmony_ci    return markEnabled_;
243c29fa5a6Sopenharmony_ci}
244c29fa5a6Sopenharmony_ci
245c29fa5a6Sopenharmony_ci
246c29fa5a6Sopenharmony_civoid InputEvent::SetMarkEnabled(bool markEnabled)
247c29fa5a6Sopenharmony_ci{
248c29fa5a6Sopenharmony_ci    markEnabled_ = markEnabled;
249c29fa5a6Sopenharmony_ci}
250c29fa5a6Sopenharmony_ci
251c29fa5a6Sopenharmony_ci
252c29fa5a6Sopenharmony_civoid InputEvent::SetProcessedCallback(std::function<void(int32_t, int64_t)> callback)
253c29fa5a6Sopenharmony_ci{
254c29fa5a6Sopenharmony_ci    processedCallback_ = callback;
255c29fa5a6Sopenharmony_ci}
256c29fa5a6Sopenharmony_ci
257c29fa5a6Sopenharmony_civoid InputEvent::MarkProcessed()
258c29fa5a6Sopenharmony_ci{
259c29fa5a6Sopenharmony_ci    if (!processedCallback_) {
260c29fa5a6Sopenharmony_ci        return;
261c29fa5a6Sopenharmony_ci    }
262c29fa5a6Sopenharmony_ci    if (!markEnabled_) {
263c29fa5a6Sopenharmony_ci        MMI_HILOGD("Skip MarkProcessed eventId:%{public}d, eventType:%{public}d", id_, eventType_);
264c29fa5a6Sopenharmony_ci        return;
265c29fa5a6Sopenharmony_ci    }
266c29fa5a6Sopenharmony_ci    auto func = processedCallback_;
267c29fa5a6Sopenharmony_ci    processedCallback_ = std::function<void(int32_t, int64_t)>();
268c29fa5a6Sopenharmony_ci    func(id_, actionTime_);
269c29fa5a6Sopenharmony_ci}
270c29fa5a6Sopenharmony_ci
271c29fa5a6Sopenharmony_civoid InputEvent::SetExtraData(const std::shared_ptr<const uint8_t[]> data, uint32_t length)
272c29fa5a6Sopenharmony_ci{
273c29fa5a6Sopenharmony_ci    if (data && (length > 0) && (length <= DATA_LENGTH_LIMIT)) {
274c29fa5a6Sopenharmony_ci        extraData_ = data;
275c29fa5a6Sopenharmony_ci        extraDataLength_ = length;
276c29fa5a6Sopenharmony_ci    }
277c29fa5a6Sopenharmony_ci}
278c29fa5a6Sopenharmony_ci
279c29fa5a6Sopenharmony_civoid InputEvent::GetExtraData(std::shared_ptr<const uint8_t[]> &data, uint32_t &length) const
280c29fa5a6Sopenharmony_ci{
281c29fa5a6Sopenharmony_ci    if (extraData_ && extraDataLength_ != 0) {
282c29fa5a6Sopenharmony_ci        data = extraData_;
283c29fa5a6Sopenharmony_ci        length = extraDataLength_;
284c29fa5a6Sopenharmony_ci    } else {
285c29fa5a6Sopenharmony_ci        length = 0;
286c29fa5a6Sopenharmony_ci    }
287c29fa5a6Sopenharmony_ci}
288c29fa5a6Sopenharmony_ci
289c29fa5a6Sopenharmony_cibool InputEvent::WriteToParcel(Parcel &out) const
290c29fa5a6Sopenharmony_ci{
291c29fa5a6Sopenharmony_ci    WRITEINT32(out, eventType_);
292c29fa5a6Sopenharmony_ci    WRITEINT32(out, id_);
293c29fa5a6Sopenharmony_ci    WRITEINT64(out, actionTime_);
294c29fa5a6Sopenharmony_ci    WRITEUINT64(out, sensorInputTime_);
295c29fa5a6Sopenharmony_ci    WRITEINT32(out, action_);
296c29fa5a6Sopenharmony_ci    WRITEINT64(out, actionStartTime_);
297c29fa5a6Sopenharmony_ci    WRITEINT32(out, deviceId_);
298c29fa5a6Sopenharmony_ci    WRITEINT32(out, targetDisplayId_);
299c29fa5a6Sopenharmony_ci    WRITEINT32(out, targetWindowId_);
300c29fa5a6Sopenharmony_ci    WRITEINT32(out, agentWindowId_);
301c29fa5a6Sopenharmony_ci    WRITEUINT32(out, bitwise_);
302c29fa5a6Sopenharmony_ci    WRITEBOOL(out, markEnabled_);
303c29fa5a6Sopenharmony_ci    if (extraData_ && extraDataLength_ != 0) {
304c29fa5a6Sopenharmony_ci        WRITEUINT32(out, extraDataLength_);
305c29fa5a6Sopenharmony_ci        WRITEBUFFER(out, (void *)extraData_.get(), extraDataLength_);
306c29fa5a6Sopenharmony_ci    } else {
307c29fa5a6Sopenharmony_ci        WRITEUINT32(out, 0);
308c29fa5a6Sopenharmony_ci    }
309c29fa5a6Sopenharmony_ci    return true;
310c29fa5a6Sopenharmony_ci}
311c29fa5a6Sopenharmony_ci
312c29fa5a6Sopenharmony_cibool InputEvent::ReadFromParcel(Parcel &in)
313c29fa5a6Sopenharmony_ci{
314c29fa5a6Sopenharmony_ci#if defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM)
315c29fa5a6Sopenharmony_ci    return false;
316c29fa5a6Sopenharmony_ci#else
317c29fa5a6Sopenharmony_ci    READINT32(in, eventType_);
318c29fa5a6Sopenharmony_ci    READINT32(in, id_);
319c29fa5a6Sopenharmony_ci    READINT64(in, actionTime_);
320c29fa5a6Sopenharmony_ci    READUINT64(in, sensorInputTime_);
321c29fa5a6Sopenharmony_ci    READINT32(in, action_);
322c29fa5a6Sopenharmony_ci    READINT64(in, actionStartTime_);
323c29fa5a6Sopenharmony_ci    READINT32(in, deviceId_);
324c29fa5a6Sopenharmony_ci    READINT32(in, targetDisplayId_);
325c29fa5a6Sopenharmony_ci    READINT32(in, targetWindowId_);
326c29fa5a6Sopenharmony_ci    READINT32(in, agentWindowId_);
327c29fa5a6Sopenharmony_ci    READUINT32(in, bitwise_);
328c29fa5a6Sopenharmony_ci    READBOOL(in, markEnabled_);
329c29fa5a6Sopenharmony_ci    READUINT32(in, extraDataLength_);
330c29fa5a6Sopenharmony_ci
331c29fa5a6Sopenharmony_ci    if (extraDataLength_ == 0) {
332c29fa5a6Sopenharmony_ci        return true;
333c29fa5a6Sopenharmony_ci    }
334c29fa5a6Sopenharmony_ci    if (extraDataLength_ > DATA_LENGTH_LIMIT) {
335c29fa5a6Sopenharmony_ci        extraDataLength_ = 0;
336c29fa5a6Sopenharmony_ci        return false;
337c29fa5a6Sopenharmony_ci    }
338c29fa5a6Sopenharmony_ci    const uint8_t *buffer = in.ReadBuffer(extraDataLength_);
339c29fa5a6Sopenharmony_ci    if (buffer == nullptr) {
340c29fa5a6Sopenharmony_ci        extraDataLength_ = 0;
341c29fa5a6Sopenharmony_ci        return false;
342c29fa5a6Sopenharmony_ci    }
343c29fa5a6Sopenharmony_ci    std::shared_ptr<uint8_t[]> sp(new uint8_t[extraDataLength_], [](uint8_t* ptr) { delete[] ptr; });
344c29fa5a6Sopenharmony_ci    if (sp == nullptr) {
345c29fa5a6Sopenharmony_ci        extraDataLength_ = 0;
346c29fa5a6Sopenharmony_ci        return false;
347c29fa5a6Sopenharmony_ci    }
348c29fa5a6Sopenharmony_ci    std::copy(buffer, buffer + extraDataLength_, sp.get());
349c29fa5a6Sopenharmony_ci    extraData_ = sp;
350c29fa5a6Sopenharmony_ci    return true;
351c29fa5a6Sopenharmony_ci#endif // defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM)
352c29fa5a6Sopenharmony_ci}
353c29fa5a6Sopenharmony_ci
354c29fa5a6Sopenharmony_cistd::string_view InputEvent::ActionToShortStr(int32_t action)
355c29fa5a6Sopenharmony_ci{
356c29fa5a6Sopenharmony_ci    switch (action) {
357c29fa5a6Sopenharmony_ci        case InputEvent::ACTION_CANCEL:
358c29fa5a6Sopenharmony_ci            return "B:C:";
359c29fa5a6Sopenharmony_ci        case InputEvent::ACTION_UNKNOWN:
360c29fa5a6Sopenharmony_ci            return "B:UK:";
361c29fa5a6Sopenharmony_ci        default:
362c29fa5a6Sopenharmony_ci            return "B:?:";
363c29fa5a6Sopenharmony_ci    }
364c29fa5a6Sopenharmony_ci}
365c29fa5a6Sopenharmony_ci
366c29fa5a6Sopenharmony_cistruct LogTraceKey {
367c29fa5a6Sopenharmony_ci    int64_t Id;
368c29fa5a6Sopenharmony_ci    int32_t action;
369c29fa5a6Sopenharmony_ci    int32_t evtType;
370c29fa5a6Sopenharmony_ci};
371c29fa5a6Sopenharmony_ci
372c29fa5a6Sopenharmony_cithread_local std::vector<LogTraceKey> g_traceIds;
373c29fa5a6Sopenharmony_cithread_local std::unordered_map<int64_t, size_t> g_traceIdToIdx;
374c29fa5a6Sopenharmony_cithread_local std::string g_traceStr;
375c29fa5a6Sopenharmony_ci
376c29fa5a6Sopenharmony_cistd::string_view Action2Str(int32_t eventType, int32_t action)
377c29fa5a6Sopenharmony_ci{
378c29fa5a6Sopenharmony_ci    switch (eventType) {
379c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_KEY: {
380c29fa5a6Sopenharmony_ci            return KeyEvent::ActionToShortStr(action);
381c29fa5a6Sopenharmony_ci        }
382c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_POINTER:
383c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_FINGERPRINT: {
384c29fa5a6Sopenharmony_ci            return PointerEvent::ActionToShortStr(action);
385c29fa5a6Sopenharmony_ci        }
386c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_AXIS: {
387c29fa5a6Sopenharmony_ci            return AxisEvent::ActionToShortStr(action);
388c29fa5a6Sopenharmony_ci        }
389c29fa5a6Sopenharmony_ci        case InputEvent::EVENT_TYPE_BASE: {
390c29fa5a6Sopenharmony_ci            return InputEvent::ActionToShortStr(action);
391c29fa5a6Sopenharmony_ci        }
392c29fa5a6Sopenharmony_ci        default: {
393c29fa5a6Sopenharmony_ci            return "?:?:";
394c29fa5a6Sopenharmony_ci        }
395c29fa5a6Sopenharmony_ci    }
396c29fa5a6Sopenharmony_ci}
397c29fa5a6Sopenharmony_ci
398c29fa5a6Sopenharmony_civoid RefreshTraceStr()
399c29fa5a6Sopenharmony_ci{
400c29fa5a6Sopenharmony_ci    g_traceStr.clear();
401c29fa5a6Sopenharmony_ci    for (auto item = g_traceIds.begin(); item < g_traceIds.end(); ++item) {
402c29fa5a6Sopenharmony_ci        if (item->Id == -1) {
403c29fa5a6Sopenharmony_ci            continue;
404c29fa5a6Sopenharmony_ci        }
405c29fa5a6Sopenharmony_ci        if (item != g_traceIds.begin()) {
406c29fa5a6Sopenharmony_ci            g_traceStr += "/";
407c29fa5a6Sopenharmony_ci        }
408c29fa5a6Sopenharmony_ci        g_traceStr += Action2Str(item->evtType, item->action);
409c29fa5a6Sopenharmony_ci        g_traceStr += std::to_string(item->Id);
410c29fa5a6Sopenharmony_ci    }
411c29fa5a6Sopenharmony_ci}
412c29fa5a6Sopenharmony_ci
413c29fa5a6Sopenharmony_civoid StartLogTraceId(int64_t traceId, int32_t eventType, int32_t action)
414c29fa5a6Sopenharmony_ci{
415c29fa5a6Sopenharmony_ci    if (traceId == -1) {
416c29fa5a6Sopenharmony_ci        return;
417c29fa5a6Sopenharmony_ci    }
418c29fa5a6Sopenharmony_ci    auto iter = g_traceIdToIdx.find(traceId);
419c29fa5a6Sopenharmony_ci    if (iter == g_traceIdToIdx.end()) {
420c29fa5a6Sopenharmony_ci        g_traceIds.push_back({traceId, action, eventType});
421c29fa5a6Sopenharmony_ci        g_traceIdToIdx.emplace(traceId, g_traceIds.size() - 1);
422c29fa5a6Sopenharmony_ci        std::string currentTraceStr(Action2Str(eventType, action));
423c29fa5a6Sopenharmony_ci        currentTraceStr += std::to_string(traceId);
424c29fa5a6Sopenharmony_ci        if (g_traceIds.size() == 1) {
425c29fa5a6Sopenharmony_ci            g_traceStr = currentTraceStr;
426c29fa5a6Sopenharmony_ci        } else {
427c29fa5a6Sopenharmony_ci            g_traceStr += "/" + currentTraceStr;
428c29fa5a6Sopenharmony_ci        }
429c29fa5a6Sopenharmony_ci        return;
430c29fa5a6Sopenharmony_ci    }
431c29fa5a6Sopenharmony_ci    if (g_traceIds.size() <= iter->second) {
432c29fa5a6Sopenharmony_ci        return;
433c29fa5a6Sopenharmony_ci    }
434c29fa5a6Sopenharmony_ci    LogTraceKey &old = g_traceIds.at(iter->second);
435c29fa5a6Sopenharmony_ci    if (old.evtType != eventType || old.action != action) {
436c29fa5a6Sopenharmony_ci        old.evtType = eventType;
437c29fa5a6Sopenharmony_ci        old.action = action;
438c29fa5a6Sopenharmony_ci        RefreshTraceStr();
439c29fa5a6Sopenharmony_ci    }
440c29fa5a6Sopenharmony_ci};
441c29fa5a6Sopenharmony_ci
442c29fa5a6Sopenharmony_civoid EndLogTraceId(int64_t id)
443c29fa5a6Sopenharmony_ci{
444c29fa5a6Sopenharmony_ci    auto iter = g_traceIdToIdx.find(id);
445c29fa5a6Sopenharmony_ci    if (iter == g_traceIdToIdx.end()) {
446c29fa5a6Sopenharmony_ci        return;
447c29fa5a6Sopenharmony_ci    }
448c29fa5a6Sopenharmony_ci    size_t idx = iter->second;
449c29fa5a6Sopenharmony_ci    g_traceIdToIdx.erase(iter);
450c29fa5a6Sopenharmony_ci    size_t idCount = g_traceIds.size();
451c29fa5a6Sopenharmony_ci    if (idCount <= idx) {
452c29fa5a6Sopenharmony_ci        return;
453c29fa5a6Sopenharmony_ci    }
454c29fa5a6Sopenharmony_ci
455c29fa5a6Sopenharmony_ci    if (idCount == idx + 1) {
456c29fa5a6Sopenharmony_ci        g_traceIds.pop_back();
457c29fa5a6Sopenharmony_ci        while (!g_traceIds.empty() && g_traceIds.back().Id == -1) {
458c29fa5a6Sopenharmony_ci            g_traceIds.pop_back();
459c29fa5a6Sopenharmony_ci        }
460c29fa5a6Sopenharmony_ci    } else {
461c29fa5a6Sopenharmony_ci        // can't erase it, erase it will make the index of other elem changed.
462c29fa5a6Sopenharmony_ci        LogTraceKey &toDelete = g_traceIds.at(idx);
463c29fa5a6Sopenharmony_ci        toDelete.Id = -1;
464c29fa5a6Sopenharmony_ci    }
465c29fa5a6Sopenharmony_ci    RefreshTraceStr();
466c29fa5a6Sopenharmony_ci}
467c29fa5a6Sopenharmony_ci
468c29fa5a6Sopenharmony_ciconst char *FormatLogTrace()
469c29fa5a6Sopenharmony_ci{
470c29fa5a6Sopenharmony_ci    return g_traceStr.c_str();
471c29fa5a6Sopenharmony_ci}
472c29fa5a6Sopenharmony_ci
473c29fa5a6Sopenharmony_ci
474c29fa5a6Sopenharmony_civoid ResetLogTrace()
475c29fa5a6Sopenharmony_ci{
476c29fa5a6Sopenharmony_ci    g_traceIds.clear();
477c29fa5a6Sopenharmony_ci    g_traceIdToIdx.clear();
478c29fa5a6Sopenharmony_ci    g_traceStr.clear();
479c29fa5a6Sopenharmony_ci}
480c29fa5a6Sopenharmony_ci
481c29fa5a6Sopenharmony_ciLogTracer::LogTracer(int64_t traceId, int32_t evtType, int32_t action)
482c29fa5a6Sopenharmony_ci{
483c29fa5a6Sopenharmony_ci    traceId_ = traceId;
484c29fa5a6Sopenharmony_ci    StartLogTraceId(traceId, evtType, action);
485c29fa5a6Sopenharmony_ci}
486c29fa5a6Sopenharmony_ci
487c29fa5a6Sopenharmony_ciLogTracer::~LogTracer()
488c29fa5a6Sopenharmony_ci{
489c29fa5a6Sopenharmony_ci    EndLogTraceId(traceId_);
490c29fa5a6Sopenharmony_ci}
491c29fa5a6Sopenharmony_ci
492c29fa5a6Sopenharmony_ciLogTracer::LogTracer()
493c29fa5a6Sopenharmony_ci{
494c29fa5a6Sopenharmony_ci    traceId_ = -1;
495c29fa5a6Sopenharmony_ci}
496c29fa5a6Sopenharmony_ci
497c29fa5a6Sopenharmony_ciLogTracer::LogTracer(LogTracer &&other) noexcept: traceId_(other.traceId_)
498c29fa5a6Sopenharmony_ci{
499c29fa5a6Sopenharmony_ci    other.traceId_ = -1;
500c29fa5a6Sopenharmony_ci}
501c29fa5a6Sopenharmony_ci
502c29fa5a6Sopenharmony_ciLogTracer &LogTracer::operator=(LogTracer &&other) noexcept
503c29fa5a6Sopenharmony_ci{
504c29fa5a6Sopenharmony_ci    if (this != &other) {
505c29fa5a6Sopenharmony_ci        traceId_ = other.traceId_;
506c29fa5a6Sopenharmony_ci        other.traceId_ = -1;
507c29fa5a6Sopenharmony_ci    }
508c29fa5a6Sopenharmony_ci    return *this;
509c29fa5a6Sopenharmony_ci}
510c29fa5a6Sopenharmony_ci
511c29fa5a6Sopenharmony_ciint32_t OHOS::MMI::EventLogHelper::infoDictCount_ = 0;
512c29fa5a6Sopenharmony_ciint32_t OHOS::MMI::EventLogHelper::debugDictCount_ = 0;
513c29fa5a6Sopenharmony_ci
514c29fa5a6Sopenharmony_ci} // namespace MMI
515c29fa5a6Sopenharmony_ci} // namespace OHOS
516