1 /*
2 * Copyright (c) 2021 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 "window_manager_service_proxy.h"
17
18 #include "window_manager_hilog.h"
19
20 namespace OHOS {
21 namespace {
22 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0, "WMServiceProxy"};
23 }
24
WindowManagerServiceProxy(struct wms * wms,struct wl_display * display,sptr<IAnimationService> & as)25 WindowManagerServiceProxy::WindowManagerServiceProxy(struct wms *wms, struct wl_display *display,
26 sptr<IAnimationService> &as)
27 {
28 this->wms = wms;
29 this->display = display;
30 this->as = as;
31 }
32
33 namespace {
WMServerErrorToGSError(int32_t error)34 GSError WMServerErrorToGSError(int32_t error)
35 {
36 switch (error) {
37 case WMS_ERROR_OK:
38 return static_cast<GSError>(GSERROR_OK);
39 case WMS_ERROR_INVALID_PARAM:
40 return static_cast<GSError>(GSERROR_INVALID_ARGUMENTS);
41 case WMS_ERROR_PID_CHECK:
42 return static_cast<GSError>(GSERROR_API_FAILED + EACCES);
43 case WMS_ERROR_NO_MEMORY:
44 return static_cast<GSError>(GSERROR_API_FAILED + ENOMEM);
45 case WMS_ERROR_INNER_ERROR:
46 return static_cast<GSError>(GSERROR_SERVER_ERROR);
47 case WMS_ERROR_OTHER:
48 return static_cast<GSError>(GSERROR_SERVER_ERROR);
49 case WMS_ERROR_API_FAILED:
50 return static_cast<GSError>(GSERROR_API_FAILED);
51 default:
52 return static_cast<GSError>(GSERROR_INTERNEL);
53 }
54 return static_cast<GSError>(GSERROR_INTERNEL);
55 }
56 } // namespace
57
OnReply(wms_error error)58 void WindowManagerServiceProxy::OnReply(wms_error error)
59 {
60 WMLOGFD("reply: %{public}d", error);
61 std::lock_guard<std::mutex> lock(promiseQueueMutex);
62 if (promiseQueue.empty() == false) {
63 promiseQueue.front()->Resolve(WMServerErrorToGSError(error));
64 promiseQueue.pop();
65 } else {
66 WMLOGFW("OnReply promiseQueue is empty");
67 }
68 }
69
OnDisplayChange(uint32_t did,const char * name,wms_screen_status state,int32_t width,int32_t height,wms_screen_type type)70 void WindowManagerServiceProxy::OnDisplayChange(uint32_t did,
71 const char *name, wms_screen_status state, int32_t width, int32_t height, wms_screen_type type)
72 {
73 WMLOGFI("state: %{public}d, did: %{public}d, %{public}s(%{public}dx%{public}d)",
74 state, did, name, width, height);
75
76 auto match = [did](const auto &info) { return info.id == static_cast<int32_t>(did); };
77 auto ret = std::find_if(displays.begin(), displays.end(), match);
78
79 if (state == WMS_SCREEN_STATUS_ADD) {
80 if (ret == displays.end()) {
81 constexpr int32_t tmpVsyncFreq = 60;
82 struct WMDisplayInfo info = {
83 .id = did,
84 .width = width,
85 .height = height,
86 .phyWidth = width,
87 .phyHeight = height,
88 .vsync = tmpVsyncFreq,
89 .type = static_cast<enum DisplayType>(type),
90 };
91 displays.push_back(info);
92 }
93 if (displayListener != nullptr) {
94 displayListener->OnScreenPlugin(did);
95 }
96 }
97
98 if (state == WMS_SCREEN_STATUS_REMOVE) {
99 if (ret != displays.end()) {
100 displays.erase(ret);
101 }
102 if (displayListener != nullptr) {
103 displayListener->OnScreenPlugout(did);
104 }
105 }
106 }
107
OnDisplayPower(uint32_t error,int32_t status)108 void WindowManagerServiceProxy::OnDisplayPower(uint32_t error, int32_t status)
109 {
110 std::lock_guard<std::mutex> lock(powerStatusPromiseQueueMutex);
111 if (!powerStatusPromiseQueue.empty()) {
112 struct PowerStatus retval = {
113 .wret = WMServerErrorToGSError(error),
114 .status = static_cast<DispPowerStatus>(status),
115 };
116 powerStatusPromiseQueue.front()->Resolve(retval);
117 powerStatusPromiseQueue.pop();
118 } else {
119 WMLOGFW("OnDisplayPower powerStatusPromiseQueue is empty");
120 }
121 }
122
OnDisplayBacklight(uint32_t error,uint32_t level)123 void WindowManagerServiceProxy::OnDisplayBacklight(uint32_t error, uint32_t level)
124 {
125 std::lock_guard<std::mutex> lock(backlightPromiseQueueMutex);
126 if (!backlightPromiseQueue.empty()) {
127 struct Backlight retval = {
128 .wret = WMServerErrorToGSError(error),
129 .level = level,
130 };
131 backlightPromiseQueue.front()->Resolve(retval);
132 backlightPromiseQueue.pop();
133 } else {
134 WMLOGFW("OnDisplayPower backlightPromiseQueue is empty");
135 }
136 }
137
OnDisplayModeChange(uint32_t mode)138 void WindowManagerServiceProxy::OnDisplayModeChange(uint32_t mode)
139 {
140 WMLOGFI("mode: %{public}u", mode);
141 displayModes = mode;
142 }
143
OnGlobalWindowStatus(uint32_t pid,uint32_t wid,uint32_t status)144 void WindowManagerServiceProxy::OnGlobalWindowStatus(uint32_t pid, uint32_t wid, uint32_t status)
145 {
146 WMLOGFI("global window status: pid=%{public}u status=%{public}u wid=%{public}u", pid, status, wid);
147 if (globalWindowChangeListener != nullptr) {
148 if (status == WMS_WINDOW_STATUS_CREATED) {
149 globalWindowChangeListener->OnWindowCreate(pid, wid);
150 }
151 if (status == WMS_WINDOW_STATUS_DESTROYED) {
152 globalWindowChangeListener->OnWindowDestroy(pid, wid);
153 }
154 }
155 }
156
OnScreenShot(wms_error reply,uint32_t did,int32_t fd,int32_t width,int32_t height,int32_t stride,uint32_t format,uint32_t timestampSec,uint32_t timestampNanoSec)157 void WindowManagerServiceProxy::OnScreenShot(wms_error reply,
158 uint32_t did, int32_t fd, int32_t width, int32_t height,
159 int32_t stride, uint32_t format, uint32_t timestampSec, uint32_t timestampNanoSec)
160 {
161 WMLOGFI("reply: %{public}u, did: %{public}d, fd: %{public}d, %{public}dx%{public}d, stride: %{public}d, "
162 "format: %{public}u, timestampSec: %{public}u, timestampNanoSec: %{public}u",
163 reply, did, fd, width, height, stride, format, timestampSec, timestampNanoSec);
164
165 {
166 std::lock_guard<std::mutex> lock(screenShotPromisesMutex);
167 if (screenShotPromises.find(did) == screenShotPromises.end()) {
168 WMLOGFW("cannot found %{public}d 's promise", did);
169 return;
170 }
171
172 if (screenShotPromises[did] == nullptr) {
173 WMLOGFW("cannot resolve %{public}d screenshot promise, it's nullptr", did);
174 return;
175 }
176
177 constexpr int64_t SEC_TO_MSEC = 1000;
178 constexpr int64_t NSEC_TO_MSEC = 1000 * 1000;
179 int64_t timestampMillSec = timestampSec * SEC_TO_MSEC + timestampNanoSec / NSEC_TO_MSEC;
180 WMSImageInfo info = {
181 .wret = static_cast<GSError>(reply),
182 .fd = fd,
183 .width = width,
184 .height = height,
185 .stride = stride,
186 .format = format,
187 .timestamp = timestampMillSec,
188 };
189 screenShotPromises[did]->Resolve(info);
190 screenShotPromises.erase(did);
191 }
192 }
193
OnWindowShot(wms_error reply,uint32_t wid,int32_t fd,int32_t width,int32_t height,int32_t stride,uint32_t format,uint32_t timestampSec,uint32_t timestampNanoSec)194 void WindowManagerServiceProxy::OnWindowShot(wms_error reply,
195 uint32_t wid, int32_t fd, int32_t width, int32_t height,
196 int32_t stride, uint32_t format, uint32_t timestampSec, uint32_t timestampNanoSec)
197 {
198 WMLOGFI("reply: %{public}u, wid: %{public}d, fd: %{public}d, %{public}dx%{public}d, stride: %{public}d, "
199 "format: %{public}u, timestampSec: %{public}u, timestampNanoSec: %{public}u",
200 reply, wid, fd, width, height, stride, format, timestampSec, timestampNanoSec);
201
202 {
203 std::lock_guard<std::mutex> lock(windowShotPromisesMutex);
204 if (windowShotPromises.find(wid) == windowShotPromises.end()) {
205 WMLOGFW("cannot found %{public}d 's promise", wid);
206 return;
207 }
208
209 if (windowShotPromises[wid] == nullptr) {
210 WMLOGFW("cannot resolve %{public}d windowshot promise, it's nullptr", wid);
211 return;
212 }
213
214 constexpr int64_t SEC_TO_MSEC = 1000;
215 constexpr int64_t NSEC_TO_MSEC = 1000 * 1000;
216 int64_t timestampMillSec = timestampSec * SEC_TO_MSEC + timestampNanoSec / NSEC_TO_MSEC;
217 WMSImageInfo info = {
218 .wret = static_cast<GSError>(reply),
219 .fd = fd,
220 .width = width,
221 .height = height,
222 .stride = stride,
223 .format = format,
224 .timestamp = timestampMillSec,
225 };
226 windowShotPromises[wid]->Resolve(info);
227 windowShotPromises.erase(wid);
228 }
229 }
230
GetDisplays(std::vector<struct WMDisplayInfo> & displays)231 GSError WindowManagerServiceProxy::GetDisplays(std::vector<struct WMDisplayInfo> &displays)
232 {
233 displays = this->displays;
234 return GSERROR_OK;
235 }
236
GetDisplayPower(int32_t did)237 sptr<PromisePowerStatus> WindowManagerServiceProxy::GetDisplayPower(int32_t did)
238 {
239 WMLOGFI("display: %{public}d", did);
240 sptr<PromisePowerStatus> ret = new PromisePowerStatus();
241 std::lock_guard<std::mutex> lock(powerStatusPromiseQueueMutex);
242 powerStatusPromiseQueue.push(ret);
243 wms_get_display_power(wms, did);
244 wl_display_flush(display);
245 return ret;
246 }
247
SetDisplayPower(int32_t did,DispPowerStatus status)248 sptr<PromiseGSError> WindowManagerServiceProxy::SetDisplayPower(int32_t did, DispPowerStatus status)
249 {
250 WMLOGFI("display: %{public}d, status: %{public}d", did, status);
251 sptr<PromiseGSError> ret = new PromiseGSError();
252 std::lock_guard<std::mutex> lock(promiseQueueMutex);
253 promiseQueue.push(ret);
254 wms_set_display_power(wms, did, static_cast<int32_t>(status));
255 wl_display_flush(display);
256 return ret;
257 }
258
GetDisplayBacklight(int32_t did)259 sptr<PromiseBacklight> WindowManagerServiceProxy::GetDisplayBacklight(int32_t did)
260 {
261 WMLOGFI("display: %{public}d", did);
262 sptr<PromiseBacklight> ret = new PromiseBacklight();
263 std::lock_guard<std::mutex> lock(backlightPromiseQueueMutex);
264 backlightPromiseQueue.push(ret);
265 wms_get_display_backlight(wms, did);
266 wl_display_flush(display);
267 return ret;
268 }
269
SetDisplayBacklight(int32_t did,uint32_t level)270 sptr<PromiseGSError> WindowManagerServiceProxy::SetDisplayBacklight(int32_t did, uint32_t level)
271 {
272 WMLOGFI("display: %{public}d, level: %{public}u", did, level);
273 sptr<PromiseGSError> ret = new PromiseGSError();
274 std::lock_guard<std::mutex> lock(promiseQueueMutex);
275 promiseQueue.push(ret);
276 wms_set_display_backlight(wms, did, level);
277 wl_display_flush(display);
278 return ret;
279 }
280
GetDisplayModes(uint32_t & displayModes)281 GSError WindowManagerServiceProxy::GetDisplayModes(uint32_t &displayModes)
282 {
283 displayModes = this->displayModes;
284 return GSERROR_OK;
285 }
286
SetDisplayMode(WMSDisplayMode modes)287 sptr<PromiseGSError> WindowManagerServiceProxy::SetDisplayMode(WMSDisplayMode modes)
288 {
289 WMLOGFI("modes: %{public}d", modes);
290 sptr<PromiseGSError> ret = new PromiseGSError();
291 std::lock_guard<std::mutex> lock(promiseQueueMutex);
292 promiseQueue.push(ret);
293 wms_set_display_mode(wms, modes);
294 wms_commit_changes(wms);
295 wl_display_flush(display);
296 return ret;
297 }
298
SetDisplayDirection(WMSDisplayDirection direction)299 GSError WindowManagerServiceProxy::SetDisplayDirection(WMSDisplayDirection direction)
300 {
301 return GSERROR_NOT_SUPPORT;
302 }
303
OnDisplayDirectionChange(DisplayDirectionChangeFunc func)304 GSError WindowManagerServiceProxy::OnDisplayDirectionChange(DisplayDirectionChangeFunc func)
305 {
306 return GSERROR_NOT_SUPPORT;
307 }
308
OnWindowListChange(IWindowChangeListenerClazz * listener)309 sptr<Promise<GSError>> WindowManagerServiceProxy::OnWindowListChange(IWindowChangeListenerClazz *listener)
310 {
311 sptr<PromiseGSError> promise = new PromiseGSError();
312 globalWindowChangeListener = listener;
313 std::lock_guard<std::mutex> lock(promiseQueueMutex);
314 promiseQueue.push(promise);
315 wms_config_global_window_status(wms, (listener == nullptr) ? 0 : 1);
316 wl_display_flush(display);
317 return promise;
318 }
319
ShotScreen(int32_t did)320 sptr<PromiseWMSImageInfo> WindowManagerServiceProxy::ShotScreen(int32_t did)
321 {
322 WMLOGFI("did: %{public}d", did);
323 sptr<PromiseWMSImageInfo> promise = new PromiseWMSImageInfo();
324 {
325 std::lock_guard<std::mutex> lock(screenShotPromisesMutex);
326 screenShotPromises[did] = promise;
327 }
328 wms_screenshot(wms, did);
329 wl_display_flush(display);
330 return promise;
331 }
332
ShotWindow(int32_t wid)333 sptr<PromiseWMSImageInfo> WindowManagerServiceProxy::ShotWindow(int32_t wid)
334 {
335 WMLOGFI("wid: %{public}d", wid);
336 sptr<PromiseWMSImageInfo> promise = new PromiseWMSImageInfo();
337 {
338 std::lock_guard<std::mutex> lock(windowShotPromisesMutex);
339 windowShotPromises[wid] = promise;
340 }
341 wms_windowshot(wms, wid);
342 wl_display_flush(display);
343 return promise;
344 }
345
SetStatusBarVisibility(bool visibility)346 sptr<PromiseGSError> WindowManagerServiceProxy::SetStatusBarVisibility(bool visibility)
347 {
348 WMLOGFI("visibility: %{public}d", visibility);
349 sptr<PromiseGSError> ret = new PromiseGSError();
350 std::lock_guard<std::mutex> lock(promiseQueueMutex);
351 promiseQueue.push(ret);
352 wms_set_status_bar_visibility(wms, visibility ? WMS_VISIBILITY_TRUE : WMS_VISIBILITY_FALSE);
353 wl_display_flush(display);
354 return ret;
355 }
356
SetNavigationBarVisibility(bool visibility)357 sptr<PromiseGSError> WindowManagerServiceProxy::SetNavigationBarVisibility(bool visibility)
358 {
359 WMLOGFI("visibility: %{public}d", visibility);
360 sptr<PromiseGSError> ret = new PromiseGSError();
361 std::lock_guard<std::mutex> lock(promiseQueueMutex);
362 promiseQueue.push(ret);
363 wms_set_navigation_bar_visibility(wms, visibility ? WMS_VISIBILITY_TRUE : WMS_VISIBILITY_FALSE);
364 wl_display_flush(display);
365 return ret;
366 }
367
AddDisplayChangeListener(IWindowManagerDisplayListenerClazz * listener)368 GSError WindowManagerServiceProxy::AddDisplayChangeListener(IWindowManagerDisplayListenerClazz *listener)
369 {
370 WMLOGFI("listener: %{public}s", (listener != nullptr) ? "Yes" : "No");
371 displayListener = listener;
372 return GSERROR_OK;
373 }
374
DestroyWindow(int32_t wid)375 sptr<PromiseGSError> WindowManagerServiceProxy::DestroyWindow(int32_t wid)
376 {
377 WMLOGFI("wid: %{public}d", wid);
378 sptr<PromiseGSError> ret = new PromiseGSError();
379 std::lock_guard<std::mutex> lock(promiseQueueMutex);
380 promiseQueue.push(ret);
381 wms_destroy_window(wms, wid);
382 wl_display_flush(display);
383 return ret;
384 }
385
SwitchTop(int32_t wid)386 sptr<PromiseGSError> WindowManagerServiceProxy::SwitchTop(int32_t wid)
387 {
388 WMLOGFI("wid: %{public}d", wid);
389 sptr<PromiseGSError> ret = new PromiseGSError();
390 std::lock_guard<std::mutex> lock(promiseQueueMutex);
391 promiseQueue.push(ret);
392 wms_set_window_top(wms, wid);
393 wms_commit_changes(wms);
394 wl_display_flush(display);
395 return ret;
396 }
397
Show(int32_t wid)398 sptr<PromiseGSError> WindowManagerServiceProxy::Show(int32_t wid)
399 {
400 WMLOGFI("wid: %{public}d", wid);
401 sptr<PromiseGSError> ret = new PromiseGSError();
402 std::lock_guard<std::mutex> lock(promiseQueueMutex);
403 promiseQueue.push(ret);
404 wms_set_window_visibility(wms, wid, WMS_VISIBILITY_TRUE);
405 wms_commit_changes(wms);
406 wl_display_flush(display);
407 return ret;
408 }
409
Hide(int32_t wid)410 sptr<PromiseGSError> WindowManagerServiceProxy::Hide(int32_t wid)
411 {
412 WMLOGFI("wid: %{public}d", wid);
413 sptr<PromiseGSError> ret = new PromiseGSError();
414 std::lock_guard<std::mutex> lock(promiseQueueMutex);
415 promiseQueue.push(ret);
416 wms_set_window_visibility(wms, wid, WMS_VISIBILITY_FALSE);
417 wms_commit_changes(wms);
418 wl_display_flush(display);
419 return ret;
420 }
421
Move(int32_t wid,int32_t x,int32_t y)422 sptr<PromiseGSError> WindowManagerServiceProxy::Move(int32_t wid, int32_t x, int32_t y)
423 {
424 WMLOGFI("wid: %{public}d, (%{public}d, %{public}d)", wid, x, y);
425 sptr<PromiseGSError> ret = new PromiseGSError();
426 std::lock_guard<std::mutex> lock(promiseQueueMutex);
427 promiseQueue.push(ret);
428 wms_set_window_position(wms, wid, x, y);
429 wms_commit_changes(wms);
430 wl_display_flush(display);
431 return ret;
432 }
433
Resize(int32_t wid,uint32_t width,uint32_t height)434 sptr<PromiseGSError> WindowManagerServiceProxy::Resize(int32_t wid, uint32_t width, uint32_t height)
435 {
436 WMLOGFI("wid: %{public}d, %{public}dx%{public}d", wid, width, height);
437 sptr<PromiseGSError> ret = new PromiseGSError();
438 std::lock_guard<std::mutex> lock(promiseQueueMutex);
439 promiseQueue.push(ret);
440 wms_set_window_size(wms, wid, width, height);
441 wms_commit_changes(wms);
442 wl_display_flush(display);
443 return ret;
444 }
445
ScaleTo(int32_t wid,uint32_t width,uint32_t height)446 sptr<PromiseGSError> WindowManagerServiceProxy::ScaleTo(int32_t wid, uint32_t width, uint32_t height)
447 {
448 WMLOGFI("wid: %{public}d, %{public}dx%{public}d", wid, width, height);
449 sptr<PromiseGSError> ret = new PromiseGSError();
450 std::lock_guard<std::mutex> lock(promiseQueueMutex);
451 promiseQueue.push(ret);
452 wms_set_window_scale(wms, wid, width, height);
453 wms_commit_changes(wms);
454 wl_display_flush(display);
455 return ret;
456 }
457
SetWindowType(int32_t wid,WindowType type)458 sptr<PromiseGSError> WindowManagerServiceProxy::SetWindowType(int32_t wid, WindowType type)
459 {
460 WMLOGFI("wid: %{public}d, type: %{public}d", wid, type);
461 sptr<PromiseGSError> ret = new PromiseGSError();
462 std::lock_guard<std::mutex> lock(promiseQueueMutex);
463 promiseQueue.push(ret);
464 wms_set_window_type(wms, wid, type);
465 wms_commit_changes(wms);
466 wl_display_flush(display);
467 return ret;
468 }
469
SetWindowMode(int32_t wid,WindowMode mode)470 sptr<PromiseGSError> WindowManagerServiceProxy::SetWindowMode(int32_t wid, WindowMode mode)
471 {
472 WMLOGFI("wid: %{public}d, mode: %{public}d", wid, mode);
473 sptr<PromiseGSError> ret = new PromiseGSError();
474 std::lock_guard<std::mutex> lock(promiseQueueMutex);
475 promiseQueue.push(ret);
476 wms_set_window_mode(wms, wid, mode);
477 wms_commit_changes(wms);
478 wl_display_flush(display);
479 return ret;
480 }
481
CreateVirtualDisplay(int32_t x,int32_t y,int32_t width,int32_t height)482 sptr<PromiseGSError> WindowManagerServiceProxy::CreateVirtualDisplay(
483 int32_t x, int32_t y, int32_t width, int32_t height)
484 {
485 sptr<PromiseGSError> ret = new PromiseGSError();
486 std::lock_guard<std::mutex> lock(promiseQueueMutex);
487 promiseQueue.push(ret);
488 wms_create_virtual_display(wms, x, y, width, height);
489 wms_commit_changes(wms);
490 wl_display_flush(display);
491 return ret;
492 }
493
DestroyVirtualDisplay(uint32_t did)494 sptr<PromiseGSError> WindowManagerServiceProxy::DestroyVirtualDisplay(uint32_t did)
495 {
496 sptr<PromiseGSError> ret = new PromiseGSError();
497 std::lock_guard<std::mutex> lock(promiseQueueMutex);
498 promiseQueue.push(ret);
499 wms_destroy_virtual_display(wms, did);
500 wms_commit_changes(wms);
501 wl_display_flush(display);
502 return ret;
503 }
504
StartRotationAnimation(uint32_t did,int32_t degree)505 GSError WindowManagerServiceProxy::StartRotationAnimation(uint32_t did, int32_t degree)
506 {
507 if (as == nullptr) {
508 return GSERROR_CONNOT_CONNECT_SERVER;
509 }
510
511 return as->StartRotationAnimation(did, degree);
512 }
513
SetSplitMode(SplitMode mode,int32_t x,int32_t y)514 sptr<PromiseGSError> WindowManagerServiceProxy::SetSplitMode(SplitMode mode, int32_t x, int32_t y)
515 {
516 WMLOGFI("mode: %{public}d, x: %{public}d, y: %{public}d", mode, x, y);
517 sptr<PromiseGSError> ret = new PromiseGSError();
518 std::lock_guard<std::mutex> lock(promiseQueueMutex);
519 promiseQueue.push(ret);
520 wms_set_split_mode(wms, mode, x, y);
521 wl_display_flush(display);
522 return ret;
523 }
524
CreateLaunchPage(const std::string & filename)525 GSError WindowManagerServiceProxy::CreateLaunchPage(const std::string &filename)
526 {
527 if (as == nullptr) {
528 return GSERROR_CONNOT_CONNECT_SERVER;
529 }
530
531 return as->CreateLaunchPage(filename);
532 }
533
CancelLaunchPage()534 GSError WindowManagerServiceProxy::CancelLaunchPage()
535 {
536 if (as == nullptr) {
537 return GSERROR_CONNOT_CONNECT_SERVER;
538 }
539
540 return as->CancelLaunchPage();
541 }
542 } // namespace OHOS
543