1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 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#ifndef COOPERATE_CONTEXT_H
17c29fa5a6Sopenharmony_ci#define COOPERATE_CONTEXT_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include "event_handler.h"
20c29fa5a6Sopenharmony_ci#include "nocopyable.h"
21c29fa5a6Sopenharmony_ci
22c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
23c29fa5a6Sopenharmony_ci#include <chrono>
24c29fa5a6Sopenharmony_ci#include <mutex>
25c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
26c29fa5a6Sopenharmony_ci
27c29fa5a6Sopenharmony_ci#include "common_event_adapter.h"
28c29fa5a6Sopenharmony_ci#include "common_event_observer.h"
29c29fa5a6Sopenharmony_ci#include "cooperate_events.h"
30c29fa5a6Sopenharmony_ci#include "ddm_adapter.h"
31c29fa5a6Sopenharmony_ci#include "dsoftbus_handler.h"
32c29fa5a6Sopenharmony_ci#include "event_manager.h"
33c29fa5a6Sopenharmony_ci#include "hot_area.h"
34c29fa5a6Sopenharmony_ci#include "input_device_mgr.h"
35c29fa5a6Sopenharmony_ci#include "input_event_transmission/input_event_builder.h"
36c29fa5a6Sopenharmony_ci#include "input_event_transmission/input_event_interceptor.h"
37c29fa5a6Sopenharmony_ci#include "i_context.h"
38c29fa5a6Sopenharmony_ci#include "mouse_location.h"
39c29fa5a6Sopenharmony_ci
40c29fa5a6Sopenharmony_cinamespace OHOS {
41c29fa5a6Sopenharmony_cinamespace Msdp {
42c29fa5a6Sopenharmony_cinamespace DeviceStatus {
43c29fa5a6Sopenharmony_cinamespace Cooperate {
44c29fa5a6Sopenharmony_ciclass Context final {
45c29fa5a6Sopenharmony_cipublic:
46c29fa5a6Sopenharmony_ci    Context(IContext *env);
47c29fa5a6Sopenharmony_ci    ~Context() = default;
48c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(Context);
49c29fa5a6Sopenharmony_ci
50c29fa5a6Sopenharmony_ci    void AttachSender(Channel<CooperateEvent>::Sender sender);
51c29fa5a6Sopenharmony_ci    void AddObserver(std::shared_ptr<ICooperateObserver> observer);
52c29fa5a6Sopenharmony_ci    void RemoveObserver(std::shared_ptr<ICooperateObserver> observer);
53c29fa5a6Sopenharmony_ci    void Enable();
54c29fa5a6Sopenharmony_ci    void Disable();
55c29fa5a6Sopenharmony_ci
56c29fa5a6Sopenharmony_ci    Channel<CooperateEvent>::Sender Sender() const;
57c29fa5a6Sopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> EventHandler() const;
58c29fa5a6Sopenharmony_ci    std::string Local() const;
59c29fa5a6Sopenharmony_ci    std::string Peer() const;
60c29fa5a6Sopenharmony_ci    int32_t StartDeviceId() const;
61c29fa5a6Sopenharmony_ci    Coordinate CursorPosition() const;
62c29fa5a6Sopenharmony_ci    NormalizedCoordinate NormalizedCursorPosition() const;
63c29fa5a6Sopenharmony_ci    uint32_t CooperateFlag() const;
64c29fa5a6Sopenharmony_ci
65c29fa5a6Sopenharmony_ci    bool IsLocal(const std::string &networkId) const;
66c29fa5a6Sopenharmony_ci    bool IsPeer(const std::string &networkId) const;
67c29fa5a6Sopenharmony_ci    bool NeedHideCursor() const;
68c29fa5a6Sopenharmony_ci
69c29fa5a6Sopenharmony_ci    void EnableCooperate(const EnableCooperateEvent &event);
70c29fa5a6Sopenharmony_ci    void DisableCooperate(const DisableCooperateEvent &event);
71c29fa5a6Sopenharmony_ci    void StartCooperate(const StartCooperateEvent &event);
72c29fa5a6Sopenharmony_ci    void RemoteStartSuccess(const DSoftbusStartCooperateFinished &event);
73c29fa5a6Sopenharmony_ci    void RelayCooperate(const DSoftbusRelayCooperate &event);
74c29fa5a6Sopenharmony_ci    void OnPointerEvent(const InputPointerEvent &event);
75c29fa5a6Sopenharmony_ci    void UpdateCooperateFlag(const UpdateCooperateFlagEvent &event);
76c29fa5a6Sopenharmony_ci    void UpdateCursorPosition();
77c29fa5a6Sopenharmony_ci    void ResetCursorPosition();
78c29fa5a6Sopenharmony_ci
79c29fa5a6Sopenharmony_ci    bool IsAllowCooperate();
80c29fa5a6Sopenharmony_ci    void OnStartCooperate(StartCooperateData &data);
81c29fa5a6Sopenharmony_ci    void OnRemoteStartCooperate(RemoteStartCooperateData &data);
82c29fa5a6Sopenharmony_ci    void OnTransitionOut();
83c29fa5a6Sopenharmony_ci    void OnTransitionIn();
84c29fa5a6Sopenharmony_ci    void OnBack();
85c29fa5a6Sopenharmony_ci    void OnRelayCooperation(const std::string &networkId, const NormalizedCoordinate &cursorPos);
86c29fa5a6Sopenharmony_ci    void OnResetCooperation();
87c29fa5a6Sopenharmony_ci    void CloseDistributedFileConnection(const std::string &remoteNetworkId);
88c29fa5a6Sopenharmony_ci
89c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
90c29fa5a6Sopenharmony_ci    void StartTrace(const std::string &name);
91c29fa5a6Sopenharmony_ci    void FinishTrace(const std::string &name);
92c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
93c29fa5a6Sopenharmony_ci
94c29fa5a6Sopenharmony_ci    DDMAdapter ddm_;
95c29fa5a6Sopenharmony_ci    DSoftbusHandler dsoftbus_;
96c29fa5a6Sopenharmony_ci    EventManager eventMgr_;
97c29fa5a6Sopenharmony_ci    HotArea hotArea_;
98c29fa5a6Sopenharmony_ci    MouseLocation mouseLocation_;
99c29fa5a6Sopenharmony_ci    InputDeviceMgr inputDevMgr_;
100c29fa5a6Sopenharmony_ci    InputEventBuilder inputEventBuilder_;
101c29fa5a6Sopenharmony_ci    InputEventInterceptor inputEventInterceptor_;
102c29fa5a6Sopenharmony_ci    CommonEventAdapter commonEvent_;
103c29fa5a6Sopenharmony_ci
104c29fa5a6Sopenharmony_ciprivate:
105c29fa5a6Sopenharmony_ci    int32_t StartEventHandler();
106c29fa5a6Sopenharmony_ci    void StopEventHandler();
107c29fa5a6Sopenharmony_ci    int32_t EnableDDM();
108c29fa5a6Sopenharmony_ci    void DisableDDM();
109c29fa5a6Sopenharmony_ci    int32_t EnableDevMgr();
110c29fa5a6Sopenharmony_ci    void DisableDevMgr();
111c29fa5a6Sopenharmony_ci    int32_t EnableInputDevMgr();
112c29fa5a6Sopenharmony_ci    void DisableInputDevMgr();
113c29fa5a6Sopenharmony_ci    void SetCursorPosition(const Coordinate &cursorPos);
114c29fa5a6Sopenharmony_ci
115c29fa5a6Sopenharmony_ci    IContext *env_ { nullptr };
116c29fa5a6Sopenharmony_ci    Channel<CooperateEvent>::Sender sender_;
117c29fa5a6Sopenharmony_ci    std::string remoteNetworkId_;
118c29fa5a6Sopenharmony_ci    int32_t startDeviceId_ { -1 };
119c29fa5a6Sopenharmony_ci    uint32_t flag_ {};
120c29fa5a6Sopenharmony_ci    Coordinate cursorPos_ {};
121c29fa5a6Sopenharmony_ci    std::shared_ptr<AppExecFwk::EventHandler> eventHandler_;
122c29fa5a6Sopenharmony_ci    std::shared_ptr<IBoardObserver> boardObserver_;
123c29fa5a6Sopenharmony_ci    std::shared_ptr<IDeviceObserver> hotplugObserver_;
124c29fa5a6Sopenharmony_ci    std::set<std::shared_ptr<ICooperateObserver>> observers_;
125c29fa5a6Sopenharmony_ci
126c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
127c29fa5a6Sopenharmony_ci    std::mutex lock_;
128c29fa5a6Sopenharmony_ci    std::map<std::string, std::chrono::time_point<std::chrono::steady_clock>> traces_;
129c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
130c29fa5a6Sopenharmony_ci};
131c29fa5a6Sopenharmony_ci
132c29fa5a6Sopenharmony_ciinline Channel<CooperateEvent>::Sender Context::Sender() const
133c29fa5a6Sopenharmony_ci{
134c29fa5a6Sopenharmony_ci    return sender_;
135c29fa5a6Sopenharmony_ci}
136c29fa5a6Sopenharmony_ci
137c29fa5a6Sopenharmony_ciinline std::shared_ptr<AppExecFwk::EventHandler> Context::EventHandler() const
138c29fa5a6Sopenharmony_ci{
139c29fa5a6Sopenharmony_ci    return eventHandler_;
140c29fa5a6Sopenharmony_ci}
141c29fa5a6Sopenharmony_ci
142c29fa5a6Sopenharmony_ciinline std::string Context::Local() const
143c29fa5a6Sopenharmony_ci{
144c29fa5a6Sopenharmony_ci    return DSoftbusHandler::GetLocalNetworkId();
145c29fa5a6Sopenharmony_ci}
146c29fa5a6Sopenharmony_ci
147c29fa5a6Sopenharmony_ciinline std::string Context::Peer() const
148c29fa5a6Sopenharmony_ci{
149c29fa5a6Sopenharmony_ci    return remoteNetworkId_;
150c29fa5a6Sopenharmony_ci}
151c29fa5a6Sopenharmony_ci
152c29fa5a6Sopenharmony_ciinline int32_t Context::StartDeviceId() const
153c29fa5a6Sopenharmony_ci{
154c29fa5a6Sopenharmony_ci    return startDeviceId_;
155c29fa5a6Sopenharmony_ci}
156c29fa5a6Sopenharmony_ci
157c29fa5a6Sopenharmony_ciinline Coordinate Context::CursorPosition() const
158c29fa5a6Sopenharmony_ci{
159c29fa5a6Sopenharmony_ci    return cursorPos_;
160c29fa5a6Sopenharmony_ci}
161c29fa5a6Sopenharmony_ci
162c29fa5a6Sopenharmony_ciinline uint32_t Context::CooperateFlag() const
163c29fa5a6Sopenharmony_ci{
164c29fa5a6Sopenharmony_ci    return flag_;
165c29fa5a6Sopenharmony_ci}
166c29fa5a6Sopenharmony_ci
167c29fa5a6Sopenharmony_ciinline bool Context::IsLocal(const std::string &networkId) const
168c29fa5a6Sopenharmony_ci{
169c29fa5a6Sopenharmony_ci    return (networkId == DSoftbusHandler::GetLocalNetworkId());
170c29fa5a6Sopenharmony_ci}
171c29fa5a6Sopenharmony_ci
172c29fa5a6Sopenharmony_ciinline bool Context::IsPeer(const std::string &networkId) const
173c29fa5a6Sopenharmony_ci{
174c29fa5a6Sopenharmony_ci    return (networkId == remoteNetworkId_);
175c29fa5a6Sopenharmony_ci}
176c29fa5a6Sopenharmony_ci
177c29fa5a6Sopenharmony_ciinline bool Context::NeedHideCursor() const
178c29fa5a6Sopenharmony_ci{
179c29fa5a6Sopenharmony_ci    return (flag_ & COOPERATE_FLAG_HIDE_CURSOR);
180c29fa5a6Sopenharmony_ci}
181c29fa5a6Sopenharmony_ci} // namespace Cooperate
182c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
183c29fa5a6Sopenharmony_ci} // namespace Msdp
184c29fa5a6Sopenharmony_ci} // namespace OHOS
185c29fa5a6Sopenharmony_ci#endif // COOPERATE_CONTEXT_H
186