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 16#include "event_manager.h" 17 18#include "log/log.h" 19 20namespace Updater { 21extern "C" __attribute__((constructor)) void RegisterEventManagerHelper(void) 22{ 23 EventManager::GetInstance().RegisterEventManagerHelper(std::make_unique<KeyListener>()); 24} 25 26void EventManager::RegisterEventManagerHelper(std::unique_ptr<KeyListener> ptr) 27{ 28 helper_ = std::move(ptr); 29} 30 31EventManager::EventManager() : pgMgr_(PageManager::GetInstance()) 32{ 33} 34 35EventManager &EventManager::GetInstance() 36{ 37 static EventManager instance; 38 return instance; 39} 40 41void EventManager::Add(const ComInfo &viewId, std::unique_ptr<LabelOnTouchListener> listener) 42{ 43 if (!pgMgr_.IsValidCom(viewId)) { 44 LOG(ERROR) << "not an valid view " << viewId; 45 return; 46 } 47 auto com = pgMgr_[viewId.pageId][viewId.comId].As(); 48 labelOnTouchListener_.push_back(std::move(listener)); 49 com->SetTouchable(true); 50 com->SetOnTouchListener(labelOnTouchListener_.back().get()); 51} 52 53void EventManager::Add(const ComInfo &viewId, std::unique_ptr<BtnOnEventListener> listener) 54{ 55 if (!pgMgr_.IsValidCom(viewId)) { 56 LOG(ERROR) << "not an valid view " << viewId; 57 return; 58 } 59 auto com = pgMgr_[viewId.pageId][viewId.comId].As(); 60 // both click and touch listener 61 BtnOnEventListener *btnListener = listener.get(); 62 // save this listener 63 btnOnClickListener_.push_back(std::move(listener)); 64 com->SetOnClickListener(btnListener); 65 // this touch listener used to disable volume key when pressing button 66 com->SetOnTouchListener(btnListener); 67} 68 69void EventManager::Add(const ComInfo &viewId, std::unique_ptr<BtnOnDragListener> listener) 70{ 71 if (!pgMgr_.IsValidCom(viewId)) { 72 LOG(ERROR) << "not an valid view " << viewId; 73 return; 74 } 75 auto com = pgMgr_[viewId.pageId][viewId.comId].As(); 76 btnOnDragListener.push_back(std::move(listener)); 77 com->SetDraggable(true); 78 com->SetOnDragListener(btnOnDragListener.back().get()); 79} 80 81// key listener is registered at root view, because key event don't has position info and is globally responded 82void EventManager::AddKeyListener() 83{ 84 OHOS::RootView::GetInstance()->SetOnKeyActListener(helper_.get()); 85} 86 87void EventManager::Add(const ComInfo &viewId, EventType evt, Callback cb) 88{ 89 switch (evt) { 90 case EventType::CLICKEVENT: 91 Add(viewId, std::make_unique<BtnOnEventListener>(cb, true)); 92 break; 93 case EventType::TOUCHEVENT: 94 Add(viewId, std::make_unique<LabelOnTouchListener>(cb, true)); 95 break; 96 case EventType::DRAGEVENT: 97 Add(viewId, std::make_unique<BtnOnDragListener>(cb, true)); 98 break; 99 default: 100 LOG(WARNING) << "event type not support"; 101 break; 102 } 103} 104} // namespace Updater 105