1686862fbSopenharmony_ci/*
2686862fbSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3686862fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4686862fbSopenharmony_ci * you may not use this file except in compliance with the License.
5686862fbSopenharmony_ci * You may obtain a copy of the License at
6686862fbSopenharmony_ci *
7686862fbSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8686862fbSopenharmony_ci *
9686862fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10686862fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11686862fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12686862fbSopenharmony_ci * See the License for the specific language governing permissions and
13686862fbSopenharmony_ci * limitations under the License.
14686862fbSopenharmony_ci */
15686862fbSopenharmony_ci
16686862fbSopenharmony_ci#include "adapter/mmi_adapter.h"
17686862fbSopenharmony_ci
18686862fbSopenharmony_ci#include <mutex>
19686862fbSopenharmony_ci#include <thread>
20686862fbSopenharmony_ci#include <sys/prctl.h>
21686862fbSopenharmony_ci
22686862fbSopenharmony_ci#include "dtbschedmgr_log.h"
23686862fbSopenharmony_ci#include "mission/dms_continue_send_manager.h"
24686862fbSopenharmony_ci
25686862fbSopenharmony_cinamespace OHOS {
26686862fbSopenharmony_cinamespace DistributedSchedule {
27686862fbSopenharmony_ci
28686862fbSopenharmony_cinamespace {
29686862fbSopenharmony_ciconst std::string TAG = "MMIAdapter";
30686862fbSopenharmony_ciconst std::string MMI_ADAPTER = "mmi_adapter";
31686862fbSopenharmony_ciconst std::string FREEZE_MMI_EVENT_TASK = "task_freeze_mmi_event";
32686862fbSopenharmony_ciconstexpr int32_t FREEZE_MMI_EVENT_INTERVAL = 5000;
33686862fbSopenharmony_ci}
34686862fbSopenharmony_ci
35686862fbSopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(MMIAdapter);
36686862fbSopenharmony_ci
37686862fbSopenharmony_civoid MMIAdapter::Init()
38686862fbSopenharmony_ci{
39686862fbSopenharmony_ci    HILOGI("Init");
40686862fbSopenharmony_ci    if (eventHandler_ != nullptr) {
41686862fbSopenharmony_ci        HILOGI("Already inited, end.");
42686862fbSopenharmony_ci        return;
43686862fbSopenharmony_ci    }
44686862fbSopenharmony_ci    mmiCallback_ = std::make_shared<MMIAdapter::MMIEventCallback>();
45686862fbSopenharmony_ci    eventThread_ = std::thread(&MMIAdapter::StartEvent, this);
46686862fbSopenharmony_ci    std::unique_lock<std::mutex> lock(eventMutex_);
47686862fbSopenharmony_ci    eventCon_.wait(lock, [this] {
48686862fbSopenharmony_ci        return eventHandler_ != nullptr;
49686862fbSopenharmony_ci    });
50686862fbSopenharmony_ci}
51686862fbSopenharmony_ci
52686862fbSopenharmony_civoid MMIAdapter::StartEvent()
53686862fbSopenharmony_ci{
54686862fbSopenharmony_ci    HILOGI("StartEvent start");
55686862fbSopenharmony_ci    prctl(PR_SET_NAME, MMI_ADAPTER.c_str());
56686862fbSopenharmony_ci    auto runner = AppExecFwk::EventRunner::Create(false);
57686862fbSopenharmony_ci    if (runner == nullptr) {
58686862fbSopenharmony_ci        HILOGE("create runner failed!");
59686862fbSopenharmony_ci        return;
60686862fbSopenharmony_ci    }
61686862fbSopenharmony_ci    {
62686862fbSopenharmony_ci        std::lock_guard<std::mutex> lock(eventMutex_);
63686862fbSopenharmony_ci        eventHandler_ = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
64686862fbSopenharmony_ci    }
65686862fbSopenharmony_ci    eventCon_.notify_one();
66686862fbSopenharmony_ci    runner->Run();
67686862fbSopenharmony_ci    HILOGI("StartEvent end");
68686862fbSopenharmony_ci}
69686862fbSopenharmony_ci
70686862fbSopenharmony_civoid MMIAdapter::UnInit()
71686862fbSopenharmony_ci{
72686862fbSopenharmony_ci    HILOGI("UnInit start");
73686862fbSopenharmony_ci    if (eventHandler_ != nullptr && eventHandler_->GetEventRunner() != nullptr) {
74686862fbSopenharmony_ci        eventHandler_->GetEventRunner()->Stop();
75686862fbSopenharmony_ci        eventThread_.join();
76686862fbSopenharmony_ci        eventHandler_ = nullptr;
77686862fbSopenharmony_ci    } else {
78686862fbSopenharmony_ci        HILOGE("eventHandler_ or eventRunner is nullptr");
79686862fbSopenharmony_ci    }
80686862fbSopenharmony_ci    HILOGI("UnInit end");
81686862fbSopenharmony_ci}
82686862fbSopenharmony_ci
83686862fbSopenharmony_ciint32_t MMIAdapter::AddMMIListener()
84686862fbSopenharmony_ci{
85686862fbSopenharmony_ci    HILOGD("AddMMIListener called");
86686862fbSopenharmony_ci    int32_t ret = MMI::InputManager::GetInstance()->AddMonitor(mmiCallback_);
87686862fbSopenharmony_ci    HILOGD("AddMMIListener result: %{public}d", ret);
88686862fbSopenharmony_ci    isMMIFreezed_ = false;
89686862fbSopenharmony_ci    return ret;
90686862fbSopenharmony_ci}
91686862fbSopenharmony_ci
92686862fbSopenharmony_civoid MMIAdapter::RemoveMMIListener(int32_t monitorId)
93686862fbSopenharmony_ci{
94686862fbSopenharmony_ci    HILOGD("RemoveMMIListener called, monitor id = %{public}d", monitorId);
95686862fbSopenharmony_ci    MMI::InputManager::GetInstance()->RemoveMonitor(monitorId);
96686862fbSopenharmony_ci    return;
97686862fbSopenharmony_ci}
98686862fbSopenharmony_ci
99686862fbSopenharmony_civoid MMIAdapter::PostRawMMIEvent()
100686862fbSopenharmony_ci{
101686862fbSopenharmony_ci    auto func = [this]() {
102686862fbSopenharmony_ci        HandleRawMMIEvent();
103686862fbSopenharmony_ci    };
104686862fbSopenharmony_ci    if (eventHandler_ != nullptr) {
105686862fbSopenharmony_ci        eventHandler_->PostTask(func);
106686862fbSopenharmony_ci    } else {
107686862fbSopenharmony_ci        HILOGE("eventHandler_ is nullptr");
108686862fbSopenharmony_ci    }
109686862fbSopenharmony_ci}
110686862fbSopenharmony_ci
111686862fbSopenharmony_civoid MMIAdapter::PostUnfreezeMMIEvent()
112686862fbSopenharmony_ci{
113686862fbSopenharmony_ci    auto func = [this]() {
114686862fbSopenharmony_ci        HandleUnfreezeMMIEvent();
115686862fbSopenharmony_ci    };
116686862fbSopenharmony_ci    if (eventHandler_ != nullptr) {
117686862fbSopenharmony_ci        eventHandler_->PostTask(func, FREEZE_MMI_EVENT_TASK, FREEZE_MMI_EVENT_INTERVAL);
118686862fbSopenharmony_ci    } else {
119686862fbSopenharmony_ci        HILOGE("eventHandler_ is nullptr");
120686862fbSopenharmony_ci    }
121686862fbSopenharmony_ci}
122686862fbSopenharmony_ci
123686862fbSopenharmony_civoid MMIAdapter::HandleRawMMIEvent()
124686862fbSopenharmony_ci{
125686862fbSopenharmony_ci    if (isMMIFreezed_) {
126686862fbSopenharmony_ci        return;
127686862fbSopenharmony_ci    }
128686862fbSopenharmony_ci    isMMIFreezed_ = true;
129686862fbSopenharmony_ci    DMSContinueSendMgr::GetInstance().OnMMIEvent();
130686862fbSopenharmony_ci    PostUnfreezeMMIEvent();
131686862fbSopenharmony_ci}
132686862fbSopenharmony_ci
133686862fbSopenharmony_civoid MMIAdapter::HandleUnfreezeMMIEvent()
134686862fbSopenharmony_ci{
135686862fbSopenharmony_ci    isMMIFreezed_ = false;
136686862fbSopenharmony_ci}
137686862fbSopenharmony_ci
138686862fbSopenharmony_civoid MMIAdapter::MMIEventCallback::OnInputEvent(std::shared_ptr<MMI::KeyEvent> keyEvent) const
139686862fbSopenharmony_ci{
140686862fbSopenharmony_ci    MMIAdapter::GetInstance().PostRawMMIEvent();
141686862fbSopenharmony_ci}
142686862fbSopenharmony_ci
143686862fbSopenharmony_civoid MMIAdapter::MMIEventCallback::OnInputEvent(std::shared_ptr<MMI::PointerEvent> pointerEvent) const
144686862fbSopenharmony_ci{
145686862fbSopenharmony_ci    MMIAdapter::GetInstance().PostRawMMIEvent();
146686862fbSopenharmony_ci}
147686862fbSopenharmony_ci
148686862fbSopenharmony_civoid MMIAdapter::MMIEventCallback::OnInputEvent(std::shared_ptr<MMI::AxisEvent> axisEvent) const
149686862fbSopenharmony_ci{
150686862fbSopenharmony_ci    MMIAdapter::GetInstance().PostRawMMIEvent();
151686862fbSopenharmony_ci}
152686862fbSopenharmony_ci} // namespace DistributedSchedule
153686862fbSopenharmony_ci} // namespace OHOS
154