• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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