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