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