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