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 "screen_client_window_adapter.h"
17
18 #include "rs_surface_node.h"
19 #include "transaction/rs_interfaces.h"
20 #include "window_option.h"
21 #include "wm_common.h"
22
23 #include "dscreen_constants.h"
24 #include "dscreen_errcode.h"
25 #include "dscreen_hisysevent.h"
26 #include "dscreen_log.h"
27
28 namespace OHOS {
29 namespace DistributedHardware {
30 IMPLEMENT_SINGLE_INSTANCE(ScreenClientWindowAdapter);
CreateWindow(std::shared_ptr<WindowProperty> windowProperty,int32_t windowId)31 sptr<Surface> ScreenClientWindowAdapter::CreateWindow(std::shared_ptr<WindowProperty> windowProperty,
32 int32_t windowId)
33 {
34 if (windowProperty == nullptr) {
35 DHLOGE("windowProperty is nullptr.");
36 return nullptr;
37 }
38 sptr<Rosen::WindowOption> option = new Rosen::WindowOption();
39 if (option == nullptr) {
40 DHLOGE("option is nullptr.");
41 return nullptr;
42 }
43 option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING);
44 option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING);
45 option->SetDisplayId(windowProperty->displayId);
46 std::string windowName = SCREEN_CLIENT_WINDOW + std::to_string(windowId);
47 sptr<Rosen::Window> window = Rosen::Window::Create(windowName, option);
48 if (window == nullptr || window->GetSurfaceNode() == nullptr) {
49 DHLOGE("Create screen client window failed.");
50 return nullptr;
51 }
52 auto surface = window->GetSurfaceNode()->GetSurface();
53 if (surface == nullptr) {
54 window->Destroy();
55 DHLOGE("surface is nullptr");
56 return nullptr;
57 }
58 Rosen::RSTransactionProxy::GetInstance()->FlushImplicitTransaction();
59 std::shared_ptr<Rosen::IInputEventConsumer> listener =
60 std::make_shared<ScreenClientInputEventListener>(ScreenClientInputEventListener());
61 window->SetInputEventConsumer(listener);
62 DHLOGD("Create window name is %s.", windowName.c_str());
63 if (OHOS::Rosen::WMError::WM_OK != window->Resize(windowProperty->width, windowProperty->height)) {
64 window->Destroy();
65 DHLOGE("Window resize failed.");
66 return nullptr;
67 }
68 if (OHOS::Rosen::WMError::WM_OK != window->MoveTo(windowProperty->startX, windowProperty->startY)) {
69 window->Destroy();
70 DHLOGE("Window moveto failed.");
71 return nullptr;
72 }
73 {
74 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
75 windowIdMap_.emplace(windowId, window);
76 }
77 DHLOGD("Get surface(windowId = %d) success.", windowId);
78 return surface;
79 }
80
ShowWindow(int32_t windowId)81 int32_t ScreenClientWindowAdapter::ShowWindow(int32_t windowId)
82 {
83 sptr<Rosen::Window> window = nullptr;
84 {
85 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
86 auto iter = windowIdMap_.find(windowId);
87 if (iter == windowIdMap_.end()) {
88 DHLOGE("Invalid windowId (windowId = %d).", windowId);
89 return ERR_DH_SCREEN_SCREENCLIENT_SHOW_WINDOW_ERROR;
90 }
91 window = iter->second;
92 }
93 if (window == nullptr) {
94 DHLOGE("Current window is null.");
95 return ERR_DH_SCREEN_SCREENCLIENT_SHOW_WINDOW_ERROR;
96 }
97 if (OHOS::Rosen::WMError::WM_OK != window->Show()) {
98 DHLOGE("Show window failed.");
99 return ERR_DH_SCREEN_SCREENCLIENT_SHOW_WINDOW_ERROR;
100 }
101 DHLOGD("Show window (windowId = %d) success.", windowId);
102 return DH_SUCCESS;
103 }
104
HideWindow(int32_t windowId)105 int32_t ScreenClientWindowAdapter::HideWindow(int32_t windowId)
106 {
107 sptr<Rosen::Window> window = nullptr;
108 {
109 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
110 auto iter = windowIdMap_.find(windowId);
111 if (iter == windowIdMap_.end()) {
112 DHLOGE("Invalid windowId (windowId = %d).", windowId);
113 return ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR;
114 }
115 window = iter->second;
116 }
117 if (window == nullptr) {
118 DHLOGE("Current window is null.");
119 return ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR;
120 }
121 if (OHOS::Rosen::WMError::WM_OK != window->Hide()) {
122 DHLOGE("Hide window failed.");
123 return ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR;
124 }
125 DHLOGD("Hide window (windowId = %d) success.", windowId);
126 return DH_SUCCESS;
127 }
128
MoveWindow(int32_t windowId,int32_t startX,int32_t startY)129 int32_t ScreenClientWindowAdapter::MoveWindow(int32_t windowId, int32_t startX, int32_t startY)
130 {
131 sptr<Rosen::Window> window = nullptr;
132 {
133 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
134 auto iter = windowIdMap_.find(windowId);
135 if (iter == windowIdMap_.end()) {
136 DHLOGE("Invalid windowId (windowId = %d).", windowId);
137 return ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR;
138 }
139 window = iter->second;
140 }
141 if (window == nullptr) {
142 DHLOGE("Current window is null(windowId = %d).", windowId);
143 return ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR;
144 }
145 if (OHOS::Rosen::WMError::WM_OK != window->MoveTo(startX, startY)) {
146 DHLOGE("Move window failed (windowId = %d).", windowId);
147 return ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR;
148 }
149 DHLOGD("MoveTo window (windowId = %d) success.", windowId);
150 return DH_SUCCESS;
151 }
152
RemoveWindow(int32_t windowId)153 int32_t ScreenClientWindowAdapter::RemoveWindow(int32_t windowId)
154 {
155 sptr<Rosen::Window> window = nullptr;
156 {
157 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
158 auto iter = windowIdMap_.find(windowId);
159 if (iter == windowIdMap_.end()) {
160 DHLOGE("Invalid windowId(windowId = %d).", windowId);
161 return ERR_DH_SCREEN_SCREENCLIENT_REMOVE_WINDOW_ERROR;
162 }
163 window = iter->second;
164 windowIdMap_.erase(windowId);
165 }
166 if (window == nullptr) {
167 DHLOGE("Current window is null(windowId = %d).", windowId);
168 return ERR_DH_SCREEN_SCREENCLIENT_REMOVE_WINDOW_ERROR;
169 }
170 if (OHOS::Rosen::WMError::WM_OK != window->Hide()) {
171 DHLOGE("Remove window window failed(windowId = %d).", windowId);
172 return ERR_DH_SCREEN_SCREENCLIENT_REMOVE_WINDOW_ERROR;
173 }
174 if (OHOS::Rosen::WMError::WM_OK != window->Destroy()) {
175 DHLOGE("Remove window window failed(windowId = %d).", windowId);
176 return ERR_DH_SCREEN_SCREENCLIENT_REMOVE_WINDOW_ERROR;
177 }
178 DHLOGD("Remove window success(windowId = %d).", windowId);
179 return DH_SUCCESS;
180 }
181
DestroyAllWindow()182 int32_t ScreenClientWindowAdapter::DestroyAllWindow()
183 {
184 DHLOGD("~ScreenClientWindowAdapter");
185 std::lock_guard<std::mutex> dataLock(windowIdMapMutex_);
186 for (const auto &item : windowIdMap_) {
187 auto window = item.second;
188 if (window == nullptr) {
189 DHLOGE("window is nullptr(windowId = %d).", item.first);
190 continue;
191 }
192 if (OHOS::Rosen::WMError::WM_OK != window->Destroy()) {
193 DHLOGE("Destroy window(windowId = %d) failed .", item.first);
194 continue;
195 }
196 }
197 windowIdMap_.clear();
198 return DH_SUCCESS;
199 }
200
OnInputEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent) const201 bool ScreenClientInputEventListener::OnInputEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) const
202 {
203 DHLOGI("onInputEvent, pointerEvent");
204 pointerEvent->MarkProcessed();
205 return true;
206 }
207
OnInputEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent) const208 bool ScreenClientInputEventListener::OnInputEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) const
209 {
210 DHLOGI("onInputEvent, keyEvent");
211 keyEvent->MarkProcessed();
212 return true;
213 }
214
OnInputEvent(const std::shared_ptr<MMI::AxisEvent> & axisEvent) const215 bool ScreenClientInputEventListener::OnInputEvent(const std::shared_ptr<MMI::AxisEvent>& axisEvent) const
216 {
217 DHLOGI("onInputEvent, axisEvent");
218 axisEvent->MarkProcessed();
219 return true;
220 }
221 } // namespace DistributedHardware
222 } // namespace OHOS