1 /*
2 * Copyright (c) 2022-2024 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 "dinput_context.h"
17
18 #include "constants.h"
19
20 #include "dinput_errcode.h"
21 #include "dinput_utils_tool.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
25 namespace DistributedInput {
26 IMPLEMENT_SINGLE_INSTANCE(DInputContext);
27
~DInputContext()28 DInputContext::~DInputContext()
29 {
30 sinkScreenInfoMap_.clear();
31 srcScreenInfoMap_.clear();
32 }
33
GetScreenInfoKey(const std::string & devId,const uint64_t sourceWinId)34 std::string DInputContext::GetScreenInfoKey(const std::string &devId, const uint64_t sourceWinId)
35 {
36 DHLOGI("GetScreenInfoKey screenInfoKey: %{public}s, sourceWinId: %{public}" PRIu64 "",
37 GetAnonyString(devId).c_str(), sourceWinId);
38 return devId + RESOURCE_SEPARATOR + std::to_string(sourceWinId);
39 }
40
RemoveSinkScreenInfo(const std::string & screenInfoKey)41 int32_t DInputContext::RemoveSinkScreenInfo(const std::string &screenInfoKey)
42 {
43 DHLOGI("RemoveSinkScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
44 std::lock_guard<std::mutex> lock(sinkMapMutex_);
45 sinkScreenInfoMap_.erase(screenInfoKey);
46 return DH_SUCCESS;
47 }
48
UpdateSinkScreenInfo(const std::string & screenInfoKey,const SinkScreenInfo & sinkScreenInfo)49 int32_t DInputContext::UpdateSinkScreenInfo(const std::string &screenInfoKey, const SinkScreenInfo &sinkScreenInfo)
50 {
51 DHLOGI("UpdateSinkScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
52 std::lock_guard<std::mutex> lock(sinkMapMutex_);
53 if (sinkScreenInfoMap_.count(screenInfoKey) <= 0) {
54 DHLOGE("source window id not exist");
55 return ERR_DH_INPUT_CONTEXT_KEY_NOT_EXIST;
56 }
57
58 SinkScreenInfo tmp = sinkScreenInfo;
59 if (CalculateTransformInfo(tmp) != DH_SUCCESS) {
60 DHLOGE("calculate transform infomation failed");
61 }
62
63 sinkScreenInfoMap_[screenInfoKey] = tmp;
64 return DH_SUCCESS;
65 }
66
GetSinkScreenInfo(const std::string & screenInfoKey)67 SinkScreenInfo DInputContext::GetSinkScreenInfo(const std::string &screenInfoKey)
68 {
69 DHLOGI("GetSinkScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
70 std::lock_guard<std::mutex> lock(sinkMapMutex_);
71 if (sinkScreenInfoMap_.count(screenInfoKey) <= 0) {
72 DHLOGE("screenInfoKey not exist");
73 SinkScreenInfo sinkScreenInfo;
74 sinkScreenInfoMap_[screenInfoKey] = sinkScreenInfo;
75 }
76
77 return sinkScreenInfoMap_[screenInfoKey];
78 }
79
GetAllSinkScreenInfo()80 const std::unordered_map<std::string, SinkScreenInfo> &DInputContext::GetAllSinkScreenInfo()
81 {
82 std::lock_guard<std::mutex> lock(sinkMapMutex_);
83 return sinkScreenInfoMap_;
84 }
85
RemoveSrcScreenInfo(const std::string & screenInfoKey)86 int32_t DInputContext::RemoveSrcScreenInfo(const std::string &screenInfoKey)
87 {
88 DHLOGI("RemoveSrcScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
89 std::lock_guard<std::mutex> lock(srcMapMutex_);
90 srcScreenInfoMap_.erase(screenInfoKey);
91 return DH_SUCCESS;
92 }
93
UpdateSrcScreenInfo(const std::string & screenInfoKey,const SrcScreenInfo & srcScreenInfo)94 int32_t DInputContext::UpdateSrcScreenInfo(const std::string &screenInfoKey, const SrcScreenInfo &srcScreenInfo)
95 {
96 std::lock_guard<std::mutex> lock(srcMapMutex_);
97 DHLOGI("UpdateSrcScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
98 if (srcScreenInfoMap_.count(screenInfoKey) <= 0) {
99 DHLOGE("source window id not exist");
100 return ERR_DH_INPUT_CONTEXT_KEY_NOT_EXIST;
101 }
102
103 srcScreenInfoMap_[screenInfoKey] = srcScreenInfo;
104 return DH_SUCCESS;
105 }
106
GetSrcScreenInfo(const std::string & screenInfoKey)107 SrcScreenInfo DInputContext::GetSrcScreenInfo(const std::string &screenInfoKey)
108 {
109 DHLOGI("GetSrcScreenInfo screenInfoKey: %{public}s", GetAnonyString(screenInfoKey).c_str());
110 std::lock_guard<std::mutex> lock(srcMapMutex_);
111 if (srcScreenInfoMap_.count(screenInfoKey) <= 0) {
112 DHLOGE("source window id not exist");
113 SrcScreenInfo srcScreenInfo;
114 srcScreenInfoMap_[screenInfoKey] = srcScreenInfo;
115 }
116
117 return srcScreenInfoMap_[screenInfoKey];
118 }
119
SetLocalTouchScreenInfo(const LocalTouchScreenInfo & localTouchScreenInfo)120 void DInputContext::SetLocalTouchScreenInfo(const LocalTouchScreenInfo &localTouchScreenInfo)
121 {
122 std::lock_guard<std::mutex> lock(localTouchScreenInfoMutex_);
123 localTouchScreenInfo_ = localTouchScreenInfo;
124 }
125
GetLocalTouchScreenInfo()126 LocalTouchScreenInfo DInputContext::GetLocalTouchScreenInfo()
127 {
128 std::lock_guard<std::mutex> lock(localTouchScreenInfoMutex_);
129 return localTouchScreenInfo_;
130 }
131
CalculateTransformInfo(SinkScreenInfo & sinkScreenInfo)132 int32_t DInputContext::CalculateTransformInfo(SinkScreenInfo &sinkScreenInfo)
133 {
134 if (sinkScreenInfo.sinkShowHeight == 0 || sinkScreenInfo.sinkShowWidth == 0) {
135 DHLOGE("can not calculate transform infomation");
136 return ERR_DH_INPUT_CONTEXT_CALCULATE_FAIL;
137 }
138 TransformInfo transformInfo;
139 transformInfo.sinkWinPhyX = static_cast<uint32_t>(sinkScreenInfo.sinkWinShowX /
140 static_cast<double>(sinkScreenInfo.sinkShowWidth)) * sinkScreenInfo.sinkPhyWidth;
141 transformInfo.sinkWinPhyY = static_cast<uint32_t>(sinkScreenInfo.sinkWinShowY /
142 static_cast<double>(sinkScreenInfo.sinkShowHeight)) * sinkScreenInfo.sinkPhyHeight;
143 transformInfo.sinkProjPhyWidth = static_cast<uint32_t>((sinkScreenInfo.sinkProjShowWidth /
144 static_cast<double>(sinkScreenInfo.sinkShowWidth)) * sinkScreenInfo.sinkPhyWidth);
145 transformInfo.sinkProjPhyHeight = static_cast<uint32_t>((sinkScreenInfo.sinkProjShowHeight /
146 static_cast<double>(sinkScreenInfo.sinkShowHeight)) * sinkScreenInfo.sinkPhyHeight);
147 if (transformInfo.sinkProjPhyWidth == 0 || transformInfo.sinkProjPhyHeight == 0) {
148 DHLOGE("can not calculate transform infomation");
149 return ERR_DH_INPUT_CONTEXT_CALCULATE_FAIL;
150 }
151
152 // coefficient of the sink projection area in the source touch driver
153 transformInfo.coeffWidth = static_cast<double>(sinkScreenInfo.srcScreenInfo.sourcePhyWidth /
154 static_cast<double>(transformInfo.sinkProjPhyWidth));
155 transformInfo.coeffHeight = static_cast<double>(sinkScreenInfo.srcScreenInfo.sourcePhyHeight /
156 static_cast<double>(transformInfo.sinkProjPhyHeight));
157
158 DHLOGI("CalculateTransformInfo sinkWinPhyX = %{public}d, sinkWinPhyY = %{public}d, sinkProjPhyWidth = %{public}d, "
159 "sinkProjPhyHeight = %{public}d, coeffWidth = %{public}f, coeffHeight = %{public}f", transformInfo.sinkWinPhyX,
160 transformInfo.sinkWinPhyY, transformInfo.sinkProjPhyWidth, transformInfo.sinkProjPhyHeight,
161 transformInfo.coeffWidth, transformInfo.coeffHeight);
162 sinkScreenInfo.transformInfo = transformInfo;
163 return DH_SUCCESS;
164 }
165
GetDHFwkKit()166 std::shared_ptr<DistributedHardwareFwkKit> DInputContext::GetDHFwkKit()
167 {
168 std::lock_guard<std::mutex> lock(dhFwkKitMutex_);
169 if (dhFwkKit_ == nullptr) {
170 dhFwkKit_ = std::make_shared<DistributedHardwareFwkKit>();
171 }
172 return dhFwkKit_;
173 }
174
GetRemoteObject(const int32_t saId)175 sptr<IRemoteObject> DInputContext::GetRemoteObject(const int32_t saId)
176 {
177 DHLOGI("GetDScreenSrcSA start");
178 {
179 std::lock_guard<std::mutex> lock(remoteObjectsMutex_);
180 if (remoteObjects_.find(saId) != remoteObjects_.end()) {
181 DHLOGI("dScreenSrcSA get from cache!");
182 return remoteObjects_[saId];
183 }
184 }
185
186 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
187 if (samgr == nullptr) {
188 DHLOGE("GetSystemAbilityManager fail!");
189 return nullptr;
190 }
191 auto remoteObject = samgr->GetSystemAbility(saId);
192 if (remoteObject == nullptr) {
193 DHLOGE("GetSystemAbility remoteObject is nullptr");
194 return nullptr;
195 }
196 return remoteObject;
197 }
198
AddRemoteObject(const int32_t saId,const sptr<IRemoteObject> & remoteObject)199 void DInputContext::AddRemoteObject(const int32_t saId, const sptr<IRemoteObject> &remoteObject)
200 {
201 std::lock_guard<std::mutex> lock(remoteObjectsMutex_);
202 remoteObjects_[saId] = remoteObject;
203 }
204
RemoveRemoteObject(const int32_t saId)205 void DInputContext::RemoveRemoteObject(const int32_t saId)
206 {
207 std::lock_guard<std::mutex> lock(remoteObjectsMutex_);
208 remoteObjects_.erase(saId);
209 }
210 } // namespace DistributedInput
211 } // namespace DistributedHardware
212 } // namespace OHOS