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